書評:The Data Science Design Manual

少し前に「The Data Science Design Manual」という本を読んだので紹介します。

この本の著者はAlgorithm Design Manualを書いた、Steven S. Skiena先生であり内容自体はデータサイエンスの基礎的な内容を網羅的に説明した本です。非常にユーモアがある書き方で、データサイエンスの勉強はもちろん純粋な読み物としても楽しめる部分があります。
どのくらいユーモアがあるかというのは序文のCaveatという部分を読めばわかります。以下はその部分の引用です。
「It is traditional for the author to magnanimously accept the blame for whatever deficiencies remain. I don’t. Any errors, deficiencies or problems in this book are somebody else’s fault, but I would appreciate knowing about them so as to determine who is to blame.」

技術的な内容は数式を使ってしっかりと解説されており、ところどころにSkiena先生が実際に体験したデータ分析する上での罠や手法の説明を書いた「War Story」という節が挟まれており、読んでいて飽きないように工夫されています。
内容自体はデータの前処理から可視化、モデル作成と一通り書かれており、統計や線形代数の基本的な内容もカバーされているので1冊で基本的な部分が簡潔に学べるようになっていました。

このような本の類書は最近非常に増えており、内容的には大体理解している部分が多かったが、系統立てて読んでみると知識の抜けている部分が分かるので、英語に抵抗がなくて何か一冊データ分析の本を選ぶなら、読み物として面白いので割とおすすめできる本でした。


「欠測データ処理」を読んだ

データ分析の前処理における重要なポイントの一つとして、欠測データをどのように扱うかがある。
入門向けの記事だと単純に平均値や0埋めなどを施して、そのまま機械学習モデルに投入する例が多いが統計学的にはこのような単一代入法と呼ばれる手法はバイアスを生じる。
そこで使われるのが多重代入法と呼ばれる手法である。

多重代入法について詳しく知りたかったので、評価の高い「欠測データ処理」を読んだ。

本書では欠測データの種類、単一代入法・多重代入法の理論的な側面とともにRによる実際のコード例も紹介されている。
例えば、一口に欠測データといってもその生成メカニズムとしてMCAR, MAR, NMARなどの種類が存在する。ある調査では経験的に完全にランダムに欠損が生じているデータ(MCAR)は公的統計の調査においては約10~20%程度という結果もある。
MARによる欠損は単一代入法ではバイアスが生じるため、多重代入法を利用するべきである。多重代入法とは欠測データの分布から独立かつ無作為に抽出されたM個のシミュレーション値によって欠測値を置き換えるものである。

最後の「おわりに」の章にある3つの疑問に対する回答が、なぜ多重代入法を使うのかという説明として非常にわかりやすかった。「なぜ複数回の代入が必要なのか」という疑問に対して、複数回の代入を行うことで推定に関する不確実性を代入されたデータに取り入れることで、標準誤差を適切にすることができると書かれている。これによって母集団パラメータの推定を妥当なものとすることができる。

MITのLex Fridman氏によるAIポッドキャスト

MITのresearch scientistである、Lex Fridman氏がAI関連のポッドキャストを始めたそうです。AI関連のBig-pictureについて著名なゲストと話すとのことです。https://lexfridman.com/ai/

少し聞いてみましたが、音質も良く英語も分かりやすい方だと思うのでオススメできそうです。以前、データサイエンス関連のポッドキャストをまとめた記事も書いているので、そちらも参考にしてください。

Lex Fridman氏はMITでDeep Learningによる自動運転に関する講義などを行っており、授業の様子はYouTubeで公開されています。

直感 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と比較して、あまり実行時間が増えないようになっている。

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

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を使うべきということを学んだという話でした。