HOME > 機械学習入門編

03.機械学習入門編

丁度一年前位から少しずつニューラルネットワークの勉強はしていたもののNNCは初めて使用するツールですし、ここに登場する専門用語を復習するのと、新しい用語を勉強する意味でも再度知っておく必要がありましたので、始める前に少しだけ書いておきたいと思います。

【参考文献】
リックテレコム 足立悠著
ソニー開発のNeural Network Console入門

オライリー・ジャパン 斎藤 康毅著
ゼロから作るDeep Learning ――Pythonで学ぶディープラーニングの理論と実装


但し上記の前者参考書「1.2 機械学習」~「2.4 再帰型ニューラルネットワーク」の内容は結構難しい内容で、仮にこの内容を全く知らなくてもNNCが全く動かせないわけでもないので、読み飛ばしていただいても構いません。あくまでこのホームページはGGEの覚書ですので内容を誤って利内している可能性もありますので用途に応じて読み飛ばしていただいたり、専門的に勉強される方は、上記参考書を並行してみていただけるとありがたいです。

03.01 機械学習とは何か

これから行うAI分野は「機械学習」と呼ばれ、端的に言うと「データ内のルールやパターンを探し出す操作を機械に肩代わりさせよう」とする試みです。その際の入力データを「学習データ」、データからルールを探し出す行為を「学習」と呼びます。最終的に見つかったデータの特徴を「特徴量」、この特徴量の蓄積が「知識」となります。

しかし「機械が学習する」とは一体どういうことなのでしょうか?


では、人だったらどうするかを分析してみましょう。

質問! 「ヒラメとカレイはどのようにみわけるか」

ご存知の方みえますかねぇ!?
まず答えられた方は一般的に「知識があった」といいます。なぜ知識があったかというと昔「勉強した=学習した」ことがあるからです。但し勉強した方法はテレビで見たり新聞で読んだり学校で教えてもらったりと人それぞれですが、共通しているのは「教えてもら対象があった」ということです。

その前に 答えいいますね。腹びれという小さなひれを下にしたとき「左ヒラメ、右カレイ」といいまして、頭の位置が左に来るのがヒラメ、右に来るのがカレイ」です。

次に答えの方を分析してみると、ここでいう「知識」は「左ヒラメ、右カレイ」であり、「ヒラメトカレイ」を区分するための特徴は「眼の位置」であるわけです。このため「特徴量」というのは「眼の位置」ということになります。では一番最初の人は「最初の知らなかった人はどうやって知ったのでしょう?」 

もしかすると最初の人はカレイもヒラメも同じものと思っていたかもしれません。
でも「食べた時の味」だったり「とれる場所」だったりに違いがあったりして、それを観測する人が、見た目にも「眼の位置」が違うじゃないかと気が付いたわけです。 次に「眼の位置が違う」ことに気が付いた人が、何も知らない人が「これはヒラメですか?」なんて聞くと「眼の位置が違うじゃないか これはカレイだよ」と教えて、どんどん拡散していったということです。

この場合のように「知識」というものは「教える人がいる場合」と「いない場合」によって習得に違いがあるということです。

    教える人がいる場合は「知識の導入」により「予測が可能になる

    教える人がいない場合は、「大量のデータ観測」により「知識を発見する

ということなのです.機械学習も人間が行ったのと同じことを同じように行うのです。



03.02 パーセプトロン

GGEは今年還暦ですが、生まれるさらに前の1957年アメリカの研究者ローゼンブラットという人が考え出したアルゴリズムが21世紀のAIに欠かせないものになりましたので少々勉強しておきましょう。

名前を「パーセプトロン(perceptron)」といいます。

パーセプトロンは複数の入力信号に対し1つの信号を出力します。「信号」は電気信号と同じように0か1です。模式化する場合は下記のように表現され、「〇」を「ノード」、その中間の線「-」を「エッジ」または「リンク」といい、出力信号へ送られる際、「重み(waight)」が加味されます。x1,x2は入力信号、yは出力信号、w1、w2は重みを表しています。
出力信号yは各々の信号に対し固有の重みを乗じた総和が、限界値(「閾値(しきいち))より大きい場合は「1」、小さい場合は「0」となって出力されます。

y = { 0 ( w 1 x 1 + w 2 x 2 θ ) 1 ( w 1 x 1 + w 2 x 2 > θ )


このような論理で何ができるのか、 ちょっと例題をやってみましょう。
アセンブラも含めましてプログラム言語の中にはほとんどありますビット論理積(AND C++だと”&”)、論理和(OR C++dato”|”)というのがあり,.これも同じように入力が2つで出力が1つです。パーセプトロンにおける(重み1、重み2、閾値)をこのように表現した場合、論理積が(0.5、0.5、0.7)、論理和が(-0.5、-0.5、-0.7)にすると、ありゃ不思議! 実際のビットの論理演算結果と同じになりました。

しかもよく見ると、重みは同じ値で閾値のみ変更しただけでORができてしまいます。ついでに論理積の重み・閾値にすべてマイナスをつけるとNANDとなります。このようにパラメータを変更し決定してやるまでの作業をコンピュータにさせる作業こそが「学習」なのであります。
さて次に、AND、ORができるようになったら次に、これを組み合わせて作成するっていうのを、コンピュータプログラムを学校なんかでなう際に最初に教わります。習う代表格が排他的論理和=XORなんかが該当しますが、パーセプトロンも同じように「多層パーセプトロン」といって複数個つなぎ合わせることによって複雑かつ柔軟な論理を作り出すことができるのです。



03.03 ニューラルネットワークとは?

既に「1.3 ニューラルネットワークとニューロン」でお話ししておりますが、もう少し踏み込んでお話ししたいと思います。

人間の神経細胞をモデルに考案されたディープラーニングのもとになる手法であります。
人間の脳の中では通常当たり前のように現れている目の前の光景も文字も匂いもすべてが鼻や目から入ってくる電気信号で、これがシナプスを介してニューロン(神経細胞)へ、ニューロンネットワークを経由して脳に送られ処理され画像・文字・匂いとして認識され、これをニューラルネットワークと言っています。
ニューラルネットワークは大きく分けると入力層・中間層(隠れ層)・出力層に分類され、模式化すると通常下記のように表現されます。各々の名称は「」を「ノード」、その中間の線を「エッジ」または「リンク」といい、先ほど登場したパーセプトロンと何も変わりがありません。




前回と異なる点は「閾値」による大小判定を「バイアス」というパラメータを追加することによって0以下かそれ以上化を判定できるようになったことです。

y = { 0 ( b + w 1 x 1 + w 2 x 2 0 ) 1 ( b + w 1 x 1 + w 2 x 2 > 0 )




     y = h(b + w1x1 + w2x2)


( x ) = { 0 ( 0 ) 1 ( > 0 )

このように入力信号総和を出力信号に変換するまでの関数を「活性化関数(activation function)」といいます。

もうお分かりと思いますが、単純なパーセプトロンの場合も実際には人の手を借りて行っていたものを機械が行う上においていままで説明してきた活性化関数は1か0でした、しかし現実の世界あるとなしだけで片付けられるかと言ったらそうではありません。ビールが継がれたら飲むとした場合コップの中のビールは在るか無しの2つでしょうか、 いや違います。瓶からドクドク注がれて一杯になってから、どうぞ!となります。
これも同じようにニューラルネットワークで使用する際に活性化関数は1か0ではだめなのです。そこでそれ以降様々な活性化の方法が模索され、種類がいっぱいあるのですが1つ1つ説明すると終らないので今回はやめておきます。

次にニューラルネットワークの話となります。
ここで分かりやすいようにNNCを使った事例を紹介しているサイトがあるのでご紹介します。

SONY Neural Network Console で 指原莉乃をディープラーニング
http://cedro3.com/ai/akb48-dl/

このサイトでは、NNCの最初の事例としてAKB48の沢山の女の子の中から指原莉乃だけをNNCに区別させるという事例です.大まかな部分だけを説明すると、
  ① 画像サイトからAKB48の顔の部分だけを切り取り同じ大きさにする
                            ↓
  ② NNC入力データにする
                            ↓
  ③ 指原莉乃とそれ以外を区別したフォルダーに入れて指原の顔を覚えさせる
                            ↓
  ④ 学習終了したらAKB48の写真を見せて指原かそうでないかを区別させる

のようになります。
この単純なニューラルネットワークは何をしているかというと、おおざっぱに言うと同じ大きさの写真をドット単位で調べて重みとバイアスを求め特徴量としているということです。その結果後に同パラメータを用いることにより、テスト用の写真を見せると指原かそうでないかを確率で算出してくるのです。

この時に入力層から出力層に向けてデータを送ることを「順伝搬」、反対を「逆伝搬」といいます。
上記のように重みとバイアスにより結果を求めるのは「順伝搬」なのですが、もし間違っていた場合に重みを変更してやる必要があります.このように正解と結果に生じた誤差を重み等に繁栄する働きがある関数を「誤差関数」といいます。

大量のデータでこれを行うと「振り子」のように、振れ幅が徐々に小さくなってきて最終的には一番下の点で停止すると考えているわけです。この時、 誤差が少ない方へ重みを変更する手法を「勾配降下法」といいます。

実は頭の中では振り子と同じように考えられますが、実際は「誤差が小さくなった箇所」が「誤差が最も小さい個所」ではないケースがあります。これを「局所最適点」といい、局所的最小値であって最小値ではない箇所が時々出てくるのです。このスパイラルにはまると、只でさえ膨大なデータを扱って時間がかかるのにさらに時間がかかり、うちの場合以前お話ししたかと思いますが、32ビットWindows10機が一台オーバー人で燃えてしまいました。

このようにすべてのデータにより学習させることを「バッチ学習」といいますが、膨大な時間がかかる為少しのデータで行う「ミニバッチ学習」による「確率的勾配降下法」というテクニックなどがありますが、高速かつ正解率が高い処理を目指すには非常にレベルの高い分野であるといえます。

そこで「1から作らなくても、高速かつ正確に行うことができるツール」 


それが「neural Network Cosole」というわけなのです。



HOME > 機械学習入門編