偏微分で解く非線形最適化 — 3D曲面の底を探す
前回 は、3x+2y のような一次式を最大化する問題を、直線を平行移動する方法で解いた。
では、目的関数が次のように曲がっていたらどうだろう。
f(x,y)=x2+xy+2y2−6x−8y
今度は f(x,y)=k が直線にならない。かわりに登場するのが、3D曲面・等高線・偏微分だ。
この記事では制約条件を付けず、x,y を自由に動かせる場合の最小化を考える。
1. 2変数関数を3Dで見る
1変数関数 y=f(x) のグラフは、平面上の曲線だった。
2変数関数 z=f(x,y) では、各 (x,y) に対して高さ z が決まるので、グラフは空間内の曲面になる。
まずは単純な例を見よう。
f(x,y)=(x−2)2+2(y−1)2+1
どちらも2乗なので、
f(x,y)≥1
は常に成り立つ。等号が成り立つのは (x,y)=(2,1) のときだけだ。したがって最小値は 1 である。
3Dで描くと、(2,1,1) に底がある、お椀のような曲面になる。
最も低い点は (2, 1, 1)。等高線は同じ高さの点を結んだ線です。中心へ進むと高さが下がります。
3Dの表示範囲は x = 0〜4、y = −1〜3。色付きの線は、底からのx方向・y方向の断面です。
2. 偏微分は「片方だけ動かしたときの傾き」
1変数関数の微分 f′(x) は、グラフのその点における傾きだった。
2変数では動ける方向がたくさんある。まずは x 方向と y 方向を別々に見る。
- x に関する偏微分 ∂x∂f:y を固定して、x だけを少し動かしたときの変化率
- y に関する偏微分 ∂y∂f:x を固定して、y だけを少し動かしたときの変化率
さきほどの単純な関数なら、
∂x∂f=2(x−2),∂y∂f=4(y−1)
となる。
底では、どちらの方向にも傾いていないので、
∂x∂f=0,∂y∂f=0
が成り立つ。
3. 二つの偏微分をまとめたものが「勾配」
偏微分をベクトルとしてまとめると、**勾配(gradient)**になる。
∇f(x,y)=(∂x∂f∂y∂f)
勾配ベクトルは、その点で関数が最も急激に増える方向を指す(通常のユークリッド距離で考えた場合)。逆向きの −∇f は、最も急激に減る方向だ。
微小な移動 (Δx,Δy) に対して、
Δf≈∂x∂fΔx+∂y∂fΔy=∇f⋅(ΔxΔy)
と近似できる。内積なので、移動方向と勾配の向きがそろうほど、増加量は大きくなる。
滑らかな関数が、制約のない内点で局所的な最大値・最小値を取るなら、そこでは通常、
∇f(x,y)=0
が必要になる。
ただし、これは必要条件であって十分条件ではない。勾配がゼロでも、そこが底とは限らない。
ℹ∇f = (2.0, 4.0)
黒い矢印が選んだ点の勾配です。逆向きに少し進むと高さが下がります。底では勾配がゼロになり、矢印が消えます。
図をドラッグするか、スライダーで点を動かせます。矢印の長さは勾配の大きさに比例します(背景の矢印は黒い矢印より縮小)。
4. 実際に、少し複雑な関数を最小化してみる
冒頭の関数に戻ろう。
f(x,y)=x2+xy+2y2−6x−8y
今回は xy が含まれるので、x 方向と y 方向の変化が互いに影響し合う。
それぞれ偏微分すると、
∂x∂f∂y∂f=2x+y−6=x+4y−8
勾配がゼロになる点を探す。
{2x+y−6=0x+4y−8=0
1本目から y=6−2x。2本目に代入して、
x+4(6−2x)−8=0⟹x=716
したがって、
(x,y)=(716,710)
が停留点だ。そのときの値は、
f(716,710)=−788
となる。
でも、これだけでは「本当に最小値か」はまだ証明できない。
5. 勾配ゼロでも最小値とは限らない
例えば、
g(x,y)=x2−y2
を考えてみよう。原点 (0,0) では、
∇g(0,0)=(00)
となる。
しかし、y=0 に沿って動くと g(x,0)=x2≥0、x=0 に沿って動くと g(0,y)=−y2≤0 だ。
原点は、ある方向には谷、別の方向には山になっている。このような点を**鞍点(あんてん)**という。
6. ヘッセ行列で「曲がり方」を調べる
そこで使うのが、2階偏微分を並べた**ヘッセ行列(Hessian)**だ。
Hf(x,y)=∂x2∂2f∂y∂x∂2f∂x∂y∂2f∂y2∂2f
今回の関数では、
Hf=(2114)
となる。左上の成分は 2>0、行列式は、
detHf=2⋅4−1⋅1=7>0
だ。この2条件からヘッセ行列が正定値であることが分かる。今回の関数は上に凸の二次関数なので、停留点は局所的な底であるだけでなく、全体でただ一つの最小点になる。
実際、停留点からのずれを u=x−716、v=y−710 と置くと、
f(x,y)+788=u2+uv+2v2=(u+2v)2+47v2≥0
である。等号は u=v=0 のときだけ成立するので、
fmin=−788
と厳密に結論できる。
参考までに、2変数でヘッセ行列が対称な場合、停留点付近の判定には D=fxxfyy−fxy2 が使える。D>0 かつ fxx>0 なら局所最小、D>0 かつ fxx<0 なら局所最大、D<0 なら鞍点。D=0 の場合はこの判定だけでは決められない。
7. 計算機はどうやって底を探す?
式が複雑になって連立方程式を直接解けなくても、勾配が分かれば少しずつ値を下げていける。
それが**勾配降下法(gradient descent)**の基本的な考え方だ。
xt+1yt+1=xt−η∂x∂f(xt,yt)=yt−η∂y∂f(xt,yt)
η>0 は一歩の大きさを表す学習率。大きすぎると行き過ぎ、小さすぎると収束が遅くなる。
今回の関数なら、更新式は、
xt+1yt+1=xt−η(2xt+yt−6)=yt−η(xt+4yt−8)
になる。
ℹ0歩目:f = 15.0000
現在点 (5.000, 4.000)。最小点 (16/7, 10/7) までの距離は 3.7389 です。
白抜きの点が最小点、緑が現在点です。この二次関数では 0 < η < 2/(3+√2) ≈ 0.4531 なら、どの開始点からも収束します。大きすぎる学習率で振動・発散する様子も試せます。最大60歩、座標の大きさが10⁶を超える手前で停止します。
まとめ:勾配は「次にどちらへ動くか」を教えてくれる
今回は、非線形関数を最小化するために、
- 2変数関数を3D曲面と等高線で捉える。
- 偏微分で二つの方向の傾きを求める。
- 勾配がゼロになる停留点を探す。
- ヘッセ行列などを使い、本当に最小点か確認する。
という順番で考えた。
ただし、ここまでは x,y を自由に動かせる場合の話だ。制約条件があると、勾配がゼロではない場所が最適解になることがある。
次回は、その理由を幾何学的に理解し、ラグランジュ未定乗数法とKKT条件につなげよう。
次の記事: ラグランジュ未定乗数法とKKT条件