logo

微分の一般化:勾配行列と行列微分 📂多変数ベクトル解析

微分の一般化:勾配行列と行列微分

定義

スカラー関数 f:Rn×nRf : \mathbb{R}^{n \times n} \to \mathbb{R}行列 X=[xij]Rn×n\mathbf{X} = [x_{ij}] \in \mathbb{R}^{n \times n}に対して、勾配行列 Xf\nabla_{\mathbf{X}} fは次のように定義される。

[Xf]ij=fxij(i,j=1,,n) [\nabla_{\mathbf{X}} f]_{ij} = \dfrac{\partial f}{\partial x_{ij}} \quad (i,j=1,\dots,n)

Xf=fX=[fx11fx1nfxn1fxnn] \nabla_{\mathbf{X}} f = \dfrac{\partial f}{\partial \mathbf{X}} = \begin{bmatrix} \dfrac{\partial f}{\partial x_{11}} & \cdots & \dfrac{\partial f}{\partial x_{1n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial f}{\partial x_{n1}} & \cdots & \dfrac{\partial f}{\partial x_{nn}} \end{bmatrix}

説明

行列というのがベクトルの形を変えたものであると考えると、勾配から自然に一般化可能だ。そもそも勾配というのも、ベクトル全体で微分するのではなく、ベクトルの各成分ごとに微分したものを再びベクトルにしたに過ぎない。ならば行列で微分するという概念も本当は行列で微分するのではなく、行列の各成分で微分したものを再び行列にすることにすぎない。本質的には多変数関数の微分と変わらないことを覚えておこう。もちろん敢えて言うならこれは行列"で"微分することが正しく、行列"を"微分することはこれとはまた違うので注意しよう。**行列"を"**微分するというのは行列関数を微分することを意味する。

機械学習、ディープラーニングを含めたデータを扱う分野では、ベクトルと行列計算、そしてこれらの微分値計算が頻繁に登場するため、使用される表記法と考えても良い。演算子 X=X\nabla_{\mathbf{X}} = \dfrac{\partial}{\partial \mathbf{X}}を行列勾配、計算された行列 Xf\nabla_{\mathbf{X}}fを勾配行列と呼ぶのが適当だろう。

関連項目

一般化

上の説明をよく考えてみれば、結局本質的に微分される値と微分する変数が定数か多変数かの話であるため、行列に限定する必要はない。以下の表のように様々な場合について定義できる。

変数 \ 値スカラー yyベクトル y\mathbf{y}行列 Y\mathbf{Y}
スカラーyx\dfrac{\partial y}{\partial x}yx\dfrac{\partial \mathbf{y}}{\partial x}Yx\dfrac{\partial \mathbf{Y}}{\partial x}
ベクトルyx\dfrac{\partial y}{\partial \mathbf{x}}yx\dfrac{\partial \mathbf{y}}{\partial \mathbf{x}}
行列yX\dfrac{\partial y}{\partial \mathbf{X}}

そうは言っても実際には新しい概念ではなく、既存のものを見やすく一つの表記法で統一したものである。

変数 \ 値スカラー yyベクトル y\mathbf{y}行列 Y\mathbf{Y}
スカラー微分勾配行列関数微分
ベクトルベクトル値関数微分ヤコビアン
行列行列勾配

ここでヤコビアン連鎖律を考えると、関数値 y\mathbf{y}列ベクトル、変数 x\mathbf{x}行ベクトルとして扱うのが自然だ。

y=[y1y2ym],x=[x1x2xn] \mathbf{y} = \begin{bmatrix} y_{1} \\ y_{2} \\ \vdots \\ y_{m} \end{bmatrix}, \quad \mathbf{x} = \begin{bmatrix} x_{1} & x_{2} & \cdots & x_{n} \end{bmatrix}

だからyx\dfrac{\partial y}{\partial \mathbf{x}}は行ベクトルで、yx\dfrac{\partial \mathbf{y}}{\partial x}は列ベクトルだ。yx\dfrac{\partial y}{\partial x}がスカラーなので、以下のように自然に連鎖律の表現が可能だ。物理学の教科書で勾配が行ベクトルとして表記されるのがこの理由からである。y=y(x)y = y(\mathbf{x})x=x(t)\mathbf{x} = \mathbf{x}(t)とすると、

yt=yxdxdt=[yx1yxn][dx1dtdxndt]=i=1nyxidxidt \dfrac{\partial y}{\partial t} = \dfrac{\partial y}{\partial \mathbf{x}} \dfrac{d \mathbf{x}}{d t} = \begin{bmatrix} \dfrac{\partial y}{\partial x_{1}} & \cdots & \dfrac{\partial y}{\partial x_{n}} \end{bmatrix} \begin{bmatrix} \dfrac{d x_{1}}{d t} \\ \vdots \\ \dfrac{d x_{n}}{d t} \end{bmatrix} = \sum\limits_{i=1}^{n} \dfrac{\partial y}{\partial x_{i}} \dfrac{d x_{i}}{d t}

表記法を統一したからと言ってそれが勾配なのかベクトル値関数の微分なのか混乱しやすい。このような時にはx\dfrac{\partial }{\partial x}自体をスカラー、x\dfrac{\partial }{\partial \mathbf{x}}自体をベクトル、X\dfrac{\partial }{\partial \mathbf{X}}自体を行列と考え、上記の微分が行列のクロネッカー積 \otimesで繋がれていると見ると計算が容易だ。詳細は以下を参照しよう。

スカラーを

スカラーで微分

スカラーをスカラーで微分する場合は普通の微分と同じだ。

yx=limh0y(x+h)y(x)h \dfrac{\partial y}{\partial x} = \lim\limits_{h \to 0} \dfrac{y(x+h) - y(x)}{h}

クロネッカー積で表現すると、

yx=xy=yx \dfrac{\partial y}{\partial x} = \dfrac{\partial }{\partial x} \otimes y = \dfrac{\partial y}{\partial x}

ベクトルで微分

これは普通の勾配と同じだ。値がスカラーで、変数が行ベクトルであるため、自然と勾配も行ベクトルになると考えられる。

yx=xy=[yx1yxn] \dfrac{\partial y}{\partial \mathbf{x}} = \nabla_{\mathbf{x}} y = \begin{bmatrix} \dfrac{\partial y}{\partial x_{1}} & \cdots & \dfrac{\partial y}{\partial x_{n}} \end{bmatrix}

クロネッカー積で表現すると、

yx=xy=[x1xn][y]=[yx1yxn] \dfrac{\partial y}{\partial \mathbf{x}} = \dfrac{\partial }{\partial \mathbf{x}} \otimes y = \begin{bmatrix} \dfrac{\partial }{\partial x_{1}} & \cdots & \dfrac{\partial }{\partial x_{n}} \end{bmatrix} \otimes \begin{bmatrix} y \end{bmatrix} = \begin{bmatrix} \dfrac{\partial y}{\partial x_{1}} & \cdots & \dfrac{\partial y}{\partial x_{n}} \end{bmatrix}

ラプラシアン Δy=2y\Delta y = \nabla^{2} yは次のようになる。

Δy=2y=i=1n2yxi2=(yx)(yx)T=Tr((yx)T(yx)) \Delta y = \nabla^{2} y = \sum\limits_{i=1}^{n} \dfrac{\partial^{2} y}{\partial x_{i}^{2}} = \left( \dfrac{\partial y}{\partial \mathbf{x}} \right) \left( \dfrac{\partial y}{\partial \mathbf{x}} \right)^{\mathsf{T}} = \Tr \left( \left( \dfrac{\partial y}{\partial \mathbf{x}} \right)^{\mathsf{T}} \left( \dfrac{\partial y}{\partial \mathbf{x}} \right) \right)

(yx)T(yx)\left( \dfrac{\partial y}{\partial \mathbf{x}} \right)^{\mathsf{T}} \left( \dfrac{\partial y}{\partial \mathbf{x}} \right)ヘシアンとなる。

H(y)=(yx)T(yx)=[2yx122yx1xn2yxnx12yxn2] H(y) = \left( \dfrac{\partial y}{\partial \mathbf{x}} \right)^{\mathsf{T}} \left( \dfrac{\partial y}{\partial \mathbf{x}} \right) = \begin{bmatrix} \dfrac{\partial^{2} y}{\partial x_{1}^{2}} & \cdots & \dfrac{\partial^{2} y}{\partial x_{1} \partial x_{n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial^{2} y}{\partial x_{n} \partial x_{1}} & \cdots & \dfrac{\partial^{2} y}{\partial x_{n}^{2}} \end{bmatrix}

行列で微分

上で定義した行列勾配である。

Xy=yX=[yx11yx1nyxm1yxmn] \nabla_{\mathbf{X}} y = \dfrac{\partial y}{\partial \mathbf{X}} = \begin{bmatrix} \dfrac{\partial y}{\partial x_{11}} & \cdots & \dfrac{\partial y}{\partial x_{1n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial y}{\partial x_{m1}} & \cdots & \dfrac{\partial y}{\partial x_{mn}} \end{bmatrix}

クロネッカー積で表現すると、

yX=Xy=[x11x1nxm1xmn][y]=[yx11yx1nyxm1yxmn] \dfrac{\partial y}{\partial \mathbf{X}} = \dfrac{\partial }{\partial \mathbf{X}} \otimes y = \begin{bmatrix} \dfrac{\partial }{\partial x_{11}} & \cdots & \dfrac{\partial }{\partial x_{1n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial }{\partial x_{m1}} & \cdots & \dfrac{\partial }{\partial x_{mn}} \end{bmatrix} \otimes \begin{bmatrix} y \end{bmatrix} = \begin{bmatrix} \dfrac{\partial y}{\partial x_{11}} & \cdots & \dfrac{\partial y}{\partial x_{1n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial y}{\partial x_{m1}} & \cdots & \dfrac{\partial y}{\partial x_{mn}} \end{bmatrix}

ベクトルを

スカラーで微分

一般的なベクトル値関数の微分と同じだ。

yx=y(x)=limh0y(x+h)y(x)h \dfrac{\partial \mathbf{y}}{\partial x} = \mathbf{y}^{\prime}(x) = \lim\limits_{h \to 0} \dfrac{\mathbf{y}(x+h) - \mathbf{y}(x)}{h}

関数値 y\mathbf{y}が列ベクトルで、変数 xxがスカラーであるため、計算結果は列ベクトルになる。クロネッカー積で表現すると、

yx=xy=[x][y1ym]=[y1xymx] \dfrac{\partial \mathbf{y}}{\partial x} = \dfrac{\partial }{\partial x} \otimes \mathbf{y} = \begin{bmatrix} \dfrac{\partial }{\partial x} \end{bmatrix} \otimes \begin{bmatrix} y_{1} \\ \vdots \\ y_{m} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial y_{1}}{\partial x} \\ \vdots \\ \dfrac{\partial y_{m}}{\partial x} \end{bmatrix}

ベクトルで微分

ベクトルをベクトルで微分する場合はヤコビアンと同じだ。ヤコビアンの定義を見てみると、

yx=(y1,y2,,ym)(x1,x2,,xn)=[y1x1y1xnymx1ymxn] \dfrac{\partial \mathbf{y}}{\partial \mathbf{x}} = \dfrac{\partial (y_{1}, y_{2}, \dots, y_{m})}{\partial (x_{1}, x_{2}, \dots, x_{n})} = \begin{bmatrix} \dfrac{\partial y_{1}}{\partial x_{1}} & \cdots & \dfrac{\partial y_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial y_{m}}{\partial x_{1}} & \cdots & \dfrac{\partial y_{m}}{\partial x_{n}} \end{bmatrix}

これはクロネッカー積で表現した結果と同じである。

yx=xy=[x1xn][y1ym]=[y1x1y1xnymx1ymxn] \dfrac{\partial \mathbf{y}}{\partial \mathbf{x}} = \dfrac{\partial }{\partial \mathbf{x}} \otimes \mathbf{y} = \begin{bmatrix} \dfrac{\partial }{\partial x_{1}} & \cdots & \dfrac{\partial }{\partial x_{n}} \end{bmatrix} \otimes \begin{bmatrix} y_{1} \\ \vdots \\ y_{m} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial y_{1}}{\partial x_{1}} & \cdots & \dfrac{\partial y_{1}}{\partial x_{n}} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial y_{m}}{\partial x_{1}} & \cdots & \dfrac{\partial y_{m}}{\partial x_{n}} \end{bmatrix}

行列を

スカラーで微分

これは行列関数の微分と同じだ。クロネッカー積で表現すると、

Yx=xY=[x][y11y12y1ny21y22y2nym1ym2ymn]=[y11xy1nxym1xymnx] \dfrac{\partial \mathbf{Y}}{\partial x} = \dfrac{\partial }{\partial x} \otimes \mathbf{Y} = \begin{bmatrix} \dfrac{\partial }{\partial x} \end{bmatrix} \otimes \begin{bmatrix} y_{11} & y_{12} & \cdots & y_{1n} \\ y_{21} & y_{22} & \cdots & y_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ y_{m1} & y_{m2} & \cdots & y_{mn} \end{bmatrix} = \begin{bmatrix} \dfrac{\partial y_{11}}{\partial x} & \cdots & \dfrac{\partial y_{1n}}{\partial x} \\ \vdots & \ddots & \vdots \\ \dfrac{\partial y_{m1}}{\partial x} & \cdots & \dfrac{\partial y_{mn}}{\partial x} \end{bmatrix}