ディープラーニング
これは 人工知能アドベントカレンダー の16日目の記事です。
最近もっとも注目を集めている Deep Learning について見ていきましょう。なお、ニューラルネットワークとディープラーニング、人工知能との関係については、以下のエントリも併せてご覧ください。
前回までのおさらい
前回はパーセプトロンとバックプロパゲーション(BP)について説明しました。
パーセプトロンは次のような構造をとっています。
これだけでもある種の学習は可能でしたが、一方で原理的に学習が不可能な問題があることがわかりました*1。
そこでバックプロパゲーションが登場します。これは結果だけ見れば簡単な話で、パーセプトロンをもうひとつくっつけて3層構造にしたというものです。
これで非線形な問題も扱えるようになりました。原理的には中間層(真ん中の層)のニューロンの数を増やすことでより難しい問題も扱えるようになります(モデルの表現能力が高くなる、というような言い方をする)*2。
さらに、ある種の問題では、中間層のニューロン数をそのまま増やすのではなく、もうひとつ中間層をつけて4層構造にする、またはさらに層を追加して5層、6層構造にすると、よりすくないニューロン数でもモデルの表現能力が上がることがわかっていました。
直感的にも、形式ニューロンを組み合わせることでパーセプトロンができ、パーセプトロンを組み合わせることでバックプロパゲーションができたのですから、そのバックプロパゲーションをさらに組み合わせることでなにかあたらしいことができそうに思えます。
ところがこのアプローチはまったくうまくいかないために、結局バックプロパゲーションは3層のまま扱い、中間層のニューロン数を増やすか、パラメータを工夫するなどの方法でしか対応できませんでした*3。
なぜうまくいかないのか
4層以上のバックプロパゲーション(ニューラルネットワーク)は、潜在的な能力は高そうだという期待はありつつも、どうしてもうまく学習することができませんでした。このためにニューラルネットワークは冬の時代を迎え、その後はSVMやベイジアンネットワーク的な手法、Random ForestやBoostingなどなど様々な優れた手法が登場したこともあり、パーセプトロンとバックプロパゲーションは完全に日陰者となっていました*4。
ライン作業で例える
わかりやすく説明するために、ここではニューラルネットワークを工場のライン作業に見立ててみましょう。
ここでは、素材(入力)が送られてくるので、最初の工程(ネットワークの1層目)で簡単な加工をし、次の工程(2層目)に送ります。2層目は前の工程から送られてきた製品をまた加工して次の工程に送ります。これを繰り返していくと、なにかしらの商品が完成して、出力として出てくる(出荷)というわけです。
パーセプトロンの場合は、最初は各工程の作業者はランダムに動くので、メチャクチャな製品が出力されてきます。
この商品を見て、「本当に欲しい物はこういうものなんだ」というお手本を見せると、各作業員が「なるほど、これは自分が作ってるものとずいぶん違うぞ。もっと似たものを作れるようにしよう」と動きを改めます。これをどんどん繰り返していくと、次第にどの工程でも適切な作業をしてくれるようになり、望む製品が出荷されてくる、というわけです。
多層にするということは、工程の数を増やすということです。なぜ工程を増やすとうまくいかないのでしょうか。
出力されたきたものと、実際に作りたいものを比べて、どれくらい工程を修正すればいいのかは、工程が少ないときはとても簡単にできます。自分しか作業する人間がいなければ、可能な限り自分だけでなんとかすればいいので、その工程の限界まで似せるように働けばよいだけです。
ところが、複数工程からなっていると、それぞれの役割分担という今までにないタスクが増えます。理想的には、各工程が適切に作業内容を分割・分担して、どの工程でもそこそこに働き、後の工程は前の工程の内容をうまく組み合わせることでより良い製品ができるようになるべきです。ニューラルネットワークはとても表現能力が高いので、一番最後にある層だけが頑張って活動して、入力に近い層は「どれくらい違うか」の情報が上がってこないので相変わらずランダムに作業しているといったパターンに陥りやすくなります。
最終工程が半端に優秀なために、ネットワーク全体が最終工程(最後の層)だけで学習を進めていってしまって、多層にした意味が薄れてしまうのです。これを Vanishing Gradient Problem といいます。
ここをなんとかして、「どの層もきちんと学習して、各層はもちろんネットワーク全体のパフォーマンスを上げる」ようにできればよいのですが、その方法は長らく謎でした。もちろんどの層でどれくらい学習すればいいのかを人間が決めてあげればそれなりに動くこともあるのですが、人間が一々ルールを決めなくても良いようにするのが機械学習なのに、それを人間が教えなければいけないのは本末転倒です。適切な役割分担を自動的に学習させなければなりません。
Deep Learning
この解決策はわかってしまえばとても簡単で、まず1層だけで学習し、学習が終わったら2層目を追加して2層目だけを学習し、それが終わったら3層目だけを学習し…というように1層ずつ学習させて、それが全て終わったらすべての層をつなげて、改めてひとつのネットワークとして学習させればよかったのです*5。
さて、Deep Learningによってなにがそんなに良くなったのでしょうか。Deep Learningでは層を多段構成にすることで、意味のある階層構造を自動的に獲得できるようになったというメリットがあります。
Deep Learning (CNN) による特徴抽出の様子。最下段は1層目のニューロンが反応する刺激(画像)。まずどの画像でも単純な線が抽出され、それらが組み合わさって目やタイヤや脚などのより複雑な部分が抽出され、最後にそれらが組み合わさって顔や車を表現できるようになっている*6
従来、このような特徴抽出は問題ごとに人間が考えていたのですが、DeepLearningによってこの部分はすべて自動的に獲得できるようになり、かつそのほうが人間が長年にわたって試行錯誤を繰り返してきたものより優れていたのです。
また、このような構造は脳の視覚野の働きと非常に似ている部分があり*7、一次視覚野では簡単なエッジ(線)に反応するニューロンがあり、二次視覚野では複数の線を組み合わせたもう少し複雑なパターンに反応するニューロンがあり、さらにIT野までいくと、顔だけに反応するニューロンがあったりします。これはまさしく上記の画像と同じような構造です。
Deep Learningの細かい理論や数学的なモデルについてはここでは細かく触れませんが、前回と今回とで「ニューラルネットワークとはなにか?」「なぜ多層化するのか?」「なぜ今まで多層化できなかったのか?」「Deep Learningはなにが優れているのか?」などといったところはお分かりいただけたかと思います。
*2:モデルの表現能力が高くなればより難しい問題も解けるのなら、どの問題に対しても十分に多いニューロンでBPをすればいい、と思えるかもしれない。ところがモデルの表現能力が必要以上に高くなると、「与えられた学習データはうまく分類できるが、そうでないデータはまったく対応できない」状態に陥りやすくなる。過去問は完璧に解けるが試験本番ではまったく結果を出せない学生と似た状態である。これを過学習とよぶ。また、無駄に多いニューロンは、より多くの計算資源、より多くの学習データを使う
*3:ただし、局所的に結合するようなネットワークだとうまく学習できることは早い段階でわかっていた。これをConvolutional Neural Network (CNN) と呼ぶが、当時はマシンスペックが足りないとか、学習データが十分にないなどの理由で注目はされなかった。これは2010年台になってからDeep Learningとして一躍注目を集めることとなる
*4:あまり注目されないがパーセプトロンやバックプロパゲーション(他にはRBFネットワークなど)には他と比べた優れた点があった。SVMやBoostingが主に「分類」、つまり顔かどうかとか、イヌかネコかといった問題に着目していたのに比べ、ニューラルネットワークでは任意の関数を近似する能力がある、という比較的珍しい能力があった
*5:これはかなり簡単に書いてあって、実際はスパースネスを導入したり、次元圧縮をしたりして、より適切な表現ができるようにしなければならないし、学習方法についても活性化関数を旧来のSigmoidからReLUに変えるなど、全体的なアーキテクチャ変更とともに、細かいテクニックも多数導入することによって達成された。特にスパースネスの導入はDeep Learningに限らず極めて重要だが、もう一日アドベントカレンダーが必要になるのでここでは適当にぼかしながら説明している
*6:www.cs.stanford.edu/people/ang//slides/DeepLearning-Mar2013.pptx
*7:というよりは、CNNは人間の視覚野の一部を参考にしつつ設計されているので、似ているのは当然ともいえる