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

無料レッスン

勾配降下法で最小値を探す

このレッスンのあとで: 学習率を決め、傾きと逆の向きへ進んで、関数の最小値に近づくことができる。

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

勾配降下法とは、坂を下って最小値を探す方法

勾配降下法(こうばいこうかほう)とは、関数の値が減る向きへ少しずつ進んで、最小値を探す方法です。式を解けない関数でも、傾きさえ計算できれば使えます。

ある店の費用が、仕入れの量で変わるとします。費用がいちばん低くなる量を、傾きを頼りに、一歩ずつ探していきます。

このレッスンのゴール

メモ

学習率を決め、傾きと逆の向きへ進んで、関数の最小値に近づくことができる。

キーワード

ことばいみれい
最小値関数がとる値の中で、いちばん小さい値
更新今の x から、次の x を求める1回の計算
学習率1回の更新で、傾きに掛ける倍率0.1
収束更新をくり返して、ある値に落ち着くこと
発散更新をくり返して、値が大きく離れていくこと

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

傾きと逆の向きへ、少しだけ進む

費用が f(x) = (x − 3)² + 1 万円で、x は仕入れの量(百個)とします。傾きは 2 × (x − 3) です。x = 0 では −6 で、マイナスは「x を増やすと費用が減る」ことを意味します。

更新の式は「新しい x = x − 学習率 × 傾き」です。学習率 0.1 なら、0 − 0.1 × (−6) で 0.6 に進みます。

例: x = 0 から4回更新する(学習率 0.1)

回x傾き新しい x
10−60.6
20.6−4.81.08
31.08−3.841.464
41.464−3.0721.7712

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

1回目の更新を確かめる

コマンド
docker exec jupyter python3 -c "print(round(0 - 0.1 * 2 * (0 - 3), 3))"

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

更新をくり返して費用を下げる

コード: python
# 費用 f(x) = (x - 3)² + 1 を小さくします。傾きは 2 * (x - 3) です。
x = 0.0
rate = 0.1
for step in range(1, 6):
    slope = 2 * (x - 3)
    x = x - rate * slope
    print("回", step, "x =", round(x, 4), "費用 =", round((x - 3) ** 2 + 1, 4))
# rate を 1.1 に変えて、もう一度実行してください。
# 費用は減りますか、増えますか。

学習率が大きすぎると行き過ぎる

学習率が小さいと、安全ですが時間がかかります。大きいと、最小の位置を飛び越えます。この例では、1.0 で 6、0、6 と行ったり来たりします。

1.1 では、振れ幅が毎回大きくなり、費用が逆に増えます。値が離れていくこの状態を発散と呼びます。

例: 学習率ごとの x の動き

学習率1回目2回目3回目様子
0.10.61.081.4643 に近づく(収束)
0.53331回で着く
1.0606行ったり来たり
1.16.6−1.328.184遠ざかる(発散)

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

学習率 1.1 の1回目を確かめる

コマンド
docker exec jupyter python3 -c "print(round(0 - 1.1 * 2 * (0 - 3), 3))"

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

傾きが十分小さくなったら止める

最小値では傾きが 0 になります。ただし小数の計算では、ぴったり 0 にならないことが多いです。そこで「傾きの大きさが小さな値より小さくなった」ら止めます。

さらに、回数の上限も決めておきます。発散する設定でも、いつか必ず止まります。

よくある間違い

注意

学習率は大きいほど、速く最小値に着くと考えがちです。大きすぎると、行き過ぎて費用が増えます。小さめの値から始め、費用が下がることを確かめてから、少しずつ上げます。

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

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