方向微分とは?勾配ベクトルが最急上昇方向になる理由

濃い霧の立ちこめる山の斜面に立っているとします。視界は足元の1メートルだけ。地図もGPSもありません。それでも「北東に一歩踏み出したら、自分は登るのか下るのか、どれくらいの急さで登るのか」は、足元の地面の傾きを確かめれば分かります。さらに欲張って「どの向きに踏み出せば一番速く高度が上がるのか」も知りたくなります。

この2つの問いに答えるのが、本記事のテーマである方向微分(directional derivative)勾配ベクトル(gradient)です。方向微分は「指定した向きに進んだときの変化率」を測る道具、勾配は「すべての向きの方向微分をまとめて1本のベクトルに詰め込んだもの」です。そして両者は

$$ D_{\bm{u}} f(\bm{a}) = \nabla f(\bm{a}) \cdot \bm{u} $$

という驚くほど単純な内積の式で結ばれます。この1行の式から、「勾配の向きが最も急な上り坂である」「勾配は等高線に垂直である」という2つの幾何学的事実が、ほとんど自動的に転がり出てきます。

この関係は、単なる数学的な小話ではありません。少なくとも次の2つの場面で毎日のように使われています。

  • 機械学習の最適化:ニューラルネットワークの学習は、損失関数 $L(\bm{\theta})$ を下げるためにパラメータを $\bm{\theta} \leftarrow \bm{\theta} – \eta \nabla L$ と更新します。なぜ $-\nabla L$ の向きなのか? その答えがまさに「勾配の逆向きが最急降下方向だから」であり、本記事で証明する不等式そのものです。
  • 物理の輸送現象:熱伝導のフーリエ則 $\bm{q} = -\lambda \nabla T$ は「熱は温度が最も急に下がる向きに流れる」と言っています。等温線(等高線)に垂直に熱が流れるという実験事実は、「勾配は等位面の法線である」という幾何学の帰結です。同じ構造は拡散のフィックの法則 $\bm{J} = -D \nabla c$、電場と電位の関係 $\bm{E} = -\nabla \phi$ にも現れます。

さらに、画像処理のエッジ検出(輝度の勾配が大きい場所が輪郭)、地形解析の斜面方位(勾配の向き)、偏微分方程式の境界条件(境界の法線方向微分 $\partial u/\partial n$)と、方向微分は理工系のあちこちに顔を出します。

山の斜面のある1点から16方向へ矢印を伸ばし、赤い矢印が登る向き・青い矢印が下る向き・矢印の長さがその向きの傾きの大きさを表す概念図。最も長い矢印がいちばん急に登れる向きを示す

この記事全体の見取り図が上の絵です。ある1点に立ったとき、進む向きごとに「登るのか下るのか、どれくらい急か」が決まります。赤い矢印が登る向き、青い矢印が下る向きで、矢印の長さがその向きの傾きの大きさです。矢印は全方向でバラバラに見えますが、実はその長さの分布は $\cos$ 波という単純な形をしており、最も長い1本(黒縁の矢印)の向きが勾配ベクトル、その真横(破線)が高さの変わらない等高線方向になります。本記事はこの絵に描かれた事実を、ひとつずつ式で証明していく道のりです。

本記事の内容

  • 方向微分の直感的な意味と、極限による厳密な定義
  • 全微分可能なら $D_{\bm{u}} f = \nabla f \cdot \bm{u}$ となることの、省略なしの導出
  • コーシー・シュワルツの不等式から「勾配=最急上昇方向」を結論する道筋
  • 等高線と勾配が直交する理由の証明
  • 方向微分が全方向で存在しても全微分可能とは限らない反例と、概念の階層整理
  • Pythonによる可視化(勾配場、方向微分の $\cos$ 波、最急降下法の軌跡)

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

方向微分とは — 「山を1枚の板で切る」

まず、方向微分がやっていることを図形的にイメージしましょう。

標高を表す関数 $z = f(x, y)$ のグラフは、3次元空間に浮かぶ「山の表面」です。あなたは山の斜面の点 $\bm{a} = (a_1, a_2)$ に立っています。ここで、地面に垂直な1枚の巨大な板を、あなたの立っている点を通り、指定した水平方向 $\bm{u}$ に沿って差し込みます。板と山の表面が交わる線は、1本の曲線になります。

この曲線は、1変数関数のグラフです。板の上を「あなたから $h$ メートル進んだ位置」を横軸、「そこでの標高」を縦軸にとった、見慣れた $y = g(h)$ の形をしています。そして、この曲線の $h = 0$ における接線の傾きこそが、向き $\bm{u}$ に対する方向微分です。

曲面 f=x^2+2y^2 に鉛直な板(橙)を差し込み、板と曲面の交線である断面曲線(赤)とその接線(黒破線)を描いた3D図。接線の傾きが方向微分4.243に等しいことを示す

橙色の半透明な面が「差し込んだ板」、赤い曲線が板と曲面の交線です。この赤い曲線だけを取り出せば、横軸が進んだ距離・縦軸が高さの、ごく普通の1変数関数のグラフになります。黒い破線はその接線で、傾きが $4.243$ — これがこの向きの方向微分の値です。多変数の話が、板を1枚差し込んだ瞬間に高校数学の接線の傾きに戻っていることが見て取れます。

つまり方向微分とは、「多変数関数を、指定した向きの直線上に制限して1変数関数に落とし、その微分係数を取る」操作にほかなりません。多変数の微分は難しそうに見えますが、向きを1つ固定してしまえば、高校で習った1変数の微分に戻るわけです。この「1本の直線に制限する」という発想は、後で登場する全微分可能性の議論でも繰り返し使います。

板を差し込む向きを変えれば、切り口の曲線も変わり、傾きも変わります。北向きに切れば急な上り、東向きに切れば緩い下り、といった具合です。ですから方向微分は「点 $\bm{a}$ と向き $\bm{u}$」の2つを指定して初めて決まる量です。

ここで自然な疑問が生まれます。向きは無限にあるのに、その全部の傾きをいちいち計算しないといけないのか? 答えは「ノー」です。実は $n$ 次元なら、$n$ 個の傾き(=各座標軸方向の偏微分)さえ分かっていれば、残り無限個の向きの傾きは内積ひとつで復元できます。その仕組みを次節から式で追いかけます。

方向微分の数学的定義

極限による定義

1変数関数の微分係数は「$x$ を $h$ だけずらしたときの $f$ の変化を $h$ で割り、$h \to 0$ とした極限」でした。方向微分もまったく同じ発想で、「ずらす」操作をベクトル方向のずらしに置き換えるだけです。

$\mathbb{R}^n$ 上のスカラー場 $f: \mathbb{R}^n \to \mathbb{R}$、点 $\bm{a} \in \mathbb{R}^n$、そして単位ベクトル $\bm{u}$($\|\bm{u}\| = 1$)に対し、方向微分 $D_{\bm{u}} f(\bm{a})$ を次で定義します。

$$ \begin{equation} D_{\bm{u}} f(\bm{a}) = \lim_{h \to 0} \frac{f(\bm{a} + h\bm{u}) – f(\bm{a})}{h} \end{equation} $$

分子の $f(\bm{a} + h\bm{u}) – f(\bm{a})$ は「向き $\bm{u}$ に $h$ だけ進んだときの関数値の増分」、分母の $h$ は「進んだ距離」です。$\|\bm{u}\| = 1$ としているので、$\bm{a}$ から $\bm{a} + h\bm{u}$ までの実際の距離はちょうど $|h|$ です。したがってこの商は文字どおり「1メートル進むあたり何メートル標高が上がるか」という傾きを表しています。

なお $h$ は正の値だけでなく負の値からも $0$ に近づける必要があります。$h > 0$ 側と $h < 0$ 側で極限が違えば、方向微分は存在しません。これは1変数の微分係数で右微分と左微分の一致を要求するのと同じ話です。

なぜ単位ベクトルに限るのか

定義で $\|\bm{u}\| = 1$ を課すのには理由があります。もし $\bm{u}$ の長さを自由にすると、$\bm{v} = c\bm{u}$($c > 0$)に対して

$$ \lim_{h \to 0} \frac{f(\bm{a} + h\bm{v}) – f(\bm{a})}{h} = \lim_{h \to 0} c \cdot \frac{f(\bm{a} + (hc)\bm{u}) – f(\bm{a})}{hc} = c \, D_{\bm{u}} f(\bm{a}) $$

となり、同じ向きなのに値が $c$ 倍されるからです。これでは「その向きの傾き」という幾何学的な意味が失われてしまいます。長さを $1$ に固定して初めて、「傾き」という比較可能な量になるわけです。

ただし文献によっては長さを固定しない流儀もあり、その場合は $D_{\bm{v}} f(\bm{a})$ は「$\bm{v}$ を速度ベクトルとして動いたときの $f$ の時間変化率」を意味します。物理で $\frac{df}{dt} = \bm{v} \cdot \nabla f$ と書くときはこちらの流儀です。本記事では断りのない限り $\|\bm{u}\| = 1$ とします。

偏微分は方向微分の特別な場合

定義式で $\bm{u}$ を第 $i$ 座標軸の基本ベクトル $\bm{e}_i = (0, \dots, 1, \dots, 0)$ に取ると、$\bm{a} + h\bm{e}_i$ は「第 $i$ 成分だけを $h$ ずらした点」ですから

$$ D_{\bm{e}_i} f(\bm{a}) = \lim_{h \to 0} \frac{f(a_1, \dots, a_i + h, \dots, a_n) – f(a_1, \dots, a_n)}{h} = \frac{\partial f}{\partial x_i}(\bm{a}) $$

となり、これはまさに偏微分の定義そのものです。つまり偏微分とは、座標軸という特定の $n$ 方向だけを見た方向微分です。方向微分はその一般化であり、座標軸に縛られずに任意の向きを見られる点が本質的に強力です。

左:断面曲線に対して刻み幅hを1.4→0.8→0.4と縮めると割線の傾きが6.343→5.443→4.843と接線の傾き4.2426に近づく様子。右:x軸方向・y軸方向・斜め45度方向の3つの断面曲線とその接線を重ね、偏微分が座標軸方向の方向微分にすぎないことを示す図

左のグラフは定義式 (1) をそのまま絵にしたもので、刻み幅 $h$ を $1.4 \to 0.8 \to 0.4$ と縮めるにつれ割線の傾きが $6.343 \to 5.443 \to 4.843$ と単調に減り、接線の傾き $4.2426$ へ向かっています。右のグラフでは、同じ点 $(1,1)$ を通る3本の断面曲線($x$ 軸方向・$y$ 軸方向・斜め $45^\circ$ 方向)が描かれており、それぞれの接線の傾きが $2.000$、$4.000$、$4.243$ です。前2者がちょうど偏微分 $\partial f/\partial x = 2$、$\partial f/\partial y = 4$ に一致していることが、「偏微分は方向微分の特別な場合」という主張の意味です。

ここまでで「向きごとの傾き」を測る道具が手に入りました。次に問題になるのは、無限にある向きの傾きを、どうやって有限個の情報(偏微分)から復元するかです。その鍵が全微分可能性です。

全微分可能なら $D_{\bm{u}} f = \nabla f \cdot \bm{u}$

全微分可能性の定義を確認する

多変数関数の「微分可能」は、1変数のときより少し慎重な定義が必要です。1変数では

$$ f(a + h) = f(a) + f'(a) h + o(h) \quad (h \to 0) $$

と、「関数が局所的に直線で近似できること」が微分可能性でした。多変数ではこの「直線近似」を「線形写像による近似」に置き換えます。

関数 $f$ が点 $\bm{a}$ で全微分可能(differentiable)であるとは、あるベクトル $\bm{g} \in \mathbb{R}^n$ が存在して

$$ \begin{equation} f(\bm{a} + \bm{v}) = f(\bm{a}) + \bm{g} \cdot \bm{v} + o(\|\bm{v}\|) \quad (\|\bm{v}\| \to 0) \end{equation} $$

が成り立つことをいいます。ここで $o(\|\bm{v}\|)$ は「$\|\bm{v}\|$ より真に速く $0$ に近づく量」、すなわち残差を $R(\bm{v})$ と書いたとき

$$ \lim_{\bm{v} \to \bm{0}} \frac{R(\bm{v})}{\|\bm{v}\|} = 0 $$

を満たす量です。幾何学的には「グラフが点 $\bm{a}$ の上に接平面($n$ 次元なら接超平面)を持ち、どの方向から近づいてもグラフが接平面に十分速く貼り付く」ことを意味します。

このとき $\bm{g}$ は一意に定まり、その第 $i$ 成分は $\partial f/\partial x_i(\bm{a})$ に一致します。実際、$\bm{v} = h\bm{e}_i$ と取れば式 (2) は $f(\bm{a} + h\bm{e}_i) = f(\bm{a}) + g_i h + o(|h|)$ となり、両辺を $h$ で割って $h \to 0$ とすれば $g_i = \partial f/\partial x_i(\bm{a})$ が出ます。この $\bm{g}$ を勾配ベクトルと呼び

$$ \nabla f(\bm{a}) = \left( \frac{\partial f}{\partial x_1}(\bm{a}), \frac{\partial f}{\partial x_2}(\bm{a}), \dots, \frac{\partial f}{\partial x_n}(\bm{a}) \right) $$

と書きます。

左:曲面f=x^2+2y^2と点(1,1)での接平面を重ねた3D図で、着目点の近くで両者がぴったり貼り付いている様子。右:残差の相対量|R(v)|/||v||を距離||v||の両対数で描き、全微分可能な関数では向きによらず0に落ちるのに対し、反例x^2y/(x^4+y^2)は曲線y=x^2に沿って発散することを示す図

左の3D図では、緑の曲面($f = x^2 + 2y^2$)と橙の接平面が点 $(1,1)$ の近くでほとんど区別できないほど重なっています。これが「全微分可能=局所的に平面で近似できる」の絵です。右の両対数プロットは判定の本質を示しており、$f = x^2 + 2y^2$ では残差の相対量 $|R(\bm{v})|/\|\bm{v}\|$ が向き($17^\circ$、$57^\circ$、$115^\circ$)によらず傾き1で $0$ に落ちていきます。一方、赤い破線は後で扱う反例 $x^2y/(x^4+y^2)$ を曲線 $y = x^2$ に沿って評価したもので、原点に近づくほど発散しており、残差が $\|\bm{v}\|$ より速く消えていません。同じ点でも「どの経路で近づくか」で結論が変わる、という全微分可能性の厳しさがここに現れています。

導出その1:定義に直接代入する

では本題です。$f$ が $\bm{a}$ で全微分可能なら、任意の単位ベクトル $\bm{u}$ に対して $D_{\bm{u}} f(\bm{a}) = \nabla f(\bm{a}) \cdot \bm{u}$ が成り立つことを示します。

出発点は全微分可能性の式 (2) です。ここで $\bm{v}$ として、特別に「向き $\bm{u}$ の直線上の点」だけを選びます。すなわち $\bm{v} = h\bm{u}$ と代入します。

$$ f(\bm{a} + h\bm{u}) = f(\bm{a}) + \nabla f(\bm{a}) \cdot (h\bm{u}) + R(h\bm{u}) $$

内積は第2引数についてスカラー倍を外に出せる(線形性)ので、$\nabla f \cdot (h\bm{u}) = h \, (\nabla f \cdot \bm{u})$ と書き直せます。

$$ f(\bm{a} + h\bm{u}) – f(\bm{a}) = h \, \bigl( \nabla f(\bm{a}) \cdot \bm{u} \bigr) + R(h\bm{u}) $$

方向微分の定義に持ち込むため、両辺を $h$($h \neq 0$)で割ります。

$$ \frac{f(\bm{a} + h\bm{u}) – f(\bm{a})}{h} = \nabla f(\bm{a}) \cdot \bm{u} + \frac{R(h\bm{u})}{h} $$

残る仕事は、右辺第2項が $h \to 0$ で消えることの確認です。$\|\bm{u}\| = 1$ より $\|h\bm{u}\| = |h|$ ですから、絶対値をとって

$$ \left| \frac{R(h\bm{u})}{h} \right| = \frac{|R(h\bm{u})|}{|h|} = \frac{|R(h\bm{u})|}{\|h\bm{u}\|} $$

と変形できます。$h \to 0$ のとき $\|h\bm{u}\| = |h| \to 0$ なので、全微分可能性の仮定($R(\bm{v})/\|\bm{v}\| \to 0$)がそのまま使えて、右辺は $0$ に収束します。したがって

$$ \begin{equation} D_{\bm{u}} f(\bm{a}) = \lim_{h \to 0} \frac{f(\bm{a} + h\bm{u}) – f(\bm{a})}{h} = \nabla f(\bm{a}) \cdot \bm{u} \end{equation} $$

が示されました。無限個ある向きの傾きが、たった $n$ 個の偏微分と内積だけで全部書けてしまう — これが式 (3) の主張です。

導出その2:連鎖律で導く

同じ結果を、多変数の連鎖律から導いてみます。こちらのほうが「1変数に落とす」という §1 のイメージに直結しています。

向き $\bm{u}$ の直線上を走る点を

$$ \bm{r}(h) = \bm{a} + h\bm{u}, \qquad \bm{r}(0) = \bm{a}, \quad \bm{r}'(h) = \bm{u} $$

とパラメータ表示し、その上での $f$ の値を1変数関数

$$ g(h) = f(\bm{r}(h)) = f(a_1 + h u_1, \dots, a_n + h u_n) $$

とします。この $g$ こそ、§1 で「板で切ってできた曲線」と呼んだものです。方向微分の定義は、まさに $g$ の $h = 0$ における微分係数

$$ D_{\bm{u}} f(\bm{a}) = \lim_{h \to 0} \frac{g(h) – g(0)}{h} = g'(0) $$

にほかなりません。そこで $g'(h)$ を連鎖律で計算します。合成関数 $f(x_1(h), \dots, x_n(h))$ の微分公式は

$$ \frac{dg}{dh} = \sum_{i=1}^{n} \frac{\partial f}{\partial x_i}\bigl(\bm{r}(h)\bigr) \cdot \frac{dx_i}{dh} $$

でした。ここで各成分は $x_i(h) = a_i + h u_i$ なので $dx_i/dh = u_i$ です。これを代入すると

$$ \frac{dg}{dh} = \sum_{i=1}^{n} \frac{\partial f}{\partial x_i}\bigl(\bm{r}(h)\bigr) u_i $$

となり、$h = 0$ とおけば $\bm{r}(0) = \bm{a}$ なので

$$ g'(0) = \sum_{i=1}^{n} \frac{\partial f}{\partial x_i}(\bm{a}) \, u_i = \nabla f(\bm{a}) \cdot \bm{u} $$

が得られます。式 (3) と一致しました。

ただし注意が必要です。この連鎖律の公式自体、「$f$ が全微分可能である」ことを前提に証明されるものです。偏微分が存在するだけでは連鎖律は使えません。導出その1が全微分可能性の定義から直接組み立てられているのに対し、導出その2は連鎖律という中間定理を経由している、という違いがあります。後の反例の節で、この前提を外すと何が壊れるかを具体的に見ます。

式 (3) が手に入ると、あとは内積の性質を調べるだけで幾何学的な結論が次々と出てきます。まずは「どの向きが最も急か」から片付けましょう。

最急上昇方向 — コーシー・シュワルツからの結論

内積を $\cos$ で書き直す

式 (3) の右辺は内積です。2つのベクトルの内積は、その長さと成す角 $\theta$ を使って

$$ \nabla f(\bm{a}) \cdot \bm{u} = \|\nabla f(\bm{a})\| \, \|\bm{u}\| \cos\theta = \|\nabla f(\bm{a})\| \cos\theta $$

と書けます($\|\bm{u}\| = 1$ を使いました)。したがって

$$ \begin{equation} D_{\bm{u}} f(\bm{a}) = \|\nabla f(\bm{a})\| \cos\theta, \qquad \theta = \angle(\nabla f(\bm{a}), \bm{u}) \end{equation} $$

です。方向微分は、勾配の長さという固定値に $\cos\theta$ を掛けただけの量だということが分かります。向き $\bm{u}$ を1周させると、方向微分は $\cos$ 波を1周期分描きます。この事実は後で数値実験でも確かめます。

$\cos\theta$ の最大値は $\theta = 0$ での $1$、最小値は $\theta = \pi$ での $-1$ です。よって直ちに次の3点が読み取れます。

  • $\theta = 0$($\bm{u}$ が $\nabla f$ と同じ向き)のとき $D_{\bm{u}} f$ は最大値 $\|\nabla f\|$ をとる → 最急上昇方向
  • $\theta = \pi$($\bm{u}$ が $\nabla f$ と逆向き)のとき $D_{\bm{u}} f$ は最小値 $-\|\nabla f\|$ をとる → 最急降下方向
  • $\theta = \pi/2$($\bm{u}$ が $\nabla f$ と直交)のとき $D_{\bm{u}} f = 0$ → 関数値が(1次の精度で)変化しない方向

左:点(1,1)で向きの角αを0度から360度まで動かしたときの方向微分が、実測値と理論値|∇f|cos(α−α_g)でぴったり重なるcos波になることを示すグラフ。右:同じデータの極座標表示で、増加側(橙)と減少側(青)が原点で接する直径4.4721の2つの円を描く図

左のグラフは、向きの角 $\alpha$ を1周させたときの方向微分を実測(橙の実線)と理論式 $\|\nabla f\|\cos(\alpha – \alpha_g)$(青の破線)で重ねたもので、両者は完全に一致しています。最大値 $4.4721$ を取るのは $\alpha = 63.4^\circ$、すなわち勾配 $(2,4)$ の向きそのものであり、ゼロ交差はそこから $\pm 90^\circ$ ずれた位置に来ています。右の極座標表示では、方向微分の絶対値が原点で接する2つの円になります。$\|\nabla f\|\cos\theta$ の極座標グラフが直径 $\|\nabla f\|$ の円になるという古典的な事実で、勾配ベクトル(緑の線)は円が最も膨らむ向きを指していると読めます。

コーシー・シュワルツの不等式による厳密化

「内積は $\|\bm{a}\|\|\bm{b}\|\cos\theta$ である」を成す角の定義として使うと循環論法になりかねないので、角度を持ち出さずに同じ結論を出しておきます。使うのはコーシー・シュワルツの不等式

$$ \begin{equation} |\bm{x} \cdot \bm{y}| \le \|\bm{x}\| \, \|\bm{y}\| \end{equation} $$

です。等号は $\bm{x}$ と $\bm{y}$ が平行(一方が他方のスカラー倍、あるいは一方が零ベクトル)のときに限って成り立ちます。

不等式 (5) を短く証明しておきます。$\bm{y} \neq \bm{0}$ とし、任意の実数 $t$ に対して

$$ \varphi(t) = \|\bm{x} + t\bm{y}\|^2 = \|\bm{x}\|^2 + 2t (\bm{x} \cdot \bm{y}) + t^2 \|\bm{y}\|^2 \ge 0 $$

を考えます。左辺はノルムの2乗なので常に非負、右辺は $t$ の2次式です。「すべての $t$ で非負な2次式」は判別式が非正でなければなりません。$t^2$ の係数 $\|\bm{y}\|^2 > 0$ に注意して判別式を書くと

$$ D/4 = (\bm{x} \cdot \bm{y})^2 – \|\bm{x}\|^2 \|\bm{y}\|^2 \le 0 $$

となり、移項して平方根をとれば式 (5) が出ます。等号成立は判別式が $0$、つまり $\varphi(t_0) = 0$ となる $t_0$ が存在するとき、すなわち $\bm{x} + t_0 \bm{y} = \bm{0}$ のとき、つまり2つのベクトルが平行なときです。

これを $\bm{x} = \nabla f(\bm{a})$、$\bm{y} = \bm{u}$($\|\bm{u}\| = 1$)に適用すると

$$ |D_{\bm{u}} f(\bm{a})| = |\nabla f(\bm{a}) \cdot \bm{u}| \le \|\nabla f(\bm{a})\| \, \|\bm{u}\| = \|\nabla f(\bm{a})\| $$

を得ます。つまり

$$ \begin{equation} -\|\nabla f(\bm{a})\| \;\le\; D_{\bm{u}} f(\bm{a}) \;\le\; \|\nabla f(\bm{a})\| \end{equation} $$

であり、どの向きに進んでも、傾きの絶対値は勾配の長さを超えられないことが分かります。$\|\nabla f(\bm{a})\|$ は、その点における傾きの「天井」なのです。

左:φ(t)=||∇f+tu||^2 を3つの向きuについて描いた放物線。uが勾配と平行なときだけ最小値が0になり横軸に接する(判別式ゼロ=等号成立)ことを示す。右:向きの角に対する方向微分の絶対値が上限|∇f|=4.4721に到達するのは勾配と平行な63.4度と243.4度だけであることを示すグラフ

左のグラフは証明に使った2次式 $\varphi(t) = \|\nabla f + t\bm{u}\|^2$ を3つの向き $\bm{u}$ について描いたものです。どの放物線も非負ですが、横軸に接するのは $\bm{u}$ が勾配と平行なときだけで、これが判別式ゼロ=コーシー・シュワルツの等号成立に対応します。右のグラフは同じ結論を方向微分の側から見たもので、$|D_{\bm{u}} f|$ は上限 $4.4721$ を決して超えず、到達するのは勾配と平行な $63.4^\circ$ とその反対向き $243.4^\circ$ のちょうど2点だけです。ゼロになる2点($153.4^\circ$ と $333.4^\circ$)が等高線の接線方向にあたります。

上限が実際に達成されるかも確認しましょう。$\nabla f(\bm{a}) \neq \bm{0}$ のとき

$$ \bm{u}^\star = \frac{\nabla f(\bm{a})}{\|\nabla f(\bm{a})\|} $$

と取れば、これは単位ベクトルであり

$$ D_{\bm{u}^\star} f(\bm{a}) = \nabla f(\bm{a}) \cdot \frac{\nabla f(\bm{a})}{\|\nabla f(\bm{a})\|} = \frac{\|\nabla f(\bm{a})\|^2}{\|\nabla f(\bm{a})\|} = \|\nabla f(\bm{a})\| $$

となって上限に等しくなります。等号条件から、上限を達成する単位ベクトルは $\bm{u}^\star$ ただ1つです。同様に $-\bm{u}^\star$ が下限 $-\|\nabla f\|$ を唯一達成します。ここまでをまとめると次の定理になります。

最急上昇の定理:$f$ が $\bm{a}$ で全微分可能で $\nabla f(\bm{a}) \neq \bm{0}$ ならば、方向微分 $D_{\bm{u}} f(\bm{a})$ は $\bm{u} = \nabla f(\bm{a})/\|\nabla f(\bm{a})\|$ のとき最大となり、その最大値は $\|\nabla f(\bm{a})\|$ である。

「勾配は最も急な上り坂を指す」という誰もが聞いたことのある標語は、こうしてコーシー・シュワルツの等号条件という、極めて素朴な不等式に由来していたわけです。

なお $\nabla f(\bm{a}) = \bm{0}$ の場合は、式 (3) よりすべての向きで $D_{\bm{u}} f(\bm{a}) = 0$ となり、「最急上昇方向」は定義できません。これは極大点・極小点・鞍点などの臨界点にいる状況で、1次の情報だけでは進む向きを決められないことを意味します。この場合はヘッセ行列という2次の情報が必要になります。

さて、$\theta = \pi/2$ の場合を「変化しない方向」と呼びました。変化しない方向を集めると何になるのでしょうか。それが等高線です。

勾配は等高線(等位面)に直交する

直感 — 「横に歩けば高度は変わらない」

登山道の等高線図を思い出してください。等高線とは「標高が等しい点を結んだ線」です。等高線に沿って歩けば、定義上、標高は変わりません。標高が変わらないということは、その向きの方向微分は $0$ ということです。そして式 (4) から $D_{\bm{u}} f = 0$ は $\cos\theta = 0$、つまり $\bm{u} \perp \nabla f$ を意味します。等高線の接線方向は勾配と直交する — これで話は終わっているのですが、パラメータ表示を使ってきちんと示しておきます。

証明

$f$ の値が $c$ である点の集合、すなわち等位集合(2次元なら等高線、3次元なら等位面)

$$ S_c = \{\bm{x} \in \mathbb{R}^n : f(\bm{x}) = c\} $$

を考えます。この集合の上を通る滑らかな曲線を $\bm{r}(t)$ とし、$\bm{r}(t_0) = \bm{a}$ とします。曲線が $S_c$ 上にあるので、すべての $t$ について

$$ f(\bm{r}(t)) = c $$

が成り立ちます。この恒等式を $t$ で微分します。右辺は定数なので微分すると $0$、左辺は合成関数なので連鎖律を使うと

$$ \frac{d}{dt} f(\bm{r}(t)) = \sum_{i=1}^{n} \frac{\partial f}{\partial x_i}(\bm{r}(t)) \, \frac{dr_i}{dt} = \nabla f(\bm{r}(t)) \cdot \bm{r}'(t) $$

です。よって

$$ \begin{equation} \nabla f(\bm{r}(t)) \cdot \bm{r}'(t) = 0 \end{equation} $$

が任意の $t$ で成立します。$t = t_0$ とすれば

$$ \nabla f(\bm{a}) \cdot \bm{r}'(t_0) = 0 $$

すなわち勾配は、等位集合上の任意の曲線の接ベクトルと直交することが示されました。等位集合の接ベクトル全体が接平面(接超平面)を張るので、言い換えれば $\nabla f(\bm{a})$ は $S_c$ の $\bm{a}$ における法線ベクトルです。

$\bm{r}'(t_0)$ を正規化して単位ベクトル $\bm{u}$ にすれば $D_{\bm{u}} f(\bm{a}) = 0$ となり、冒頭の直感的な議論とも一致します。

この結果は実用面でも便利です。たとえば3次元の曲面 $g(x, y, z) = 0$ の点 $\bm{a}$ における接平面の方程式は、法線が $\nabla g(\bm{a})$ であることから

$$ \nabla g(\bm{a}) \cdot (\bm{x} – \bm{a}) = 0 $$

と一発で書けます。球面 $x^2 + y^2 + z^2 = R^2$ なら $\nabla g = (2x, 2y, 2z) = 2\bm{x}$ となり、「球の法線は中心から表面へ向かう半径方向」という当たり前の事実が自動的に出てきます。

等高線の間隔が教えてくれるもの

もうひとつ、地図読みに直結する事実があります。等高線の間隔と勾配の大きさは反比例します。

隣り合う等高線の値の差を $\Delta c$、等高線に垂直な向きの間隔を $\Delta n$ とすると、その垂直方向の方向微分(法線微分)は $\|\nabla f\|$ ですから、1次近似で

$$ \Delta c \approx \|\nabla f\| \, \Delta n \quad \Longrightarrow \quad \Delta n \approx \frac{\Delta c}{\|\nabla f\|} $$

となります。勾配が大きいところほど等高線が密になるわけです。地形図で「等高線が詰まっている=崖」と読むのは、まさにこの式を無意識に使っています。損失関数の等高線図を見て「ここは急峻だから学習率を下げないと発散する」と判断するのも同じ原理です。

左:f=x^2+2y^2の等高線を1刻みで描き、y軸上(緑点)では間隔が狭く、x軸上(橙点)では間隔が広いことを示す図。右:等高線の値の差Δcを小さくすると、実距離Δnと予測値Δc/|∇f|の比が1に近づくことを4つの位置について示すグラフ

左の図では等高線の値を $1$ 刻みの等間隔にとっているので、線の混み具合がそのまま $\|\nabla f\|$ の大小を映します。$y$ 軸上(緑の点)は隣の等高線までの距離が短く、$x$ 軸上(橙の点)では約 $1.4$ 倍離れています。これは同じ等高線 $f = c$ 上で $\|\nabla f\|$ が $y$ 軸上 $2\sqrt{2c}$、$x$ 軸上 $2\sqrt{c}$ となり、比がちょうど $\sqrt{2} \approx 1.41$ になることの反映です。右のグラフは近似式 $\Delta n \approx \Delta c / \|\nabla f\|$ の精度を測ったもので、実距離と予測値の比は $\Delta c = 1$ では $0.94$ 程度ですが、$\Delta c$ を小さくするほど $1$ に単調に近づきます。これは $\Delta n \approx \Delta c/\|\nabla f\|$ があくまで1次近似であり、等高線の間隔を狭くとるほど正確になることを示しています。

ここまで理論を積み上げてきました。抽象的な議論が続いたので、具体的な関数で手を動かして確かめてみましょう。

具体例:$f(x, y) = x^2 + 2y^2$ を手で計算する

楕円型の谷を表す関数

$$ f(x, y) = x^2 + 2y^2 $$

を、点 $\bm{a} = (1, 1)$ で調べます。等高線 $f = c$ は楕円 $x^2 + 2y^2 = c$ で、$y$ 方向に押しつぶされた形をしています。点 $(1,1)$ は $c = 1 + 2 = 3$ の楕円上にあります。

手順1:勾配を求める。

$$ \frac{\partial f}{\partial x} = 2x, \qquad \frac{\partial f}{\partial y} = 4y $$

なので $\nabla f(x, y) = (2x, 4y)$、点 $(1,1)$ では

$$ \nabla f(1, 1) = (2, 4), \qquad \|\nabla f(1,1)\| = \sqrt{4 + 16} = \sqrt{20} = 2\sqrt{5} \approx 4.4721 $$

手順2:向き $\bm{u} = (1,1)/\sqrt{2}$ の方向微分。「北東」に相当する向きです。式 (3) より

$$ D_{\bm{u}} f(1,1) = (2, 4) \cdot \frac{1}{\sqrt{2}}(1, 1) = \frac{2 + 4}{\sqrt{2}} = \frac{6}{\sqrt{2}} = 3\sqrt{2} \approx 4.2426 $$

手順3:定義(極限)でも確かめる。 $h$ を小さくしながら差分商を計算します。$\bm{a} + h\bm{u} = (1 + h/\sqrt{2},\, 1 + h/\sqrt{2})$ なので

$$ f(\bm{a} + h\bm{u}) = \left(1 + \tfrac{h}{\sqrt{2}}\right)^2 + 2\left(1 + \tfrac{h}{\sqrt{2}}\right)^2 = 3\left(1 + \tfrac{h}{\sqrt{2}}\right)^2 $$

展開すると

$$ f(\bm{a} + h\bm{u}) = 3\left(1 + \frac{2h}{\sqrt{2}} + \frac{h^2}{2}\right) = 3 + 3\sqrt{2}\, h + \frac{3}{2}h^2 $$

$f(\bm{a}) = 3$ を引いて $h$ で割ると

$$ \frac{f(\bm{a} + h\bm{u}) – f(\bm{a})}{h} = 3\sqrt{2} + \frac{3}{2}h \;\xrightarrow{h \to 0}\; 3\sqrt{2} $$

となり、手順2の結果と一致しました。$h = 10^{-3}$ なら差分商は $3\sqrt{2} + 0.0015 = 4.24414$ で、真値 $4.24264$ との誤差は $0.0015$。$h$ に比例して誤差が減る(前進差分の1次精度)様子も式から読み取れます。

手順4:最急上昇方向と最大増加率。 定理より

$$ \bm{u}^\star = \frac{(2,4)}{2\sqrt{5}} = \frac{(1,2)}{\sqrt{5}} \approx (0.4472,\, 0.8944), \qquad D_{\bm{u}^\star} f = 2\sqrt{5} \approx 4.4721 $$

北東方向 $(1,1)/\sqrt{2}$ の $4.2426$ は、確かに最大値 $4.4721$ より小さいですね。$\bm{u}$ と $\nabla f$ の成す角は

$$ \cos\theta = \frac{6}{\sqrt{2}\cdot\sqrt{20}} = \frac{6}{\sqrt{40}} = 0.94868 \quad \Rightarrow \quad \theta \approx 18.43^\circ $$

で、検算すると $\|\nabla f\| \cos\theta = 4.4721 \times 0.94868 = 4.2426$。式 (4) がぴったり成り立っています。わずか18度ずれただけでは傾きは5%しか損をしないというのも面白い点で、$\cos$ が $\theta = 0$ の近傍で平坦($\cos\theta \approx 1 – \theta^2/2$)なことの現れです。

手順5:変化しない方向。 $\nabla f = (2,4)$ に直交する単位ベクトルは $\bm{t} = (-2, 1)/\sqrt{5}$ です。実際

$$ D_{\bm{t}} f(1,1) = \frac{(2)(-2) + (4)(1)}{\sqrt{5}} = \frac{-4 + 4}{\sqrt{5}} = 0 $$

となり、この向きが等高線(楕円 $x^2 + 2y^2 = 3$)の接線方向であることが確認できます。楕円を陰関数微分しても $2x + 4y y’ = 0$ から $y’ = -x/(2y) = -1/2$ が出て、方向ベクトル $(-2, 1)$ の傾き $-1/2$ と一致します。

f=x^2+2y^2の等高線図の上で、点(1,1)における勾配(2,4)(橙)・北東向きu=(1,1)/√2(緑)・等高線の接線方向t=(−2,1)/√5(紫)の3本のベクトルを描き、勾配と北東の成す角18.43度を示した図

太い青の楕円が点 $(1,1)$ を通る等高線 $f = 3$、橙の矢印が勾配 $(2,4)$、緑が北東向き $\bm{u} = (1,1)/\sqrt{2}$、紫が接線方向 $\bm{t} = (-2,1)/\sqrt{5}$ です。紫の矢印だけが楕円にぴったり沿っており、この向きの方向微分が $0$ になることが目で分かります。橙と緑の成す角はわずか $18.43^\circ$ しかなく、それでも方向微分は $4.4721$ から $4.2426$ へと約5%しか落ちません。$\cos$ が $\theta = 0$ の近くで平坦であることの、視覚的な確認です。

ここまでは「全微分可能な関数」を暗黙に仮定してきました。しかしこの仮定を外すと、直感が驚くほど簡単に裏切られます。次節でその危うさを見ておきましょう。

概念の階層 — 方向微分が存在しても全微分可能とは限らない

多変数の微分をめぐる性質には、次のような階層があります。矢印は「⇒(含意する)」を表します。

$$ C^1 \text{級} \;\Longrightarrow\; \text{全微分可能} \;\Longrightarrow\; \text{全方向の方向微分が存在} \;\Longrightarrow\; \text{偏微分が存在} $$

そして、この逆向きの矢印はどれも成り立ちません。ひとつずつ反例を見ていきます。

反例1:偏微分は存在するが、他の方向微分が存在しない

$$ f(x, y) = \begin{cases} \dfrac{xy}{x^2 + y^2} & (x, y) \neq (0,0) \\[4pt] 0 & (x, y) = (0,0) \end{cases} $$

原点での挙動を調べます。$\bm{u} = (\cos\alpha, \sin\alpha)$ として

$$ \frac{f(h\cos\alpha, h\sin\alpha) – f(0,0)}{h} = \frac{1}{h} \cdot \frac{h^2 \cos\alpha \sin\alpha}{h^2(\cos^2\alpha + \sin^2\alpha)} = \frac{\cos\alpha \sin\alpha}{h} $$

分母に $h$ が残ってしまいました。$\cos\alpha \sin\alpha \neq 0$ なら $h \to 0$ で発散します。つまり座標軸方向($\alpha = 0, \pi/2$ で $\cos\alpha\sin\alpha = 0$)では方向微分は $0$ として存在しますが、斜め方向では方向微分がそもそも存在しません。偏微分が両方存在しても、それ以外の向きの傾きは保証されないという例です。

反例2:全方向の方向微分が存在するが、$\nabla f \cdot \bm{u}$ の形にならない

$$ f(x, y) = \begin{cases} \dfrac{x^2 y}{x^4 + y^2} & (x, y) \neq (0,0) \\[4pt] 0 & (x, y) = (0,0) \end{cases} $$

$\bm{u} = (a, b)$($a^2 + b^2 = 1$)に対して原点での差分商を計算します。分子・分母に $h$ の冪を代入すると

$$ \frac{f(ha, hb)}{h} = \frac{1}{h} \cdot \frac{h^2 a^2 \cdot hb}{h^4 a^4 + h^2 b^2} = \frac{1}{h} \cdot \frac{h^3 a^2 b}{h^2 (h^2 a^4 + b^2)} = \frac{a^2 b}{h^2 a^4 + b^2} $$

$b \neq 0$ のとき $h \to 0$ の極限は $a^2 b / b^2 = a^2/b$ で、確かに有限の値に収束します。$b = 0$ のときは $f(ha, 0) = 0$ なので極限は $0$ です。よってすべての向きで方向微分が存在します

ところが $D_{\bm{u}} f(\bm{0}) = a^2/b$ は $\bm{u} = (a,b)$ の線形関数ではありません。もし全微分可能なら式 (3) より $D_{\bm{u}} f = \nabla f \cdot \bm{u} = g_1 a + g_2 b$ という $a, b$ の1次式でなければならないのに、$a^2/b$ は明らかにその形をしていません。したがってこの $f$ は原点で全微分可能ではありません。

さらに悪いことに、この関数は原点で連続ですらありません。放物線 $y = x^2$ に沿って原点に近づくと

$$ f(x, x^2) = \frac{x^2 \cdot x^2}{x^4 + x^4} = \frac{1}{2} $$

と定数 $1/2$ になり、$f(0,0) = 0$ に一致しないからです。全方向から直線的に近づけば傾きが取れるのに、曲がった経路で近づくと値が飛ぶ — 方向微分は「直線に沿った情報」しか見ていないため、こうした抜け穴があるのです。

反例3:方向微分が線形性まで満たすのに全微分可能でない

反例2は「線形性が壊れているから微分不可能」と診断できました。では線形性まで成り立てば安心かというと、そうではありません。

$$ f(x, y) = \begin{cases} \dfrac{x^3 y}{x^6 + y^2} & (x, y) \neq (0,0) \\[4pt] 0 & (x, y) = (0,0) \end{cases} $$

原点での差分商を、$\bm{u} = (a,b)$ について計算します。分子は $h^3 a^3 \cdot hb = h^4 a^3 b$、分母は $h^6 a^6 + h^2 b^2 = h^2(h^4 a^6 + b^2)$ なので

$$ \frac{f(ha, hb)}{h} = \frac{1}{h} \cdot \frac{h^4 a^3 b}{h^2 (h^4 a^6 + b^2)} = \frac{h \, a^3 b}{h^4 a^6 + b^2} $$

分子に $h$ が残っている点が反例2との決定的な違いです。$b \neq 0$ なら分母は $b^2 \neq 0$ に収束するので、全体は $0$ に収束します。$b = 0$ のときも $f(ha, 0) = 0$ より極限は $0$。つまり

$$ D_{\bm{u}} f(\bm{0}) = 0 \quad (\text{すべての単位ベクトル } \bm{u}) $$

です。偏微分も当然 $0$ なので $\nabla f(\bm{0}) = (0,0)$ であり、$D_{\bm{u}} f = \nabla f \cdot \bm{u} = 0$ という等式まで全方向で成立してしまいます。線形性も完璧です。

それでもこの関数は原点で全微分可能ではありません。理由は反例2と同じく連続性の破れです。3次曲線 $y = x^3$ に沿って近づくと

$$ f(x, x^3) = \frac{x^3 \cdot x^3}{x^6 + x^6} = \frac{x^6}{2x^6} = \frac{1}{2} $$

で、やはり $1/2$ に張り付きます。$f$ は原点で不連続であり、不連続な点で全微分可能ということはありえません(全微分可能なら式 (2) より $\bm{v} \to \bm{0}$ で $f(\bm{a}+\bm{v}) \to f(\bm{a})$ が従うため)。

この例が教えてくれるのは、「方向微分がすべて存在し、しかも $\nabla f \cdot \bm{u}$ で書ける」ことは、全微分可能性の十分条件ではないという事実です。全微分可能性が要求しているのは「$\bm{v}$ がどんな経路で(直線でなくても)$\bm{0}$ に近づいても、残差が $\|\bm{v}\|$ より速く消える」という一様な条件であり、直線に沿った極限をいくら集めても届きません。この関数の場合、$y = x^3$ という曲線に沿ってだけ残差が消えずに残ります。

十分条件:$C^1$ 級なら全微分可能

では実務上、どうやって全微分可能性を確認すればよいのでしょうか。ありがたいことに、次の使いやすい十分条件があります。

定理:点 $\bm{a}$ のある近傍で $f$ の偏微分 $\partial f/\partial x_i$($i = 1, \dots, n$)がすべて存在し、かつ $\bm{a}$ で連続ならば、$f$ は $\bm{a}$ で全微分可能である。

「偏微分が存在して連続」= $C^1$ 級です。多項式・指数関数・三角関数・それらの合成や商(分母が $0$ にならない範囲)はすべて $C^1$ 級なので、通常出会う関数はほぼ自動的に全微分可能です。上の反例たちはいずれも原点で偏導関数が不連続になっています。裏を返せば、病的な例は「分母が $0$ になる点」に集中して現れるということです。

なお $C^1$ 級は全微分可能の十分条件ですが必要条件ではありません。$f(x) = x^2 \sin(1/x)$($f(0)=0$)の多変数版のように、微分可能だが導関数が不連続な例も作れます。

概念の階層を頭に入れたところで、方向微分の最大の応用先である最適化に話を移します。

最急降下法との関係

なぜ $-\nabla f$ に進むのか

関数 $f$ を最小化したい、という問題を考えます。現在地は $\bm{x}_k$。ここから1歩踏み出すとして、どの向きに踏み出せば $f$ が最も速く下がるでしょうか。

「速く下がる」とは方向微分 $D_{\bm{u}} f(\bm{x}_k)$ が最も小さい(最も負の)ことです。式 (6) より $D_{\bm{u}} f \ge -\|\nabla f\|$ であり、等号は

$$ \bm{u} = -\frac{\nabla f(\bm{x}_k)}{\|\nabla f(\bm{x}_k)\|} $$

のときに限って達成されます。よって最急降下方向は勾配の逆向きです。ここから最急降下法(gradient descent)の更新式

$$ \begin{equation} \bm{x}_{k+1} = \bm{x}_k – \eta \, \nabla f(\bm{x}_k) \end{equation} $$

が生まれます。$\eta > 0$ は歩幅(学習率)です。式 (8) では単位ベクトルに正規化せず $\nabla f$ をそのまま使っていますが、これは「勾配が大きい(急な)ところでは大股に、平坦なところでは小股に歩く」という自然な副作用を持ち、実用上そのほうが扱いやすいためです。

深層学習で見慣れた $\bm{\theta} \leftarrow \bm{\theta} – \eta \nabla L(\bm{\theta})$ は、まさにこの式です。その根拠を辿ると、コーシー・シュワルツの不等式にたどり着く — これが本記事で最も強調したい繋がりです。

「最急」は局所的な話でしかない

ここで重要な注意があります。$-\nabla f$ が最急降下方向なのは、あくまで踏み出した瞬間の1次の変化率についてです。「その方向にまっすぐ進めば最短で最小値に着く」わけではありません。

このズレは、細長い谷(等高線が細長い楕円)で顕著に現れます。谷の斜面に立つと、勾配は「谷底に向かって横断する向き」をほぼ指し、「谷に沿って下る向き」はほとんど指しません。結果として最急降下法は谷を左右に往復しながらじりじり進む、いわゆるジグザグを起こします。

このジグザグには、方向微分から導ける美しい性質があります。各ステップで歩幅 $\eta_k$ を「その直線上で $f$ を最小にする値」に選ぶ(厳密直線探索)と、$\phi(\eta) = f(\bm{x}_k – \eta \nabla f(\bm{x}_k))$ の最小点では $\phi'(\eta_k) = 0$ です。連鎖律で $\phi’$ を計算すると

$$ \phi'(\eta) = \nabla f(\bm{x}_k – \eta \nabla f(\bm{x}_k)) \cdot \bigl(-\nabla f(\bm{x}_k)\bigr) $$

なので、$\eta = \eta_k$ で $\bm{x}_{k+1} = \bm{x}_k – \eta_k \nabla f(\bm{x}_k)$ となることを使えば

$$ \begin{equation} \nabla f(\bm{x}_{k+1}) \cdot \nabla f(\bm{x}_k) = 0 \end{equation} $$

が得られます。連続する2つの探索方向は必ず直交するのです。さらに、各ステップの進行方向 $-\nabla f(\bm{x}_k)$ は $\bm{x}_k$ を通る等高線の法線方向ですから、軌跡は「等高線に垂直に飛び出しては、次の等高線に接する位置で直角に折れ曲がる」という特徴的なパターンを描きます。この様子は後ほど数値実験で可視化します。

ジグザグの速さは条件数 $\kappa = \lambda_{\max}/\lambda_{\min}$(ヘッセ行列の固有値比)で決まり、厳密直線探索つき最急降下法では

$$ f(\bm{x}_{k+1}) – f^\star \le \left(\frac{\kappa – 1}{\kappa + 1}\right)^2 \bigl(f(\bm{x}_k) – f^\star\bigr) $$

という収束評価が知られています。$f = x^2 + 2y^2$ なら $\kappa = 4/2 = 2$ で係数は $(1/3)^2 = 1/9$。1ステップごとに残差が $1/9$ になる高速な収束です。一方 $\kappa = 100$ なら係数は約 $0.96$ となり、ほとんど進まなくなります。この弱点を克服するのがニュートン法(ヘッセ行列で座標を「丸く」する)や共役勾配法(過去の方向と共役な向きを選ぶ)、モーメンタム法です。

理論が出揃いました。ここからはPythonで実際に絵を描き、これまでの主張を目で確かめます。

Pythonでの実装と可視化

準備:日本語フォントの設定と共通関数

図のラベルを日本語にするため、最初にフォント設定をしておきます。以降のコードはこのセルを実行済みとして書きます。

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

# 日本語フォントの設定(環境にあるものを自動選択)
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

# 対象とするスカラー場 f(x,y) = x^2 + 2y^2 と、その勾配
def f(x, y):
    return x**2 + 2*y**2

def grad_f(x, y):
    return np.array([2*x, 4*y])

a = np.array([1.0, 1.0])          # 調べる点
g = grad_f(*a)                     # 勾配ベクトル
print("勾配 ∇f(1,1) =", g)
print("勾配の大きさ |∇f| =", np.linalg.norm(g))

実行すると 勾配 ∇f(1,1) = [2. 4.]勾配の大きさ |∇f| = 4.47213595499958 と表示されます。手計算で求めた $(2,4)$ と $2\sqrt{5} \approx 4.4721$ に一致しており、以降の図の土台が正しいことが確認できました。

図1:等高線と勾配ベクトル場

まず、勾配が「等高線に垂直で、急なところほど長い」という2つの性質を1枚の図で確認します。等高線を contour で、勾配場を quiver で重ね描きします。

# 格子を作って等高線を描く
X, Y = np.meshgrid(np.linspace(-2.2, 2.2, 400), np.linspace(-1.6, 1.6, 400))
Z = f(X, Y)

# 勾配は粗い格子で矢印表示
Xq, Yq = np.meshgrid(np.linspace(-2, 2, 11), np.linspace(-1.4, 1.4, 9))
U, V = 2*Xq, 4*Yq

plt.figure(figsize=(9, 6))
cs = plt.contour(X, Y, Z, levels=[0.5, 1, 2, 3, 5, 7, 9, 12], colors="#4a90d9")
plt.clabel(cs, fmt="f=%.1f", fontsize=9)
plt.quiver(Xq, Yq, U, V, color="#d95f02", angles="xy",
           scale_units="xy", scale=12, width=0.004, label="勾配 ∇f(最急上昇方向)")
plt.plot(*a, "ko", ms=8)
plt.annotate("点(1,1)", a, textcoords="offset points", xytext=(8, 8), fontsize=11)
plt.title("等高線と勾配ベクトル場:矢印は必ず等高線に垂直で、急な場所ほど長い")
plt.xlabel("$x$"); plt.ylabel("$y$"); plt.legend(loc="upper left")
plt.gca().set_aspect("equal"); plt.tight_layout(); plt.show()

f=x^2+2y^2の等高線(青)と勾配ベクトル場(橙の矢印)を重ねた図。すべての矢印が等高線を直角に横切り、原点から遠いほど長く、谷底の原点では矢印が消えることを示す

この図から3つのことが読み取れます。第一に、すべての矢印が等高線を直角に横切っています — 式 (7) で証明した直交性が目に見える形で現れています。第二に、原点から遠い(等高線が密な)場所ほど矢印が長く、$\|\nabla f\|$ が等高線の混み具合と対応していることが分かります。第三に、矢印はすべて外向き、つまり $f$ が増える向きを指しており、谷底(原点)では矢印が消えます。これが $\nabla f = \bm{0}$ の臨界点です。

図2:差分商が方向微分に収束する様子

次に、定義式 (1) の極限が本当に $\nabla f \cdot \bm{u}$ に収束するかを数値で確かめます。$\bm{u} = (1,1)/\sqrt{2}$ として、$h$ を $10^{-1}$ から $10^{-6}$ まで動かします。

u = np.array([1.0, 1.0]) / np.sqrt(2)     # 北東向きの単位ベクトル
Du_exact = g @ u                           # 理論値 ∇f・u = 3√2

hs = np.logspace(-1, -6, 30)
quotients = np.array([(f(*(a + h*u)) - f(*a)) / h for h in hs])

fig, ax = plt.subplots(1, 2, figsize=(12, 4.5))
ax[0].semilogx(hs, quotients, "o-", color="#d95f02", label="差分商")
ax[0].axhline(Du_exact, ls="--", color="#4a90d9",
              label=f"理論値 ∇f・u = {Du_exact:.4f}")
ax[0].set_xlabel("刻み幅 $h$"); ax[0].set_ylabel("$(f(a+hu)-f(a))/h$")
ax[0].set_title("差分商は $h \\to 0$ で方向微分に収束する"); ax[0].legend()

ax[1].loglog(hs, np.abs(quotients - Du_exact), "o-", color="#d95f02", label="誤差")
ax[1].loglog(hs, 1.5*hs, "--", color="gray", label="傾き1の基準線($1.5h$)")
ax[1].set_xlabel("刻み幅 $h$"); ax[1].set_ylabel("絶対誤差")
ax[1].set_title("誤差は $h$ に比例(前進差分は1次精度)"); ax[1].legend()
plt.tight_layout(); plt.show()

左:刻み幅hを10^-1から10^-6まで縮めたときの差分商が理論値4.2426に収束する片対数グラフ。右:絶対誤差の両対数プロットが傾き1の基準線1.5hとぴったり平行に並び、前進差分が1次精度であることを示すグラフ

左のグラフでは、差分商が $h$ を小さくするにつれて破線(理論値 $3\sqrt{2} = 4.2426$)に滑らかに近づいています。右のグラフは誤差の両対数プロットで、点列が傾き1の基準線とぴったり平行です。手計算で得た「差分商 $= 3\sqrt{2} + 1.5h$」という式のとおり、誤差が $h$ の1次で減ることが数値的にも確認できました。ちなみに $h = 10^{-3}$ での差分商は $4.244141$、$h = 10^{-5}$ では $4.242656$ となり、桁が1つ増えるごとに誤差の桁が1つ減っています。

図3:「板で切った断面」を3Dで見る

§1 で述べた「山を1枚の板で切る」イメージを、実際に3Dで描いてみます。曲面の上に、点 $(1,1)$ を通り向き $\bm{u}$ に伸びる断面曲線と、その接線を重ねます。

from mpl_toolkits.mplot3d import Axes3D  # noqa: F401

fig = plt.figure(figsize=(9, 6.5))
ax = fig.add_subplot(111, projection="3d")

Xs, Ys = np.meshgrid(np.linspace(-0.5, 2.5, 60), np.linspace(-0.5, 2.5, 60))
ax.plot_surface(Xs, Ys, f(Xs, Ys), cmap="viridis", alpha=0.45,
                linewidth=0, antialiased=True)

# 向き u に沿った断面曲線(板と曲面の交線)
t = np.linspace(-1.2, 1.2, 200)
px, py = a[0] + t*u[0], a[1] + t*u[1]
ax.plot(px, py, f(px, py), color="crimson", lw=3, label="向き $u$ に沿った断面曲線")

# その接線(傾きが方向微分)
ax.plot(px, py, f(*a) + Du_exact*t, color="black", lw=2, ls="--",
        label=f"接線(傾き = 方向微分 {Du_exact:.3f})")
ax.scatter(*a, f(*a), color="black", s=60)

ax.set_xlabel("$x$"); ax.set_ylabel("$y$"); ax.set_zlabel("$f(x,y)$")
ax.set_title("方向微分=曲面を鉛直面で切った断面曲線の傾き")
ax.view_init(elev=22, azim=-58); ax.legend(loc="upper left")
plt.tight_layout(); plt.show()

実行すると、記事の冒頭近く(§「方向微分とは」)で示した3D図とほぼ同じ絵が得られます。赤い曲線が「板と山の交線」、黒い破線がその接線です。方向微分とは、この赤い曲線を1変数関数と見たときの接線の傾きである、という定義の意味がそのまま絵になっています。板を差し込む向きを変えれば赤い曲線の形も変わり、接線の傾きも変わることが想像できるはずです。この図が、次の「向きを1周させる」実験の下準備になります。

図4:方向微分は向きの $\cos$ 波になる

式 (4) の $D_{\bm{u}} f = \|\nabla f\| \cos\theta$ を確認します。向きの角 $\alpha$ を $0$ から $2\pi$ まで動かし、方向微分をプロットします。

alphas = np.linspace(0, 2*np.pi, 721)
Us = np.stack([np.cos(alphas), np.sin(alphas)], axis=1)   # 単位ベクトルを1周分
Du = Us @ g                                                # 各向きの方向微分

norm_g = np.linalg.norm(g)
alpha_g = np.arctan2(g[1], g[0])          # 勾配の向き(ラジアン)

fig, ax = plt.subplots(1, 2, figsize=(12.5, 5))
ax[0].plot(np.degrees(alphas), Du, color="#d95f02", lw=2, label="$D_u f(\\alpha)$")
ax[0].plot(np.degrees(alphas), norm_g*np.cos(alphas - alpha_g), "--",
           color="#4a90d9", lw=2, label="$|\\nabla f|\\cos(\\alpha-\\alpha_g)$")
ax[0].axhline(norm_g, color="gray", ls=":"); ax[0].axhline(-norm_g, color="gray", ls=":")
ax[0].axvline(np.degrees(alpha_g), color="green", ls=":",
              label=f"勾配の向き {np.degrees(alpha_g):.1f}°")
ax[0].set_xlabel("向きの角 $\\alpha$ [度]"); ax[0].set_ylabel("方向微分")
ax[0].set_title("方向微分は角度の $\\cos$ 波(上限・下限は $\\pm|\\nabla f|$)")
ax[0].legend(fontsize=9)

axp = fig.add_subplot(122, projection="polar")
axp.plot(alphas, np.clip(Du, 0, None), color="#d95f02", lw=2)
axp.plot(alphas, np.clip(-Du, 0, None), color="#4a90d9", lw=2)
axp.set_title("極座標表示:増加側(橙)と減少側(青)の2つの円\n"
              "直径 $=|\\nabla f|$、接する向きが方向微分ゼロ", fontsize=10)
ax[1].axis("off")
plt.tight_layout(); plt.show()

出力される絵は、§「内積を $\cos$ で書き直す」で示した $\cos$ 波と極座標表示の図と同じものです。左のグラフでは、実測した方向微分(実線)が理論の $\cos$ 波(破線)と完全に重なっています。最大値 $4.4721$ を取るのは $\alpha = 63.4^\circ$、これは $\arctan(4/2) = 63.43^\circ$、つまり勾配 $(2,4)$ の向きそのものです。最小値 $-4.4721$ はその反対側 $243.4^\circ$、ゼロ交差は $\pm 90^\circ$ ずれた $153.4^\circ$ と $333.4^\circ$ で、これが等高線の接線方向 $(-2,1)$ に対応します。右の極座標表示では、方向微分の絶対値が「原点で接する2つの円」を描きます。$\|\nabla f\|\cos\theta$ の極座標グラフが直径 $\|\nabla f\|$ の円になるという古典的な事実で、勾配ベクトルは2つの円が最も膨らむ向きを指していると読めます。

図5:等高線に沿った方向微分がゼロであることの数値検証

「等高線の接線方向では方向微分が $0$」を、複数の点で数値的に確かめます。楕円 $x^2 + 2y^2 = 3$ をパラメータ表示 $(\sqrt{3}\cos t, \sqrt{3/2}\sin t)$ で辿り、各点で接ベクトルと勾配の内積を計算します。

ts = np.linspace(0, 2*np.pi, 200)
cx, cy = np.sqrt(3)*np.cos(ts), np.sqrt(1.5)*np.sin(ts)      # 等高線 f=3 上の点
tx, ty = -np.sqrt(3)*np.sin(ts), np.sqrt(1.5)*np.cos(ts)     # 接ベクトル r'(t)
tn = np.hypot(tx, ty)
gx, gy = 2*cx, 4*cy                                           # 各点の勾配

Du_tangent = (gx*tx + gy*ty) / tn        # 接線方向の方向微分
Du_normal = np.hypot(gx, gy)             # 法線方向の方向微分(= |∇f|)

print("接線方向の方向微分の最大絶対値:", np.max(np.abs(Du_tangent)))

plt.figure(figsize=(10, 4.5))
plt.plot(np.degrees(ts), Du_tangent, color="#4a90d9", lw=2,
         label="等高線の接線方向 $D_t f$(理論値 0)")
plt.plot(np.degrees(ts), Du_normal, color="#d95f02", lw=2,
         label="法線方向 $D_n f = |\\nabla f|$")
plt.xlabel("等高線上の位置(パラメータ $t$ [度])"); plt.ylabel("方向微分")
plt.title("等高線に沿えば変化率ゼロ、垂直に横切れば変化率は最大")
plt.legend(); plt.grid(alpha=0.3); plt.tight_layout(); plt.show()

等高線f=3の上を1周しながら、接線方向の方向微分(青)が全域で0に張り付く一方、法線方向の方向微分(橙)は3.464から4.899の間で変動することを示すグラフ

接線方向の方向微分の最大絶対値 は $6.2 \times 10^{-16}$、つまり倍精度計算の丸め誤差そのものです。理論どおり厳密に $0$ だと結論できます。青い線が横軸に張り付く一方、橙の線(法線方向の方向微分)は $3.46$ から $4.90$ の間で変動しています。同じ等高線の上でも場所によって「崖の急さ」が違うわけで、これは楕円の曲率が一定でないことの反映です。$y$ 軸寄り($t = 90^\circ$、$\|\nabla f\| = 4\sqrt{1.5} = 4.899$)で最大、$x$ 軸寄り($t = 0^\circ$、$\|\nabla f\| = 2\sqrt{3} = 3.464$)で最小になるのは、$f$ が $y$ 方向に2倍鋭いためです。

図6:最急降下法の軌跡は等高線と直交する

式 (9) で証明した「厳密直線探索なら連続する探索方向が直交する」を実験します。$f = \frac{1}{2}\bm{x}^\top \bm{A} \bm{x}$($\bm{A} = \mathrm{diag}(2,4)$、これは $x^2 + 2y^2$ と同じ)の場合、最適な歩幅は解析的に $\eta_k = \frac{\bm{g}^\top \bm{g}}{\bm{g}^\top \bm{A} \bm{g}}$ と書けます。

A = np.diag([2.0, 4.0])
x = np.array([2.0, 1.0])          # 初期点
path, grads = [x.copy()], []

for k in range(6):
    gk = A @ x                                   # 勾配
    eta = (gk @ gk) / (gk @ A @ gk)              # 厳密直線探索による最適歩幅
    grads.append(gk.copy())
    x = x - eta * gk
    path.append(x.copy())
path = np.array(path)

# 連続する勾配の内積(規格化)を確認
for k in range(len(grads) - 1):
    c = grads[k] @ grads[k+1] / (np.linalg.norm(grads[k]) * np.linalg.norm(grads[k+1]))
    print(f"cos(∇f_{k}, ∇f_{k+1}) = {c:.2e}")

出力される cos はすべて $10^{-16}$ 台($1.67\text{e-}16$、$-4.51\text{e-}17$、$\dots$)、すなわち倍精度の丸め誤差の範囲でゼロです。連続する2つの勾配が厳密に直交している、すなわち軌跡が毎回きっちり直角に折れ曲がっていることが確認できました。この直交性は、厳密直線探索が「その直線上で $f$ を最小化する」=「その直線方向の方向微分をゼロにする」ことの必然的な帰結です。

続いて軌跡を等高線上に描きます。

X, Y = np.meshgrid(np.linspace(-0.6, 2.4, 400), np.linspace(-0.8, 1.3, 400))
plt.figure(figsize=(9.5, 6))
cs = plt.contour(X, Y, 0.5*(2*X**2 + 4*Y**2), levels=15, colors="#4a90d9", alpha=0.6)
plt.plot(path[:, 0], path[:, 1], "o-", color="crimson", lw=2, ms=7,
         label="最急降下法の軌跡(厳密直線探索)")

# 各点での勾配(外向き)を矢印で
for p in path[:-1]:
    gp = A @ p
    plt.arrow(p[0], p[1], 0.12*gp[0], 0.12*gp[1], head_width=0.04,
              color="#d95f02", length_includes_head=True)
plt.plot(0, 0, "k*", ms=16, label="最小点")
plt.title("軌跡は等高線に垂直に飛び出し、次のステップで直角に折れる(ジグザグ)")
plt.xlabel("$x$"); plt.ylabel("$y$"); plt.legend()
plt.gca().set_aspect("equal"); plt.tight_layout(); plt.show()

左:f=x^2+2y^2の等高線上に描いた最急降下法(厳密直線探索)の軌跡。各線分が等高線に垂直に飛び出し、次のステップで直角に折れるジグザグを描く。右:条件数κ=2,20,100での残差f(x_k)/f(x_0)の減衰を片対数で比較し、実測が理論式((κ−1)/(κ+1))^2=0.1111・0.8186・0.9608と一致することを示すグラフ

赤い折れ線が最急降下法の軌跡です。各線分は出発点の等高線に対して垂直に飛び出しており(橙の矢印が勾配、線分はその真逆)、到着点では次の等高線にちょうど接して直角に曲がっています。これはまさに式 (9) の可視化です。関数値は $6 \to 0.667 \to 0.0741 \to 0.00823 \to \cdots$ と、ステップごとにきっちり $1/9$ 倍になっており、理論式 $\left(\frac{\kappa-1}{\kappa+1}\right)^2 = (1/3)^2 = 1/9$($\kappa = 2$)と完全に一致しました。条件数が小さいのでジグザグは穏やかですが、$\bm{A} = \mathrm{diag}(2, 200)$ のように条件数を上げると振幅の大きい往復に変わり、収束が劇的に遅くなります。

図7:反例を可視化する

最後に、反例3の $f(x,y) = x^3 y/(x^6 + y^2)$ を描き、「全方向の方向微分が $0$ なのに不連続」という奇妙な状況を目で見てみます。

def f_counter(x, y):
    d = x**6 + y**2
    return np.where(d == 0, 0.0, x**3 * y / np.where(d == 0, 1.0, d))

X, Y = np.meshgrid(np.linspace(-1, 1, 600), np.linspace(-1, 1, 600))
Z = f_counter(X, Y)

fig, ax = plt.subplots(1, 2, figsize=(12.5, 5))
im = ax[0].pcolormesh(X, Y, Z, cmap="coolwarm", vmin=-0.5, vmax=0.5, shading="auto")
xs = np.linspace(-1, 1, 400)
ax[0].plot(xs, xs**3, "k--", lw=2, label="曲線 $y=x^3$(この上で $f=1/2$)")
ax[0].plot(0, 0, "ko", ms=8)
ax[0].set_title("反例 $f=x^3y/(x^6+y^2)$:原点付近に赤い尾根が張り付く")
ax[0].set_xlabel("$x$"); ax[0].set_ylabel("$y$"); ax[0].legend(loc="lower right")
fig.colorbar(im, ax=ax[0])

# 各向きに沿った f の値:原点に近づくと必ず0へ
for alpha in [0.3, 0.8, 1.4, 2.2]:
    r = np.linspace(1e-4, 0.8, 400)
    ax[1].plot(r, f_counter(r*np.cos(alpha), r*np.sin(alpha)),
               label=f"直線 $\\alpha={np.degrees(alpha):.0f}°$")
r = np.linspace(1e-4, 0.8, 400)
ax[1].plot(r, f_counter(r, r**3), "k--", lw=2, label="曲線 $y=x^3$ に沿う")
ax[1].set_xlabel("原点からの距離"); ax[1].set_ylabel("$f$ の値")
ax[1].set_title("直線に沿えば 0 に収束、曲線に沿えば 1/2 のまま")
ax[1].legend(fontsize=9); ax[1].grid(alpha=0.3)
plt.tight_layout(); plt.show()

左:反例f=x^3y/(x^6+y^2)の値を色で表した図。曲線y=x^3に沿って細い赤(f=1/2)と青(f=−1/2)の尾根・谷が原点に張り付いている。右:原点を通る4本の直線に沿うとfが0に収束するのに対し、曲線y=x^3に沿うとfが1/2のまま動かないことを示すグラフ

左の図では、原点の周りに $y = x^3$ に沿った細い赤($f = 1/2$)と青($f = -1/2$)の尾根・谷が張り付いています。この尾根は原点に向かってどんどん細くなるので、原点を通るどんな直線もこの尾根を「一瞬で横切る」だけであり、直線に沿った極限には引っかかりません。右の図がその事情を示しています。どの直線(実線)に沿っても原点に近づくにつれ $f \to 0$ ですが、曲線 $y = x^3$(黒い破線)に沿うと $f$ は $1/2$ から一切動きません。差分商で言えば、直線に沿った $f(h\bm{u})/h$ は $h \, a^3 b/(h^4 a^6 + b^2) \to 0$ となるため、全方向の方向微分がきれいに $0$ になります。方向微分は直線しか見ない。全微分可能性はあらゆる経路を見る。 この差が、概念の階層が崩れない理由です。

応用:方向微分が実際に使われる場面

理論と実験を通して方向微分の性質を押さえました。最後に、この道具がどこで働いているかを整理しておきます。

(1)機械学習の最適化。 既に述べたとおり、勾配降下法・確率的勾配降下法・Adam などの手法はすべて「$-\nabla L$ が最急降下方向である」という事実を出発点にしています。近年の手法は、この素朴な向きに「過去の勾配の平均(モーメンタム)」や「座標ごとのスケーリング(Adam の二乗平均)」を加えて改良していますが、根っこは方向微分です。逆に言えば、勾配がゼロになる鞍点で学習が停滞する現象も「1次の方向微分だけでは進む向きが決まらない」ことの表れです。

(2)偏微分方程式の境界条件。 熱伝導や拡散の問題では、境界での法線微分 $\partial u/\partial n = \nabla u \cdot \bm{n}$ を指定するノイマン境界条件が頻出します。これはまさに「境界の外向き単位法線 $\bm{n}$ 方向の方向微分」であり、物理的には「境界を通り抜ける熱流束(フラックス)」を意味します。断熱条件 $\partial u/\partial n = 0$ は「境界方向に温度勾配がない=熱が出入りしない」ことを表しています。

(3)画像処理のエッジ検出。 画像を輝度のスカラー場 $I(x,y)$ と見なすと、輪郭は「輝度が急激に変わる場所」= $\|\nabla I\|$ が大きい場所です。Sobel フィルタは $\partial I/\partial x, \partial I/\partial y$ を差分近似で計算するもので、勾配の大きさ $\sqrt{I_x^2 + I_y^2}$ でエッジ強度を、向き $\arctan(I_y/I_x)$ でエッジの方位を求めます。Canny 法の「非最大抑制」は、勾配方向(=エッジに垂直な向き)の方向微分を見て、その線上で最大でない画素を消す処理です。

(4)地形・リモートセンシング解析。 数値標高モデル(DEM)から傾斜角 $\arctan\|\nabla z\|$ と斜面方位(勾配の向き)を計算するのは、GIS の最も基本的な処理です。土砂災害リスク評価や太陽光パネルの設置適地判定は、この2つの量に基づいています。水が流れる向きが「最急降下方向」であることも、集水域の解析に直接使われます。

(5)レベルセット法・陰関数表現。 曲線や曲面を $\phi(\bm{x}) = 0$ という等位集合で表す手法では、法線が $\bm{n} = \nabla \phi / \|\nabla \phi\|$ で得られます。界面の移動シミュレーション、コンピュータグラフィックスの符号付き距離場(SDF)、機械学習の陰的形状表現(DeepSDF など)は、すべて「勾配=等位面の法線」という本記事の性質に支えられています。

このように、方向微分と勾配の関係は「山登りの喩え話」にとどまらず、最適化・物理・画像・地理情報と広い範囲を貫く共通言語になっています。

まとめ

本記事では、方向微分と勾配ベクトルの関係を、定義から応用まで通して解説しました。

  • 方向微分の定義:$D_{\bm{u}} f(\bm{a}) = \lim_{h \to 0} \frac{f(\bm{a}+h\bm{u}) – f(\bm{a})}{h}$。多変数関数を1本の直線に制限して1変数関数に落とし、その微分係数を取る操作。単位ベクトルに限るのは「傾き」という意味を保つため。偏微分は座標軸方向の方向微分という特別な場合。
  • 中心の等式:$f$ が全微分可能なら $D_{\bm{u}} f(\bm{a}) = \nabla f(\bm{a}) \cdot \bm{u}$。全微分可能性の定義に $\bm{v} = h\bm{u}$ を代入し、残差項が $\|h\bm{u}\| = |h|$ で割っても消えることから示せる。連鎖律を使う導出でも同じ結果になる。
  • 最急上昇方向:コーシー・シュワルツの不等式 $|\nabla f \cdot \bm{u}| \le \|\nabla f\|$ とその等号条件(平行)から、$\bm{u} = \nabla f/\|\nabla f\|$ が最大の増加率 $\|\nabla f\|$ を与える唯一の向きだと分かる。角度で書けば $D_{\bm{u}} f = \|\nabla f\|\cos\theta$ で、向きを1周させると $\cos$ 波を描く。
  • 等高線との直交性:等位集合上の曲線 $\bm{r}(t)$ について $f(\bm{r}(t)) = c$ を微分すると $\nabla f \cdot \bm{r}’ = 0$。勾配は等位集合の法線であり、等高線が密なところほど $\|\nabla f\|$ が大きい。
  • 概念の階層:$C^1$級 ⇒ 全微分可能 ⇒ 全方向の方向微分が存在 ⇒ 偏微分が存在。逆は成り立たない。特に $f = x^3y/(x^6+y^2)$ は、全方向の方向微分が存在して $\nabla f \cdot \bm{u}$ の形(すべて $0$)にまでなるのに、$y = x^3$ 上で $f = 1/2$ となって原点で不連続。方向微分は直線しか見ないという限界の表れ。
  • 最急降下法:更新式 $\bm{x}_{k+1} = \bm{x}_k – \eta \nabla f(\bm{x}_k)$ の根拠は最急降下方向の定理。厳密直線探索を使うと連続する勾配が直交し、軌跡は等高線に垂直に飛び出して直角に折れるジグザグを描く。収束の速さは条件数で決まる。

方向微分は「多変数の微分を1変数に還元する」という発想の原型であり、この考え方は変分法(関数空間での方向微分=ガトー微分)、感度解析、自動微分の前進モードなど、より高度な話題にそのまま引き継がれます。1次の情報だけでは足りない場面ではヘッセ行列を使った2次の議論へ、制約つきの最適化ではラグランジュ未定乗数法へと進んでいくのが自然な学習ルートです。

次のステップとして、以下の記事も参考にしてください。