凸最適化の基礎
凸関数が保証する「局所最適解 = 大域最適解」という最適化理論の要
- 1
- 関数 が「凸関数」であるとは、グラフ上の任意の2点を結ぶ線分がグラフより常に上(またはグラフに接する)にある性質であり、直感的には「谷が1つしかないお椀型」の関数を指す
- 2
- 凸関数には『局所的な最小値は必ず大域的な最小値でもある』という強力な性質があり、どこから探索を始めても勾配降下法などの局所探索が必ず唯一の最適解に収束することが数学的に保証される
- 3
- サポートベクターマシン(SVM)の損失関数は凸関数であるため学習が必ず最適解に収束するが、ニューラルネットワークの損失関数は一般に非凸(谷がいくつも存在する)であり、初期値によって異なる局所解に落ち着くことがある
なぜこれを学ぶのか? — 現実社会とテクノロジーでの価値
なぜ生まれたのか?
関数 $f$ が「凸関数」であるとは、グラフ上の任意の2点を結ぶ線分がグラフより常に上(またはグラフに接する)にある性質であり、直感的には「谷が1つしかないお椀型」の関数を指す
身につく武器・思考力
凸関数には『局所的な最小値は必ず大域的な最小値でもある』という強力な性質があり、どこから探索を始めても勾配降下法などの局所探索が必ず唯一の最適解に収束することが数学的に保証される
実社会・ITでの活躍現場
- •機械学習モデルの学習における凸損失関数と非凸損失関数の違い
- •ITシステム・アルゴリズム実装における論理設計
- •データ分析やシミュレーションにおける数理モデリング
Layer 1 — 直感・シミュレーター
凸関数(お椀型)と非凸関数(谷が複数ある波形)をボタンで切り替えて、点をドラッグして異なる初期位置から「勾配降下」を実行してみよう。凸関数ではどこから始めても同じ谷底(大域最小値)にたどり着くが、非凸関数では初期位置によって異なる谷(局所最小値)に捕まってしまうことがある。
点をドラッグして初期位置を変え、実行ボタンで谷底まで降下させてみよう。
現在地 = -3.000、 = 6.900
更新式:
凸関数では、点をどこに置いても勾配降下は必ず同じ谷底(大域最小値 x=1)に収束する。局所最小値=大域最小値が保証されるため。
↑ SVMの凸損失関数は「どこから学習を始めても同じ最適解に収束する」ことが保証されるが、ニューラルネットワークの非凸損失関数ではその保証がない代わりに、実務上は十分良い解が得られることが多い。
関数 が凸関数であるとき、勾配降下法によって見つかった「局所的な最小値」について正しい記述はどれか?
Layer 2 — 定義・受験・証明
定義
定義域が凸集合であるような関数 が「凸関数」であるとは、任意の2点 と任意の に対して次の不等式が成り立つことをいう。
これは「グラフ上の任意の2点を結ぶ線分(弦)が、グラフそのものより下に来ることは決してない」という幾何学的な意味を持つ。2回微分可能な関数の場合、 がすべての で成り立つことと凸性は同値である。
公式・数理モデル
証明・導出
凸関数の局所最小値が大域最小値であることの証明(背理法): を凸関数とし、 を局所最小値( の近傍で最小)とする。ここで、ある点 が存在して であると仮定する(大域的にはもっと小さい値がある、という仮定)。
凸性の定義より、任意の に対して
仮定 より、右辺は
したがって
が任意の小さな について成り立つ。 とすると、点 は にいくらでも近づけるので、 のどんなに小さな近傍内にも より小さい値を取る点が存在することになる。これは が「局所最小値」であるという仮定(近傍内で最小)に矛盾する。 よって、 となるような は存在せず、局所最小値 は同時に大域最小値でもあることが示された。
押さえておきたいポイント
- 凸関数の判定条件: 1変数なら (下に凸)、多変数ならヘッセ行列が半正定値であること
- 凸関数の重要な帰結:『局所最適 = 大域最適』が保証されるため、勾配降下法などの局所探索アルゴリズムが必ず正しい解に収束する
- サポートベクターマシン(SVM)やリッジ回帰・ロジスティック回帰の損失関数は凸関数として設計されており、学習の収束性が理論的に保証されている
- ニューラルネットワークの損失関数は一般に非凸(複数の谷=局所最小値を持つ)であり、初期値や最適化手法によって異なる解に到達しうるが、実務上は十分良い解が得られることが経験的に知られている
本トピックの内容・数理モデルは、文部科学省学習指導要領(算数・数学・情報)および国際標準カリキュラムに準拠し、エンジニアリング現場の実装事例と照らし合わせてMath World Lab編集部により検証・作成されています。
Layer 3 — 工学応用・現場実装
機械学習モデルの学習における凸損失関数と非凸損失関数の違い
SVMのヒンジ損失やロジスティック回帰の対数尤度損失は凸関数として設計されているため、勾配降下法は初期値によらず必ず唯一の大域最適解に収束する。一方、ディープラーニングの損失関数(多数の重みパラメータに対する非線形関数)は一般に非凸であり、初期値の違いによって異なる局所最小値に収束しうる。以下は同じ勾配降下ロジックを凸関数と非凸関数の両方に適用し、収束先が初期値に依存するかどうかを比較するコードである。
1// 凸関数の例: f(x) = (x-2)^2 + 1 (谷はただ1つ、x=2で最小)2function convexLoss(x: number): number {3 return (x - 2) ** 2 + 1;4}5function convexGradient(x: number): number {6 return 2 * (x - 2);7}89// 非凸関数の例: 複数の谷(局所最小値)を持つ関数10function nonConvexLoss(x: number): number {11 return 0.3 * x ** 4 - 2 * x ** 2 + 0.5 * x + 5; // x ≈ ±1.8 付近に2つの谷12}13function nonConvexGradient(x: number): number {14 return 1.2 * x ** 3 - 4 * x + 0.5;15}1617// 汎用の勾配降下法: 初期値 x0 から steps 回だけ更新する18function gradientDescent(19 gradient: (x: number) => number,20 x0: number,21 learningRate: number,22 steps: number23): number {24 let x = x0;25 for (let i = 0; i < steps; i++) {26 x = x - learningRate * gradient(x);27 }28 return x;29}3031// 凸関数: どの初期値から始めても必ず同じ最小点 x=2 に収束する32console.log(gradientDescent(convexGradient, -5, 0.1, 100).toFixed(3)); // 2.00033console.log(gradientDescent(convexGradient, 8, 0.1, 100).toFixed(3)); // 2.0003435// 非凸関数: 初期値によって異なる局所最小値に収束してしまう36console.log(gradientDescent(nonConvexGradient, -3, 0.02, 200).toFixed(3)); // 左側の谷に収束37console.log(gradientDescent(nonConvexGradient, 3, 0.02, 200).toFixed(3)); // 右側の谷に収束(別の値)
次に学ぶならコレ!おすすめトピック
この単元と深い繋がりを持つ、あわせて学ぶと理解が深まるおすすめ単元