Sideswipe

情報工学、計算論的神経科学など、真面目なこと書くブログ。お仕事の話は Twitter: @kazoo04 にお願いします。

視覚野のモデル

これは 人工知能アドベントカレンダー の18日目の記事です。

今日からは、脳の代表的な部位に対して、いかにして計算機で再現するかといった部分を見ていきます。

視覚野を再現するには

視覚野の働きを再現するときの主な方針としては、以下のようなものが挙げられることが多いようです。

  • レチノトピーを再現
  • 階層的な特徴抽出
  • スパースネス

言うまでもなく、この3つで視覚野のすべてを説明できるわけではありませんが、概ね悪く無い結果が得られるので方針としては悪くありません。

視覚野のおさらい

まず動物(主に哺乳類)の視覚野をおさらいしましょう。アドベントカレンダーでは7日目で扱いました。必要に応じて併せてご覧ください。

t.co

特に大事なのは、特定の視覚刺激にだけ反応するコラムという構造が集まっていること、隣のコラムは少しだけ違う刺激によく反応する、言い換えると似たような処理をするコラムが集まっているということがまず挙げられます。

f:id:kazoo04:20131217175228j:plain
一次視覚野のコラム構造(再掲)

もう一つは、このようなコラムの集合がさらにひとかたまり(領野)となっていて、各領野は階層的な処理をしているということです。

f:id:kazoo04:20151119013115p:plain
腹側皮質視覚路の図(再掲)

V1(一次視覚野)では単純な線にしか反応せず、あるコラムは水平な線、そのすぐ近くのコラムはたとえば10度傾いた線、遠くにあるコラムは90度傾いた垂直な線に強く反応する、といった具合です(下図)*1。V2ではV1から入力を受けて、線の組み合わせ、つまりL字型の模様(コーナー)とか、もう少し複雑な例だと渦巻きのような形に反応するコラムがあります。

f:id:kazoo04:20131217175325j:plain
特定の刺激にのみ強く反応するニューロンの様子(再掲、Hubel, 1968)

IT野になるとさらに複雑な刺激に反応するコラムが現れ、たとえば手ならどのような角度で見ても、実写でもイラストでもとにかく手であれば反応するものや、顔に反応するものが現れます。このように、視覚野は低次の領野では単純な図形しか処理できませんが、これを繰り返していくことで少しずつ複雑なものが認識できるような階層構造になっています*2

レチノトピーの再現

レチノトピーや方位選択性をもった処理をコンピュータで再現するにはどうしたらいいのでしょうか。実は視覚野はかなり古くから研究されていることもあって、コンピュータで再現する(ことによってなにか有益なことに役立てる)アプローチも活発に研究されてきました。

たとえば、一次視覚野の反応はガボール(Gabor)関数でとてもよく近似できることが1987年には既にわかっていました*3

1982 年にも Kohonen が Self Organizing Map (自己組織化写像、SOM) を提案しました。これは一次視覚野を観察して得られた知識から、大幅な簡略化を加えつつも自己組織的に脳のコラム構造のようなものを生成できます。また、SOMは入力として画像でも音声でも与えることができ、次元数が多くても良いので制限が少なく、かつわかりやすいモデルです。

他にも、Yangqing Jia と Sergey Karayev が提案した Self-Organizing Sparse Codes では、SOMを改良して一次視覚野に似たマップを得ることができています。

f:id:kazoo04:20151217233648p:plain
Self-Organizing Sparse Codes に画像を学習させた結果。エッジに特異的に反応するようなコラム(SOMの場合はノードと呼ぶ)が得られており、かつ物理的に近くにあるノードは似たような画像によく反応するようになっている(Yangqing, 2010)

他の手法としては、Topographic Independent Component Analysis (Topographic ICA, TICA) が挙げられます*4

f:id:kazoo04:20151217234155p:plain
TICAによって得られたマップ。先ほど同様、エッジに特異的に反応するノード(Gaborフィルタで近似できる)が得られており、かつ近くのノードは似た刺激に反応する。

スパースネス

スパースコーディング(sparse coding) と呼ばれる方法が見つかってからは、この考えが非常に重要であることがわかって様々なところで使われるようになりました。神経科学でもそうですし、Deep Learningでも使われているこの概念について簡単に説明します。

スパースとは少数である、疎であるという意味ですが、ここでいうスパースコーディングは、なるべく少ない数の神経細胞の活動によって、なるべくたくさんの信号をなるべく正確に表現できるようにする、ということです。

下の図を見てください。左上は自然画像(写真)です。ここから、今まで見てきたエッジに反応するコラム構造のようなものを得ます(図右上、ここではこれを辞書と呼ぶ)。さて、次に図下段の一番左にある模様を再現したいとします。スパースコーディングでは、なるべく少ない辞書の組み合わせでこれを再現しようとします。ここでは、3つの辞書*5を選んできて足すことで近似できます。

f:id:kazoo04:20151218000240p:plain
スパースコーディング*6

なぜわざわざそんなことをするのでしょうか?たとえば、フーリエ変換やウェーブレット変換と呼ばれる手法でも、画像をたくさんの要素(波)に分解して、それを組み合わせて任意の画像を表現するということは行われます。しかも、こちらのほうがたくさんの基底を組み合わせてなるべく正確に表現しようとします。正確に表現できるならそれに越したことはないように思えますが、なぜスパースコーディングがそんなに重要なのでしょうか。

これにはいくつかの理由があります。ひとつは、脳の神経細胞数は有限なため、なるべく少ない神経細胞で様々な情報を表現できるようにしたほうが得だということです。極稀にしか使わないような専用の神経細胞を大事にとっておくよりは、たとえ少し精度が落ちてもあらゆるシーンで利用可能な反応的な神経細胞を用意しておいたほうが良いというわけです。もうひとつの理由は、どの情報も少数の神経細胞の発火で表現できるのですから、当然省エネになります。これは生存する上で非常に大切です。いくらパワフルな処理が可能でも、エネルギーの供給ができなければ餓死してしまいます。
最後の理由は、複雑な情報をより明確な形で表現できるということです。どのような情報でも少数の神経細胞しか発火しないということは、ある種の情報抽出ができているということですから、一見複雑に見える入力からその本質的な部分を取り出していると考えることができ、そうすると階層的な情報処理にも役立ちます*7 *8

階層的な情報処理

ここまでアドベントカレンダーを見てきた方にとっては、既にDeep Learningで階層的な情報抽出・情報処理がいかに大事かは既におわかりかと思います。

f:id:kazoo04:20151215220703p:plain

段階的に情報を処理することによって、ネットワーク全体の能力をフルに使うことができるのです。実はスパースコーディングはこの段階的な処理に欠かせない概念で、Deep Learningの発展にも大きな役割を果たしました。この辺りの話は、過去のアドベントカレンダーを参照してください。

kazoo04.hatenablog.com

kazoo04.hatenablog.com

また、そもそも少しくらいコラム構造が正確な働きをしていなくても、階層的な構造をしているということ自体が視覚の認識において非常に重要な役割を果たしていることがわかっています*9。つまり、単に性能アップのために多層にする、というわけではなく、情報処理の観点から多層化は必須の存在であるといえそうです。

まとめ

今回は視覚野のモデルについて、現在研究されている部分を広く浅く紹介しました。視覚野、特にV1については完璧には程遠いにしろそれなりに近い結果が得られるモデルができていることや、Deep Learningの成功によって遠回りではありますが実践的な裏付けもされてきています。視覚野で得られた知見を活かすことで他の領野の機能を模倣する、というアプローチも十分ありえます。今後も活発な研究がなされる分野です。

*1:なぜ近くのコラムは似ている入力に反応するのか、という点については、回転や平行移動に対して頑健な処理を行うためだと考えられている。たとえば、V1の超複雑型細胞は、受容野のどの場所に線が提示されても、その線の傾きさえ合っていれば反応する。この超複雑型細胞の働きは、ある特定の場所のコラムの入力を束ねることで実現できる

*2:Quiroga RQ, Reddy L, Kreiman G, Koch C, Fried I. Invariant visual representation by single neurons in the human brain, Nature. 2005 Jun 23;435(7045):1102-7.

*3:Judson P. Jones and Larry A. Palmer, An Evaluation of the Two-Dimensional Gabor Filter Model of Simple Receptive Fields in Cat Striate Cortex, Journal of Neurophysiology, Vol. 58(6), pp. 1233–1258, 1987.

*4:Aapo Hyvärinen, Patrik O. Hoyer, and Mika Inki, Topographic Independent Component Analysis, Neural Computation 13(7):1527-1558, 2001

*5:正確には基底と呼ばれるもの

*6:Yu an Ng. Feature learning for image classification, ECCV10 のスライド

*7:Vinje WE, Gallant JL. Sparse coding and decorrelation in primary visual cortex during natural vision. Science. 2000 Feb 18;287(5456):1273-6.

*8:Olshausen BA, Field DJ. Sparse coding of sensory inputs. Curr Opin Neurobiol. 2004 Aug;14(4):481-7.

*9:A Saxe, PW Koh, Z Chen, M Bhand, B Suresh, AY Ng, On random weights and unsupervised feature learning, ICML2010

遺伝的アルゴリズム

これは 人工知能アドベントカレンダー の17日目の記事です。

Advent Calendar 2015ランキング - Qiita によれば購読者数ランキングで3位になったそうです。最近は内容があまり充実していませんが引き続きよろしくお願いします。

そろそろ機械学習の話も終わりにして、次回からは具体的に脳の機能をいかにして再現するかという点に焦点を絞っていきますが、その前にすこし趣向を変えて、遺伝的アルゴリズムについて説明します。

遺伝的アルゴリズムとは

遺伝的アルゴリズム(genetic algorithm, GA)は、生命の進化を模して計算を行うことで、従来より柔軟な処理ができるのではないかという発想から生まれたものです*1

生命は最初はごく単純な存在でしたが、非常に長い時間をかけて少しずつより環境に適応するよう進化してきました。「進化」という方法によって、最初は海を漂うタンパク質程度でしかなかったものが、泳ぐようになり、光合成するようになり、空を飛んだり、木に登ったり、さらには二足歩行をして月に行ったりすることができるようにまでなったことを考えれば、進化そのものをコンピュータで扱うという発想は自然なものといえます。

そんなわけで、1975年には John Henry Holland によって早くも遺伝的アルゴリズムが誕生しました(タイミング的には、パーセプトロンより後で、バックプロパゲーションよりは前、といったところ)。

初期の遺伝的アルゴリズムは効率の点からもはや使われていませんが、その改良アルゴリズムは今でも現役で使われています。有名な例だと、新幹線のN700系のノーズ形状は遺伝的アルゴリズムで設計されたようです。他の例としては、昔は巡回セールスマン問題*2の近似解法としてかなり盛んに研究されました。

遺伝的アルゴリズムが解けるのは基本的に組合せ最適化と言われる問題で、この世のありとあらゆる問題が解けるわけではありませんが、それでも強力な手法です。

特徴

遺伝的アルゴリズムが優れている点は、メタヒューリスティクスといって、「完璧ではないにしろ、幅広い問題*3に対して汎用的に適用できる」というものが挙げられます。
普通、アルゴリズムといえばある特定の問題を解くための手法であって、並び替えなら並び替えの、データ検索ならデータ検索の専用アルゴリズムがあるわけですが、遺伝的アルゴリズムは比較的どの問題を解かせてもそこそこ良い解を求めることができます。誤解を恐れずに言えば、万能というわけです*4

そのため、「一体どうすれば解けるのか解法がわからないので、完璧な解は諦めて、遺伝的アルゴリズムでそこそこ良い解を求めよう」といったことができるのです。

アルゴリズム

進化を模倣するなんてさぞ複雑なアルゴリズムなのだろうと思われますが、実際のところその概念は非常にシンプルです。
ここではわかりやすく  x^2-6x+9=0 のときの x の値を求めましょう。
まず、解の候補をいくつか生成します。初期のビットストリング型GAと呼ばれる、値を2進数で扱うものにして、とりあえず4bitで表現することにします。ランダムに4つくらい解の候補を生成しましょう。カッコ内はわかりやすさのための10進数表記です。

  • 0000 (0)
  • 0101 (5)
  • 1100 (12)
  • 1101 (13)

この解の候補を個体(individual)と呼びます。つまり、ひとつひとつが生命(遺伝子)だと考えるわけです。この個体を進化させて正しい解を求めるのが遺伝的アルゴリズムの目的です。この後の操作は

  • 選択(淘汰)
  • 交叉
  • 突然変異

の3つを繰り返すだけです。

選択

選択(selection)は、今の個体がどれくらい良いかを見ます。現実世界で例えるなら、環境に適応していない個体は厳しい自然界を生き残れず死ぬ可能性が高く、環境にうまく適応できる個体は生きて子孫を残す可能性が高くなるわけです。その適応度を測定します。ここでは、さきほどの  x^2-6x+9=0 の x に値を実際に当てはめてみましょう。

  • 0000 (0) → 9
  • 0101 (5) → 4
  • 1100 (12) → 81
  • 1101 (13) → 100

この世界では値が0に近い個体ほど優れた生命体なので、どうやら 1100 と 1101 の個体はイマイチのようです。逆に0101の個体はかなり適応度が高い(0に近い)ことがわかります。

交叉

交叉(crossover)はふたつの個体から新しい個体(子供)を誕生させる操作です。さきほどの結果を見ると、 0000 の個体と 0101 の個体が良さそうなので、この2つを選んで子供を作りましょう。交叉の仕方は様々ですが、今回は一点交叉という方法をとりましょう。

適当なところで遺伝子を二つに分割して

  • 0000 → 00 | 00
  • 0101 → 01 | 01

入れ替えます

  • 0000 → 0001 (1)
  • 0101 → 0100 (4)

これが新しい子供です。たいてい2つの個体から2つの子孫ができます。このままだと個体が無限に増えていってしまうので、適応度の低い 1100 と 1101 の個体には死んでもらいましょう。結果として、以下の4つの個体が生き残ります。

  • 0000 (0) ←親
  • 0101 (5) ←親
  • 0001 (1) ←子
  • 0100 (4) ←子

突然変異

突然変異(mutation)は文字通りある個体の遺伝子に突然変異を起こします。ここではどれかひとつの個体を選んで、遺伝子を1つ書き換えてしまいましょう。

  • 0000 (0) → 0010 (2) に書き換え
  • 0101 (5)
  • 0001 (1)
  • 0100 (4)

突然変異は大抵あまり良くない個体が生まれるので一見デメリットしかないように思えますが、個体の多様性が維持でき、後々良い解が出やすくなるというメリットがあるので基本的に必須の操作です*5

これで1ステップ完了です。あとは解が得られるまで、つまり 0011 (3) の個体が誕生するまで計算を繰り返します*6

より複雑な例

先の例は簡単すぎましたが、実際にはどのように設計すればよいのかわからないようなものであっても、「どれくらい良いか」の基準だけがあれば遺伝的アルゴリズムで解を探索できるので、以下の動画のように適当な身体と間接を与えてうまく移動できるような仮想生命体を作ったりすることができます。

www.youtube.com

www.youtube.com

まとめ

実際の生物も、どのような性質があればこの世界で上手く生き残っていけるかという正解がわからない環境でうまく適応していく必要があります。このようなときに、効率は悪いものの前提知識を必要とせずに適応していける遺伝子情報を子供に伝えて進化していくという方法はかなり強力です。

人間は脳の発達によって、後天的に獲得できる能力が非常に多いものの、たとえば反射や快・不快の基準、もっとミクロに言えばどのような神経細胞がどのような場所に配置されどう繋がるのかといったものは当然先天的なものであって、長年自然界に適応していった結果です。

人工知能、汎用人工知能を作る上でも、必ず本能に近い部分を作る必要は出てくると思われますから、このような特別な仮定をおかずに汎用的に最適解を探索できるようなアルゴリズムは少なくとも部分的には確実に必要になるでしょう。

*1:他にも遺伝的プログラミングや人工免疫システムなど色々な手法があり、総称としては進化的アルゴリズム(evolutionary algorithm, EA)や進化的計算(evolutionary computation)と呼ばれるが、ここでは遺伝的アルゴリズムだけに絞って説明する

*2:ある地点から出発して、特定の地点を1回ずつ訪問して、またスタート地点に戻ってくるようなときの最短経路を求める問題。具体的には郵便局員がすべての訪問先を回ってまた郵便局に帰ってくるような問題

*3:とはいっても主に組合せ最適化が対象になる

*4:ノーフリーランチ定理(no free lunch theorem)といって、どんな問題も完璧にできるアルゴリズムは存在せず、汎用的なアルゴリズムは幅広い問題が解ける一方で、特定の問題だけを見ればそれ専用のアルゴリズムには勝てない。万能ナイフはいろいろな状況で使えるが専用器具に比べるとどの機能も中途半端なのと似ている

*5:局所解に陥らないように探索範囲を広げる効果がある

*6:大抵はもっと複雑な問題を扱うため、どんなに繰り返し計算してもピッタリの解が得られない、またはそもそも最適解がわからないことが多いので、十分な数繰り返したら適当なところで計算を打ち切ったり、似たような個体しか生まれなくなったところで打ち切ったりする

ディープラーニング

これは 人工知能アドベントカレンダー の16日目の記事です。

最近もっとも注目を集めている Deep Learning について見ていきましょう。なお、ニューラルネットワークとディープラーニング、人工知能との関係については、以下のエントリも併せてご覧ください。

kazoo04.hatenablog.com

前回までのおさらい

前回はパーセプトロンとバックプロパゲーション(BP)について説明しました。

パーセプトロンは次のような構造をとっています。

f:id:kazoo04:20151007200055p:plain

これだけでもある種の学習は可能でしたが、一方で原理的に学習が不可能な問題があることがわかりました*1

そこでバックプロパゲーションが登場します。これは結果だけ見れば簡単な話で、パーセプトロンをもうひとつくっつけて3層構造にしたというものです。

f:id:kazoo04:20151007200113p:plain

これで非線形な問題も扱えるようになりました。原理的には中間層(真ん中の層)のニューロンの数を増やすことでより難しい問題も扱えるようになります(モデルの表現能力が高くなる、というような言い方をする)*2

さらに、ある種の問題では、中間層のニューロン数をそのまま増やすのではなく、もうひとつ中間層をつけて4層構造にする、またはさらに層を追加して5層、6層構造にすると、よりすくないニューロン数でもモデルの表現能力が上がることがわかっていました。

f:id:kazoo04:20151007200341p:plain

直感的にも、形式ニューロンを組み合わせることでパーセプトロンができ、パーセプトロンを組み合わせることでバックプロパゲーションができたのですから、そのバックプロパゲーションをさらに組み合わせることでなにかあたらしいことができそうに思えます。

ところがこのアプローチはまったくうまくいかないために、結局バックプロパゲーションは3層のまま扱い、中間層のニューロン数を増やすか、パラメータを工夫するなどの方法でしか対応できませんでした*3

なぜうまくいかないのか

4層以上のバックプロパゲーションニューラルネットワーク)は、潜在的な能力は高そうだという期待はありつつも、どうしてもうまく学習することができませんでした。このためにニューラルネットワークは冬の時代を迎え、その後はSVMベイジアンネットワーク的な手法、Random ForestやBoostingなどなど様々な優れた手法が登場したこともあり、パーセプトロンバックプロパゲーションは完全に日陰者となっていました*4

ライン作業で例える

わかりやすく説明するために、ここではニューラルネットワークを工場のライン作業に見立ててみましょう。
ここでは、素材(入力)が送られてくるので、最初の工程(ネットワークの1層目)で簡単な加工をし、次の工程(2層目)に送ります。2層目は前の工程から送られてきた製品をまた加工して次の工程に送ります。これを繰り返していくと、なにかしらの商品が完成して、出力として出てくる(出荷)というわけです。

パーセプトロンの場合は、最初は各工程の作業者はランダムに動くので、メチャクチャな製品が出力されてきます。

f:id:kazoo04:20151215214506p:plain

この商品を見て、「本当に欲しい物はこういうものなんだ」というお手本を見せると、各作業員が「なるほど、これは自分が作ってるものとずいぶん違うぞ。もっと似たものを作れるようにしよう」と動きを改めます。これをどんどん繰り返していくと、次第にどの工程でも適切な作業をしてくれるようになり、望む製品が出荷されてくる、というわけです。

f:id:kazoo04:20151215214512p:plain

多層にするということは、工程の数を増やすということです。なぜ工程を増やすとうまくいかないのでしょうか。

f:id:kazoo04:20151215214536p:plain

出力されたきたものと、実際に作りたいものを比べて、どれくらい工程を修正すればいいのかは、工程が少ないときはとても簡単にできます。自分しか作業する人間がいなければ、可能な限り自分だけでなんとかすればいいので、その工程の限界まで似せるように働けばよいだけです。

ところが、複数工程からなっていると、それぞれの役割分担という今までにないタスクが増えます。理想的には、各工程が適切に作業内容を分割・分担して、どの工程でもそこそこに働き、後の工程は前の工程の内容をうまく組み合わせることでより良い製品ができるようになるべきです。ニューラルネットワークはとても表現能力が高いので、一番最後にある層だけが頑張って活動して、入力に近い層は「どれくらい違うか」の情報が上がってこないので相変わらずランダムに作業しているといったパターンに陥りやすくなります。

f:id:kazoo04:20151215214543p:plain

最終工程が半端に優秀なために、ネットワーク全体が最終工程(最後の層)だけで学習を進めていってしまって、多層にした意味が薄れてしまうのです。これを Vanishing Gradient Problem といいます。

ここをなんとかして、「どの層もきちんと学習して、各層はもちろんネットワーク全体のパフォーマンスを上げる」ようにできればよいのですが、その方法は長らく謎でした。もちろんどの層でどれくらい学習すればいいのかを人間が決めてあげればそれなりに動くこともあるのですが、人間が一々ルールを決めなくても良いようにするのが機械学習なのに、それを人間が教えなければいけないのは本末転倒です。適切な役割分担を自動的に学習させなければなりません。

f:id:kazoo04:20151215214727p:plain

Deep Learning

この解決策はわかってしまえばとても簡単で、まず1層だけで学習し、学習が終わったら2層目を追加して2層目だけを学習し、それが終わったら3層目だけを学習し…というように1層ずつ学習させて、それが全て終わったらすべての層をつなげて、改めてひとつのネットワークとして学習させればよかったのです*5

さて、Deep Learningによってなにがそんなに良くなったのでしょうか。Deep Learningでは層を多段構成にすることで、意味のある階層構造を自動的に獲得できるようになったというメリットがあります。

f:id:kazoo04:20151215220703p:plain
Deep Learning (CNN) による特徴抽出の様子。最下段は1層目のニューロンが反応する刺激(画像)。まずどの画像でも単純な線が抽出され、それらが組み合わさって目やタイヤや脚などのより複雑な部分が抽出され、最後にそれらが組み合わさって顔や車を表現できるようになっている*6

従来、このような特徴抽出は問題ごとに人間が考えていたのですが、DeepLearningによってこの部分はすべて自動的に獲得できるようになり、かつそのほうが人間が長年にわたって試行錯誤を繰り返してきたものより優れていたのです。

また、このような構造は脳の視覚野の働きと非常に似ている部分があり*7、一次視覚野では簡単なエッジ(線)に反応するニューロンがあり、二次視覚野では複数の線を組み合わせたもう少し複雑なパターンに反応するニューロンがあり、さらにIT野までいくと、顔だけに反応するニューロンがあったりします。これはまさしく上記の画像と同じような構造です。

Deep Learningの細かい理論や数学的なモデルについてはここでは細かく触れませんが、前回と今回とで「ニューラルネットワークとはなにか?」「なぜ多層化するのか?」「なぜ今まで多層化できなかったのか?」「Deep Learningはなにが優れているのか?」などといったところはお分かりいただけたかと思います。

*1:非線形な問題は学習できない

*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は人間の視覚野の一部を参考にしつつ設計されているので、似ているのは当然ともいえる

ニューラルネットワークとパーセプトロン

これは 人工知能アドベントカレンダー の15日目の記事です。

今回はニューラルネットワークについて扱います。ニューラルネットワークはかなり歴史が古く、流行ったり廃れたりを繰り返しながら少しずつ進歩を遂げてきました。今日では、Deep Learningによって幅広い層にその存在を知られるようになり、一躍最新のアルゴリズムへと進化しました。ここではそんなニューラルネットワークについて見ていきましょう。

なお、この内容は 人工知能は Deep Learning によって成されるのか? - Sideswipe でも触れているので、かなり重複していますが興味があれば併せて御覧ください。

形式ニューロン

脳が神経細胞のネットワークによって成り立っていることから、これを模倣することで高度な情報処理ができるのではないかと予想するのは自然な流れといえます。マッカロック(McCulloch)とピッツ(Pitts)は、1943年に以下のような形式ニューロン(formal neuron)を提案しました*1*2

f:id:kazoo04:20151007195948p:plain

この図の見方は簡単で、ここでは入力が3つあり、それぞれの入力に対して重みが掛け算されて、その値が閾値を超えていれば出力は1、そうでなければ出力は0となります。
たとえば、入力が1,2,3、重みが0.5, 0.7, 0.9だとすると、1*0.5 + 2*0.7 + 3*0.9 = 4.6 を計算して、閾値と比較するわけです。やっていることは掛けて足して比較するというだけの簡単なモデルです*3

実際の神経細胞は以下のようになっています。

f:id:kazoo04:20151117001007p:plain

いくつかの樹状突起(入力)が細胞体に入っていき、細胞体から1本の軸索(出力)があるという意味では両者はよく似ているといえますが、言うまでもなく神経細胞をかなり簡略化したもので、生理学的な根拠は大幅に削られています。ちなみに出力はコンピュータに扱いやすい0か1かのどちらかです。

f:id:kazoo04:20151117001033p:plain

実際の神経細胞は ニューロンの概要とそのモデル でも触れたように、もっと複雑な挙動をしますが、発火するかしないか(全か無か)の2パターンの振る舞いをするという意味ではやはり似ています。

パーセプトロン

f:id:kazoo04:20151007200055p:plain

こんな足し算と掛け算しかできないものがなんの役に立つのかと思われるかもしれませんが、形式ニューロンは非常に優れており、1958年に Rosenblatt が提案したパーセプトロンは形式ニューロンをいくつか並列に組み合わせてから出力ニューロンで束ねるという2層の構造をとることで、入力と出力のペアを学習することを示しました。

たとえば、2つの入力と1つの出力があるとします。パーセプトロンに対して、入力として1と2を、出力として両者を足した3を与えて、これを満たすように重みを変更します。次に、入力にまた適当な数、たとえば3と5、出力に両者を足した8を与えて学習させます。これを色々な数で学習させたあとに、学習に使わなかった数、たとえば1と5を入力すると、6を出力するようになるのです。つまり、「足し算」を学習したことになります。もちろん掛け算もできるし、平方根を計算することもできます。出力も2つにして、一方は足し算の結果が、もう片方は引き算の結果が出てくるような学習だってできます*4。これはまさに教師あり学習のことです。

パーセプトロンの終焉と復活

パーセプトロンはいかにも「なんでも学習できる」という万能感がありそうな感じで、ものすごく優れた方法に思えます。実際にパーセプトロンはとても流行したのですが、すぐにパーセプトロンでは理論的に学習できない問題が存在することがわかり、しかも悪いことに世の中の解きたい問題は大抵パーセプトロンでは解けないタイプの問題であることもわかりました。具体的には、教師あり学習の項で触れた、「線形分離可能な問題」しか解けなかったのです。そんなわけで期待していたほどの活躍ができないパーセプトロンの研究はすっかり廃れてしまいました。

f:id:kazoo04:20151007200113p:plain

約30年後の1986年、今度はラメルハート(Rumelhart)によってパーセプトロンを改良したバックプロパゲーション(Backpropagation, BP)が発表されました*5。これは上図のように、2つのパーセプトロンを合体したような形になっており、新しく出来た真ん中の層を隠れ層(hidden layer)と呼びます。

実はこれだけで先ほどの「線形分離可能な問題しか解けない」という制限を突破して、非線形分離可能なモデルになります。パーセプトロンは重みを調整しなければならないところが1層だけなので簡単にどれくらい調整すればよいかが求まるのですが、この場合は2層あるのでそれぞれの層でどれくらい値を調整すればいいのか決めるのが難しという問題がありました。BPはこの問題に対して誤差逆伝搬と呼ばれる方法を使ってうまく良い重み調整方法を手に入れたため、3層構造でも学習可能になったのです*6

さらなる進化

形式ニューロンを組み合わせることでパーセプトロンが登場し、ある種の問題が学習可能になりました。
パーセプトロンではできなかった問題については、パーセプトロンを組み合わせて3層構造にしたBPでパーセプトロンの制限を超えて様々な問題が学習可能になりました*7

それでは、そのBPをさらに組み合わせて多層にしたら、もっともっと複雑な問題が解けるようになるのではないでしょうか*8

f:id:kazoo04:20151007200341p:plain

ところがこのような複雑なネットワークはうまく学習するのがとても難しいことがわかり*9、理論的に優れた性能が発揮できるということはわかっていても、そもそも学習ができないのでした。

この問題は、Deep Learningの登場まで解決できないまま、ニューラルネットワーク自体が次第に忘れ去られていきます*10

*1:Warren S. McCulloch; Walter Pitts (December 1943). "A logical calculus of the ideas immanent in nervous activity". The bulletin of mathematical biophysics (Kluwer Academic Publishers) 5 (4): 115–133.

*2:マッカロックは神経生理学者、ピッツは数学者であり、異業種のコラボによって生まれたのが形式ニューロンである

*3:形式ニューロンの場合、普通は入力も0,1で、出力も0, 1、出力と閾値は実数であるが、以後紹介するニューラルネットワークでは入出力も実数であることが多いのでそのように紹介した。形式ニューロンの入出力を0と1に固定した理由は、ニューロンの発火モデル(発火するかしないかのどちらかの振る舞いしかしない)を導入したかったためであろう

*4:ここでは任意の自然数を与えているかのように書いているが、実際はパーセプトロンの場合0以上1以下の値しか与えられないので、適当に正規化する必要がある

*5:実はパーセプトロンは完全に廃れたわけではなく、今でもパーセプトロンに似たアルゴリズムが現役で活躍している。というのも、ある種のデータは線形分類器でも十分な精度が出ることがわかったり、線形分類器は過学習しにくいことや、学習が早く簡単なこと、カーネルトリックによって非線形分離可能にすることができるなど色々な応用例が出てきたためである

*6:この説明は簡略化した要約で、かなり正確さが犠牲になっている。バックプロパゲーションアルゴリズムについては様々な解説があるので、興味のある方はぜひ調べてみていただきたい

*7:色々な条件があるが、ざっくり言うと任意の連続な関数が任意の精度で近似可能になった。もっと簡単にいえば、世の中の大抵の問題が学習可能になった

*8:理論的には、3層構造のネットワークでも、中間層が十分な数だけあれば問題がない。ただし、ある種の問題に関しては、層を増やすことでより少ないニューロンで同じ問題を学習できる、言い換えるとより小さいネットワークで複雑な問題が解けることはわかっていました

*9:いろいろな理由があるが、主な壁はVanishing Gradient Problem という、重みを調整したくても適切な重み調整量がネットワーク中に拡散してしまって重みがほとんど変わらなくなってしまう問題があった

*10:とはいっても、SVMニューラルネットワークで表現できるし、Passive Aggressive や AROW, SCW のような、パーセプトロンを改良した(が、もはやニューラルネットワークとはみなされない)アルゴリズムが誕生し、それらは今でも用いられているので、正確には多層のBPを上手く学習するというアプローチが諦められていた、と言ったほうがいいかもしれない

強化学習

これは 人工知能アドベントカレンダー の14日目の記事です。

人工知能アドベントカレンダーも半分以上終わりました。今回は筆者の体調が最近思わしくないため、短めでいきます(後日加筆修正があるとおもいます)。

強化学習(reinforcement learning)は、教師ありでも教師なし学習でもない第3の機械学習アルゴリズムです*1

強化学習とは

強化学習は、

  • エージェント
  • 環境
  • 行動
  • 報酬

が与えられた時に、報酬を最大化するように学習していく(これを方策という)方法です。

f:id:kazoo04:20151214011440p:plain
強化学習の模式図。エージェントは環境を観測して行動を選択する。行動すると環境から報酬が得られたり、罰が得られたり、なにも起きなかったりする。このフェーズを繰り返して、報酬が最大化されるような方策を得ることが目的になる。

昔テレビかなにかで見たイタズラで、「右足を上げるとテレビがつく」ようにして何も知らない人がテレビの前を通ったときにイタズラをしかけるというものがありました。
最初、被験者はテレビが付いたり消えたりするのを不思議そうに見ますが、じっと見てると(両足が地面についてるので)テレビは消えてしまいます。色々試行錯誤したのち、右足を上げて片足立ちすることでテレビが見られることに気づく、というわけです。これは簡単そうで意外と難しい問題で、その時に可能な行動は無数にあるのに、ごく少ない試行回数で「右足を上げておく」というベストな解に到達できるわけです。このときは、「環境」はそのまま実験環境を指し、「行動」は身体を動かすこと、「報酬」は「テレビがつく」ということにあたります。このときの最適な方策は、「右足を上げ続ける」です。「エージェント」はもちろん被験者自身のことです。

動物行動学や心理学などでは、ネズミやネコやサルやもちろんヒトを使って様々な実験がされるわけですが、「ある行動をする(レバーを引くなど)をすると、ご褒美(ジュースや餌やお金)がもらえたり、罰(電流が流れる、お金を取られる)が与えられたりする」タイプの実験が多く見受けられます*2。このような実験を動物に行うと、最初はどうすれば良いことが起きるかわからないので適当に行動し、ある報酬が貰えると「どうすればもらえるのか?」ということを試行錯誤して、最終的にルールに気づきます*3

f:id:kazoo04:20151214011609p:plain
強化学習の具体例。環境は様々な要因からなり、なにをすればどうなるのかはエージェント(ラット)はなにもわからない。何度か経験を繰り返していくと、効率よく報酬のジュースを得ることができるようになる。最適な方策は最初わからないので、とにかく適当に動くしか無い。この場合だと、「ランプが付いている状態でスピーカーから音が出たときにだけレバーを引くとジュースがもらえるが、それ以外のときにレバーを引くと床に電流が流れる」、とかかもしれない。可能な行動は無数にあり、環境も無数の可能性のもとに成り立っているが、動物はこのような不確定要素が多い環境でも素早く最適な方策を得ることができる。

このような学習は、哺乳類はもちろん、脊椎動物全般に見られ、イカやタコなどの無脊椎動物でも見られる*4ことから、進化の初期段階で得られた原始的かつ重要な学習方法だと考えられています。

学習方法

では、このような学習をどのようにコンピュータで実現すればよいでしょうか?強化学習には様々な手法がありますが、ほとんどのアルゴリズムは以下の様な流れになります。

  • 最初はなにをしたらいいかわからないので、とにかくランダムに動いてみる
  • 報酬が与えられたら、「どのような状態のとき」「何をしたか」について、「このときこうしたら良いことがあった」と記憶しておく*5
  • 次からはランダムさは残しつつ、先ほどの記憶を頼りに良くなりそうな行動もしてみる
  • 良くなりそうな行動をしてみて、予想通り報酬が受け取れたら、また「どのような状態のとき」「なにをしたか」を覚える(あるいは強化する)

このようにたくさん経験を積むことで「こういうときに、こうすれば、良いことが起きる」という環境と行動のペアが得られます。これを元に、報酬が最大化されるような方策を得るというのが基本的な考えです。

ここでは、特に有名かつ現在もよく用いられている代表的なふたつの手法、Q学習とActor-Criticを紹介します。

Q学習

Q学習はもっとも一般的に用いられているアルゴリズムで、考え方も簡単です。状態sと行動aと「状態sのときに行動aをしたときにどれくらい良さそうか」Q(s, a)の3つを考えます。

最初は、どのようなQ(s,a)も同じ値かランダムな値にしておきますが、ある条件のときに報酬が得られたらQ(s, a)を更新します。先ほどの図の例で言えば、「ブザーが鳴ったときにレバーを引いたらジュースがもらえた」とすると、Q(ブザーが鳴っている, レバーを引く)の値を大きくします。その後も、「ランダムに動くけど、Q値が高い状態と行動の組み合わせが可能なら、そっちを優先する」ような行動を続けると、Q値がどんどん更新されていき、最終的には良い方策が得られるというわけです。

Actor-Critic

Actor-Criticは他の様々なアルゴリズムとはちょっと性質が違って、行動を決めるActorと、今の状態がどれくらい良さそうか*6を決めるCriticという2つが組み合わさっています。

この方法が非常に優れている点は、行動が連続値を取る場合でも自然に計算が可能、という点です。どういうことかというと、Q学習はチェスのように「このコマをここに動かす」のような離散的で有限個しかない行動は簡単に扱えるのですが*7、身体の向きを◯度回転させる、のような行動の場合だと実数値になってしまうので無数の行動がとれることになってしまいます。

Q学習だと無限個の行動を管理しなければならず計算できない*8という欠点を、Actor-Criticでは正規乱数を使って、Actorは行動をランダムに選択することで回避します。Criticは正規乱数の平均や標準偏差を調整して、Actorがとる行動を変化させていきます。

おわりに

非常にざっくりとした説明で終わってしまいましたが、強化学習がなにか、という点についてはお分かりいただけたかと思います。こうしてみると生き物の行動はかなり強化学習で説明できる感じがしますよね。ロボットに強化学習の機能をもたせるだけでずいぶん知的に動いてくれる感じがします。もちろん実際はそんなに簡単な話ではないのですが…。

動物の脳では本当に強化学習をしているのでしょうか?また、しているとしたらどのようなアルゴリズムを採用しているのでしょうか?Q学習やActor-Criticが使われているのでしょうか?これらの点に関しては、また後日見ていきましょう。

*1:教師あり学習と教師なし学習の中間の方法、と言うこともあるが、これは半教師あり学習というアルゴリズムがあるので、あまり適切な表現とはいえない

*2:良いことが起きることで行動が強化されるのを「正の強化」、嫌なことがなくなるのを「負の強化」、悪いことが起きるのを「罰」と呼ぶ。実際にはもっと細かく「正の弱化」や「負の罰」などもあるが、ここではそこまで細かくは触れない。強化学習の文脈では、「報酬」しか存在せず、良いか悪いかは報酬の値の正負で決める。ただわかりやすく「罰」と呼ぶこともあり、厳密には決まっていない

*3:行動心理学的には、オペラント条件づけと呼ばれる

*4:ここでいう学習はオペラント条件付けであって、古典的条件付けではないことに注意

*5:負の報酬(良くないこと)が起きることもあるので、そのときも同様に「悪いことがあった」ことを記憶する

*6:具体的にはTD誤差を計算するのだが、疲れているのでここでは詳しく説明しない

*7:実際は離散的であってもチェスの場合はものすごく状態数が多いので結局扱いきれない。このようなときには別途回避策をとる

*8:たとえば行動の空間を圧縮したり離散化したりして扱いやすくしてからQ学習する方法もある。というかそれが一般的

教師あり学習

これは 人工知能アドベントカレンダー の13日目の記事です。

教師あり学習(supervised learning)は、「機械学習といえば教師あり学習」といってもいいくらいの機械学習を代表する一分野で、なにかを認識したり、予想したりするために必要な手法です。ここでは、いくつかの代表的な教師あり学習アルゴリズムを見ていきましょう。

教師あり学習とはなにか

既に度々説明していますが、教師あり学習はデータと正解のペアを与えて、それをもとに学習する方法です。
文字認識(数字認識)を例に取ってみましょう。以下の頭を見てください。

f:id:kazoo04:20151212000908p:plain

まず、プログラムに教えるためのデータが必要です。いろいろな形の数字の画像をたくさん用意します(図では3つずつしか用意していないが、普通は数百〜数万ほど集める)。そして、それぞれの画像に対して、その画像はどの数字に対応しているのかという正解データも用意します(教師データ、ラベル、教師信号等色々な呼び方がある)。

そしてこのデータとラベルのペアを教師あり学習のプログラム(教師あり学習器、あるいは単に学習器)に与えます。学習器の仕事は、このペアをよく観察して共通する特徴を見つけ出す、つまり「こういう特徴のある画像なら、この数字だ」というルールを見つけることです。

文字認識なら画像を与え、音声認識なら音声を、動画認識なら動画と、その正解を与えればどのようなものでも学習できます*1

汎化能力

汎化能力(generalization ability)はちょっとここで説明するには難しいのですが、以後も重要な概念になるので簡単に触れておきます。教師あり学習では与えられたデータを学習できても実際には使いものにならないことがあります。たとえば、人間がテスト勉強(ここでは数学を例にする)をするとき、教科書にある問題しか解くことができなくても、その場ではきちんとわかったつもりになれます。ところがテスト本番で、教科書にある問題より少し数字が変わった程度の問題に上手く対応できずにあまり点数がとれなかった、なんて話はよくありますよね。ここでの勉強は、「将来やってくるであろう問題」を解くためにやらなければならないので、逆に言えば教科書にある問題がまったくできなくても、テスト本番で問題が解ければ問題ないといえます。実際には、例題も解けないのに試験で上手く出来るとは思えないので両者は別物ではないのですが、教師あり学習でも同じことがいえます。

教師あり学習では、人間が用意した学習データはちゃんと認識できてるのに、いざ実際に使おうと思うと未知のデータにまったく対応できていない、ということが非常によくあります(過学習, overfitting)。これをクリアして、予め用意しておいたデータもちゃんと正解できるし、新たな未知のデータもきちんと正解できる学習器のことを「汎化能力が高い」といいます。教師あり学習の歴史は結局のところ、いかに過学習せずに汎化能力を高めるかという歴史にほかなりません。

代表的な手法

教師あり学習のアルゴリズムは非常に幅広く、また一見別物だが数学的には非常に似てる、とか、複数アルゴリズムを組み合わせたアルゴリズム、などもあるので、すっきりとした分類は難しいのですが、そのような細かい点はある程度注釈に書くことにして、よく挙げられる(あるいは使われている)アルゴリズムをいくつか紹介します。

ニューラルネットワーク

いきなり本命のニューラルネットワークです。ただニューラルネットワークは1950年代には既に登場していて*2、この頃はまだC言語LISPもないどころかようやくトランジスタが実用化されつつあるといった時代です。今ディープラーニングに牽引されて大ブームのニューラルネットワークですが、割と初期の頃から注目はされていたわけです。

しかも、他の手法も広義のニューラルネットワークとして扱えるものが多く、なんでもありな手法ではあります。

ニューラルネットワーク過去の記事にまとめたので、そちらを御覧ください

SVM

SVM(サポートベクターマシン, Support Vector Machine)は1963年に基本的なアイディアが、1992年に改良したものが発表され、特に改良後のカーネル法を使ったSVMという手法は当時とてつもない性能を誇り、今で言うDeepLearningブームのようになんでもSVMで学習すればOKという、教師あり学習のデファクトスタンダードな存在になりました。今でもSVMは非常によく使われていて、Deep Learningと組み合わせる手法も一般的です。SVMはその頃様々な問題が指摘されて下火になりかけていたニューラルネットワークにトドメを刺してDeep Learning誕生まで王者のように君臨していたレベルのアルゴリズムなので、ここでももう少しだけ詳しく触れておきましょう。

f:id:kazoo04:20151212010016p:plain

上のような問題を考えます。白と黒のデータがあって、それを分割する線を引きたいのです。いったん線が引ければ、新しいデータがきたときに、線のどちらがわにあるかどうか見るだけで、未知のデータが白なのか黒なのか当てることができます。これが目的です。実用的には白丸と黒丸ではなくて、それが数字データだったりするわけですが、ここでは簡単のために2次元平面上に黒丸か白丸があるというシンプルな問題を考えます。

でも、線の引き方には無数のパターンが考えられます(図右)。ここで、どう線を引くかで汎化能力が変わるので、過学習しないように、汎化能力が最も高くなるようなところに線を引きたいところです。

SVMでは、次のような考え方で線を引きます。白のデータと黒のデータの集まりから、お互い最も近いデータを見つけます(図では二重丸で示したデータ)。そしてそのデータから最も離れた場所に線を引くのです(青線)。

f:id:kazoo04:20151212010255p:plain

これをSVMではマージン最大化(maximum margin)と呼ぶのですが、このような基準でわけると大抵うまくいくことがわかっています。まあ直感的にも、複数のデータを分割するときは、その真ん中あたりで分割するのが合理的に思えますよね。

ただ、SVMはまっすぐな線しか引けないので、次のようなデータのときは困ってしまいます。

f:id:kazoo04:20151212010704p:plain

こういう学習データはどう頑張っても直線できれいに区切ることができません*3。ここまでが最初に提案されたSVMで、「まっすぐな線で区切れるような性質のデータならいいけど、そうじゃないと…」という微妙なしこりが残る手法でした。ところが1992年に革命的なアイディアでこれを乗り切ることに成功しました。ここでは難しい話を飛ばして、視覚的にわかりやすい説明をします。

f:id:kazoo04:20151212010941p:plain

上の図を見てください。「まっすぐな線でしか区切れないなら、データがある空間のほうを捻じ曲げよう」というメチャクチャな方法です。直線で区切れないデータでも、空間をうまく曲げると区切れるデータに変えることができます(図の赤線)。「そんなにうまい方法があるものか」と思ってしまいますが、カーネル関数を使うことで都合のいい空間を考えることが出来る上に、カーネルトリック(kernel trick)という方法も編み出され、カーネルトリックを使うと難しい計算を飛ばして、簡単に処理することができます*4

この謎の空間でSVMを使ってまっすぐな線をひいた後に、もとの空間に戻ってくると、あら不思議、直線を引いたはずなのに曲線になっています…というようなアルゴリズムです。よくわかりませんよね。実際にSVMの理論はとてもむずかしいのですが、とにかくすごい方法なのです*5

f:id:kazoo04:20151212011644p:plain

決定木

決定木(decision tree)はSVMと比べるとずいぶんわかりやすい手法です。ここでは実利を兼ね備えた例題として、「(食べ物の)ニラとスイセンを見分ける学習器を作る」ことを目標にしていることにしましょう*6

f:id:kazoo04:20151212013615p:plain
類を見ないほどに利便性の高い決定木の例

見て分かる通り、決定木はデータが与えられた時に、ある条件を満たしているかどうか?でどんどん分岐していって最終的な出力を行う方法です。
当然、これらの属性は予め人が決めておくわけですが、決定木は図のような木構造を自動的に決めてくれます。

最初に「ニラの匂いがするか」という質問が来ていますが、決定木は一番確実そうな*7ものから質問していきます。最後の方になると茎の太さというあんまり確実性がなさそうな質問になっていきます。

決定木のとても良いところは、他の手法と異なり、結果が人間が理解できる形で出力されることです。先ほどの図を見てもお分かりの通り、人間にとってとてもわかりやすい形式で学習器を出力してくれます。また、単に「はい/いいえ」で答えられるようなものと、「1cm以上かどうか」といったある閾値を設けて振り分けていく方法をどちらも混ぜて使えるのも、他の手法ではあまりない決定木のメリットです。

ここから派生したアルゴリズムとして、Random Forest や xgboost があり、これらは色々な決定木を大量につくって、多数決で最終的な答えを決めるものです。こちらはその性質上時間がかかるのはデメリットなのですが、扱いやすく精度も高いので色々なところで使われています(たとえばMicrosoftKinectが有名な例)。

Random Forest 系のアルゴリズムは、以前のブログで扱ったことがあるので、興味のある方は御覧ください。

kazoo04.hatenablog.com

線形分類器たち

線形分類器は、データを直線で区切るアルゴリズムすべてを指すので、実はSVMも線形分類器です*8。ただSVMは歴史的にも実用的にも機械学習に大きな影響を及ぼしたので、別途枠を設けました。

すでにSVMの項目で、「データを直線で区切れないデメリットがある」と言ってしまった線形分類器ですが、意外にも実用的にはかなり使えるアルゴリズムです。詳しい理由は省きますが、

  • 学習も認識も高速
  • オンライン学習しやすい*9
  • 意外と線形分離できるデータが多い*10
  • Kernelと組み合わせることで線形分類器でも非線形分離ができる(曲線で区切れる)ので実用上問題ない
  • アルゴリズムがシンプルで使いやすい
  • よく研究されていて、理論的なバックグラウンドが盤石

実は線形分類器についても過去のブログで取り扱っているので、興味のある方はそちらも御覧ください。

kazoo04.hatenablog.com

線形分類器はとくかく色々な種類があるのですべて紹介しきれませんが、古くはパーセプトロンSVM、最近でも活発に研究されていて、AROWやSCWといった方法が提案されています。実用例としては、GMailの優先トレイ(重要と思われるメールが目立つように表示される機能)は線形分類器のひとつである Passive Aggressive で実装されていたようです(今は改善されて違う方法かもしれません)。

分類と回帰

具体例として上げたのは「0〜9までのどの文字か?」「黒丸か白丸か」「ニラとスイセンのどちらか?」といったどれかに分類するものでしたが、実際には回帰といって、数値を出すこともできます。たとえば、顔写真から年齢を推定したいときは、「0歳か1歳か2歳か3歳か4歳か…」といった分類方法でもダメではないのですが、回帰を使うと「25.3歳」のように実数を出力してくれます。天気も「晴れか曇りか雨かを予想したい」場合は分類になりますが、「明日の気温が何度になるか予想したい」場合は回帰になります。

あるいは株価のデータを使って、「株価が上がる確率はいくらか」といった確率を扱う場合も回帰が利用できます。回帰をそのまま分類に使うこともできるので両者の違いはたまに曖昧なのですが*11、分類も回帰も応用範囲が広いのでよく利用されます。

まとめ

教師あり学習は非常に重要な役割を果たし、また画像認識、音声認識など最近良く話題になる分野なので、すこし雑多になってしまいましたが、いつもより細かく紹介してみました。人間の脳も、ある種の教師あり学習をしているという見方が有力ですが、これはまた後日詳しく見ていくことにしましょう。

*1:これはかなり不正確な表現で、どのようなデータでも人間が適切に設計された特徴ベクトルに変換できれば学習できる、ということ

*2:パーセプトロンが1958年、形式ニューロンはもっと前

*3:線形分離不可能、あるいは非線形分離なデータという

*4:これ以上詳しく説明しようとすると、また1ヶ月分のアドベントカレンダーが必要になるので、カーネルや再生核ヒルベルト空間の話はここではしないし、高次元空間への写像なども触れない

*5:最近はSVMやKernel法に関するやさしい解説がインターネットにも多くあるので、気になった人は見てみることをおすすめします。細かい証明を考えなければ、カーネルカーネルトリックの考え方はそれなりにわかりやすいかと思います

*6:ニラとスイセンは見た目が似ているため、間違って庭に生えている有毒なスイセンを食べてしまう事故がよくある

*7:具体的な決め方はアルゴリズムによるが、GINI係数を使うCARTなどが有名

*8:もっと言えば、線形分類器はニューラルネットワークで表現できるので、線形分類器もSVMニューラルネットワークのひとつだとも言える。ただ、あまり一般的な分類ではない。

*9:オンライン学習は、データをいっぺんに与える必要がなく、必要なときに適時追加していくような使い方ができるアルゴリズム

*10:これも詳しい理由は省くが、自然言語処理などは非常に高次元なデータを扱う事が多く、そのようなデータは線形分離可能なことが多い

*11:ロジスティック回帰などがその例

教師なし学習

これは 人工知能アドベントカレンダー の12日目の記事です。

前回は機械学習の大まかな解説をしました。今回はそのうちの教師なし学習(unsupervised learning)について詳しく見ていきましょう。

教師なし学習とはなにか

教師なし学習は、学習対象のデータはあるが、それが何かという正解(文脈によってはラベル、教師信号ともいう)は与えられていないので、どうにかしてなにかしらの構造や法則を見出すための手法です。

大抵の場合、クラスタリング系のアルゴリズムを扱うことが多いので、ここでもクラスタリングを中心にします。

クラスタリングとはなにか

クラスタリング(clustering)は機械学習に限らずによく使われる言葉なので親しみやすいかと思います。
簡単に言えば、与えられたデータに対して、似たような物をまとめる処理です*1

たとえば、以下の図を見てください。いくつかの図形が書いてありますね。このひとつひとつをデータだと思ってください。データには普通複数の属性(attribute)があります。ここでいえば、パッと見でも色と形の属性がありそうです。

f:id:kazoo04:20151211211020p:plain

この図形をクラスタリング、つまりグループわけしてくださいと言われたら、どのようにしますか?これには正解がありませんよね。なにしろ何を基準にしてグループ分けすればいいのかもわからないし、いくつのグループに分けるのかもわからないからです。以下のようにいろいろなわけかたが考えられます。

f:id:kazoo04:20151211211030p:plain

Aは色で3つに分けたもの、Bは形で3つにわけたものです。これがそこそこ妥当な感じがします。でも分け方はほかにもいろいろ考えられます。Cは「丸いかどうか(角があるかどうか)」で分けたものですし、Dは「図の下のほうに描かれているかどうか」で分けたものです。なんでもアリですね。でも分け方の基準がないのだから、仕方ありません。

このように、クラスタリングは正解がわからないデータに対して、どのような法則があるかを見やすくする*2ことが目的であって、どう解釈されるかはまた別の話になります。

言い換えると、クラスタリングのためにはなにかしらの前提を設ける必要があります。この場合だと、たとえば「どのグループも同じ数だけの図形が含まれるようにする」という条件を設けることによって、Bの分類方法が妥当だということになります。

代表的な方法

k-means

k-meansは非常に広い分野で用いられているアルゴリズムで、クラスタリングの代表格です。派生アルゴリズムもたくさんあります。

k-meansは、「どのクラスタも同じくらいの個数のデータが含まれる」ことを前提においている*3ため、この条件にそぐわないデータを分析しようとするとメチャクチャな結果になることもあるのですが、それでもよく用いられています。

以下のようなデータを考えます。XとY軸があって、点がいくつかあります。これをクラスタリングしてみましょう。

f:id:kazoo04:20151211215543p:plain

先に正解を言ってしまうと、これは左下と右下にそれぞれ100個ずつ点をある程度バラけさせて生成したものなので、

f:id:kazoo04:20151211215648p:plain

このようになります。妥当な感じに分割されました。これはよく出来たパターンですが、実際には次のようにうまく分割できないこともあります*4

f:id:kazoo04:20151211215733p:plain

また、そもそもk-meansはいくつのクラスタに分けるのかは予め人間が指定しなければいけないので、たとえば以下のランダムに生成したデータでも、クラスタ数を6と指定すれば無理矢理にでも6個に分割します*5

f:id:kazoo04:20151211215859p:plain

k-meansは一見簡単そうなのにうまく分類できないパターンがたくさんあることが欠点の一つです。この理由の一つは、k-meansは理論的に似たグループをまとめるときに、円で囲うようにしてまとめていくことが原因です。

f:id:kazoo04:20151211220556p:plain

上の図を見てください。左のケースでは、両方のクラスタをうまく円で囲むことができ、きちんとクラスタリングできています。真ん中のケースでは、中央にある青いデータは円で囲めるのですが、赤のデータもかこおうとすると青のクラスタを飲み込んでひとつのクラスタになってしまうのでうまくいきません。右のケースも同様で、青いデータはいいのですが赤いデータを囲おうとするとやはり青いデータと被るのでうまくいきません(この場合は、左右や上下に無理矢理分けてクラスタリングされることになる)。

こういったときには、カーネル(kernel)という方法を使ってk-meansする方法*6や、DBSCANなど囲み方が円でなくてもいい方法を使うことになりますが、どの手法も一長一短あり最強の手法はありません*7

おわりに

今回は簡単ではありますが、教師なし学習とはなにか、また教師なし学習の一手法であるk-meansによるクラスタリングについて触れました。次回は教師あり学習について見ていきましょう。

*1:もうすこしだけ詳しく言うと、同じグループ内のデータはお互いに似ていて、別のグループのデータはお互いに似ていないようにデータを分割すること

*2:見やすくするといっても、「人間がわかりやすい形にする」場合と「機械が処理しやすい形にする」場合がある

*3:この書き方はあまり正確ではない。詳しく言うなら、クラスタの形状が超球状になり、どのクラスタもその半径が同じくらいになる

*4:この例では、クラスタに含まれるデータの数が大きく異なるので失敗している

*5:クラスタ数も自動的に推定するアルゴリズムもある

*6:kernel法は様々なアルゴリズムに応用されている非常に強力な手法だが、理論が難しいのでここでは触れない

*7:たとえば人間が決めなければならない値(パラメータ)が更に増える、時間がかかる、メモリ消費量が多い、など