見出し画像

第21話 バックプロパゲーションの理解に必要な知識 -訓練データとテストデータ、損失関数-

今回からNN(ニューラルネットワーク)の学習アルゴリズムであるバックプロパゲーションの中身について学習していきます。
バックプロパゲーションを理解するためには次の5つの要素を知る必要がありました。

<バックプロパゲーションの理解に必要な5要素>
1 訓練データとテストデータ
2 損失関数
3 勾配降下法
4 最適化アルゴリズム
5 バッチサイズ

今回はこのうちの1と2について勉強していきます。
具体的な内容は次のとおりです。
・訓練データとテストデータ
・損失関数(二乗和誤差、交差エントロピー誤差)

それでは学習をはじめましょう。
(教科書「はじめてのディープラーニング」我妻幸長著)

訓練データとテストデータ

NNを学習させるためには多数のデータが必要になります。
この学習に必要なデータのことを訓練データといい、訓練データによって学習したNNがうまく学習できているかを検証するためのデータをテストデータといいます。
このようにNNの学習には2種類のデータを用意する必要があります。

名称未設定

訓練データの使われ方のイメージを示します。
訓練用の入力と正解のデータを使ってNNを学習させます。

名称未設定

学習が完了したら、学習させたNNが未知のデータに対して有効かどうかを、テストデータを使用して検証します。
テストデータの入力をNNに入れると、NNはなにかしらの出力を返してきます。
その出力と正解の誤差が小さければ、良い学習ができているということになります。(言うまでもなく出力=正解がベスト)

名称未設定

出力と正解のイメージはこんな感じです。
分類問題のときは正解はどれか一つになるので、正解の配列は1が一つだけある形となります。これをone-hot表現といいます。

名称未設定

回帰・分類どちらの場合でも、出力と正解の誤差がどんどん小さくなればNNの学習が進んでいると言うことができます。

損失関数 -二乗和誤差と交差エントロピー誤差-

出力と正解の誤差を定義する関数です。誤差関数、コスト関数ともいいます。
今更ですが、誤差とはあるべき状態との解離の度合いのことです。
誤差が大きいとは、望ましい状態から離れていることを意味します。
NNの学習はこの誤差を最小化するように行われます。

損失関数にはさまざまな種類があるのですが、ディープラーニングでは二乗和誤差、交差エントロピー誤差を使用するのが一般的のようです。

二乗和誤差
出力値と正解値の差を二乗し、すべての出力層のニューロンで総和をとったものを二乗和誤差と呼びます。
数式で表すとこのようになります。

名称未設定

1/2は微分したときに便利だから付いています。(微分すると×2されて打ち消される。)
これを用いることにより、ニューラルネットワークの出力と正解の誤差を定量化することができます。

二乗和誤差は正解や出力が連続的な値のケースに向いているため回帰問題でよく使用されるようです。
Numpyのsum関数、square関数(引数を2乗する関数)を使って簡単に実装することができます。

スクリーンショット 2020-04-29 6.26.18

交差エントロピー誤差
2つの分布の間のズレを表す尺度です。分類問題でよく使用されるようです。
次のような数式で表されます。

名称未設定

Σとlogが出てきて、一見よくわからない関数ですね。
ですが実はそんなに難しくありません。

先ほどのおさらいですが、分類問題では正解値はone-hot表現でした。
なので上式の右辺は、実は1項しか残りません。
先ほどの例だとはこのようになります。

名称未設定

こうなればあとは-logがどのような関数かを理解するだけですね。
ずばりこのような関数です。

名称未設定

xが1から遠ざかるほどyは大きく、xが1に近づくほどyは0に近づきます。
先ほどの例に当てはめると、y_3が正解の1から遠いうちは誤差Eは大きく、y_3が1に近づけば誤差Eは小さくなります。

交差エントロピー誤差は、出力値と正解値の解離が大きいほど誤差が大きくなる(0に近くなるほど無限に向かって増大)ので、学習速度が速く、出力値と正解値の解離が素早く解消できる利点があります。
Numpyのsum関数、log関数を使って実装してみましょう。

スクリーンショット 2020-04-30 4.51.41

簡単に書けました。logの()内に1e-7とあるのは、log(0)とすると計算が止まってしまうためのを防ぐためです。(log0は無限に発散するので計算できない。)

一つ例をやってみます。
出力y1 = (0.18, 0.8, 0.02)と適当に定めて、正解をt1として、y1との解離によって誤差Eがどのように変化するか確認します。

名称未設定2

y1とt1との解離が最も大きい一番右のコードで、誤差が最大になることがちゃんと確認できました。


まとめに入ります。
今回は、訓練データとテストデータ、損失関数(二乗和誤差、交差エントロピー誤差)について学習しました。
損失関数を理解したことにより、バックプロパゲーションにおける最初のステップである「出力と正解の誤差を算出する。」ことができるようになりましたね。

次回は勾配降下法について学習します。
それではまた(^_^)ノシ

よろしければサポートお願いします!いただいたサポートは書籍代等に活用いたします!