
ランダムな200箇所から出発したら、勾配降下法は1つも正解にたどり着けなかった。焼きなまし法で局所最適解から抜け出す実験
勾配降下法は「今いる場所から見て、坂を下る方向に進み続ける」という手法だ。理屈はシンプルで、実際に多くの場面でうまく機能する。ただ、この方法には構造的な弱点がある。一度谷底に着いてしまうと、そこが本当の最下点でなくても、そこから動けなくなるという点だ。
これは人生の意思決定にも重なる話だと思う。「今より悪くなる選択はしない」を徹底すると、目の前の小さな谷(そこそこ快適な現状)に落ち着いた時点で、その先によりよい選択肢があっても、そこへは絶対に辿り着けない。一度でも「今より悪化する」ステップを踏まなければ、そこへ抜け出せないからだ。
この「一時的な悪化を受け入れる」ことの効果を、局所最適解だらけの地形を使って実際に検証してみた。
Ackley関数: エッグクレート状の地形
局所最適解の実験によく使われるベンチマーク関数にAckley関数がある。
原点に唯一の大域最適解()があり、その周りには整数座標付近に無数の浅い局所最適解が、卵パックのように規則正しく並んでいる。
def ackley(pos):
x, y = pos[..., 0], pos[..., 1]
r = np.sqrt(0.5 * (x ** 2 + y ** 2))
term1 = -20 * np.exp(-0.2 * r)
term2 = -np.exp(0.5 * (np.cos(2 * np.pi * x) + np.cos(2 * np.pi * y)))
return term1 + term2 + np.e + 20
実際に3D表示してみると、この「無数の浅い谷に囲まれた、たった一つの深い谷」という構造がよく分かる(ドラッグで回転できます)。
3つの手法で競走させる
3つの手法を実装して比較する。
- 通常のGD: 勾配方向に、常に一定の歩幅で下り続ける
- Momentum: これまでの移動の慣性を持ち越しながら下る。慣性の力で、浅い谷を惰性で乗り越えられることがある
- 焼きなまし法(Simulated Annealing, SA): ランダムな方向に一歩動いてみて、改善するなら採用。悪化する場合でも、確率で採用してしまう。温度は徐々に下げていく
def run_sa(start, iters, step_size, T0, cooling, rng):
pos = start.copy()
f_pos = ackley(pos)
T = T0
for _ in range(iters):
candidate = pos + rng.normal(0, step_size, size=2)
f_cand = ackley(candidate)
delta = f_cand - f_pos
if delta < 0 or rng.random() < np.exp(-delta / max(T, 1e-8)):
pos, f_pos = candidate, f_cand
T *= cooling
return pos
温度が高い最初のうちは、多少の悪化にも寛容になる(悪化幅が大きくてもがそこそこの値を持つ)。学習が進むにつれてを下げていくと、だんだん「悪化を受け入れる寛容さ」が減り、最後はほぼ通常のGDと同じように、改善する方向にしか動かなくなる。
結果: GDは0%、SAは100%
の範囲からランダムに選んだ200箇所を開始点として、それぞれの手法を500ステップ動かし、最終的に大域最適解(原点)から距離0.5以内にたどり着けたかを調べた。

gd: 0.000
momentum: 0.025
sa: 1.000
正直、ここまではっきり差が出るとは思っていなかった。通常のGDは200箇所すべてで、開始点の近くにあった浅い局所最適解に落ちて動けなくなった。1つも大域最適解にたどり着けていない。 Momentumも多少はましだが、200回中5回(2.5%)成功しただけだった。一方で焼きなまし法は、200箇所すべてから大域最適解にたどり着いた。
同じ開始点(隅の方、付近)から3手法を動かした軌跡を地形図に重ねてみると、差は一目瞭然だ。

GDとMomentumの軌跡は、凡例には出しているものの、グラフ上ではほとんど見えない。開始点のすぐ近くの谷に落ちて、そこからぴくりとも動いていないからだ。実際の到達点は次のようになった。
gd final: [-5.0, -5.0] f=12.64
momentum final: [-4.99, -4.99] f=12.63
sa final: [0.003, 0.029] f=0.10
GDとMomentumは、開始点から一番近い(だが本命ではない)谷の底に到達しただけで、そこから一歩も動けていない。焼きなまし法だけが、盤面を大きく横切って本当の谷まで辿り着いている。
Momentumは強めれば強めるほど良いわけではない
Momentumがほとんど役に立たなかったのは、慣性の強さ(momentum係数)が足りなかっただけなのか、それとも慣性をどれだけ強めても構造的に無理なのか、を0から0.99まで振って確認してみた。

あたりで到達率が3.0%とわずかにピークを作るが、そこからさらに慣性を強めると、では逆に0%まで落ちてしまう。慣性を強めれば強めるほど脱出しやすくなるわけではなく、途中に山がある。慣性が弱すぎると浅い谷をほとんど乗り越えられず、強すぎると今度は勢い余って別の浅い谷に飛び込んでしまい、結局同じように動けなくなる。過学習の記事や転移学習の記事でも見た「強めれば強めるほど良いとは限らず、途中に最適な強さがある」という形が、ここでも同じように現れた。
いずれにせよ、この程度の慣性では、Ackley関数の谷の深さ・広さに対してはほとんど無力だった。
一時的な悪化を受け入れる、という設計
今回の実験でもっとも印象に残ったのは、焼きなまし法が最初のうちは平気で「悪化する方向」に動いていたことだ。上のアニメーションでも、温度が高い序盤(iter=100あたり)は粒子たちが盤面を広く動き回り、終盤(iter=500)になるとほとんどが中心の谷に収束している。

GD側の粒子は、最初の数十ステップでそれぞれ最寄りの谷に落ちてしまい、あとはずっと同じ場所に固まったままになる。SA側の粒子は、序盤は地形全体をランダムに探り、温度が下がるにつれて徐々に「改善する方向にしか動かない」通常のGDに近い挙動へと収束していく。この「最初は広く探り、後から絞り込む」設計そのものが、局所最適解を回避できた理由だ。
一度も後退しない戦略は、一見もっとも合理的に見える。しかし、それは同時に「最初にたまたま近くにあった、そこそこの答え」に永遠に縛られる戦略でもある。焼きなまし法は、序盤にあえて「改悪」を許容することで、その縛りから逃れている。ただし無制限に許容するわけではなく、温度を下げることで、その許容範囲は時間とともに狭めていく。ずっと悪化を許し続けていたら、いつまで経っても一つの場所に定まらない。
これは、キャリアや人生の選択にもそのまま重なる話だと思う。今より条件が悪くなる転職、うまくいっていた環境をあえて離れる決断、時間や信頼を一時的に失うかもしれない挑戦。「今より悪くなる選択は絶対にしない」を徹底していたら、最初にたまたま流れ着いた、そこそこ快適な場所からは一生動けない。焼きなまし法が教えてくれるのは、悪化を受け入れる勇気を無期限に持ち続けろということではなく、まだ何も分かっていない初期のうちほど大胆に、経験や情報が積み上がってきたら徐々に慎重に、という温度スケジュールそのものの合理性だ。
まとめ
- 無数の局所最適解を持つAckley関数の上で、200箇所のランダムな開始点から通常のGD・Momentum・焼きなまし法(SA)を競走させたところ、GDは0%、Momentumは2.5%、SAは100%が大域最適解に到達した
- GDとMomentumは、開始点から最も近い(本命ではない)谷に落ちたら最後、そこから一歩も動けなかった
- Momentumの強さ(momentum係数)を0から0.99まで振ると、付近でわずかに到達率が上がるものの、そこからさらに強めると再び悪化する、非単調な関係になった。「強めるほど良い」わけではない
- 焼きなまし法は、温度が高い序盤は悪化する方向にも動くことを許容し、温度が下がるにつれて徐々に「改善する方向にしか動かない」通常のGDに近づいていく。この「最初は大胆に、後から慎重に」という設計が、局所最適解からの脱出を可能にしていた


