勾配(gradient, grad)は、スカラー場に対して定義されるベクトル解析の基本的な演算子です。スカラー場の勾配をとると、ベクトル場が得られます。
勾配は「スカラー場がどの方向にどれだけ急激に変化するか」を表す量であり、物理学や工学のあらゆる場面で登場します。例えば、温度場の勾配は熱流の方向を決め、ポテンシャルの勾配は力の方向を決めます。また、機械学習における勾配降下法もこの概念に基づいています。
本記事の内容
- 勾配の数学的な定義(ナブラ演算子)
- 勾配の幾何学的意味(等高線に垂直、最急上昇方向)
- 方向微分係数との関係の導出
- 具体例による勾配の計算
- Pythonで等高線と勾配ベクトルを重ねて可視化
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
また、偏微分の基本的な計算ができることを前提とします。
勾配の数学的定義
ナブラ演算子
勾配を定義する前に、ナブラ演算子(nabla operator) $\nabla$ を導入します。ナブラ演算子は次のように定義されるベクトル微分演算子です。
$$ \nabla = \begin{pmatrix} \dfrac{\partial}{\partial x} \\[8pt] \dfrac{\partial}{\partial y} \\[8pt] \dfrac{\partial}{\partial z} \end{pmatrix} $$
ナブラ演算子そのものは「偏微分する」という操作を各成分に持つベクトルであり、それ自体は関数に作用させて初めて意味を持ちます。
勾配の定義
スカラー場 $f(x, y, z)$ の勾配(gradient)は、ナブラ演算子をスカラー場に作用させたもので、次のように定義されます。
$$ \nabla f = \operatorname{grad} f = \begin{pmatrix} \dfrac{\partial f}{\partial x} \\[8pt] \dfrac{\partial f}{\partial y} \\[8pt] \dfrac{\partial f}{\partial z} \end{pmatrix} $$
つまり、スカラー場 $f$ の各変数についての偏微分を成分に持つベクトルが勾配です。
2次元の場合は次のようになります。
$$ \nabla f(x, y) = \begin{pmatrix} \dfrac{\partial f}{\partial x} \\[8pt] \dfrac{\partial f}{\partial y} \end{pmatrix} $$
勾配の重要な性質として、スカラー場を入力として受け取り、ベクトル場を出力するという点があります。
$$ \nabla : f(\bm{r}) \in \mathbb{R} \;\longrightarrow\; \nabla f(\bm{r}) \in \mathbb{R}^3 $$
勾配の幾何学的意味
勾配には2つの重要な幾何学的意味があります。
1. 勾配は等高線(等値面)に垂直である
スカラー場 $f(x, y) = c$($c$ は定数)で定義される曲線を等高線と呼びます。3次元の場合、$f(x, y, z) = c$ で定まる面を等値面と呼びます。
勾配ベクトル $\nabla f$ は、等高線(等値面)に対して常に垂直(法線方向)です。
これを確認しましょう。等高線 $f(x, y) = c$ 上の点 $\bm{r}(t) = (x(t), y(t))^{\top}$ を考えます。この曲線上では $f$ の値は一定なので、$t$ で微分すると次のようになります。
$$ \frac{d}{dt} f(x(t), y(t)) = 0 $$
連鎖律を適用すると、
$$ \frac{\partial f}{\partial x}\frac{dx}{dt} + \frac{\partial f}{\partial y}\frac{dy}{dt} = 0 $$
この左辺は、勾配ベクトル $\nabla f$ と接線ベクトル $\dfrac{d\bm{r}}{dt}$ の内積に他なりません。
$$ \nabla f \cdot \frac{d\bm{r}}{dt} = 0 $$
内積が $0$ ということは、勾配ベクトル $\nabla f$ が等高線の接線ベクトルに対して垂直であることを意味します。したがって、勾配は等高線に垂直です。
2. 勾配は最急上昇方向を指す
勾配ベクトルは、スカラー場 $f$ が最も急激に増加する方向を指しています。これは方向微分係数を通じて理解できます。
方向微分係数との関係
方向微分係数の定義
点 $\bm{r}_0 = (x_0, y_0)$ から単位ベクトル $\bm{e} = (e_1, e_2)^{\top}$($|\bm{e}| = 1$)の方向にスカラー場 $f$ がどれだけ変化するかを表す量を、方向微分係数と呼びます。
方向微分係数 $D_{\bm{e}} f$ は次のように定義されます。
$$ D_{\bm{e}} f(\bm{r}_0) = \lim_{h \to 0} \frac{f(\bm{r}_0 + h\bm{e}) – f(\bm{r}_0)}{h} $$
勾配との関係の導出
方向微分係数を、勾配を用いて表すことができます。$f$ が微分可能であるとき、$\bm{r}_0$ の近傍で全微分の式を用います。
$$ f(\bm{r}_0 + h\bm{e}) \approx f(\bm{r}_0) + h \frac{\partial f}{\partial x}e_1 + h\frac{\partial f}{\partial y}e_2 $$
これを方向微分係数の定義に代入します。
$$ D_{\bm{e}} f(\bm{r}_0) = \lim_{h \to 0} \frac{f(\bm{r}_0) + h \dfrac{\partial f}{\partial x}e_1 + h \dfrac{\partial f}{\partial y}e_2 – f(\bm{r}_0)}{h} $$
分子の $f(\bm{r}_0)$ が打ち消し合うので、
$$ D_{\bm{e}} f(\bm{r}_0) = \lim_{h \to 0} \frac{h \left(\dfrac{\partial f}{\partial x}e_1 + \dfrac{\partial f}{\partial y}e_2\right)}{h} $$
$h$ を約分すると、
$$ D_{\bm{e}} f(\bm{r}_0) = \frac{\partial f}{\partial x}e_1 + \frac{\partial f}{\partial y}e_2 $$
右辺はまさに勾配ベクトルと方向ベクトルの内積なので、
$$ \boxed{D_{\bm{e}} f(\bm{r}_0) = \nabla f(\bm{r}_0) \cdot \bm{e}} $$
これが方向微分係数と勾配の関係式です。
最急上昇方向の導出
上の結果から、方向微分係数は内積で表されるため、コーシー・シュワルツの不等式を用いると次のことがわかります。
$$ D_{\bm{e}} f = \nabla f \cdot \bm{e} = |\nabla f||\bm{e}|\cos\theta = |\nabla f|\cos\theta $$
ここで、$\theta$ は勾配ベクトル $\nabla f$ と方向ベクトル $\bm{e}$ のなす角です。$|\bm{e}| = 1$ であることを用いました。
$D_{\bm{e}} f$ が最大になるのは $\cos\theta = 1$、すなわち $\theta = 0$ のときです。つまり、$\bm{e}$ が $\nabla f$ と同じ方向を向いているときに、方向微分係数は最大値 $|\nabla f|$ をとります。
$$ \max_{\bm{e}} D_{\bm{e}} f = |\nabla f| \quad \text{($\bm{e}$ が $\nabla f$ と平行のとき)} $$
この結果から、以下の2つの重要な結論が得られます。
- 勾配の方向: $\nabla f$ は $f$ が最も急激に増加する方向(最急上昇方向)を指す
- 勾配の大きさ: $|\nabla f|$ はその最急上昇方向における $f$ の変化率を表す
逆に、$\theta = \pi$(勾配と逆方向)のとき方向微分係数は最小値 $-|\nabla f|$ をとり、$f$ が最も急激に減少する方向となります。この性質は機械学習の勾配降下法で用いられており、損失関数を最小化するために勾配の逆方向にパラメータを更新します。
具体例: $f(x,y) = x^2 + y^2$ の勾配
具体的なスカラー場で勾配を計算してみましょう。
$$ f(x, y) = x^2 + y^2 $$
このスカラー場は原点を中心とする放物面です。等高線は $x^2 + y^2 = c$ なので、原点を中心とする同心円になります。
勾配の計算
定義に従って偏微分を計算します。
$x$ についての偏微分は、$y$ を定数とみなして $x$ で微分します。
$$ \frac{\partial f}{\partial x} = \frac{\partial}{\partial x}(x^2 + y^2) = 2x $$
$y$ についての偏微分は、$x$ を定数とみなして $y$ で微分します。
$$ \frac{\partial f}{\partial y} = \frac{\partial}{\partial y}(x^2 + y^2) = 2y $$
したがって、勾配は次のようになります。
$$ \nabla f = \begin{pmatrix} 2x \\ 2y \end{pmatrix} = 2\begin{pmatrix} x \\ y \end{pmatrix} = 2\bm{r} $$
ここで、$\bm{r} = (x, y)^{\top}$ は位置ベクトルです。
結果の解釈
勾配 $\nabla f = 2\bm{r}$ から次のことが読み取れます。
- 方向: 勾配は原点から放射状に外側を向いています。これは等高線(同心円)に垂直です。
- 大きさ: $|\nabla f| = 2\sqrt{x^2 + y^2} = 2r$($r$ は原点からの距離)なので、原点から離れるほど勾配の大きさが大きくなります。つまり、原点から遠いほど $f$ の変化が急になることを意味しています。
特定の点での計算
点 $(1, 2)$ での勾配を計算すると、
$$ \nabla f(1, 2) = \begin{pmatrix} 2 \times 1 \\ 2 \times 2 \end{pmatrix} = \begin{pmatrix} 2 \\ 4 \end{pmatrix} $$
このベクトルの大きさは $|\nabla f(1,2)| = \sqrt{4 + 16} = \sqrt{20} = 2\sqrt{5} \approx 4.47$ です。
方向 $\bm{e} = \left(\dfrac{1}{\sqrt{5}},\, \dfrac{2}{\sqrt{5}}\right)^{\top}$(勾配方向の単位ベクトル)における方向微分係数は、
$$ D_{\bm{e}} f(1,2) = |\nabla f(1,2)| = 2\sqrt{5} $$
となり、これが点 $(1, 2)$ での $f$ の最大変化率です。
もう一つの例: $f(x,y) = \sin(x)\cos(y)$
もう少し複雑な例として、$f(x, y) = \sin(x)\cos(y)$ の勾配を求めてみましょう。
$x$ についての偏微分は、
$$ \frac{\partial f}{\partial x} = \cos(x)\cos(y) $$
$y$ についての偏微分は、
$$ \frac{\partial f}{\partial y} = -\sin(x)\sin(y) $$
したがって、
$$ \nabla f(x, y) = \begin{pmatrix} \cos(x)\cos(y) \\ -\sin(x)\sin(y) \end{pmatrix} $$
この場合、勾配の方向と大きさは点ごとに大きく変化し、等高線の形状も複雑になります。Pythonで可視化して確認してみましょう。
Pythonで等高線と勾配ベクトルを可視化する
例1: $f(x,y) = x^2 + y^2$ の勾配
等高線(スカラー場)と勾配ベクトル(ベクトル場)を重ねて描画することで、勾配が等高線に垂直であることを視覚的に確認できます。
import numpy as np
import matplotlib.pyplot as plt
# 格子点を生成
x = np.linspace(-3, 3, 200)
y = np.linspace(-3, 3, 200)
X, Y = np.meshgrid(x, y)
# スカラー場: f(x, y) = x^2 + y^2
F = X**2 + Y**2
# 勾配: grad f = (2x, 2y)
# quiver用に粗い格子を使う
x_q = np.linspace(-3, 3, 15)
y_q = np.linspace(-3, 3, 15)
XQ, YQ = np.meshgrid(x_q, y_q)
U = 2 * XQ
V = 2 * YQ
# 可視化
fig, ax = plt.subplots(figsize=(8, 8))
# 等高線を描画
contour = ax.contour(X, Y, F, levels=15, cmap="Blues", linewidths=1.2)
ax.clabel(contour, inline=True, fontsize=9, fmt="%.1f")
# 勾配ベクトルを描画
ax.quiver(XQ, YQ, U, V, color="red", scale=80, width=0.004, alpha=0.8)
ax.set_xlabel("x", fontsize=14)
ax.set_ylabel("y", fontsize=14)
ax.set_title(r"Contour of $f = x^2 + y^2$ and $\nabla f$", fontsize=16)
ax.set_aspect("equal")
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
このプロットを見ると、赤い矢印(勾配ベクトル)が青い等高線に対して垂直に交差していることが確認できます。また、原点から離れるほど矢印が長くなっており、勾配の大きさが増していることもわかります。
例2: $f(x,y) = \sin(x)\cos(y)$ の勾配
より複雑なスカラー場での可視化も行ってみましょう。
import numpy as np
import matplotlib.pyplot as plt
# 格子点を生成
x = np.linspace(-2 * np.pi, 2 * np.pi, 300)
y = np.linspace(-2 * np.pi, 2 * np.pi, 300)
X, Y = np.meshgrid(x, y)
# スカラー場: f(x, y) = sin(x) * cos(y)
F = np.sin(X) * np.cos(Y)
# 勾配: grad f = (cos(x)cos(y), -sin(x)sin(y))
x_q = np.linspace(-2 * np.pi, 2 * np.pi, 20)
y_q = np.linspace(-2 * np.pi, 2 * np.pi, 20)
XQ, YQ = np.meshgrid(x_q, y_q)
U = np.cos(XQ) * np.cos(YQ)
V = -np.sin(XQ) * np.sin(YQ)
# 可視化
fig, ax = plt.subplots(figsize=(10, 8))
# 等高線とカラーマップ
cf = ax.contourf(X, Y, F, levels=30, cmap="RdBu_r", alpha=0.7)
contour = ax.contour(X, Y, F, levels=15, colors="gray", linewidths=0.8)
ax.clabel(contour, inline=True, fontsize=8, fmt="%.1f")
# 勾配ベクトル
ax.quiver(XQ, YQ, U, V, color="black", scale=20, width=0.003, alpha=0.9)
ax.set_xlabel("x", fontsize=14)
ax.set_ylabel("y", fontsize=14)
ax.set_title(r"Contour of $f = \sin(x)\cos(y)$ and $\nabla f$", fontsize=16)
ax.set_aspect("equal")
fig.colorbar(cf, ax=ax, label=r"$f(x, y)$", shrink=0.8)
plt.tight_layout()
plt.show()
この図では、赤い領域が $f$ の値が大きい領域(山)、青い領域が $f$ の値が小さい領域(谷)です。黒い矢印(勾配ベクトル)が等高線に垂直であり、かつ $f$ の値が増加する方向を向いていることが確認できます。
山の頂上(極大点)や谷の底(極小点)では $\nabla f = \bm{0}$ となり、矢印がほとんど見えなくなっています。このように $\nabla f = \bm{0}$ となる点を停留点(critical point)と呼びます。
3次元への拡張
ここまで2次元で解説してきましたが、3次元への拡張は自然に行えます。スカラー場 $f(x, y, z)$ の勾配は次のとおりです。
$$ \nabla f(x, y, z) = \begin{pmatrix} \dfrac{\partial f}{\partial x} \\[8pt] \dfrac{\partial f}{\partial y} \\[8pt] \dfrac{\partial f}{\partial z} \end{pmatrix} $$
例えば、$f(x, y, z) = x^2 + y^2 + z^2$ のとき、
$$ \nabla f = \begin{pmatrix} 2x \\ 2y \\ 2z \end{pmatrix} = 2\bm{r} $$
となり、2次元の場合と同様に、原点から放射状に外側を向く勾配ベクトルが得られます。等値面 $x^2 + y^2 + z^2 = c$ は球面であり、勾配はこの球面に垂直です。
また、方向微分係数と勾配の関係式 $D_{\bm{e}} f = \nabla f \cdot \bm{e}$ は、3次元でもまったく同様に成立します。
まとめ
本記事では、勾配(grad)の定義と幾何学的な意味について解説しました。
- 勾配の定義: スカラー場 $f$ の勾配 $\nabla f$ は、各変数の偏微分を成分に持つベクトルです
- 幾何学的意味1: 勾配ベクトルは等高線(等値面)に垂直です
- 幾何学的意味2: 勾配ベクトルは $f$ が最も急激に増加する方向(最急上昇方向)を指します
- 方向微分係数: $D_{\bm{e}} f = \nabla f \cdot \bm{e}$ の関係が成立し、勾配方向で最大の変化率 $|\nabla f|$ を得ます
- 具体例: $f(x,y) = x^2 + y^2$ の勾配は $\nabla f = (2x, 2y)^{\top}$ であり、等高線(同心円)に垂直な放射状ベクトルとなります
次のステップとして、ベクトル場に対する演算子である発散(div)について学びましょう。発散は、ベクトル場の「湧き出し」を表す量です。