外れ具合を見て重みを直す
勾配降下法(こうばいこうかほう)は、損失が減る向きへ重みを少しずつ動かして、ネットワークを学習させる方法です。ニューラルネットワークの学習は、この方法の仲間で行われています。
重みが最初は適当な数でも、予測の外れ具合を見て直していくと、少しずつ正しい答えに近づきます。この直し方を、数を追って確かめます。
このレッスンのゴール
メモ
ネットワークが誤差から学ぶ仕組みを説明できる。
キーワード
| ことば | いみ | れい |
|---|---|---|
| 損失 | 予測がどれだけ外れたかを表す数 | |
| 勾配 | 重みを動かしたとき、損失がどちらへどれだけ変わるか | |
| 学習率 | 1回の直しで、重みを動かす大きさの倍率 | 0.1 |
| 勾配降下法 | 損失が減る向きへ、重みを少しずつ動かす方法 | |
| 誤差逆伝播法 | 誤差を出力側から入力側へ送って、各重みの勾配を求める方法 | |
| エポック | 学習データを全部1回通すこと |
学生が入力するセルは、このプレビューでは空白です。
損失は外れ具合を1つの数にしたもの
いちばん簡単な例は、重みが1つだけのモデルです。予測は「入力 × 重み」で、答えとの差を2乗して、平均を取ります。これを平均二乗誤差と呼び、ここでは損失として使います。
差を2乗するので、外れが大きいほど損失は急に大きくなります。プラスとマイナスの外れも、打ち消し合いません。
例: 重みを変えると損失が変わる
| 重み | 予測(入力1、入力2) | 差の2乗 | 損失(平均) |
|---|---|---|---|
| 0 | 0、0 | 9、36 | 22.5 |
| 2 | 2、4 | 1、4 | 2.5 |
| 3 | 3、6 | 0、0 | 0 |
学生が入力するセルは、このプレビューでは空白です。
損失はコマンドで確かめられる
データは、入力 1 のとき答え 3、入力 2 のとき答え 6 の2組です。次のコマンドは、重み0の損失を、表と同じ式で計算します。
重み0の損失を確かめる
docker exec jupyter python3 -c "print(((0 - 3) ** 2 + (0 - 6) ** 2) / 2)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
勾配は損失が増える向きを教える
勾配は、重みを少し増やしたとき、損失がどちらへどれだけ変わるかを表します。勾配がマイナスなら、重みを増やすと損失が減ります。
だから、重みを動かす向きは勾配の反対です。式は「新しい重み = 重み − 学習率 × 勾配」です。学習率が、1回に動く大きさを決めます。
勾配の1回目を計算する
重み0のとき、1つ目の組では 2×(0−3)×1 で −6、2つ目の組では 2×(0−6)×2 で −24 です。平均は −15 で、マイナスなので重みを増やします。
新しい重みは 0 − 0.1×(−15) で 1.5 です。損失は 22.5 から 5.625 に下がります。
例: 重み0から4回直す(学習率0.1)
| 回 | 重み | 勾配 | 新しい重み |
|---|---|---|---|
| 1 | 0 | -15 | 1.5 |
| 2 | 1.5 | -7.5 | 2.25 |
| 3 | 2.25 | -3.75 | 2.625 |
| 4 | 2.625 | -1.875 | 2.8125 |
学生が入力するセルは、このプレビューでは空白です。
勾配を確かめる
docker exec jupyter python3 -c "print(5 * (0 - 3), 5 * (1.5 - 3))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
重みが正しい値へ近づく様子
# データは [入力, 答え] の組です。正しい重みは 3 です。
data = [[1, 3], [2, 6]]
weight = 0.0
rate = 0.1
for step in range(5):
gradient = 0.0
for pair in data:
error = weight * pair[0] - pair[1]
gradient = gradient + 2 * error * pair[0]
gradient = gradient / len(data)
weight = weight - rate * gradient
print("回", step + 1, "重み", round(weight, 3))
# rate を 0.5 に変えて、もう一度実行します。
# 重みは 3 に近づきますか。
学習率が大きすぎると行き過ぎる
学習率が小さいと安全ですが、近づくのに回数がかかります。大きすぎると、正しい重みを飛び越えて、損失が逆に増えます。
この例で学習率が 0.5 だと、重みは 0、7.5、−3.75、13.125 と、3 を中心に大きく揺れて、遠ざかります。
例: 学習率で重みの動きが変わる
| 学習率 | 1回目 | 2回目 | 3回目 | 様子 |
|---|---|---|---|---|
| 0.1 | 1.5 | 2.25 | 2.625 | 3 に近づく |
| 0.2 | 3 | 3 | 3 | 1回で着く |
| 0.5 | 7.5 | -3.75 | 13.125 | 揺れて遠ざかる |
学生が入力するセルは、このプレビューでは空白です。
深いネットワークでは誤差を後ろへ送る
ネットワークには、重みがたくさんあります。誤差逆伝播法は、出力側の誤差を入力側へ層ごとに送り返し、各重みの勾配を順に求めます。
求めた勾配で、すべての重みを同時に少し動かします。学習データを全部1回通すとエポックが1つ進み、これを何回もくり返します。
よくある間違い
注意
学習率を大きくすれば、速く学べると考えがちです。しかし大きすぎると、正しい重みを飛び越えて、損失は減らずに増えます。小さい値から始めて、損失が下がるか確かめます。