体系 › 微分と最適化の数学
·無料·論文·10分で読めます

凸性と最適化 — なぜ深層学習は「凸でない」のに動くのか

最適化理論の教科書は「凸なら解ける、凸でないなら保証なし」と教える。では損失面が凸でない深層学習はなぜ動くのか。凸集合・凸関数の定義から、局所解より恐い鞍点、汎化と結びつく平坦な最小値まで、地形の言葉で一気につなぐ。

要点

  • 凸集合は、中のどの2点を結んでも線分がまるごと集合に収まる、へこみのない領域である。
  • 凸関数では、局所的な最小値は必ず大域的な最小値であり、勾配降下法に保証がつく。
  • 深層学習の損失面は置換対称性ゆえに凸ではなく、凸の保証は消える。
  • 高次元では、訓練を妨げる臨界点の圧倒的多数は局所解ではなく鞍点で、SGDのノイズが脱出を助ける。
  • 平坦な最小値は鋭い最小値より汎化しやすいと考えられ、SAMは近傍で最悪の地点の損失を下げて平坦な谷を探す。
対象textタスクmath

Identifying and attacking the saddle point problem in high-dimensional non-convex optimization


ボウルの底と、霧の山脈

目隠しをして、足元の傾きだけを頼りに一番低い場所を探す遊びを想像してください。

舞台がサラダボウルの内側なら簡単です。どこに立っていても「下り」の方向へ歩き続ければ、必ず底—それも唯一の底—に着きます。

舞台が霧のかかった山脈なら話は別です。歩いた先の窪地が本当に一番低い谷なのか、それとも小さな水たまりなのか、足元の傾きだけでは分かりません。尾根の上の奇妙な平坦地で、どちらへ進むべきか途方に暮れるかもしれません。

このボウルと山脈を数学の言葉で区別するのが凸性(とつせい)です。そして深層学習の損失面は、まぎれもなく山脈のほうです。それなのに勾配降下法—「足元の下りへ歩く」だけの方法—が実際にはうまくいく。この記事は、その謎を地形の言葉で解いていきます。

凸集合と凸関数 — 「へこみのない」形

まず土台の2つの定義から。どちらも「2点を結ぶ」だけの素朴な話です。

凸集合は、へこみのない領域のことです。集合 CC が凸であるとは、

λx+(1−λ)y∈C(∀x,y∈C, ∀λ∈[0,1])\lambda x + (1-\lambda)y \in C \quad (\forall x, y \in C,\ \forall \lambda \in [0,1])
(1)

言い換えると「CC の中のどの2点 x,yx, y を選んで直線で結んでも、その線分がまるごと CC に収まる」ということです。λ\lambda(ラムダ)は線分上の位置を表す0から1の割合です(0.5なら中間点)。円盤は凸、三日月は凸ではありません(線分が欠けた部分を横切るため)。

凸関数は、グラフが「お椀型」の関数です。関数 ff が凸であるとは、

f(λx+(1−λ)y)≤λf(x)+(1−λ)f(y)f(\lambda x + (1-\lambda)y) \le \lambda f(x) + (1-\lambda)f(y)
(2)

言い換えると「グラフ上の2点を弦(直線)で結ぶと、グラフは必ず弦の下か弦上にある」ということです。左辺は「2点の混ぜ合わせ地点での関数の値」、右辺は「関数の値の混ぜ合わせ」つまり弦の高さ。お椀は弦より下にたわむ、という日常的な観察がそのまま定義になっています。f(x)=x2f(x)=x^2 は凸、sin⁡x\sin x は凸ではありません。

1変数で2回微分できるなら、判定はもっと簡単です。f′′(x)≥0f''(x) \ge 0 がすべての点で成り立てば凸。つまり「傾きがずっと増え続ける(減りに転じない)」なら、お椀型だと保証されます。

凸だと何がうれしいのか

凸関数には、最適化にとって夢のような性質があります。

局所的な最小値は、必ず大域的な最小値である。

「これ以上どちらに動いても下がらない」場所を見つけたら、そこが正真正銘の一番底だと保証されるのです。ボウルの中では、水たまりにだまされる事態がそもそも起こりえません。理由も定義から素直に出ます。もし底Aより低い別の点Bがあったなら、AとBを結ぶ弦は途中でAより低くなり、Aの近くにもっと低い点が存在してしまう—「Aは局所最小」という前提と矛盾するからです。

さらに微分可能な凸関数では、次の一階の条件が成り立ちます。

f(y)≥f(x)+∇f(x)⊤(y−x)f(y) \ge f(x) + \nabla f(x)^\top (y - x)
(3)

言い換えると「どの点 xx で接平面(接線)を引いても、関数全体がその接平面より上にある」。∇f(x)\nabla f(x)(ナブラf)は点 xx での勾配、つまり最も急な上り方向を指すベクトルです。この式の強力さは、∇f(x)=0\nabla f(x) = 0 を代入すると右辺が f(x)f(x) になり、「勾配がゼロの点は全域で最小」が一行で出るところにあります。

だから凸な問題—線形回帰やロジスティック回帰—では、勾配降下法はどこから出発しても同じ答えに着きます。まずはその「安心な世界」を体で確かめてください。

FIG 1凸な谷を球が転がる。学習率が適切なら必ず底に着くが、上げすぎると谷を飛び越えて発散する—凸ですら学習率だけは面倒を見てくれない

ここまでが教科書の前半、「凸なら解ける」の世界です。ところが深層学習は、この安心な世界の外に住んでいます。

深層学習の損失面は、証明つきで凸ではない

ニューラルネットの損失関数(パラメータを入力、訓練誤差を出力とする関数)が凸でないことは、雰囲気ではなく簡単な議論で示せます。鍵は置換対称性です。

隠れ層のニューロン1番と2番を、つながる重みごとそっくり入れ替えても、ネットワークの計算する関数は変わりません。つまりパラメータ空間には、損失が完全に等しい「別の場所」が大量にあるのです。ある最小値 θA\theta_A とその並べ替えコピー θB\theta_B の中間点を考えます。もし損失が凸なら、式(2)より中間点の損失は両端以下—つまり中間点も最小値のはずです。しかし実際は半分ずつ混ざった中途半端な重みになり、損失は跳ね上がります。凸性の定義が破れているので、損失面は凸ではないと結論できます。

凸でない以上、教科書の保証は全部消えます。勾配がゼロの点(臨界点)が底とは限らない。では勾配降下法は何に捕まるのか—長らく「局所解(ローカルミニマム)に捕まる」と説明されてきました。しかし2010年代半ば、この通説がひっくり返ります。

恐いのは局所解ではなく鞍点だった

臨界点の性質は、二階微分を並べた行列ヘッセ行列の固有値で分類できます(固有値と固有ベクトルそのものの意味はAIのための線形代数で扱っています)。固有値は「その方向に断面を切ったときの曲がり方」で、

鞍点は馬の鞍の形で、前後には窪み、左右には盛り上がっています。勾配はゼロなので勾配降下法は立ち往生しますが、実は「下りられる方向」が残っています。

ここで次元の高さが効いてきます。Dauphinら(2014)はランダム行列理論を引きながらこう論じました。パラメータが100万次元なら、臨界点が局所最小値であるためには100万個の固有値がすべて正でなければならない—コインを100万回投げて全部表が出るような偶然で、損失がまだ高い領域ではまず起こらない。つまり高次元では、訓練を妨げる臨界点の圧倒的多数は局所解ではなく鞍点だという描像です。

これは朗報でもあります。鞍点には必ず脱出方向(負の固有値の方向)があり、SGD(確率的勾配降下法)がミニバッチごとに持ち込むノイズが、そちらへ偶然押し出してくれるからです。「解けない」はずの非凸最適化が実際に進む理由の一つは、敵の正体が袋小路ではなく、抜け道つきの踊り場だったことにあります。

FIG 2凸でない損失面の等高線を降下経路が進む。出発点しだいで別の谷に落ち、モーメンタムを効かせると浅い窪みや鞍のよどみを通り抜けやすくなる

どの谷に落ちるかで、賢さが変わる — 平坦な最小値

非凸の地形には谷がたくさんあります。すると新しい問いが生まれます。同じくらい低い谷なら、どれに落ちても同じなのか?

答えは「同じではないらしい」です。手がかりは谷の幅にあります。切り立った峡谷のような鋭い最小値と、広い盆地のような平坦な最小値では、訓練誤差が同じでも本番(テスト)での成績が違う—平坦なほうが汎化しやすい、という仮説が古くからあります。Keskarら(2017)は、大バッチ訓練でテスト精度が落ちる現象を調べ、ノイズの減った大バッチは鋭い谷に落ちやすいことを観察しました。

直感はこうです。訓練データとテストデータは似ているが同一ではないので、テスト時には損失面がわずかに横にずれる。峡谷の底に立っていたら、地面が少しずれただけで壁に激突する(損失が急増する)。盆地の底なら、多少ずれても底のままです。

この考えを訓練アルゴリズムに焼き込んだのが SAM(Sharpness-Aware Minimization, 2021)です。現在の地点の損失ではなく「近傍で最悪の地点の損失」を下げるよう更新し、明示的に平坦な谷を探します。ただし「平坦さ」は尺度の取り方(再パラメータ化)で見かけが変わるという批判もあり、汎化の本当の説明が何かは今も研究が続いています。

コードで確かめる — 鞍点のよどみ

鞍点の「立ち往生してから抜ける」感触は、2変数あれば再現できます。f(x,y)=x2−y2f(x,y) = x^2 - y^2 は原点が鞍点です(xx 方向には谷、yy 方向には尾根)。

import numpy as np

w = np.array([1.0, 1e-8])          # ほぼ尾根の真上から出発
for t in range(60):
    g = np.array([2*w[0], -2*w[1]])  # f = x^2 - y^2 の勾配
    w -= 0.1 * g
    if t % 10 == 0:
        print(t, w)

走らせると、xx は数ステップで0に潰れる一方、yy は 10−810^{-8} からじわじわとしか育たず、しばらく原点近くでほぼ動かない時間が続きます。勾配のノルムだけ見ると「収束した」ように見える—これが鞍点のよどみです。初期値の 10−810^{-8} を 10−210^{-2} に変える(=ノイズで尾根から押し出された状況にする)と、脱出が一気に早まるのも確認できます。

現場ではこう使う

この地形観は、モデルを訓練する人の日々の判断に直結します。

まとめ

勾配降下法そのものの導出は損失関数と最適化で、その土台の微分はAIのための微分で扱っています。「平坦な谷はなぜ本番に強いか」を汎化の側から掘るなら過学習と評価設計が続きになります。

参考文献

  1. Identifying and attacking the saddle point problem in high-dimensional non-convex optimization. arXiv:1406.2572論文ページ·PDF
  2. On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima. arXiv:1609.04836論文ページ·PDF
  3. Sharpness-Aware Minimization for Efficiently Improving Generalization. arXiv:2010.01412論文ページ·PDF

本記事は上記論文の本文にもとづいて執筆しています。数値・主張は原典を優先してください。

運営: TechAthletes · 編集方針 · 出典の付け方 · 訂正の記録

コメント

コメントにはログインが必要です