見出し画像

ベクトルと行列の微分

機械学習や物理学の理論では、微分がよく使われるので簡単にまとめました。


スカラーとベクトルと行列

スカラー

スカラー(Scalar)は日常で我々が数値と呼ぶものです。

$$
1.5\ , \ \frac{1}{3}\ , \ 10^3 \ \text{など}
$$

なお、この記事では実数のみを考えます。虚数は扱いません。

ベクトル

ベクトル(Vector)はスカラーを並べたものです。

$$
\bm{x} = \left(1.2\ , \ \frac{1}{3} \ , \ 10^3 \right)
$$

なお、上記のベクトルは3つの要素を持つので3次元ベクトルと呼べます。

次元数が1の場合は、多くの場合スカラーと同等とみなします。

また、ベクトルはよく列ベクトルとして表記します。

$$
\bm{x} = \begin{bmatrix}
 \\[-5pt]
1.2\\[1ex]
\dfrac{1}{3} \\[3ex]
10^3 \\[1ex]
\end{bmatrix}
$$

より一般に$${n}$$個の要素を持つベクトルは以下のように表記できます。

$$
\bm{x} = \begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}
$$

$${\bm{x}}$$という表記は、ベクトルの中身を気にしない場合は特に便利です。

行列

行列は、スカラーを縦横に将棋盤のマス目のように並べたものです。

例えば、2行3列(2x 3)の行列$${X}$$を考えます。

$$
X = \begin{bmatrix}
  1 & 3 & 0.01 \\
 -2 & 9 & 5
\end{bmatrix}
$$

上記のように、行列は大文字で表記することが多いです。

一般に、$${m}$$行$${n}$$列の行列は次のように表記します。

$$
X = \begin{bmatrix}
x_{11} & x_{12} & \cdots & x_{1n} \\
x_{21} & x_{22} & \cdots & x_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
x_{m1} & x_{m2} & \cdots & x_{mn}
\end{bmatrix}
$$

「どちらが行で、どちらが列なのか?」わからなくなったら、学校で整列している様子を思い浮かべてみると、縦に並んだ列のイメージで思い出すかもしれません。

列ベクトルを縦ベクトルと呼ぶこともあります。

スカラー値関数

スカラー入力のスカラー値関数

スカラーを返す関数をスカラー値関数と呼びます。

$$
f(x) = x^2 + 5
$$

このスカラー関数は、入力値$${x}$$を与えると$${x^2 + 5}$$を計算してスカラー値を返します。

なお、スカラー値を指定する変数をスカラー変数と呼びます。つまり、上記の$${x}$$はスカラー変数です。

ベクトル入力のスカラー値関数

複数の値を受け入れるスカラー関数を考えます。例えば、こんな関数があります。

$$
f(x_1, x_2)
$$

$${x_1, x_2}$$をまとめてベクトルにします。

$$
\bm{x} = (x_1, x_2)
$$

これをベクトル変数と呼びます。上記のスカラー関数はベクトル変数を使えば、次のように簡潔に表記できます。

$$
f(\bm{x})
$$

この記事では太字でベクトル変数を表現していますが、物理では$${\vec{x}}$$という表記もあります。おそらく、元々は空間内での大きさと方向という意味合いが強かったからだと思われます。

より一般に、複数の値$${x_1, x_2, \ldots, x_n}$$を受け入れるスカラー値関数は、ベクトル変数$${\bm{x}=(x_1, x_2, \ldots, x_n)}$$によって以下のように簡潔に表記できます。

$$
f(\bm{x}) = f(x_1, x_2, \ldots, x_n)
$$

ただし、入力がスカラーでもベクトルでもスカラーを返すものは全てスカラー値関数になります。

また、ベクトル変数の要素数が1の場合は、入力をスカラーとみなせるので、ベクトル入力による表記ではスカラー入力を含めた一般化した議論が行えます。

行列入力のスカラー値関数

行列を入力とするスカラー値関数$${f(X)}$$を考えることもできます。

例えば、$${m \times n}$$の行列$${X}$$中身を全部二乗して足し合わせるのは、行列を入力とするスカラー値関数です。

$$
f(X) = \sum\limits_{i=1}^m \sum\limits_{j=1}^n x_{ij}^2
$$

行列の要素の平均や分散を計算したりするのもよくある例です。

ベクトル値関数

スカラー入力のベクトル値関数

ベクトル値を返す関数をベクトル値関数と呼びます。

例えば、スカラーを入力としてベクトルを返す関数はベクトル値関数です。

$$
\bm{f}(x) = (x^2, 2x+1)
$$

ここで、関数を太字にしてベクトル値を返すことを表現しました。ただし、太字になっていないことも多く、ほとんどは文脈から判断できるのでそれでも問題ありません。

より一般的に、$${\bm{f}(x)}$$が$${n}$$個の要素を持つベクトルを返すならば次のようにも表記できます。

$$
\bm{f}(x) = \biggl(f_1(x),\ f_2(x), \ \ldots\ ,\  f_n(x)\biggr)
$$

それぞれの要素に、スカラーを入力とする異なるスカラー値関数があることになります。

ベクトル入力のベクトル値関数

ベクトル入力の例として、2次元ベクトルの変数$${\bm{x} = (x_1, x_2)}$$を入力として、次のようなベクトル値関数も考えられます。

$$
\bm{f}(\bm{x}) = (x_1^2, \ x_1 x_2, 2x_2 + 1)
$$

ベクトルの入力を受けて、別のベクトルを返しています。

より一般的に、$${\bm{f}(\bm{x})}$$が$${n}$$個の要素を持つベクトルを返すならば次のようにも表記できます。

$$
\bm{f}(\bm{x}) = \biggl(f_1(\bm{x}),\ f_2(\bm{x}), \ \ldots\ ,\  f_n(\bm{x})\biggr)
$$

それぞれの要素に、ベクトルを入力とする異なるスカラー値関数があることになります。

ちょっと話はそれますが、入力ベクトルが空間の位置(位置ベクトル)である場合、その関数は「場」(field)と呼ばれることがあります。特に物理では、位置ベクトルを入力とする関数を「場」と呼ぶことが多いです。

スカラー場 (scalar field):空間内の各点にスカラー値を対応させる関数。
例:温度分布、圧力分布

ベクトル場 (vector field):空間内の各点にベクトル値を対応させる関数。
例:電場、磁場

列ベクトルでベクトル値関数を表記すれば以下になります。

$$
\bm{f}(\bm{x}) = \begin{bmatrix}
 \\[-6pt]
f_1(\bm{x}) \\[6pt]
f_2(\bm{x}) \\[2pt]
\vdots \\[4pt]
f_m(\bm{x}) \\[4pt]
\end{bmatrix}
$$

機械学習では、線形変換がよく使われます。その場合の関数は行列とベクトルの積などで表現できます。

$$
\begin{aligned}
\bm{f}(\bm{x}) = W\bm{x} + \bm{b} &= \begin{bmatrix}
w_{11} & w_{12} & \cdots & w_{1n} \\
w_{21} & w_{22} & \cdots & w_{2n} \\
\vdots & \vdots & \ddots & \vdots \\
w_{m1} & w_{m2} & \cdots & w_{mn} 
\end{bmatrix} \begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix} + \begin{bmatrix}
b_1 \\
b_2 \\
\vdots \\
b_m
\end{bmatrix} \\[6ex]
&= \begin{bmatrix}
w_{11} x_1 + w_{12} x_2 \  + \cdots \ + w_{1n} x_n \ + b_1 \\
w_{21} x_1 + w_{22} x_2 \  + \cdots \ + w_{2n} x_n \ + b_2 \\
\vdots \\
w_{m1} x_1 + w_{m2} x_2  + \cdots + w_{mn} x_n + b_m \\
\end{bmatrix}
\end{aligned}
$$

これもベクトルを入力としてベクトルを返しているのでベクトル値関数です。

行列入力のベクトル値関数

行列を入力とするベクトル値関数$${\bm{f}(X)}$$を考えることもできます。例えば、行列$${X}$$内の要素の平均と分散をベクトルとして返す関数などが考えられます。

他にも、線形変換における重みやバイアスを入力の変数ととらえる場合があります。これは前述の線形変換と中身は同じですが、入力が異なります。

$$
\bm{f}(W, \bm{b}) = W\bm{x} + \bm{b}
$$

ここで、$${\bm{x}}$$は関数の一部(固定値)として扱われています。このように重み行列$${W}$$とバイアス$${\bm{b}}$$を入力変数として扱うのは、後で勾配の計算の時に登場します。

行列値関数

スカラー入力の行列値関数

行列を返す関数を行列値関数と呼びます。

例えば、2次元空間の回転行列は、角度$${\theta}$$を入力として取り、回転行列 $${R(\theta)}$$を出力します:

$$
R(\theta) = \begin{bmatrix}
\cos \theta & -\sin \theta \\
sin \theta & \cos \theta
\end{bmatrix}
$$

ここで、入力はスカラー値の$${\theta}$$ですが、出力は$${2 \times 2}$$の行列です。この行列は、2次元のベクトルを$${\theta}$$ラジアン回転させるために使われます。

スカラーを入力とする行列値関数は一般に以下のように表記できます。

$$
F(x) = \begin{bmatrix}
 \\[-7pt]
f_{11}(x) & f_{12}(x) & \cdots & f_{1n}(x) \\
f_{21}(x) & f_{22}(x) & \cdots & f_{2n}(x) \\
\vdots & \vdots & \ddots & \vdots \\
f_{m1}(x) & f_{m2}(x) & \cdots & f_{mn}(x) \\[5pt]
\end{bmatrix}
$$

各要素として、スカラー入力のスカラー値関数があることになります。

ベクトル入力の行列値関数

ベクトルを入力とする行列値関数は一般に以下のように表記できます。

$$
F(\bm{x}) = \begin{bmatrix}
 \\[-7pt]
f_{11}(\bm{x}) & f_{12}(\bm{x}) & \cdots & f_{1n}(\bm{x}) \\
f_{21}(\bm{x}) & f_{22}(\bm{x}) & \cdots & f_{2n}(\bm{x}) \\
\vdots & \vdots & \ddots & \vdots \\
f_{m1}(\bm{x}) & f_{m2}(\bm{x}) & \cdots & f_{mn}(\bm{x}) \\[5pt]
\end{bmatrix}
$$

各要素として、ベクトル入力のスカラー値関数があることになります。

行列入力の行列値関数

行列を入力とする行列値関数は一般に以下のように表記できます。

$$
F(X) = \begin{bmatrix}
f_{11}(X) & f_{12}(X) & \cdots & f_{1n}(X) \\
f_{21}(X) & f_{22}(X) & \cdots & f_{2n}(X) \\
\vdots & \vdots & \ddots & \vdots \\
f_{m1}(X) & f_{m2}(X) & \cdots & f_{mn}(X)
\end{bmatrix}
$$

各要素として行列入力のスカラー値関数があることになります。

スカラー変数による微分

スカラー値関数をスカラー変数で微分

例えば次のようなスカラー値関数があるとします。

$$
f(x) = x^2 + 1
$$

この関数は、一つのスカラー変数$${x}$$に依存しています。これを、$${x}$$で微分すると以下になります。

$$
\frac{\mathrm{d} f(x)}{\mathrm{d} x} = 2x
$$

このように、微分される関数$${f(x)}$$が一つの変数$${x}$$にのみ依存する場合の微分を常微分と呼びます。

なお、微分の仕組みについては、こちらで解説しています。

スカラー値関数が複数の変数に依存する場合に、その中の一つの変数で微分することを偏微分と呼び、以下のように表記します。

$$
\frac{\partial f(\bm{x})}{\partial x_i}
$$

ここでは、入力ベクトル$${\bm{x} = (x_1, x_2, \ldots, x_i, \ldots)}$$の中の$${x_i}$$以外は固定されている(つまり、$${x_i}$$に依存しないので数値と同じ)扱いになっています。

例えば、次のようなベクトル入力のスカラー関数を考えます。

$$
f(\bm{x}) = x_1^2 + x_1x_2 + x_2 + 1 \quad ここで、\bm{x} = (x_1, x_2)
$$

これを$${x_1}$$で偏微分してみましょう。この時、$${x_2}$$は固定されている(つまり$${x_1}$$に依存しないので数字と同じ扱い)になります。よって、以下のように計算できます。

$$
\frac{\partial f(\bm{x})}{\partial x_1} = 2x_1 + x_2
$$

$${x_2}$$で偏微分すると以下になります。

$$
\frac{\partial f(\bm{x})}{\partial x_2} = x_1 + 1
$$

ベクトル値関数をスカラー変数で微分

ベクトル値関数の微分では、出力ベクトルの各要素(関数)を微分します。

スカラー入力のベクトル値関数$${\bm{f}(x)}$$の微分は以下の常微分になります。

$$
\frac{\mathrm{d} \bm{f}(x)}{\mathrm{d} x} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\mathrm{d} f_1(x)}{\mathrm{d} x} \\[12pt]
\dfrac{\mathrm{d} f_2(x)}{\mathrm{d} x} \\[10pt]
\vdots \\[8pt]
\dfrac{\mathrm{d} f_m(x)}{\mathrm{d} x} \\[10pt]
\end{bmatrix}
$$

ベクトル入力のベクトル値関数$${\bm{f}(\bm{x})}$$を、入力の1要素(変数$${x_i}$$)で部分するなら偏微分になります。

$$
\frac{\partial\bm{f}(\bm{x})}{\partial x_i} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial f_1(\bm{x})}{\partial x_i} \\[12pt]
\dfrac{\partial f_2(\bm{x})}{\partial x_i} \\[10pt]
\vdots \\[8pt]
\dfrac{\partial f_m(\bm{x})}{\partial x_i} \\[10pt]
\end{bmatrix}
$$

行列値関数をスカラー変数で微分

スカラー入力の行列値関数の微分は、出力行列の各要素(関数)を常微分します。

$$
\frac{\mathrm{d} F(x)}{\mathrm{d} x} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial f_{11}(x)}{\mathrm{d} x} & \dfrac{\mathrm{d} f_{12}(x)}{\mathrm{d} x} & \cdots & \dfrac{\mathrm{d} f_{1n}(x)}{\mathrm{d} x} \\[3ex]
\dfrac{\partial f_{21}(x)}{\mathrm{d} x} & \dfrac{\mathrm{d} f_{22}(x)}{\mathrm{d} x} & \cdots & \dfrac{\mathrm{d} f_{2n}(x)}{\mathrm{d} x} \\[3ex]
\vdots & \vdots & \ddots & \vdots \\[3ex]
\dfrac{\partial f_{m1}(x)}{\mathrm{d} x} & \dfrac{\mathrm{d} f_{m2}(x)}{\mathrm{d} x} & \cdots & \dfrac{\mathrm{d} f_{mn}(x)}{\mathrm{d} x} \\[3ex]
\end{bmatrix}
$$

入力がベクトル変数で、そのうちの一つの要素で微分するなら偏微分になります。

$$
\frac{\partial F(\bm{x})}{\partial x_i} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial f_{11}(\bm{x})}{\partial x_i} & \dfrac{\partial f_{12}(\bm{x})}{\partial x_i} & \cdots & \dfrac{\partial f_{1n}(\bm{x})}{\partial x_i} \\[3ex]
\dfrac{\partial f_{21}(\bm{x})}{\partial x_i} & \dfrac{\partial f_{22}(\bm{x})}{\partial x_i} & \cdots & \dfrac{\partial f_{2n}(\bm{x})}{\partial x_i} \\[3ex]
\vdots & \vdots & \ddots & \vdots \\[3ex]
\dfrac{\partial f_{m1}(\bm{x})}{\partial x_i} & \dfrac{\partial f_{m2}(\bm{x})}{\partial x_i} & \cdots & \dfrac{\partial f_{mn}(\bm{x})}{\partial x_i} \\[3ex]
\end{bmatrix}
$$

ベクトル変数による微分

スカラー値関数をベクトル変数で微分

スカラー値関数をベクトル変数で微分するのは、ベクトルの要素ごとにそのスカラー値関数を偏微分することです。

$$
\frac{\partial f(\bm{x})}{\partial \bm{x}} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial f(\bm{x})}{\partial x_1} \\[12pt]
\dfrac{\partial f(\bm{x})}{\partial x_2} \\[10pt]
\vdots \\[8pt]
\dfrac{\partial f(\bm{x})}{\partial x_n} \\[10pt]
\end{bmatrix}
$$

これは勾配(gradient)とも呼ばれ、次のように表記することが多いです。

$$
\nabla f(\bm{x}) = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial}{\partial x_1} \\[12pt]
\dfrac{\partial}{\partial x_2} \\[10pt]
\vdots \\[8pt]
\dfrac{\partial}{\partial x_n} \\[10pt]
\end{bmatrix} f(\bm{x})
$$

この記号$${\nabla}$$はナブラ記号と呼ばれます。偏微分の記号をベクトルの中に入れて関数自体は外に表記しています。これで勾配が簡単に表記できます。

また、機械学習の論文などでは、これを常微分として表記することがあります。例えば、ニューラルネットワークのパラメータの更新式を以下のように表現します。

$$
\bm{\theta} \Leftarrow \bm{\theta} - \alpha\frac{\mathrm{d} L(\bm{\theta})}{\mathrm{d} \bm{\theta}}
$$

ここで、$${\bm{\theta}}$$はニューラルネットワークのパラメータ(重み、バイアスなど)を全てまとめたベクトルで、$${L(\bm{\theta})}$$は損失関数です。$${\dfrac{\mathrm{d} L(\bm{\theta})}{\mathrm{d} \bm{\theta}}}$$は、$${\nabla L(\bm{\theta})}$$と同じ意味で使われています。

また、$${\alpha}$$は学習率であり、上式は勾配降下法における更新式を意味します。文脈から偏微分が行われているのは明らかです。

$$
\frac{\mathrm{d} L(\bm{\theta})}{\mathrm{d} \bm{\theta}} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial L(\bm{\theta})}{\partial \theta_1} \\[12pt]
\dfrac{\partial L(\bm{\theta})}{\partial \theta_2} \\[10pt]
\vdots \\[8pt]
\dfrac{\partial L(\bm{\theta})}{\partial \theta_n} \\[10pt]
\end{bmatrix}
$$

同じことを丸括弧で、$${\frac{\mathrm{d} L(\bm{\theta})}{\mathrm{d} \bm{\theta}} = \left(\frac{\partial L(\bm{\theta})}{\partial \theta_1}, \frac{\partial L(\bm{\theta})}{\partial \theta_2}, \cdots, \frac{\partial L(\bm{\theta})}{\partial \theta_n}\right)}$$とも書きます。ただし、これは列ベクトル(縦ベクトル)と同等であり、横ベクトルではありません。これも文脈で判断できる場合が大抵です。

ナブラ記号を使うのが単純明快かどうかは、個人の好みによるでしょう。

$$
\bm{\theta} \Leftarrow \bm{\theta} - \alpha\nabla L(\bm{\theta})
$$

同じことを$${\text{grad}}$$とも表記します。これはgradientの略です。

$$
\bm{\theta} \Leftarrow \bm{\theta} - \alpha\text{ grad}  L(\bm{\theta})
$$

ベクトル値関数をベクトル変数で微分

出力が$${m}$$次元のベクトル値関数を、$${n}$$次元の入力ベクトルで微分すると、$${m \times n}$$個の偏微分を要素に持つ行列になります。

これをヤコビ行列(Jacobian matrix)と呼び、次のように表記します。

$$
J_{\bm{f}} = \frac{\partial \bm{f}(\bm{x})}{\partial \bm{x}} = \begin{bmatrix}
 \\[-5pt]
\dfrac{\partial f_1}{\partial x_1} & \dfrac{\partial f_1}{\partial x_2} & \cdots & \dfrac{\partial f_1}{\partial x_n} \\[12pt]
\dfrac{\partial f_2}{\partial x_1} & \dfrac{\partial f_2}{\partial x_2} & \cdots & \dfrac{\partial f_2}{\partial x_n} \\[12pt]
\vdots & \vdots & \ddots & \vdots \\[10pt]
\dfrac{\partial f_m}{\partial x_1} & \dfrac{\partial f_m}{\partial x_2} & \cdots & \dfrac{\partial f_m}{\partial x_n} \\[10pt]
\end{bmatrix}
$$

一見複雑ですが、順番に考えるとそうでもありません。まず、出力が$${m}$$次元のベクトル値関数は次のように書くことが出来ます。

$$
\bm{f}(\bm{x}) = \begin{bmatrix}
 \\[-6pt]
f_1(\bm{x}) \\[6pt]
f_2(\bm{x}) \\[2pt]
\vdots \\[4pt]
f_m(\bm{x}) \\[4pt]
\end{bmatrix}
$$

この各要素はスカラー関数です。これを$${n}$$次元の入力ベクトルで微分します。

$$
\begin{aligned}
\frac{\partial f_1(\bm{x})}{\partial \bm{x}} &= \left( \dfrac{\partial f_1(\bm{x})}{\partial x_1}, \dfrac{\partial f_1(\bm{x})}{\partial x_2}\ ,\ \cdots \ , \ \dfrac{\partial f_1(\bm{x})}{\partial x_n}\right) \\[3ex]
\frac{\partial f_2(\bm{x})}{\partial \bm{x}} &= \left( \dfrac{\partial f_2(\bm{x})}{\partial x_1}, \dfrac{\partial f_2(\bm{x})}{\partial x_2}\ ,\ \cdots \ , \ \dfrac{\partial f_2(\bm{x})}{\partial x_n}\right) \\
\vdots \\[1ex]
\frac{\partial f_m(\bm{x})}{\partial \bm{x}} &= \left( \dfrac{\partial f_m(\bm{x})}{\partial x_1}, \dfrac{\partial f_m(\bm{x})}{\partial x_2}, \cdots, \dfrac{\partial f_m(\bm{x})}{\partial x_n}\right)
\end{aligned}
$$

ここで入力ベクトル$${\bm{x}}$$が繰り返されているので省略して、結果を行列形式にまとめたのがヤコビ行列になります。

  • は出力ベクトル$${\bm{f}(\bm{x})}$$の各成分$${f_i}$$に対応するので、行の数は$${m}$$。

  • は入力ベクトル$${\bm{x}}$$の各成分$${x_j}$$に対応するので、列の数は $${n}$$。

よって、ヤコビ行列$${J_{\bm{f}}}$$は$${m \times n}$$の行列として表現され、各要素が偏微分$${\dfrac{\partial f_i}{\partial x_j}}$$になっています。

なお、ヤコビ行列を$${\dfrac{\partial \bm{f}(\bm{x})}{\partial \bm{x}}}$$や$${D\bm{f}(\bm{x})}$$や$${D_x\bm{f}}$$とも表記します。大抵は文脈からヤコビ行列であることは明白です。

Wx を x で微分

ベクトル値関数をベクトル変数で微分する特別なケースとして、線形変換$${\bm{f}(\bm{x}) = W\bm{x}}$$を入力ベクトル$${\bm{x}}$$で微分することを考えます。

ベクトル値関数をベクトル変数で微分するので、$${\bm{f}(\bm{x})}$$のヤコビ行列になりますが、線形変換なので結果が単純になります。

まず、関数の中身を展開して表現します。

$$
\bm{f}(\bm{x}) = W\bm{x} = \begin{bmatrix}
w_{11} x_1 + w_{12} x_2 \ + \cdots \ + w_{1n} x_n \\[1ex]
w_{21} x_1 + w_{22} x_2 \ + \cdots \ + w_{2n} x_n \\
\vdots \\
w_{m1} x_1 + w_{m2} x_2 + \cdots + w_{mn} x_n
\end{bmatrix}
$$

この各行はスカラー値関数です。これをベクトル$${\bm{x}}$$で微分します。

$$
\begin{aligned}
\frac{\partial (w_{11} x_1 + w_{12} x_2 \ + \cdots \ + w_{1n} x_n )}{\partial \bm{x}} &= \left( w_{11}, w_{12}, \cdots, w_{1n} \right) \\[2ex]
\frac{\partial (w_{21} x_1 + w_{22} x_2 \ + \cdots \ + w_{2n} x_n )}{\partial \bm{x}} &= \left( w_{21}, w_{22}, \cdots, w_{2n} \right) \\[1ex]
\vdots \\[1ex]
\frac{\partial (w_{m1} x_1 + w_{m2} x_2 \ + \cdots \ + w_{mn} x_n )}{\partial \bm{x}} &= \left( w_{m1}, w_{m2}, \cdots, w_{mn} \right)
\end{aligned}
$$

これを行列にまとめると$${W}$$と同じです。よって、結果は以下になります。

$$
\begin{aligned}
\dfrac{\partial W\bm{x}}{\partial \bm{x}} = W
\end{aligned}
$$

当たり前の結果に見えますが、知らないと戸惑う可能性があります。

注意点
ベクトルや行列の微分結果の表記方法を選択するオプションとして「分子レイアウト」と「分母レイアウト」という二つの表示形式があります。ここで、分子と分母とは$${\frac{\partial \bm{y}}{\partial \bm{x}}}$$の$${\bm{y}}$$と$${\bm{x}}$$のことを指します。

$${\bm{y}}$$の要素数が$${m}$$、$${\bm{x}}$$の要素数が$${n}$$の時、微分の結果を$${m \times n}$$行列で表示する方法を分子レイアウトと呼びます。この場合、微分の結果は$${\bm{y}}$$の成分が行方向(縦方向)、$${\bm{x}}$$の成分が列方向(横方向)に並びます。上述のヤコビ行列の説明はこれに従っています。

一方、分母レイアウトはこの行列を転置して、$${\bm{x}}$$の成分が行方向(縦方向)、$${\bm{y}}$$の成分が列方向(横方向)に並ぶ$${n \times m}$$行列で表現する方式です。

よって、文献によっては、$${\dfrac{\partial W\bm{x}}{\partial \bm{x}} = W^\top}$$と表記している場合もあります。

参考:https://en.wikipedia.org/wiki/Matrix_calculus

行列による微分

スカラー値関数を行列で微分

行列を入力とするスカラー値関数を、その入力行列で微分することを考えます。この場合、行列の各要素(変数)に対してスカラー値関数の偏微分を計算します。

例えば、スカラー値関数$${f(\mathbf{X})}$$の入力$${\mathbf{X}}$$が$${m \times n}$$の行列とすると、$${f}$$を$${\mathbf{X}}$$の要素$${w_{ij}}$$ごとに偏微分することで、$${m \times n}$$の行列が得られます。

$$
\frac{\partial f}{\partial \mathbf{X}} = \begin{bmatrix}
 \\[-6pt]
\dfrac{\partial f}{\partial x_{11}} & \dfrac{\partial f}{\partial x_{12}} & \cdots & \dfrac{\partial f}{\partial x_{1n}} \\[3ex]
\dfrac{\partial f}{\partial x_{21}} & \dfrac{\partial f}{\partial x_{22}} & \cdots & \dfrac{\partial f}{\partial x_{2n}} \\[2ex]
\vdots & \vdots & \ddots & \vdots \\[1ex]
\dfrac{\partial f}{\partial x_{m1}} & \dfrac{\partial f}{\partial x_{m2}} & \cdots & \dfrac{\partial f}{\partial x_{mn}} \\[3ex]
\end{bmatrix}
$$

結果として、元の行列と同じ形($${m \times n}$$)の行列になります。また、このような行列を、一般に勾配行列(gradient matrix)と呼びます。

この勾配行列は、入力行列の各要素に対するスカラー関数の感度(偏微分)を示しています。

ベクトル値関数を行列で微分

行列$${X}$$を入力とするベクトル値関数$${\bm{f}(X)}$$を$${X}$$で微分することを考えます。

まず、ベクトル値関数 $${\bm{f}(X)}$$の出力を、$${p}$$個の要素を持つベクトルとして以下のように表現します。

$$
\bm{f}(X) = \begin{bmatrix}
 \\[-6pt]
f_1(X) \\[1ex]
f_2(X) \\
\vdots \\
f_p(X) \\[1ex]
\end{bmatrix}
$$

ここでの目標は、ベクトル値関数 $${\bm{f}(X)}$$の各成分の偏微分を行列$${X}$$の各要素$${x_{ij}}$$に対して求めることです。よって、行列$${X}$$が$${m \times n}$$だとすると、全部で$${p \times m \times n}$$個の偏微分が必要となります。

その要素となる偏微分を一般形で書くと以下になります。

$$
\frac{\partial f_k(X)}{\partial x_{ij}}
$$

  • $${k}$$は、ベクトル値関数の各成分$${f_k}$$に対応します。よって、$${k}$$は$${1}$$から$${p}$$の整数です。

  • $${i}$$と$${j}$$は、行列$${X}$$の行および列の位置に対応します。よって、$${i}$$は$${1}$$から$${m}$$の整数、$${j}$$は$${1}$$から$${n}$$の整数です。

これを3次元のテンソルの要素として次のように表現します。

$$
\left(\frac{\partial \bm{f}(X)}{\partial X}\right)_{kij} = \frac{\partial f_k(X)}{\partial x_{ij}}
$$

これは$${\bm{f}(X)}$$に対するヤコビ行列に相当しますが、入力が行列なので結果としては3次元のテンソルになります。

こういう計算はPyTorchとかにやってもらうのが最善です。

Wx を W で微分

ベクトル値関数を行列で微分する特別なケースとして、ベクトル値関数$${\bm{f}(W) = W\bm{x}}$$を入力行列$${W}$$で微分することを考えます。

まず、関数の中身を展開して表現します。

$$
\bm{f}(W) = \begin{bmatrix}
 \\[-6pt]
f_1(W) \\[1ex]
f_2(W) \\
\vdots \\[1ex]
f_m(W) \\[1ex]
\end{bmatrix} = 
\begin{bmatrix}
 \\[-6pt]
w_{11} x_1 + w_{12} x_2 \ + \cdots \ + w_{1n} x_n \\[1ex]
w_{21} x_1 + w_{22} x_2 \ + \cdots \ + w_{2n} x_n \\[1pt]
\vdots \\[3pt]
w_{m1} x_1 + w_{m2} x_2 + \cdots + w_{mn} x_n \\[1ex]
\end{bmatrix}
$$

$${\bm{f}(W)}$$の1行目$${f_1(W)}$$だけを入力行列$${W}$$の各要素$${w_{ij}}$$で偏微分すると以下になります。

$$
\begin{aligned}
\frac{\partial f_1(W)}{\partial W}
&= \begin{bmatrix}
 \\[-6pt]
\dfrac{\partial f_1(X)}{\partial w_{11}} & \dfrac{\partial f_1(X)}{\partial w_{12}}
  & \cdots & \dfrac{\partial f_1(X)}{\partial w_{1n}} \\[3ex]
\dfrac{\partial f_1(X)}{\partial w_{21}} & \dfrac{\partial f_1(X)}{\partial w_{22}}
  & \cdots & \dfrac{\partial f_1(X)}{\partial w_{2n}} \\
\vdots & \vdots & \ddots & \vdots \\[1ex]
\dfrac{\partial f_1(X)}{\partial w_{m1}} & \dfrac{\partial f_1(X)}{\partial w_{m2}}
  & \cdots & \dfrac{\partial f_1(X)}{\partial w_{mn}} \\[2ex]
\end{bmatrix} \\
&= \begin{bmatrix}
 \\[-6pt]
x_1 & x_2 & \cdots & x_n \\[3ex]
0 & 0 & \cdots & 0 \\[1ex]
\vdots & \vdots & \ddots & \vdots \\[1ex]
0 & 0 & \cdots & 0 \\[1ex]
\end{bmatrix} 
\end{aligned}
$$

このような結果になるのは、$${f_1(W)}$$に関連するのが行列$${W}$$の1行目の成分だけだからです。同じことを$${\bm{f}(W)}$$の2行目$${f_2(W)}$$だけを入力行列$${W}$$の各要素$${w_{ij}}$$で偏微分すると以下になります。

$$
\begin{aligned}
\frac{\partial (W \bm{x})_2}{\partial W} = \frac{\partial f_2(W)}{\partial W}
&= \begin{bmatrix}
 \\[-6pt]
\dfrac{\partial f_2(X)}{\partial w_{11}} & \dfrac{\partial f_2(X)}{\partial w_{12}}
  & \cdots & \dfrac{\partial f_2(X)}{\partial w_{1n}} \\[3ex]
\dfrac{\partial f_2(X)}{\partial w_{21}} & \dfrac{\partial f_2(X)}{\partial w_{22}}
  & \cdots & \dfrac{\partial f_2(X)}{\partial w_{2n}} \\
\vdots & \vdots & \ddots & \vdots \\[1ex]
\dfrac{\partial f_2(X)}{\partial w_{m1}} & \dfrac{\partial f_2(X)}{\partial w_{m2}}
  & \cdots & \dfrac{\partial f_2(X)}{\partial w_{mn}} \\[2ex]
\end{bmatrix} \\
&= \begin{bmatrix}
 \\[-6pt]
0 & 0 & \cdots & 0 \\[1ex]
x_1 & x_2 & \cdots & x_n \\[3ex]
0 & 0 & \cdots & 0 \\[1ex]
\vdots & \vdots & \ddots & \vdots \\[1ex]
0 & 0 & \cdots & 0 \\[1ex]
\end{bmatrix} 
\end{aligned}
$$

つまり、$${\bm{f}(W)}$$のどの行を$${W}$$で微分しても、出てくるのは同じ$${\bm{x}^\top}$$をどこかの行に1回だけ含んであとの行は全て0の行列です。なお、$${^\top}$$は転置を意味します。

$$
\bm{x}^\top = \begin{bmatrix}
x_1 \\
x_2 \\
\vdots \\
x_n
\end{bmatrix}^\top = \begin{bmatrix}
x_1 & x_2 & \cdots & x_n
\end{bmatrix}
$$

機械学習では、このような場合は3次元のテンソルとしてではなく、単に$${\bm{x}^\top}$$として扱うことが多いです。

$$
\frac{\partial (W \bm{x})}{\partial W} = \bm{x}^\top
$$

$${\bm{x}^\top}$$のみを用いることで十分に勾配の情報を得ることができるのは、重み$${w_{ij}}$$に関する偏微分の結果が対応する$${j}$$番目の入力要素$${x_j}$$になるからです。これは、重み行列のどの行$${i}$$がどこであっても同じです。

なお、この簡略化は計算効率を高める役割も果たします。

関連記事

ここから先は

0字

キカベン・読み放題

¥1,000 / 月
このメンバーシップの詳細

この記事が気に入ったらチップで応援してみませんか?