これまでは勾配降下法によって最適化をしてきましたが、他にも最適化の手法があるので見ていきましょう!
勾配降下法の欠点
復習ですが学習とは訓練データから最適な重みパラメータを自動で導き出すことです。
これを人間が頑張って探すのは限界があるので、勾配降下法を用いて計算で最適化を行うということをしてきました。
ですが勾配降下法は確かに損失関数の値を小さくはできるのですが、向かう方向が本当の最小値ではない可能性、複雑なものだと時間がかかるという欠点があります。
これらの欠点を克服するために作られたいくつかの最適化の手法を見ていきましょう!
勾配降下法の復習
実際に問題を解いて復習しましょう。
- f(x,y) = (1/20) * x^2 + y^2 の最小値を勾配法で求める
- 初期値=(-3.0, 4.0), 学習率=0.1, step=3
画像にすると以下のような関数。
yの変化は大きいがxの変化は小さい。
Step1
偏微分の計算
xについて微分すると ∂f / ∂x = 10 / x
yについて微分すると ∂f / ∂x1 = 2 * y
∂f / ∂x = -3/10 = -0.3
∂f / ∂y = 8
x=-3.0 - (0.1 * -0.3) = -2.97
y=4.0 - (0.1 * 8.0) = 3.2
Step2
偏微分の計算
∂f / ∂x = -2.97 / 10 = -0.297
∂f / ∂y = 3.2 * 2 = 6.4
x=-2.97 - (0.1 * -0.297) = -2.9403
y=3.2 - (0.1 * 6.4) = 2.56
Step3
偏微分の計算
∂f / ∂x = -2.9403 / 10 = -0.29403
∂f / ∂y = 2.56 * 2 = 5.12
x=-2.9403 - (0.1 * -0.29403) = -2.910897
y=2.56 - (0.1 * 5.12) = 2.048
xが全然小さくなりませんね。。
最適化手法① Momentum
Momentumという手法を見ていきましょう。
ChatGPTに聞いてみました。
Momentumの基本的なアイデアは、過去の勾配の移動方向を考慮して、現在の更新に反映させることです。これにより、勾配が連続して同じ方向に向かっている場合、その方向への更新が加速され、逆に揺れが多い場合には、その揺れを抑えることができます。
勾配降下法に加速するような変数を加えて学習の高速化を狙ったような手法てことですねー。
数式で見てみると以下の通り。
v ← α * v - η * ∂L / ∂W
W ← W + v
W: 重みパラメータ
η: 学習率
∂L / ∂W: 損失関数の勾配
v: 加速させるための変数
α: 加速の強さを調節するような変数
η: 学習率
∂L / ∂W: 損失関数の勾配
v: 加速させるための変数
α: 加速の強さを調節するような変数
実際に計算してみましょう!
- f(x,y) = (1/20) * x^2 + y^2 の最小値をMomentumで求める
- 初期値=(-3.0, 4.0), 学習率=0.1, step=3, α=0.9 v=0
Step1
偏微分の計算
xについて微分すると ∂f / ∂x = 10 / x
yについて微分すると ∂f / ∂x1 = 2 * y
∂f / ∂x = -3/10 = -0.3
∂f / ∂y = 8
vx = 0.9 * 0 - (0.1 * -0.3) = 0.03
vy = 0.9 * 0 - (0.1 * 8) = -0.8
x=-3.0 + 0.03 = -2.97
y=4.0 + (-0.8) = 3.2
Step2
∂f / ∂x = -2.97/10 = -0.297
∂f / ∂y = 3.2 * 2 = 6.4
vx = 0.9 * 0.03 - (0.1 * -0.297) = 0.0567
vy = 0.9 * (-0.8) - (0.1 * 6.4) = -1.36
x=-2.97 + 0.0567 = -2.9133
y=3.2 + (-1.36) = 1.84
Step3
∂f / ∂x = -2.9133 / 10 = -0.29133
∂f / ∂y = 1.84 * 2 = 3.68
vx = 0.9 * 0.0567 - (0.1 * -0.29133) = 0.080163
vy = 0.9 * (-1.36) - (0.1 * 3.68) = -1.592
x=-2.9133 + 0.080163 = -2.833137
y=1.84 + (-1.592) = 0.248
どちらも同じステップ数ですが早くなってますね!
次回は他の手法も見ていきましょう。
コメント
コメントを投稿