教師あり学習
本アプリでは教師あり学習について取り扱います。
画像データを数値化して、入力データを作成します。
例: {0.135,0.345,0.546・・・}
教師あり学習の場合は、入力データに対して答えを用意します。
例:A
このような訓練データを沢山用意して、機械学習に備えます。
データは多ければ多いほど正確になりますが、学習に時間が掛かります。
入力データの例
どうなれば学習できたことになる?
入力データから出力データを適切に算出できるネットワークを作成すれば、学習できたことになります。
文字認識の場合、入力データは各画素の濃さなどになります。
例: {0.135,0.345,0.546・・・}
出力データは各文字である確率になります。
例: {Aである可能性92%、Bである可能性 1%、Cである可能性・・・}
このようなネットワークをニューラルネットワークといいます。
入力データの画素
矢印の数値を適切にセットできれば、学習できたことになる。
パーセプトロンについて
ニューラルネットワークは複数のパーセプトロンという分岐で構成してます。
(ニューラルネットワークを多層パーセプトロンということもあります。)
パーセプトロンは複数の入力値に矢印の値を掛け算して、足し算を行います。
それにバイアス(0.11となっている矢印)も足します
計算式は下記のとおりです。
0.3 × -0.33 + 0.4 ✕ 0.44 +0.11 = 0.187
この値をそのまま利用しても、線形分離できる問題しか解けないため、
活性化関数で値を変換します。
このアプリではシグモイド関数という活性化関数を使用してます。
1 / (1 – exp(0.187))= 0.5466
これで値を出力することができました。
どうやって学習する?
答えを適切に出力するために、矢印に適切な値に更新する必要があります。
何も学習してない状態では、矢印の値にランダムな数値をセットします。
教師データから、矢印の数値を何度も微調整していきます。
誤差逆伝播法という方法で学習を行います。
誤差逆伝播法(バックプロパゲーション)
学習するには、教師データから矢印の値を調整する必要があります。
誤差逆伝播法という方法を用います。
下記のように値を調整します。
教師データの答えと実際に求めた値の差から矢印の値を調整します。
尚、このアプリでは正答は0.999、誤答は0.001を教師データとして扱ってます。
まずは教師信号を求めます。
実際の値(0.82)と教師データ(0.999)の差にシグモイド関数を微分した値を掛けます。
(シグモイド関数の傾きに注目して下さい。1や0に近づくほど傾きは小さくなります。)
(0.999 – 0.82) × 0.82 × (1 – 0.82) = 0.0264
次に変化量を求めます
{教師信号に学習率を掛けた値}と{前回の変化量(初めはゼロ)に慣性項係数を掛けた値}を足します。
このアプリでは学習率を0.75、慣性項係数を0.8と定義してます。
{0.0264 × 0.75} + {0 × 0.8} = 0.0198
この変化量が今回学習した値です。
変化量と元の矢印の値(0.231)を足して矢印の値を調整します。
0.0198 + 0.231 = 0.2508
この処理を全ての矢印に対して行います。
(尚、入力層と隠れ層の矢印はもう少し計算が複雑になります。)
様々なデータで何度も学習処理を行うと、より高性能なネットワークになります。
ただし、学習し過ぎると教師データに特化した矢印の値になってしまう場合があります。
これを過学習と言います。
汎用的なネットワークにするには、ある程度のところで学習を止める必要があります。
上記のような結果になったときは
下記のように矢印の値が変化します。
ニューラルネットワークからディープラーニングへ
このアプリでは、隠れ層が1つの3層ニューラルネットワークです。
ニューラルネットワークでも隠れ層を2つ以上セットすることもあります(多層ニューラルネットワーク)。
4層以上の多層ニューラルネットでは、局所最適解や勾配消失などの技術的な問題が発生する場合があります。
ディープラーニングにおいては複数の活性化関数を活用したり、Dropoutやバッチ正規化などの技術を適用することで
多層ニューラルネットワークの問題を解決しています。
ディープラーニングでは、より複雑な問題にも適用できるようになります。
例えば文字認識だけでなく、画像に何が写っているか分析できるようになります。