クリーム色の背景、色付き表示、高コントラスト、大きな文字のほうが読みやすいですか?配色と文字を選ぶと、すべてのページに一度で反映されます。

無料レッスン

勾配降下法で学習する仕組み

このレッスンのあとで: ネットワークが誤差から学ぶ仕組みを説明できる。

60分のレッスンコマンド2件JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

外れ具合を見て重みを直す

勾配降下法(こうばいこうかほう)は、損失が減る向きへ重みを少しずつ動かして、ネットワークを学習させる方法です。ニューラルネットワークの学習は、この方法の仲間で行われています。

重みが最初は適当な数でも、予測の外れ具合を見て直していくと、少しずつ正しい答えに近づきます。この直し方を、数を追って確かめます。

このレッスンのゴール

メモ

ネットワークが誤差から学ぶ仕組みを説明できる。

キーワード

ことばいみれい
損失予測がどれだけ外れたかを表す数
勾配重みを動かしたとき、損失がどちらへどれだけ変わるか
学習率1回の直しで、重みを動かす大きさの倍率0.1
勾配降下法損失が減る向きへ、重みを少しずつ動かす方法
誤差逆伝播法誤差を出力側から入力側へ送って、各重みの勾配を求める方法
エポック学習データを全部1回通すこと

学生が入力するセルは、このプレビューでは空白です。

損失は外れ具合を1つの数にしたもの

いちばん簡単な例は、重みが1つだけのモデルです。予測は「入力 × 重み」で、答えとの差を2乗して、平均を取ります。これを平均二乗誤差と呼び、ここでは損失として使います。

差を2乗するので、外れが大きいほど損失は急に大きくなります。プラスとマイナスの外れも、打ち消し合いません。

例: 重みを変えると損失が変わる

重み予測(入力1、入力2)差の2乗損失(平均)
00、09、3622.5
22、41、42.5
33、60、00

学生が入力するセルは、このプレビューでは空白です。

損失はコマンドで確かめられる

データは、入力 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)

回重み勾配新しい重み
10-151.5
21.5-7.52.25
32.25-3.752.625
42.625-1.8752.8125

学生が入力するセルは、このプレビューでは空白です。

勾配を確かめる

コマンド
docker exec jupyter python3 -c "print(5 * (0 - 3), 5 * (1.5 - 3))"

ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。

重みが正しい値へ近づく様子

コード: python
# データは [入力, 答え] の組です。正しい重みは 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.11.52.252.6253 に近づく
0.23331回で着く
0.57.5-3.7513.125揺れて遠ざかる

学生が入力するセルは、このプレビューでは空白です。

深いネットワークでは誤差を後ろへ送る

ネットワークには、重みがたくさんあります。誤差逆伝播法は、出力側の誤差を入力側へ層ごとに送り返し、各重みの勾配を順に求めます。

求めた勾配で、すべての重みを同時に少し動かします。学習データを全部1回通すとエポックが1つ進み、これを何回もくり返します。

よくある間違い

注意

学習率を大きくすれば、速く学べると考えがちです。しかし大きすぎると、正しい重みを飛び越えて、損失は減らずに増えます。小さい値から始めて、損失が下がるか確かめます。

このラボとソースについて: JupyterLab データサイエンスラボ:pandas、Matplotlib、scikit-learn をブラウザーで

授業で使いますか?このモジュールを学生に割り当てると、教員用ガイド、自動採点つきの課題、学生ごとのラボを使えます。