2016年06月26日

できるだけわかりやすく説明してみるという実験:深層学習(ディープラーニング)の基礎、ニューラルネットワーク

世間ではまたまた「第三次人工知能ブーム」などと言って盛り上がっているが、その中でもキーワードとなっている「学習」について。
「機械学習」だとか、「深層学習」、「強化学習」という言葉がバズっていて、「この歳になってまた学習か。。。」などとため息をつく必要はない。
学習するのはあなたではなくて人工知能なのだから。

さて、上記の言葉の関係を説明しておくと、「機械学習」というのは大きなくくりで、その中に「深層学習」や「教科学習」というものが含まれる。

深層学習(ディープラーニング)とは、人間の頭脳でのデータ処理を模したアルゴリズムにより、人間の頭脳が行うような直感的なデータ処理を可能とするものである。
卑近な例では、人間が書いた手書き文字を認識する、というところに使われている技術である。
従来の技術では、人間が書いた文字は、個人差があるため、それを認識させるのは不可能とされていたが、深層学習の技術によって可能となった。

僕が第二次人工知能ブームのまっただ中で大学院で研究していた頃は、深層学習というものはまだなく、今の深層学習の基礎に当たる「ニューラルネットワーク」が全盛期を迎えていた。
「ニューラル(neural)」とは、人間の脳にある神経細胞、ニューロンの形容詞形で、ニューラルネットワークとはその神経細胞で形成されたネットワーク、つまり神経細胞網、という意味である。

neuralNetwork
  
この図の中にある◯がニューロンで、それらニューロンは入力層、中間層、出力層に分けられ、それらの層の間のニューロンがそれぞれ結ばれている。
この図では中間層が2層であるが、深層学習ではこの層を多くする多層構造にする。

ここでの入力データ、出力データは自由に決めることができる。
たとえば手書き文字の認識であれば、入力データはタッチパネル上の数10〜数100の点になり、つまりそれだけの数のニューロンが入力層にあることになる。出力データはすべての文字の数だけ必要になるので、出力層のニューロンの数はすごいことになる。

このニューラルネットワークは「教師あり学習」と呼ばれるもので、入力データと出力データの組み合わせの正解値を予め複数用意し、その正解値の入力("教師信号"という)に対して正しい出力値を出力するように内部の状態を変化させていく。これを「学習」という。

さてここで「内部状態を変化させる」とさらりと書いたが、具体的にはどうするのか?
それがこの図にある青い線である。
この青い線にはそれぞれ繋がりの強さ("重み係数"という)を表す値がある。
一つ前の層のそれぞれのニューロンの出力値とこの青い線の重み係数を掛けあわせたものが、次の層のニューロンにとっての入力となる。
ひとつのニューロンに注目して描いた図が下記である。

neuralNetwork2

この図では、今注目しているニューロンの一つ前の層の8つのニューロンがそれぞれ0.2, 0.7, 0.5,...という出力値を持っている。これは1に近づくほどニューロンが「興奮している」ことを表し、0に近づくほどニューロンが「興奮していない」状態を表す。この値は、最初に入力層に与えた値により変化する。つまり、与えられた入力値により、それに反応して興奮するニューロンとしないニューロンがある、ということである。

それら8つの層とのつながりの重み係数はこの図ではそれぞれ0.1, 0.3 -0.4,...である。
この値は、入力層に与えた値によって変化することはなく、とりあえず固定値である、と今は考えよう。話がややこしくなりすぎるので。
この、入力層側(左側)の各ニューロンの出力値と重み係数を掛けたものの総和が、右側のニューロンの入力値となる。

この「重み係数」について考えてみると、これは「二つのニューロンの関係性」を意味する数値である。
たとえばこの重み係数が0.9という二つのニューロンは、強い関係性を持っており、左側のニューロンの出力値の影響を受ける。左側のニューロンが興奮すれば、右側のニューロンも興奮しやすい、ということだ。

それに対し、0.1というのは関係性がかなり希薄である、といえる。影響を受けにくい。
また、マイナスの値を持つこともあるが、これは「反対の影響を持つ」ということを意味する。
左側のニューロンが大きな値を出力するほど、右側のニューロンの出力値が小さくなる。

こうして計算されたひとつのニューロンにとっての入力値から、そのニューロンが持っているある関数によって出力値を計算し、それを次のさらに右側の層のニューロンに送る、、、というのを繰り返すのである。

たとえば複数の人が書いた「あ」という文字が入力層に与えられ、その正解として、出力層の1番目だけが1という値を出力し(つまり興奮し)、ほかは全部0を出力する。また、「い」の時は出力層の2番めだけが1で、、、といった感じ。
このときの「あ→1番目」「い→2番目」「う→3番目」「え→4番目」という組み合わせが教師信号。 
ニューラルネットワークは最初、デタラメな値を出力するが、学習を繰り返すことにより、やがて教師信号として与えたとおりの入力と出力の組み合わせを出力するようになる。

さて、先ほど「話がややこしくなるので、とりあえず固定値である、と考えよう」と言った各ニューロン間の重み係数であるが、そこで思わせぶりに書いたことから察しているとは思うが、この値は変更されることがある。
入力値によって変化することはなく、確かにどんな入力値に対しても同じ値であり続けるのであるが、結果として出力層から出力される答えが間違っていた場合、その出力値が正解となるように、これらの重み係数がすべて「微調整」される。

これを「学習」と呼んでいる

ここで「学習」という値の変更を、正解に近づけるように一気に変更するのではなく、「微調整」する理由は、入力値と出力値の正解の組み合わせ(教師信号)が複数あるため、それら全てに合うように内部を徐々に変更させていくという考え方なのである。

このとき最も注目すべき点は、「汎化能力(はんかのうりょく)」というものである。
上記の例で、たとえば10人が書いた 「あ」という文字に対して正しく出力層の1番目だけ1を出力するように学習したニューラルネットは、教師信号として与えていない11人目が書いた手書き文字の「あ」に対しても出力層の1番目から1を出力するようになる、ということである。
つまり学習したことを元に、学習していないことについても一般化して答えを導く、ということである。
これが、ニューラルネットが直感的な問題を解くことができる、と言われる所以である。 

【今回のまとめ】
  • 今流行りの「機械学習」とは、人工知能の学習の総称で、それには「深層学習」や「強化学習」などがふくまれている。
  • 「深層学習」の基本は「ニューラルネット」であり、それを多層構造にしたものが「深層学習」である。
  • ニューラルネットは人間の脳を模した計算の方法により、より人間の直感に近い情報処理を行うことができるようにする技術である。
  • ニューラルネットは、入力層と出力層、およびその間にある中間層で構成される。
  • 各層にはニューロン(神経細胞)があり、各層間でニューロンが繋がれている。
  • ニューロン間の繋がりはある値(重み係数)を持ち、それらのニューロン間の影響度を表している。
  • この重み係数を微調整することが「学習」と呼ばれるものである。
  • ある問題について学習したニューラルネットワークは、学習時に与えられた以外の問題にも正しい答えを出力できるようになる。これを「汎化能力」という。 


OLランキングで1位になりたい!賛同していただける方は下記をクリック!