脳をまねて自ら判断を重ねるディープラーニングとは?

脳をまねて自ら判断を重ねるディープラーニングとは?

本のまとめ

▼読んだ本は?
■Excelでわかるディープラーニング超入門
■涌井 良幸さん
http://amzn.asia/d/aQFvgvG
▼ディープ・ラーニングってそもそも何?
■別名「深層学習」と呼ばれる
■2006年トロント大学のHinton教授が発表した論文が発端
■人や動物の脳には神経細胞(ニューロン)が存在し、1つのニューロンから他のニューロンへと信号を送り出し、さまざまな情報を処理している
■ディープ・ラーニングはこの人や動物の脳の仕組みをまねた「ニューラルネットワーク」というアルゴリズムを利用した学習+判定システム
■特にニューラルネットワークを多層に構造化した「畳み込みニューラルネットワーク」を利用
▼人や動物のニューロンが情報を処理する流れは?
【1】複数ある隣のニューロンからの信号が、対象ニューロンの樹状突起と呼ばれる場所に伝わる
【2】隣からの信号を受け取ったニューロンは、それぞれの信号に「重み付け(重要度判斷)」をする
【3】重み付けした合計がある一定のしきい値を超えた場合のみ対象ニューロンが発火し、次のニューロンに出力信号を送る
※重みが足りずしきい値を超えなかった場合、ニューロンは受け取った信号を無視する
▼人や動物のニューロンの流れを数字で表すと?
【1】複数の隣のニューロンから信号が送られる
└信号有り=1
└信号無し=0

【2】複数の隣から送られたニューロン信号それぞれに重み付けを行う
└複数の隣のニューロン=x1,x2,x3
└それぞれの重み付け=w1,w2,w3
└重み付けされた複数の隣のニューロンからの信号の和=w1x1 + w2x2 + w3x3

【3】隣のニューロンからの和が対象ニューロンが予め持つしきい値を超えた場合、対象ニューロンが発火し出力される
└対象ニューロンのしきい値=θ
└発火有り = w1x1 + w2x2 + w3x3 ≧ θ (和がしきい値を超えた場合)
└発火無し = w1x1 + w2x2 + w3x3 < θ (和がしきい値を超えなかった場合)

▼シグモイドニューロンとは?
■ディープ・ラーニングでは通常のニューロンではなく、シグモイド関数を用いた人工ニューロンを利用

■この人工ニューロンを「シグモイドニューロン」と呼ぶ
※通常のニューロンの仕組みをそのまま使うと、ステップ関数という非連続の関数となり微分等が使えないため

■シグモイド関数は以下の数式で表現される
σ(x) = 1/a+e-x
※eはネイピア数と呼ばれ「≒2.71828」の定数
※exは指数関数

■シグモイド関数を用いてシグモイドニューロンの発火有無を関数で表現すると以下
y = σ(a)
※引数「a」には重み付けとしきい値の関係を示す「w1x1 + w1x1 + w1x1 – θ」が渡される
※「a」の引数のことを「入力の線形和」と呼ぶ
※シグモイド関数は0から1の間の任意の数を取る
※言いかえれば、通常のニューロンとは異なりシグモイドニューロンはニューロンの「活性度/興奮度」を段階的に数値化

▼ニューラルネットワークの流れとは?
■ニューラルネットワークでは、情報の処理階層を大きく3つに分けて処理する
【1】入力層
【2】隠れ層
【3】出力層
▼画像を判別する時のニューラルネットワークでの処理の流れは?
■例えば、12個の正方形のマス目がある
■その12個のマス目を黒く塗りつぶすことで描かれる手書きの「◯」「☓」画像がある
■その「◯」「☓」画像がどちらかを判定する時の流れ
▼入力層での処理は?
■入力層=「運搬係」
【1】12個のマス目があるため、1マス毎に合計12個の運搬係ニューロンが存在
【2】まず運搬係ニューロンが手書き画像の情報を受け取る
【3】受け取った画像を「加工せずそのまま」次の隠れ層にわたす
▼隠れ層での処理は?
■隠れ層=「検知係」
【1】検知係ニューロンは複数存在
【2】まず、例えば「検知係ニューロン1」は「運搬係ニューロン1からの対象箇所の塗りつぶしの含有率」を受け取る
【3】受け取った含有率に対して「運搬係ニューロン1の重み付けを行ない、重要度が高い」と検知する
【4】「含有率と重要度」を掛け合わせて、「検知係ニューロン1のしきい値」を超えているかどうかを検知する
【5】しきい値を超えていた場合、シグモイド関数で処理を行い「0~1」の値を算出し、出力層にわたす
【6】次に、例えば「検知係ニューロン2」は「運搬係ニューロン1からの対象箇所の塗りつぶしの含有率」を受け取る
【7】受け取った含有率に対して「運搬係ニューロン1の重み付けを行ない、重要度が低い」と検知する
【8】「含有率と重要度」を掛け合わせて、「検知係ニューロン2のしきい値」を超えているかどうかを検知する
【9】しきい値を超えていた場合、シグモイド関数で処理を行い「0~1」の値を算出し、出力層にわたす
【10】上記の検知係ニューロンが、そもそも「どの運搬係を重要視すべきか?」「しきい値をどのくらいに設定すべきか?」を行うことを「特徴抽出」と呼ぶ
▼出力層での処理は?
■出力層=「判定係」
【1】「◯の判定係」「☓の判定係」の2つのニューロンが存在
【2】まず、例えば「◯の判定係ニューロン」は「検知係ニューロン1からの算出値」を受け取る
【3】受け取った算出値に対して「検知係ニューロン1の重み付けを行ない、重要度が高い」と判定する
【4】「算出値と重要度」を掛け合わせて、「◯の判定係ニューロンのしきい値」を超えているかどうかを判定する
【5】しきい値を超えていた場合、シグモイド関数で処理を行い「0~1」の値を最終的に出力する
【6】出力値に関しては「◯画像であることの確信度が高い=1に近い値」、「☓画像であることの確信度が高い=0に近い値」となる
【7】次に、例えば「☓の判定係ニューロン」は「検知係ニューロン1からの算出値」を受け取る
【8】受け取った算出値に対して「検知係ニューロン1の重み付けを行ない、重要度が低い」と判定する
【9】「算出値と重要度」を掛け合わせて、「☓の判定係ニューロンのしきい値」を超えているかどうかを判定する
【10】しきい値を超えていた場合、シグモイド関数で処理を行い「0~1」の値を最終的に出力する
【11】出力値に関しては「☓画像であることの確信度が高い=1に近い値」、「◯画像であることの確信度が高い=0に近い値」となる
結果的に出力値はどう見ればいい?
【1】例えば「正解=◯」の画像1枚をニューラルネットワークに学習させる
【2】◯の判定係の出力値(z1)=1に近い
【3】☓の判定係の出力値(z2)=0に近い
【4】(1-z1)²+(0-z2)²を算出する
【5】この算出値が、限りなく0に近くなれば画像が◯である確信度が高くなり、結果として良いニューラルネットワークと言える
※シグモイド関数を用いるため「1」「0」の値は出力されず、近しい値が算出される
▼ニューラルネットワークの1つである畳み込みニューラルネットワークとは?
■畳み込みニューラルネットワーク
└3つあるニューラルネットワークの階層の中でも「隠れ層」が通常とは異なる処理フローとなる

■例えば100×100(10,000マス)の一部を黒く塗りつぶすことで描かれる手書きの「1」「2」という画像を認識する場合の違い

【1】通常のニューラルネットワークの場合
└1.入力層から隠れ層にそのまま情報が渡される
└2.隠れ層のニューロンは、入力層から渡される情報をすべて一括で受け取り、個々のマス目の含有率と重要度を抽出
※ただ、このやり方だと解像度の高い画像などの場合、隠れ層の処理が莫大になりコンピュータの処理限界を超える

【2】畳み込みニューラルネットワークの場合
└1.隠れ層は入力層から渡される情報を複数にグルーピング
└2.グルーピングした範囲ごとに隠れ層のニューロンが含有率と重要度を決定し、シグモイド関数で値を算出する
└3. グルーピングした範囲毎に「0~1」が算出されるため、結果表の形で複数の値が算出される
└4. 例えば3つの隠れ層ニューロンがある場合、結果的に3つの表が作成される
└5.この表が作成される層を「畳み込み層(コンボリューション層)」と呼ぶ
└6.ただ、畳み込み層だけでもまだ莫大な数量となるため、その表内の複数のセルを更にグルーピング
└7.この、畳み込み層の表を更にグルーピングした層を「プーリング層」と呼ぶ
※数回に分けてグルーピングされるため、結果的に隠れ層の処理が莫大にならない

▼各ニューロン間の「重み付け(重要度)/しきい値」はどうやって決められる?
■ディープ・ラーニングではニューラルネットワーク自らに決めさせる
└この「重み付け(重要度)/しきい値」をコンピュータに決めさせる流れを「最適化(学習)」と呼ぶ

■手書き画像「1」と「2」を判別させる場合の「最適化」の流れ
【1】「1」と「2」の手書き画像をたくさん用意する
【2】「1」の画像にはこの画像の正解が数字の1であること、「2」の画像にはこの画像の正解が数字の2であることを予め教える
【3】畳み込みニューラルネットワーク内に用意した画像を読み込ませる
【4】最終的に出力層から「数字の1であることの確信度」「数字の2であることの確信度」がそれぞれ出力
【5】両方の差分が最も小さく0に近づくように「重み付け(重要度)/しきい値」をコンピュータに最適化させる
※最適化の流れにおいて必要となる「【1】(画像」「【2】(正解の教え)」をあわせて「訓練データ(学習データ)の準備」と呼ぶ

▼訓練データを準備する流れとは?
■例えば手書きの「1」と「2」の画像を判断するための訓練データを用意する流れ
【1】たくさんの手書きで書いた「1」と「2」の画像データを集める
【2】このデータ画像をコンピュータの処理能力も踏まえつつ、解読可能な範囲で画像解像度を変更する
【3】解像度を変更した画像の各pixel(マス目)それぞれに表示される内容に応じて、「0~255」の値を割り振る(0=黒/255=白)
【4】それぞれの対象画像が何を表しているかの「正解」を付与する
▼教師あり学習と教師なし学習とは?
■教師あり学習
└訓練データそれぞれに対して、予め「これは数字の1です」など正解が付与されている状態で、ニューラルネットワークに学習させる方法

■教師なし学習
└訓練データそれぞれに対して、予め「これは数字の1です」など正解が付与されていない状態で、ニューラルネットワークに学習させる方法

思ったこと

人の脳の中に存在するニューロンの仕組みをまねて、「入力層→隠れ層→出力層」の3つの階層を辿ることで結果的に画像の判別をはじめとし、さまざまな学習を自ら行っていくニューラルネットワークというアルゴリズムを用いた、ディープ・ラーニングについてまとめられた本でした。

対象画像をピクセル単位に分解しその情報をそのまま受け取る入力層、そして受け取った画像情報に重み付けを行って特徴を導き出す隠れ層、最後に特徴を元にまた重み付けを行って画像が正しいかどうかを判別する出力層と、それぞれの階層が互いに連携しあって最終的な判断を行なっていく流れとなっています。

そしてその「重み付け」や、次の層に情報を渡すために実際に発火すべきかを判断する「しきい値」が、画像をたくさん与え続けることでネットワーク自体が自ら判断していく流れは、ほんとにニューラルネットワーク自体が生き物のように自分で特徴パターンを見つけて判断を下しているようにも見えます。

でも「重み付け・しきい値」を「コンピュータに判断させる」と書かれているように、人が判断できるのは最終的に出力した値が間違ってないからOKだねでしかなく「なんでコンピュータがその重み付け・しきい値にしたのか?」を人が判別できないというのは、プログラムの判断理由が分からず、少し怖くもありますね。

ただこうやってディープ・ラーニングの構造を読み取っていくと、多少の応用範囲はもちろんあるに決まっていますが、今はまだ「膨大な計算量に基づいてなにかの正誤判断をする」というのが限界で、人が自然に持つような感情をディープ・ラーニング自体が持つのは、まだ少し先だという偉い人たちの言葉も、なんとなく現実感がある気がします。

ああしかし、ディープ・ラーニングの構造や結果だけわかっても、実際は処理の途中に存在するシグモイド関数もネイピア数の本質的な位置づけが全然分からず、自分の数学力の無さに恐れおののくしかないす。

ありがとうございました!

関連する記事