右、斜め45度

右斜め45度は、「Done is better than perfect!」の日本語訳のつもり。進んでいれば良しとする精神を大事にしたい。

DeepLearningというニューラルネットワークの進化と、今後やってみたいこと

僕は、2000年前半、ニューラルネットワークを利用した生命情報科学の分析を行っていました。

ざっくりいうと、蛋白質A〜Zまでが、複雑に相互作用しあって、それこそ、連立方程式が100本連なって(例えば、2A+B→Cの反応が1sで進むとか、C+1/10 D→Aの反応が2Sで進むとか)その結果、蛋白質A〜Zの物質量が時系列によって変化します。目的は2つありまして、

というものです。

そのような大義名分のもと、蛋白質A〜Zの中で測定可能な物質の濃度を教師データとして、内部の相互作用を推定するということを、ニューラルネットワークを使って行ってました。ぶっちゃけ大義名分はどうでもよくて、僕は、ニューラルネットを含めた機械学習にはまったわけです。

機械学習のツボは、「表現したい関数(入力と出力の関係)を、うまく表現しつつ、その中ではシンプルに表現すること」ということにつきます。一番シンプルは線形(直線)です。で、複雑さが増していくというのは、非線形性(曲がってること)が増えるということです。つまり、X^2とかLogとかが増えれば増えるほど、あるいは、関連する式が増えれば増えるほど、複雑ということですね。で、一つの前提が置かれるわけです。世の中の事象は同じように表せるならシンプルな方が美しいので本質的であろうというものです。例えば、上記の蛋白質の例でいえば、同じように蛋白質Aの濃度を表せるのであれば、Aが変数に入ってる式(2A+B→C、C+1/10+D→A)が100本連なるより、2本の方が簡単ですし、本質的というわけです。

ニューラルネットの欠点としては、あまりにも自由に表現出来すぎる(どんな複雑さも表現できる)ので、必要以上に非線形になってしまうという欠点や、学習がいつまでたっても終わらないというものがありました。
一方で、サポートベクターマシーンなどは直線しか引けないので、学習が簡単(でも間違いやすい)でした。

僕の知識はそこで終わっていたのですが、強かにニューラルネットワークは進化していました。

グーグルや百度が注力する「ディープ・ラーニング」とは何か?(小林 雅一) | 現代ビジネス | 講談社(1/4)

正直びっくりしました。画像認識、音声認識、化合物の活性予測などで使われていて、Googleが目をつけて買収したというくらいじゃないですか。で、8段もの深い階層の隠れ層を持っていて、学習しているというじゃありませんか。その肝となる技術というのを少しピックアップしようと思います。

Greedy Layer-wise Training

ある入力と出力を紐付けるような学習を行う場合は、back propagationと呼ばれる方法を利用して出力側の誤差を逆向きに伝搬させ、内部パラメータを調整する方法がとられていました。しかし、その層の数が多くなるほど、更新部分が拡散してしまってうまく更新できない問題が知られていました。

つまり、元のパラメータの規模感も分からないまま教師あり学習をやるので、初期の学習が偏ってると偏った学習になる」「また、その際に、全ての階層のパラメータを一気に修正に行くので、収拾がつきにくいということです。

Greedy Layer-wise Trainingの肝は、「最初に教師なしデータを利用して特徴量抽出(次元を減らす)に努める(その後、backpropagetionを使って微修正するイメージ)」「また、各レイヤーのパラメータを一層ずつ調整していくので収拾がつく」ということ。

次元を減らすのには、最初に一番はじめの層を学習する場合は入力を変換し、さらに逆変換をかけ元の入力と比較し、一致するようにパラメータを更新します。式で書くとxを入力1層目の変換関数をf、その逆変換の関数をgとした時、g(f(x))を計算します。そして、xとg(f(x))が一致するようなパラメータを学習します。この時、パラメータが十分な数があれば元の入力をそのまま返すような関数が学習されてしまうのですが、パラメータに何らかの正則化をかけて学習することにより、少ない表現力でなんとか入力の情報を表現するようにパラメータは調整され、結果として入力情報をもっともうまく表現できるような関数が抽出されるというわけです。

あれっすかね、イメージは、ぼやーっと一枚の猫の絵を見て、こことここが大事なんだろうなとあたりを付けておくステージと、たくさんの猫を見てその仮説を正していくステージを分けたかんじです。


Dropout

Dropoutでは学習時にパラメータのいくつかを使わないようにします。例えば間の層(隠れ層)の50%のパラメータを入力データ毎にランダムに使わないようにし、それで学習します。そして推定時には各パラメーターからの出力結果を50%にして推定します。Hintonらの解説によれば、各データ毎に違うモデルを利用して学習し、推定時にはあたかも全部の結果の 平均を使っていることに対応しているので過学習しない(random forestやbaggingににている)と説明しています。

これは、いつも脳みそのの一部しか使ってない(で、使う場所を変えるだけ)ってことかと思います。コナン君が問題を解決するときも別のInputを受けた時にひらめくわけで、それも使う場所が変わったので、構造がひらめいた(入力と出力がつながった)ってことだと思います。

今後やってみたいこと

こうなってくると、俄然やってみたいのが、昔からの夢だった「小説・物語の構造化・特徴量抽出」です。僕は、昔から、どういう要素が面白い小説には重要なのか、それは何パターンあるのか、を知りたかったのです。それは、自分に芸術的なセンスがないことの裏変えしかも知れないのですが。

Deeplearningによって、いわゆる次元を低くても表現できるというのが可能になったわけなので、見込みはありそうです。
後は、どういう初期データにするかが肝かなと思ってます。

引き続き、考え続けたいと思います。