特徴量エンジニアリングに焦点を当てた簡潔な本:「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と比較して、あまり実行時間が増えないようになっている。

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

GPSデータによる交通事故リスク予測:Learning Deep Representation from Big and Heterogeneous Data for Traffic Accident Inference

読んだ論文のメモ。Learning Deep Representation from Big and Heterogeneous Data for Traffic Accident Inference (AAAI ’06)という論文を読んだ。

内容はGPSデータから交通事故のリスクレベルを予測するというもの。GPSデータには東京のデータが用いられている。GPSデータは精度自体やビルの陰や建物の中にいるなどの理由でノイズが乗っていると考えられる。この研究ではauto encoderを利用してGPSデータからノイズ除去を行ってからロジスティクス回帰に入力して事故リスクの予測をしている。

実験では、単純な決定木・ロジスティクス回帰・SVMと提案手法を比較して、提案手法がリスクレベルをよく予測出来ていることを確認している。また、主観評価として夜になると事故リスクがさがる、昼間は都心部の事故リスクが高い、東京・横浜間の道路が他に比べて事故リスクが高い、など我々の感覚に近い結果が出ていることも確認している。

スマートフォンの普及によりGPSデータは簡単に取得できるようになっているため、こういったタイプの研究やアプリケーションは今後増えていくだろうと考えられる。

 

機械学習によるメモリアクセス予測:Learning Memory Access Patterns

ICML 2018の論文リストを眺めていて、目についたタイトルの論文を読み始めた。まず最初に「Learning Memory Access Patterns」という論文を読んだ。この論文はRNNを用いてメモリアクセスパターンを予測することで、プリフェッチの精度を上げてパフォーマンス向上を目的としている。ある種の調査によると、CPUサイクルの50%以上はメモリからのデータを待っているともいわれており、プリフェッチの精度を上げることはコンピュータの性能向上に寄与する可能性が高い。

アイデアとしては、メモリアドレス空間をvocabralyとして扱う。これは、アドレス空間は非常に広大だが、実際にプロセスによってアクセスされる個所は局所的であり、これを予測しようとすると非常に疎なデータであるため正規化した際に有用な情報が失われてしまうためである。また、現在アクセスされているアドレスと次の時間にアクセスされるアドレスの差分(デルタ)を正解ラベルとして用いることで、デルタは通常小さいため、訓練が上手くいくというアイデアが用いられている。

また、単純にLSTMを使うだけでなく、前処理としてクラスタリングを行ってからLSTMにかけることで、プログラムのローカル構造(例えば構造体のアクセスや配列の走査)などの特徴を掴みやすくなったと述べている。

著者らは様々なデータセットを用いて、既存のメモリプリフェッチ機構とprecision/recallを比較しているが、クラスタリング+LSTMが良い性能が出ることを確認している。

Hit/Missの性能が良いのは理解できなくもないが、気になるのはやはり速度性能である。これは推測だが、おそらく既存のメモリプリフェッチ機構を置き換えるにはLSTMの推論は処理が重いのではないかという気がする。著者らは実際にH/W実装はまだ行っておらず、速度性能については今後の課題だと述べている。今後TPUのようなAIプロセッサの技術革新が進んでいけば、将来的には既存のプリフェッチ機構を置き換える可能性を秘めているかもしれない。

論文では、以前話題になったB-treeよりも高速なインデックス構造を機械学習で作成した「The Case for Learned Index Structures」という論文があったが、今後は既存のコンピュータアーキテクチャ分野にも機械学習が進出する未来がやってくるのかもしれない。

機械学習の解釈性とパフォーマンスの両立を目指して: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を入れるのが良い性能の傾向があると結論付けています。

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

 

Kerasの作者が書いたDeep Learning解説本:「Deep Learning with Python」を読んだ

タイトルの通り、広く使われているディープラーニングフレームワークであるKerasの作者François Chollet氏によるDeep Learningを解説した本「Deep Learning with Python」を読みました。今月末には日本語版が出るのでその前に読み終えることが出来て良かった。かなり分かりやすく、今まで何となく知っていた知識の整理に役だったのでオススメです。英語版を読んだので日本語版の翻訳が良いのか分からないですが、コードや図表が多いので日本語版でも理解は容易だと推測します。ちなみに英語版はUSのAmazonでかなりの高評価を受けています。


この本の特徴は、すべてのコードがKerasを用いて書かれており、コードが簡潔で理解しやすいという点だと思います。そして、本書を通じて(多分)一度も数式が登場していないので初学者にはとても読みやすいと思います(ただ、文章で説明するよりも数式なら一発で分かることというのもあるので、この点はレベルによります)。例えば、多層ニューラルネットが何をしているのかといった説明に、くしゃくしゃに丸めた紙を一層毎に開いていくイメージに似ている、といった説明がされており、初めて学ぶ人にとっては理解しやすいかと感じました。

カバーされている内容は、基本的なFully Connected Layerを用いたDNNから、畳み込み層を用いたCNN、RNNによる時系列データの取り扱い、GANやVAEなどによる画像生成などこの一冊でかなり広い分野をカバーできるようになっています。目を引いたのはCNNを用いた分類器の判断根拠を示す可視化手法(中間層の活性化状況やGrad-GAMといったヒートマップを用いた可視化)を書かれており内容が充実しています。その他にもRNNモデルの解説でLSTMやGRUが内部で何をしているかなどには、深く立ち入らず概念だけ説明して、Kerasを使えばこれだけでできるよ、と書かれているところも研究者よりは実践者向けだと感じました。

その他には、最後の章に著者が考えるディープラーニングの限界や、ディープラーニング技術の将来予測が書かれており興味深かったです。また、「この本を読み終わった後に進歩の速いディープラーニング分野の勉強を続けるにはどうしたらいいか」という内容が最後に書かれており、そこには「Kaggleをやれ、arXivで論文を読め」と書かれているのでその辺りを頑張って行きたいと思います。

恐らく、機械学習を学び始めて「ゼロから学ぶディープラーニング」を読み終えた人が、ディープラーニングを使って何か自分で試してみたいと思った時に、Kerasを学んで簡単にモデルを構築できるようになるためのステップとして最適な本だと思いました。

CNNによる価格予測の論文:「The Price is Right: Predicting Prices with Product Images」を読んだ

タイトルの通り、CNNモデルを利用して、自動車・自転車の画像から価格を予測する論文、「The Price is Right: Predicting Prices with Product Images」を読んだ。

この論文を読んだ動機は、ネットを調べるとCNNを用いて画像を分類するという例は山ほど出てくるが、CNNを用いて画像から何らかの数値を出力するregression問題に取り組んだ例があまり見つからず、ちょっとそういったことをやる必要に迫られたので読んでみた。

自転車と自動車の画像からそれぞれの価格を推定するregressionタスクにCNNを用いた。ベースラインモデルである多クラスSVMと線形モデルに対して同等~高い精度が出た。VGGとMobileNetによる転移学習よりも精度の高いネットワーク構造PriceNetReg CNNを提案している。また、CNNモデルに関して、画像のどの部分が予測に効いているかをVisualizationすることにより示している。

CNNモデルが画像のどの部分に着目して判断を行っているかということをVisualizationしているのが面白い。次はこういった可視化技術の論文を読んでみたい。

まとめスライドはこちら。

The Price is Right Predicting Prices with Product Images_slide

CNNによるセグメンテーション論文:「U-Net Convolutional Networks for Biomedical Image Segmentation」を読んだ

タイトルの通り、CNNを用いて医療画像をセグメンテーションするU-Netというネットワーク構造の論文を読んだ。

2015年に発表されたネットワーク構造だが、その後セグメンテーションでは古典的な内容になっており、いくつか発展形のネットワークも提案されている。

論文のまとめは以下。

U-Net Convolutional Networks for Biomedical Image Segmentation_Slide