ITエンジニア ノイのブログ

ITエンジニアのノイです。 YouTubeで ITエンジニアのお勉強という学習用の動画を公開しています。チャンネル登録お願いします!https://m.youtube.com/channel/UCBKfJIMVWXd3ReG_FDh31Aw/playlists

最急降下法

最急降下法とは

最急降下法(Steepest Descent Method)は、最適化アルゴリズムの一種であり、特に連続関数の最小値を見つけるために使用されます。最急降下法は、与えられた関数の勾配(または導関数)の逆方向に進みながら、関数の最小値に近づくことを目指します。

最急降下法による最小値の算出

最急降下法の手順

  1. 関数を定義します。
  2. 初期値を設定します。これは、最急降下法が最小値の近くから探索を開始する場所です。
  3. 勾配ベクトル(または導関数)を計算します。勾配は、関数が最も急な上昇方向を示すベクトルです。
  4. 勾配の逆方向に移動します。これにより、関数の値が減少します。
  5. アルゴリズムが収束するまで、ステップ3とステップ4を繰り返します。収束条件は通常、一定の反復回数または関数の変化率の閾値です。

実装例

x = -9.9 #初期値
y = -9.9 #初期値
alpha = 0.01 #学習率
diff = 1 #変化量の初期値
maxIter = 1000 #最大回数
threshold = 1.0e-5 #収束判定閾値

#結果をdataframeに格納していく
i = 0 
df_re = pd.DataFrame()
df_re.loc[i,"x"] = x
df_re.loc[i,"y"] = y
df_re.loc[i,"diff"] = diff
i += 1

#計算
while diff > threshold:# 変化しなくなったら終了
    x_pre = x
    y_pre = y
    dx = 2*x - 6 #xで微分したもの
    dy = 4*y - 4 #yで微分したもの
    x -= alpha * dx
    y -= alpha * dy
    diff = np.abs(x - x_pre) + np.abs(y - y_pre) #誤差を求める
    df_re.loc[i,"x"] = x #結果を追加していく
    df_re.loc[i,"y"] = y
    df_re.loc[i,"diff"] = diff
    i += 1
    
    if i > maxIter: #もしくは計算が最大回数を超えたら終了
        break

最急降下法の問題

最急降下法は、非線形最適化問題に対して広く使用されています。ただし、最急降下法にはいくつかの欠点もあります。例えば、局所最小値に陥る可能性があるため、グローバル最小値を見つけることができない場合があります。また、収束が遅い場合もあります。

youtu.be