自然言語処理と機械学習こそが最強の学問

CSの大学院生が真の最強学問である自然言語処理と機械学習の内容を書いていく予定。時々全然違う分野の記事も書くかもしれない。

自然言語処理と機械学習で消える仕事

機械化やITによって生み出される仕事よりも、それによって奪われる仕事の数が多いということを主張している記事をよく見かけます。現状では、間違いなくブルーカラーの仕事が奪われていて、そしてこれからますますこの傾向が進んでいくと思います。その上、自然言語処理(NLP)や機械学習の進歩によって、ブルーカラーのみならず、ホワイトカラーの仕事もかなり危うい気がします。個人的に消えるか需要が減ると思われる職業をいくつか上げてみました。

1 翻訳や通訳

機械翻訳に関して、市場に出ている製品の精度はあまり実用的ではありませんが、研究ではすでにかなりよい精度を達成しつつあるようです。10年後には、国家間の要人同士の間の通訳といった間違いを許されないような仕事を除けば、文学や小説など、非専門的な翻訳仕事はほぼ完全に消滅すると思います。

 

2 外国語教師

全部ではないでしょうが、外国語教師の一部の仕事は消えると思います。外国語を教わる分野はTOEFLの科目で分類すると、Reading, Writing, Listening, Speakingの4つが存在しますが、Readingは抽象的な意味理解が必要なので、現時点のNLPでは解決できず、教師は必要でしょう (10年後はわからないが)。しかし残りはある程度NLPで代用が効きます。Writingは文法の間違い発見は簡単にできるし、決められたテーマにそって書いてあるどうかも簡単に判別できます。ListeningやSpeakingは音声認識を使えばいくらでも教師の仕事を減らすことはできます。

 

3 記者

主観的な意見を述べる記者は需要が残るかもしれませんが、客観的に情報をまとめるだけの記者の仕事はなくなるのでしょう。twitterとかで流れる情報をキャッチして、リツイート数とかをもとにニュースとしての重要性を判断し、関連するツイートを検索し、自動要約にかければ、ニュースができあがります。同時にそれと関連するツイートのセンチメンタルを分析すれば、大衆?の意見の分布がわかりますから、記者ひとりの主観に左右されずに済むかもしれません。

 

4 法律職

コモンローのような判例を中心とした法律は簡単でないかもしれませんが、大陸法系はある程度体系化されているから、NLP技術で知識抽出や簡単な推論を行うことはさほど難しくはないでしょう。当事者がいま関わっている法律ケースを入力して、関連する法律を検索し、ベイジアンネットワークとかでモデルをつくり、過去の判例をもとにパラメータ推定すれば、普通の弁護士よりよさそうな結論を教えてくれそうな気がします。判例集とかの教師あり学習を十分に充実させれば、弁護士に相談しなくても、合理的な意思決定をすぐにできるのではないでしょうか。

 

5 医療職

法律ほどあからさまではないかもしれませんが、こちらも間違いなく需要は減るでしょう。過去の診察データを十分に集めてみて、実際の病名をターゲットデータとし、症状の言語情報を入力データとして訓練データをつくり、その上言語情報をクラスタリングして機械学習すれば、診断は簡単にできるでしょう。言語情報以外でもの画像情報とか画像認識で医者よりよい診断ができるだろうし、診察医の仕事は減るでしょう。手術する医師もかなり仕事がロボットとかに代用されるから、少なくなるのでしょう。

 

いくつか危ない職業をあげましたが、ほかにも危ない職業はいくらでもあります。 マニュアルの複雑性とかにもよりますが(法律のマニュアルである六法全書とかは難しい)、マニュアルですべてに対応できる仕事はなくなるのは時間の問題だと思います。これらの職業もそうなんですが、これからの時代で生き残るには、機械学習自然言語処理)+その分野の専門知識の両方を備えないと難しいと思います。

 

統計力学と機械学習の似ているアプローチ

最近統計力学の本を眺めていたら、統計力学機械学習のアプローチのいくつかが結構似ていることに気がつきました。機械学習ももともと統計力学からヒントを得ている面があるから、あたりまえかもしれませんが、やはり似た数式が出てくると興味深い気がします。似ているアプローチをいくつかリストしてみました。

1 熱力学エントロピーと情報エントロピー

ボルツマンの公式によると、Wを全状態数とすると、熱力学エントロピーは以下で表せます。

 S=klogW

情報エントロピーはよく確率Piを使った式で定義されるのを見ます。

 I = -\sum_{i} P_{i} log P_{i}

この二つの式は実は結構似ています。いまn個の観測値があるときに、i番目の状態の観測値がPiとすると、それが観測される回数の期待値はnPiになります。このときありうる並び替えの状態数を考えて変換すれば、二つの式が同じものになります。発見時期は前者はボルツマンさんの19世紀、後者はシャノンさんあたりの20世紀半ば。

 

2 カノニカル分布とRestricted Boltzmann Machineとsoftmax関数

この三つのモデルの確率分布は、どれもexp(E)の形を正規化したものになっています。

統計力学の本を読んでいたら、カノニカル分布などが万能すぎて怖い。よくみる方程式が次々と導かれる出てくるし、磁性、結晶、しまいには黒体放射まで出てきます。プランクの法則のあの汚いうつくしい数式がどこから出てくるかずっとわからなかったので、かなりすっきりしました。カノニカル分布はかなり昔からあるモデルであるに比べて、RBMは最近deep learningの波で脚光を浴びてきています。

 

3  イジングモデルと条件付確率場(CRF)

イジングモデルとCRFは両方共似た関数の最適解をもとめます。イジングモデルは隣り合う格子の総合作用を考慮にいれて、全体のハミルトニアンの最小化を測りますが、CRFはとなりあう系列ラベルの総合作用を考慮して、全体の確率の最適解を求めます。

CRFはグラフィカルモデルの一種で、作られてからあまり時間がたっていないし、わりと最近流行っている?手法です。一方でイジングモデルはかなり古いモデルで, Wikiによると1920年あたりにもう発見されています。両方に共通する解法として、ワイス理論(Ising)、平均場近似(CRF)とかがあるようですが、どっちもよくわかりません。

 

結論や思ったこと

1: ボルツマンは偉大な人

2: 量子統計力学とか物性物理学をまじめに勉強すれば、機械学習のいいヒントになるかもしれません。

Kaggleに参加してみた

Kaggleはデータ分析のコンペを実施しているサイトで、企業の実際のデータを分析したり、機械学習系の学会のデータを解析したりするなどさまざまなタイプのコンペがあって、なかなか面白いです。TopCoder SRMとかのアルゴリズム系のコンテストは数時間で終わりますが、こっちは数週間から数ヶ月間続きます。さらによい成績を残せば、かなり賞金が出るものもあります。たとえば、いまやっているMasterCardのコンペで、賞金が10万ドルです。(これをちょっとやってみたかったのですが、rating制限があってできませんでした)

気軽?に始められるコンペのうち、MNISTの手書き数字認識のコンペがあって、指示通りにトレーニングデータとテストデータをダウンロードして、ニューラルネットワーク(NN)で参加してみた。一度目のsubmitで、92%程度の正解率で全体順位1700人1350あたりでした。

参加後にランキングに目を通すと、初めてKaggleのすごさにいくつか気がつきました。まず、参加者全体の平均実力が高い。自分的に92%の精度はそこまで悪くないと思ったのですが、順位は見ての通り下です。つぎに、ベースラインの設定が高い。このコンペではRandom ForestやKNN(k=10)が使われていて、いずれも96%程度の正解率で、俺のNNちゃんが余裕で負けています。最後に、上位者たちのレベルがすさまじい。このコンペでテストに使われているデータは数万件あるはずなのに、上位者10人程度が何と全部正解させている!データのうちかなり書き方が崩れているものもあって、人間ですら100%は絶対無理なのに、全正解者がいることはいまでも信じられません。しかも、一位の人1回めのsubmissionでこれをたたき出してしまっています。もう強すぎてなにも言えない。

このままでは引き下がれないので、NNを進化させて、Autoencoderにしてみました。実装はNNをベースにすればすぐにできるのですが、Autoencoderはパラメータ調整がかなり辛くて、特徴をつかむために一日ぐらいかかりました。最終的にpretrainingで784次元を70次元に下げ、次に普通のNNで70-50-10で計算して、二度目のsubmissionをしました。結果は94%の正解率で、全体順位はちょっとあがったけど、あいかわらず1300ぐらいです。ベースラインぐらいには勝てると思ったのですが、やはり壁があつい。

落ち着いてForumを読んでみると、どうやらこの課題に関しては、普通のNNの正解率はRandom Forestとかに比べるとよくないらしいです。それでもあえてNNで参加している勇者の中に、隠れ層のニューロン数をなんと数百個に設定している人がいました。理由は90年代の論文の中にMNISTデータに対して、隠れ層を500個に設定するといいよと言っているものがあったかららしい。俺の場合は100前後ですら収束に相当時間がかかったのに、500個とか下手すれば一週間ぐらい訓練させなければいけません。そこまで設定するからには、やはり並列処理でがんばるか、GPUを使わないといけないのでしょうか。

とりあえず、いまのAutoencoderはまだ一番簡単なもので、sparseもdropoutもしていないので、バージョンアップしてもう一度参戦します!

ニューラルネットワークの入力正規化について

ニューラルネットワークのすばらしさをさらに体感すべく、有名な手書き文字認識のデータセットMNISTを入手して、実験をしてみました。このデータセットには28*28ピクセルの入力データとそれが指し示す0〜9のターゲット数字が入っていて、ニューラルネットワークの訓練データとしてよく使われています。実験前は、先人たちのように簡単に正解率95%叩き出せるだろうと意気込んでいましたが、ものの見事にまったく動きませんでした。

まっさきに考えられる原因としては隠れニューロン数と学習率の2つで、どちらもさまざまな条件のもとで訓練してみました変えてみたが、誤差がいつもほぼ同じところで止まってしまってしまい、どうやら違うところが原因だったようです。

いやいやデバッグをしてみたら、原因の出処はパラメータの正規化でした。私の最初の実装では、入力がすべて0~1に入るようにして、重みの乱数も0~1に入るようにしました。普通サイズの入力ならそれで良かったのですが、このデータセットの入力は784個もあり、重みとの積和を取ると簡単に大きな数になってしまって、この数が隠れ層で非線形関数にかけられると、すべて限りなく1.0になりました。この状態で、バックプロパゲーションのパラメータ更新は簡単に止まり、結果として学習が動きませんでした。

原因を突き止めたら、あとは結構楽で、積和があまり大きくならないように、乱数発生を調整したら、ちゃんと動きました!

正解率は90%程度しか出ていないのは残念ですが、学習率をまた微調整して、もっとよい正解率になるようにがんばります。

 

ニューラルネットワークの2変数関数近似能力

PRMLによると、ニューラルネットワークは万能近似器で、コンパクトな定義域を持つ任意の連続関数を近似できるらしい。ちょっと信じられないが、実際に調べてみると、英語WikipediaにUniversal Approximation Theoremという記事があって、シグモイド関数を使ったニューラルネットワークでの近似能力がすでに証明されている。

それでも確かめてみないと気がすまないので、最近実装したニューラルネットワークを使って、2変数関数の近似能力を色々と試してみた。

実験時の条件はsigmoidの隠れ層がひとつ、隠れ層のニューロンの数は2〜5、学習率は0.05~0.2で、訓練時間30秒程度に設定している。

すべてのケースでトレーニングデータとテストデータをそれぞれ500個ずつ用意して、実験した。

 

1)恒等写像のケース:

 f(x,y) = x

これぐらいはさすがに簡単にできた。収束速度が爆速だった。

テストケースの結果を2つ乗せると、こんな感じ。

 f(0.3301, 0.1987) = 0.3283

 f(0.6437, 0.9990) = 0.6437

 

2)加法のケース

 f(x,y) = x+y

これも簡単にできた。やはり収束速度が早かった。

 f(0.7511, 0.0781)=0.8289

 f(0.5151, 0.9377)=1.4533

 

3)乗法のケース

 f(x,y)=xy

最初の非線形のケース。最初は隠れ層のニューロンは2に設定して実行したが、ローカルな最適値で止まってしまって、収束しなかった。ニューロンの数を3に増やして、学習率を下げたらとうまく収束した。ただ、収束速度が上の2つの簡単なケースより遅かった。

 f(0.6897, 0.7320) = 0.5093

 f(0.2276, 0.9412) = 0.2138

 

4)すこし難しいケース

 f(x,y) = x^{2}y

上より難しいモデルなので、ニューロンの数が2のときにやはり収束しなかった。3〜5で試してみると、4の時に一番収束が早かった。ただ、それでもいままでで一番収束の速度が遅かった。

 f(0.5022,0.1622) = 0.0423

 f(0.9077,0.0617) = 0.0488

 

結論:

関数モデルが難しくなると、収束に時間がかかり、ニューロン数を増やさなければいけないがことがわかったが、やはりニューラルネットワークの近似能力はすごかった。ただ、パラメータの調整が結構難しい。ニューロンの数と学習率をうまく設定しないと、パフォーマンスがかなり変化することもわかった。遺伝的アルゴリズムあたりを使って設定したらもっと手軽にできるのかな。

時間があれば、もっと難しいケースでも実験してみたい。