外れ値処理の一手法:Winsorizingについて

機械学習や統計の分野における外れ値処理の手法の一つとしてWinsorizingと呼ばれる手法がある。日本語の解説が少なかったので書いてみる。

手法自体は非常に簡単で、外れ値を外れ値以外の最大値・最小値で置き換えるというものである。表形式データを考えると、単純に外れ値を除去するよりも、データサイズが少ない場合はほかのカラムの情報を有効活用することができる。

ちなみに英語版のWikipediaにはページが用意されている。
https://en.wikipedia.org/wiki/Winsorizing

このページにあった例を見てみると、numpy配列の上下5%のデータを最大値と最小値で置き換える方法が書かれている。

import scipy.stats
import numpy as np 
a = np.array([92, 19, 101, 58, 1053, 91, 26, 78, 10, 13, -40, 101, 86, 85, 15, 89, 89, 28, -5, 41]) 
scipy.stats.mstats.winsorize(a, limits=[0.05, 0.05])

1053が101に、-40が-5へと置き換えられる。
少し考えるとわかるが、単純に外れ値を除去して平均を取った場合とWinsoringをしてから平均を取った場合では値が異なる。

【書評】中国のAI技術と進むべき方向性:「AI Superpowers: China, Silicon Valley, and the New World Order」

最近、アメリカのAmazonで話題となっている「AI Superpowers: China, Silicon Valley, and the New World Order」という本を読んだ。
色々と面白い内容が多かったので、ここに書きたいと思う。

まず、この本の著者であるDr. Kai-Fu Leeは台湾で生まれてアメリカのカーネギーメロン大学で音声認識の分野でPh.Dを取った、人工知能の専門家である。現在はベンチャーキャピタリストとして北京を活動拠点にしている。
著者がどんな人かを手っ取り早く知りたい人は以下のTED動画を観ると良いと思う。
https://www.youtube.com/watch?v=ajGgd9Ld-Wc

この本を読むと、とにかく中国のAI活用がものすごいペースで進んでいるということが分かる。もちろん、筆者が中国をベースにビジネスをしていることを割り引いて考える必要はあるかと思うが、筆者の中国がAI実装の分野で力を付けていくだろうというビジョンは本書を読むと説得力がある。
筆者はディープラーニングによる世の中のシフトは、2つの変革として表れていくだろうと述べている。すなわち、「発見の時代から実装の時代」のシフトと「専門家の時代からデータの時代」へのシフトである。

今現在も続いている専門家がアルゴリズムを考えて、新たな有効な機械学習手法を編み出していく時代から、その手法を実際に社会実装していく時代が来るだろうとの考えから、このシフトを筆者は考えている。最近は多くの研究者がarxivなどに論文を学会で発表する前に載せており、コード実装を公開する例も多い。インターネットさえあれば、それらの世界最先端の技術を学ぶことができ、ビジネスに応用していくことが出来る時代である。

ビジネスとして最先端の機械学習の成果を利用するには、必ずしも最先端の研究者が必要なわけではない。筆者は「Today, successful AI algorithms need three things: big data, computing power, and the work of strong — but not necessarily elite — AI algorithm engineers.」とも述べている。
このように機械学習の社会実装という面だけで考えれば、中国はアメリカに劣っていないという。また、研究面でも中国出身の研究者が多くの論文を発表するようになってきており、AAAIというAI関連の有名な学会の日程が旧正月と被るために日程を変更せざるを得なかったという象徴的な出来事があった。
https://www.theatlantic.com/technology/archive/2017/02/china-artificial-intelligence/516615/

このようにAI研究や社会実装で中国の力が伸びてきており、半分冗談であるが「中国がシリコンバレーにAI研究でどれほど遅れているか?」と聞かれた中国の実業家は「16時間」と答えたらしい。これはカリフォルニアと北京の時差である。「When asked how far China lags behind Silicon Valley in artificial intelligence research, some Chinese entrepreneurs jokingly answer “sixteen hours”—the time difference between California and Beijing.」と答えたらしい。

また、中国企業のハードワークさも今後のビジネスの行方に有利に働くと考えている。筆者に言わせると、中国企業に比べてシリコンバレーの企業はとてもゆっくりと怠けて仕事をしているスピード感の違いを感じるそうだ。また、非常に熱心に学ぶ中国の学生やエンジニアの話も紹介されており、英語圏の著名なAI研究者の動画などにはすぐに中国語の字幕や翻訳が出るとのことで、将来性ももちろん感じる。この辺りの話を読んでいると、高度成長期時代の日本の姿に重なるものを感じる。
もちろん筆者だけでなく、世の中の著名な人物も似たような評価を下している。たとえばエリックシュミットは講演のなかで「Trust me, these Chinese people are good. . . . If you have any kind of prejudice or concern that somehow their system and their educational system is not going to produce the kind of people that I’m talking about, you’re wrong.」と述べたそうだ。

この本のなかでは、一体何が中国をAI実装の分野で強くしているのかといったことが書かれている。例えば、独自の文化圏、国家主導の仕組みづくり、テクノロジーを一段飛ばしで来たこと、データを使われることへの許容、ハードウェアに強い深圳を持つこと、などなど様々な点が強みとして挙げられている。
例えば、独自の文化圏として、昔の話であるがグーグルサーチは中国市場を単なる一地域としてしか見ておらず、本格的なローカライズのペースが遅かったと言う(ちなみにこのころは著者はGoogle Chinaで働いていたそうだ)。通常、検索結果をクリックするとそのページへ飛ぶが、中国人は検索結果を「ショッピングモール」のようなものだと思っており、検索結果をクリックしてもそのサイトは別タブ・ウィンドウで表示され、検索結果のページが残ったほうが効果的であったという。Baiduはいち早くそのように実装し、Googleに対して優位性を取ったという。
また、国家主導の仕組みづくりとしては、地方自治体が競うようにしてITベンチャーを簡単に設立できる特区のような地域を作るなどして、ベンチャー企業が数多く設立される仕組みを作っている。

テクノロジーを一段飛ばしで来たことは、例えば多くの人にとってはデスクトップやラップトップを経由せずにスマートフォンがメインのデバイスとして使われるようになり、スマホ特化のアプリやベンチャーが生まれたり、クレジットカードを経由せずにQRコードによる支払いが進んでいくようになったことなどが挙げられる。
データを使われることへの許容とは、直接的に言及されていないが中国政府による検閲やプライバシーといったものの意識が近年まで問題になっていなかった背景などもあり、企業に個人データを使われても、それで便利になるならば許容する精神が西側諸国よりかは大きいのだと思われる。
また、深圳はハードウェアのメッカとして知られているが、現状では他国の企業に比べて中国企業は文化・言葉などの面でビジネスをしやすいという。他国が苦労しながらもハードウェアを深圳で作ろうとしている間に、中国企業は様々なトライアルアンドエラーを行ってAI技術を用いた新しいデバイスを作れるようになるだろうと著者は予測する。
このほかにも今後数年~十数年のうちに実現するであろう、AI技術を社会実装した例なども挙げられており、専門家の目から見た将来像を学ぶ上で有益な一冊であると言える。

後半は前半とは大きく変わって、著者のTEDトークにもあったステージ4のがんであると診断された後に気付いた人生の目的やそれに向けたAI活用の話になってくる。著者は、がんと診断される前は仕事一筋で、どれだけ自分が社会に与える影響を最大化できるかといったことだけを考えて生きてきたという。しかし、人との関りや家族友人を大切にすることこそが一番重要だと思うようになったと語る。よく言われていることだが、死の間際にあの時もっと働いていれば良かったと思う人はほとんどいない。
そういった出来事を踏まえて、AIの発展した時代には人間は人との関わりを活かした仕事を進めていくべきであると言う。例えば、誰もステージ4のがんを機械に宣告されたくないはずで人間的なアプローチを持った仕事は残っていくし重要であるだろうと予測している。この辺りはTEDトークを見てもらえれば良く分かると思う。

個人的にはこの本がアメリカのAmazonで大ヒットしている現実を見ると、やはり欧米諸国は中国とパートナー関係を結んでビジネスを進めていこうという流れが出来てくるだろう。最後の方にもこの本のタイトルである「AI Superpowers」は決して、冷戦や宇宙進出の競争の時代にあったような対立関係を煽るものではなく、米中で協力してAI技術を発展させていくべきであるとも述べている。そうなった際に置いてけぼりにならないように、日本企業が中国企業から学ぶべきところは多いだろうと思う。

Kerasで転移学習をする際にはpreprocess_input()を呼ぼう

画像に関するタスクを扱っている際に、事前学習済みの重みを利用した転移学習を行うことは良い精度を出すことが多く広く使われています。Kearsには学習済みのいくつかのモデルが用意されており簡単に転移学習を行うことが出来ます。

(https://www.kaggle.com/amadeus1996/fruits-360-transfer-learning-using-keras)

公式のサンプルなどを見れば問題無いのですが、この事前学習済みのモデルを使う際にはpreprocess_input()という関数を呼び出して画像に対して前処理を行うことが想定されています。しかしながら、いくつかのブログ記事などを見たところpreprocess_input()を呼ばずに、転移学習を行っている記事があったため今回この記事を書きました。厄介なことに、preprocess_input()を呼ばなくても、VGGやResNetなどの高容量なモデルは前処理分の処理を学習するようで割と良い精度を出します。本質的には前処理しないことで、無駄な訓練が行われていることになるので、忘れずにpreprocess_input()を呼ぶべきでしょう。

ちなみにpreprocess_input()の中では、モデルによって画像の正規化、ImageNetデータセットのRGB各チャンネルごとの平均値を引く、などの処理が行われているようです。

Batch Normalization と Dropout は併用しない方が良いという話

Deep Learningのモデルを訓練していたところ、思うようにvalidation lossが下がらないことがあった。色々と調べた結果、Batch NormalizationとDropoutを併用していたのが原因であったので、誰かの為に書いておく。

この論文その解説にある通り、Batch NormalizationとDropoutを併用するとパフォーマンスが悪化することがある。原因は、「Dropoutを行うことで学習時と評価時で分散が変わってしまう一方、Batch Normalizationは学習で得られた分散を評価時もキープしてしまうため齟齬が生じることが原因」とあり、言われてみればなるほどという感じである。

結論としては、DropoutかBatch Normalizationのどちらか一方だけで試してみてvalidation lossを下げようとするのが良さそう。Deep Learningを使えばすべて解決するわけではなく、パラメータチューニングやモデル構造のチューニングが良いパフォーマンスを出すためには必要だと分かる事例の一つ。

直感 Deep Learning

直感 Deep Learning」という書籍が出るそうです。翻訳版なので原著を調べてみたところ、「Deep Learning with Keras」でした。英語版の方は、以前読んでおりレビューも書きました。この本はKerasを用いて、画像識別、自然言語処理、時系列データの分析、GAN、強化学習など幅広くトピックがカバーされていて、Kerasの使い方を学ぶのにも役立ったと思います。

以前書いたブログ記事:Kerasによるニューラルネットワーク本「Deep Learning with Keras」を読んだ


 

特徴量エンジニアリングに焦点を当てた簡潔な本:「Feature Engineering for Machine Learning」

機械学習の特徴量エンジニアリングに焦点を当てた本、「Feature Engineering for Machine Learning」を読んだ。

テーブルデータ、画像データ、文章データなどの各種データに対しての基本的な特徴量エンジニアリング手法が網羅されている本でした。例えばone-hotエンコーディングやn-gram、SIFTなどなど基本的な手法から、Box-Cox変換、Dummy Coding、データリークの問題など、一般的な機械学習の入門書ではカバーされないような内容もところどころ書かれていた。

後半ではCNNの仕組みや、論文推薦システムの構築などの、特徴量エンジニアリングを利用した実アプリケーションの作成もチュートリアル的に示されており、特徴量を加えることで精度が大きく変わるところなども分かり、特徴量エンジニアリングの重要性が学べる本となっていた。

全部で200ページほどの結構薄い本なので、英語の技術書に挑戦してみようかな、という人には機械学習の基礎が出来ているのであれば分かりやすいかと思うのでオススメしたい。

ニューラルネットワークを利用した決定木:Deep Neural Decision Trees

引き続き、機械学習の解釈性についての論文を読んだ。今回読んだのは、「Deep Neural Decision Trees (WHI ’18)」。著者による実装のページはここ

決定木とニューラルネットワークを用いる他の論文などと同様に、決定木の解釈性とニューラルネットワークの精度の高さの両立を狙っている。特に表形式データの分類に有効と著者らは述べている。

この論文では、微分可能なsoft binningという関数を入力データにかませて、学習を重ねることでsoft binningのバイアス項の値を見ることで、各フィーチャーに対してどこで決定木を分岐すれば良いかが分かるという手法を提案している。soft binningで決定木の分岐を表現して、そのあとにクロネッカー積を取ることですべての分岐の組み合わせを網羅的に調べることが出来る。すべての層は微分可能なため、通常のバックプロパゲーションによりネットワークの学習を行うことが出来る。

著者らは複数の表形式データセットに対して、決定木、ニューラルネットワーク、Deep Neural Decision Tree、の三手法で精度評価を行っている。結果はデータセットによってまちまちだが、基本的にニューラルネットワークと同等程度の精度が出ている。実験の結果、DNDTでは全く推論に使われない特徴が検出できるなどの副次的な成果も述べられている。

GPUによる速度性能の確認も行われており、フィーチャー数が増えた場合でもCPUと比較して、あまり実行時間が増えないようになっている。

今後も機械学習の解釈性関連の論文を色々と読んでいく予定。

機械学習の解釈性とパフォーマンスの両立を目指して:Human-in-the-Loop Interpretability Prior

機械学習、特にニューラルネットワークなどのアルゴリズムを使った場合、出力された結果は何万・何十万次元のベクトル演算の結果であり、人間が直接解釈することは難しい。ニューラルネットワークの解釈性については近年様々な研究が行われている。一般的に解釈性の低いモデルは高い精度を出すことが多く、適度な解釈性と適度な精度のバランスが取れたモデルが必要なケースが考えられる。

この論文「Human-in-the-Loop Interpretability Prior」は機械学習モデルに対して人間がある尺度(論文ではHIS:Human Interpretability Scoreという、人間がモデルに従って入力から出力を予測するのにかかった時間の逆数)を事前確率として、データXが与えられた際にそのデータを最も適切に説明できるモデルMをp(M|X)をMAP推定することにより選択するという手法を用いている。著者らは4種類のデータセットで実験を行っており、タスクごとにreasonableな解釈性を持ったモデルを選択できていることを確かめている。

読んだ感想としてはHISの決め方が果たして、人間がかかった時間の逆数という尺度を使うのは解釈性の尺度として適切なのか?といった疑問や、新しいモデルを作るたびにユーザの評価が必要になり汎用性は低そうに思った。HISを何らかの尺度(例えば計算時間や消費メモリ)によって算出することが出来れば、この手法を人の手を介さずに適用することも可能なのではないかと考える。

大規模データのクラスタリングには Mini Batch K-Means を使うべきという話

タイトルの通りですが、大規模データをクラスタリングする際には単純なK-Means法ではなく、Mini Batch K-Means法を使うべきという話です。

とある大規模データ(150万件ほどの文章ベクトル)をクラスタリングしたいことがあったのですが、単純にScikit-learnのK-Means法に投げてクラスタリングを走らせていたところ、数時間経っても一向に終わる気配がありませんでした。色々と調べていると、大規模データのクラスタリングにはMini Batch K-Means法を使うべきという記述を見つけました。公式ドキュメントによると、大体1万件を超えるデータをクラスタリングする場合にはMini Batch K-Meansを使うべきとのことです。

APIとしては単純にKMeansをMiniBatchKMeansに置き換えれば動きます。理論的な背景としては、論文 “Web Scale K-Means clustering” D. Sculley, Proceedings of the 19th international conference on World wide web (2010)に書かれており、ざっと読んだところランダムサンプリングしてクラスタの中心を計算していくのですが、KMeansとは異なり、各点ごとに中心を逐次的にアップデートしていくことで計算量を減らしています。

論文に載っていた速度比較ですが、圧倒的にMiniBatchKMeansが高速です。図の青がMiniBatchKMeans、赤がKMeans、横軸が時間。

この手法を使ったところ、KMeansでは数時間経っても終わらなかったクラスタリングが、MiniBatchKMeansでは数分程度で終わりました。ということで、大規模データのクラスタリングにはMIniBatchKMeansを使うべきということを学んだという話でした。

RNNのDropoutはどこに入れるべきか?:Where to Apply Dropout in Recurrent Neural Networks for Handwriting Recognition?

タイトルの通り、RNNに対してDropout層を追加する場合、どこに入れるのが適切なのか?と思い少し調べてみました。

ことの発端は、KerasにあるLSTMとGRUの、GPUによる高速化版であるCuDNNLSTMとCuDNNGRUには、dropoutとrecurrent_dropoutというCPU版には存在するパラメータが無いため、これらの層の前後にDropoutを入れても効果あるのかな?と疑問に思ったことが始まりです。

以下のKerasのgithubでこれらのパラメータについての議論が行われており、作者のChollet氏は以下のように述べており、通常のDropoutはRNNに対して効果が無いように読み取れます。https://github.com/keras-team/keras/issues/8935

Recurrent dropout is not implemented in cuDNN RNN ops. At the cuDNN level. So we can’t have it in Keras.

The dropout option in the cuDNN API is not recurrent dropout (unlike what is in Keras), so it is basically useless (regular dropout doesn’t work with RNNs).

Actually using such dropout in a stacked RNN will wreck training.

その後、少し調べてみるとタイトルにある論文「Where to Apply Dropout in Recurrent Neural Networks for Handwriting Recognition?」を見つけたので読んでみました。この論文では、手書き文字認識タスクにRNNを使用して、DropoutをRNNの前、中、後に入れてみて汎化性能を試しています。何種類かのデータセットで実験を行っていますが、結果はまちまちで、傾向としてはRNNの前にDropoutを使うのが性能が良いことが多いが、中、後に入れる場合も性能が良くなることがあり何とも言えない感じの結論となっています。ただ、著者らは複数層のRNNモデルに対しても実験を行っており、その場合にはネットワークの最初と最後にDropoutを入れるのが良い性能の傾向があると結論付けています。

はっきりとした結論は言えそうも無く、結局はタスクによるんじゃないかという感じですが、この辺はやはりディープラーニングはハイパーパラメータチューニング職人の世界であるといわれる一因なんじゃないかと感じました。