マトリョーシカ的日常

ワクワクばらまく明日のブログ。

ディープラーニングの学習とAidemyコンテストへの応募/ゼロから作るDeep Learning

https://www.instagram.com/p/BlydPMRAUnI/

 息子に時間の概念を伝えようとしているが、今日と昨日と明日をなんと説明すればいいかわからない。それはつまり過去と未来を切り分けることであるが、なんとも言語化が難しい領域だ。ほんとうにウィトゲンシュタインの「意味とは使用」というのが実感できる。日常で使用しながら意味を理解していくしかないのだ。

 楽しそうだったのでディープラーニングの本を買った。「ゼロから作るDeep Learning」というやつで、魚が表紙になっている。読んでみたらやっぱり楽しかった。ディープラーニングのおおまかな理論と実装の例が書かれている。プログラムの作り方を一から丁寧に書いているわけではないので、これを読めばなんでも作れるようになるわけではない。まぁ、そのあたりは調べながらやっていこう。

 ディープラーニングとは何か。本書曰く、「層を深くしたニューラルネットワークのこと」らしい。なんのこっちゃ。ニューラルネットワークとは人間の脳神経をモデル化したものであり、丸と矢印がいっぱい描かれている。ひとつの丸に着目すると、そいつに向かう矢印とそこから放たれる矢印がある。前者は入力であり、後者は出力である。丸は入力値を自身の内部で演算し、ある値を出力する。その出力値は隣の丸に対しては入力値となる。そうやって数珠繋ぎになった丸たちの終点が神経系全体の出力値として使われる。らしい。

 なんだか意味がわからなかったが、おそらく彼らは学習をモデル化したいという意思の現れなのだろう。「学習」をウェブの辞書で調べてみると以下の意味が掲載されていた。

3.人間も含めて動物が、生後に経験を通じて知識や環境に適応する態度・行動などを身につけていくこと。不安や嫌悪など好ましくないものの体得も含まれる。
学習(がくしゅう)の意味 - goo国語辞書

 生後の経験というのがポイントだ。学習とはあらかじめプログラムされた固有の行為の実行ではなく、経験を通じて得た入力から目的を実現するための最適な出力値を体得する行為なのだ。そういうことらしい。

 書籍の流れにしたがって少しずつ勉強をはじめよう。まずはパーセプトロンについて。これはニューラルネットワークの起源となったアルゴリズムらしい。パーセプトロンは複数の入力とひとつの出力から構成されている。内部で入力値にたいしてある処理を行い、それがある値より大きければ1を出力し、そうでなければ0を出力する。

 さきほどのニューラルネットワークの説明では省いていたが、それぞれの入力にはそれぞれに重みが掛け合わされている。重みは重要度と解釈してもらえばいい。いくら入力値が大きくてもそれにかかる重みが小さければその数値の変動は意味をなさなくなる。
 
 この単純な構造を用いてAND回路やOR回路、NAND回路をつくることが可能だ。回路というと複雑な電子基板を思い浮かべてしまうが、そういうあれではない。単純な仕組みのことだ。ふたつの入力があって、それらは0か1を持っている。どちらも1をもっているときだけ1を出力してやる仕組みがAND回路である。少なくともどちらかが1をもっていれば1を出力するのがOR回路、両方の入力がともに0だったら1を出力してやるのがNAND回路である。

 理系の人ならば「XOR回路はどうか」と考えるかもしれない。私は理系だが、そんなことを考える余裕はなかった。XOR回路は排他的論理和と呼ばれるあれで、もうどうしようもない。これは、どちらかの入力が1であるときだけ1を出力する仕組みである。残念だがこいつはひとつのパーセプトロンでは表現できない。

 絵を描くとわかりやすいかもしれない。ひとつのパーセプトロンは二次元平面上に一本の直線を引くことに他ならない。そうして平面上をふたつの領域にわけ、入力値が片方の領域に所属していれば1を出力し、そうでなければ0を出力するのだ。

f:id:kyokucho1989:20180729054932p:plain
図:AND回路の場合


 AND回路とOR回路、そしてNAND回路は一本の直線で区別することが可能だ。しかしXOR回路はそれができない。どうすればいいのか。パーセプトロンをふたつ用意して二本の線を引けばいいのだ。これを本書では層を重ねると表現している。こうやって層を重ねるという行為が未来のディープラーニングへと繋がっていくわけだ。すごいねー。

 本書のそのような絵をみると、私が大学で研究していたものを思い出した。私の専攻は制御工学であり、入力値に対して複数の線形制約を課していき、のこった領域から出力値を抜き出したりして遊んでいた。懐かしいかんじがした。

 気力があるうちにニューラルネットワークの説明をしていこう。パーセプトロンと何が違うのか。私が理解したのは二点。信号の処理(計算)の仕方と、重みの更新(学習)の有無である。信号に対する処理はパーセプトロンは領域に一本の線を引くだけだった。それがニューラルネットワークでは、なんというか、色を塗れる。あとで説明する。また、パーセプトロンでは重みは人間が決めてやるものだったが、ニューラルネットワークではなんと重みが自動で更新される。すごい。

 色を塗れるというのは値をあいまいに処理してやれるのだ。役所仕事のように01で切り分けずに、「五分くらいなら遅れてもいいっすよー」というような感じで融通がきくようになる。これを本書では「活性化関数にステップ関数以外を使用する」と表現している。ステップ関数というのは一段だけの階段の形をしていて、ある値までは0でそれを越えるといきなり1になる。パーセプトロンは活性化関数にステップ関数を使用しているのだ。それ以外の関数はどのようなものがあるのか。本書ではシグモイド関数やReLU関数を紹介している。前者は0から1まで波のようにきれいに線が繋がっており、後者はある値以降は直線的に値が増加する線を描いている。なるほど。

 さて、このように解説をしていくのも楽しいことは楽しいが、ゴールを設定しておいた方がよさげだ。今回はこちらのアイデミーが主催する「第二回#Aidemynote AIブログ解析コンテスト」に応募することとしよう。
prtimes.jp

これはアイデミー社が運営しているAidemyを利用して、実際に何かを解析した旨をブログの記事にして応募するというものだ。ちなみに前回はid:karaageさんがディープモザイクで特別賞を受賞している。すごい。
karaage.hatenadiary.jp


 目標の設定としてはミニマムサクセスがコンテストの応募、フルサクセスはオーディエンス大賞の受賞、エクストラサクセスがAidemy大賞の受賞としよう。

 まずは今月中に環境の構築をする。がんばるぞ。わーい。

 (あ、木魚叩きロボットもなんとかしなくちゃ……。)

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装

ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装