微分の一般化:勾配行列と行列微分
📂多変数ベクトル解析微分の一般化:勾配行列と行列微分
定義
スカラー関数 f:Rn×n→Rと行列 X=[xij]∈Rn×nに対して、勾配行列 ∇Xfは次のように定義される。
[∇Xf]ij=∂xij∂f(i,j=1,…,n)
∇Xf=∂X∂f=∂x11∂f⋮∂xn1∂f⋯⋱⋯∂x1n∂f⋮∂xnn∂f
説明
行列というのがベクトルの形を変えたものであると考えると、勾配から自然に一般化可能だ。そもそも勾配というのも、ベクトル全体で微分するのではなく、ベクトルの各成分ごとに微分したものを再びベクトルにしたに過ぎない。ならば行列で微分するという概念も本当は行列で微分するのではなく、行列の各成分で微分したものを再び行列にすることにすぎない。本質的には多変数関数の微分と変わらないことを覚えておこう。もちろん敢えて言うならこれは行列"で"微分することが正しく、行列"を"微分することはこれとはまた違うので注意しよう。**行列"を"**微分するというのは行列関数を微分することを意味する。
機械学習、ディープラーニングを含めたデータを扱う分野では、ベクトルと行列計算、そしてこれらの微分値計算が頻繁に登場するため、使用される表記法と考えても良い。演算子 ∇X=∂X∂を行列勾配、計算された行列 ∇Xfを勾配行列と呼ぶのが適当だろう。
関連項目
一般化
上の説明をよく考えてみれば、結局本質的に微分される値と微分する変数が定数か多変数かの話であるため、行列に限定する必要はない。以下の表のように様々な場合について定義できる。
変数 \ 値 | スカラー y | ベクトル y | 行列 Y |
---|
スカラー | ∂x∂y | ∂x∂y | ∂x∂Y |
ベクトル | ∂x∂y | ∂x∂y | |
行列 | ∂X∂y | | |
そうは言っても実際には新しい概念ではなく、既存のものを見やすく一つの表記法で統一したものである。
ここでヤコビアンや連鎖律を考えると、関数値 yは列ベクトル、変数 xは行ベクトルとして扱うのが自然だ。
y=y1y2⋮ym,x=[x1x2⋯xn]
だから∂x∂yは行ベクトルで、∂x∂yは列ベクトルだ。∂x∂yがスカラーなので、以下のように自然に連鎖律の表現が可能だ。物理学の教科書で勾配が行ベクトルとして表記されるのがこの理由からである。y=y(x)、x=x(t)とすると、
∂t∂y=∂x∂ydtdx=[∂x1∂y⋯∂xn∂y]dtdx1⋮dtdxn=i=1∑n∂xi∂ydtdxi
表記法を統一したからと言ってそれが勾配なのかベクトル値関数の微分なのか混乱しやすい。このような時には∂x∂自体をスカラー、∂x∂自体をベクトル、∂X∂自体を行列と考え、上記の微分が行列のクロネッカー積 ⊗で繋がれていると見ると計算が容易だ。詳細は以下を参照しよう。
スカラーを
スカラーで微分
スカラーをスカラーで微分する場合は普通の微分と同じだ。
∂x∂y=h→0limhy(x+h)−y(x)
クロネッカー積で表現すると、
∂x∂y=∂x∂⊗y=∂x∂y
ベクトルで微分
これは普通の勾配と同じだ。値がスカラーで、変数が行ベクトルであるため、自然と勾配も行ベクトルになると考えられる。
∂x∂y=∇xy=[∂x1∂y⋯∂xn∂y]
クロネッカー積で表現すると、
∂x∂y=∂x∂⊗y=[∂x1∂⋯∂xn∂]⊗[y]=[∂x1∂y⋯∂xn∂y]
ラプラシアン Δy=∇2yは次のようになる。
Δy=∇2y=i=1∑n∂xi2∂2y=(∂x∂y)(∂x∂y)T=Tr((∂x∂y)T(∂x∂y))
(∂x∂y)T(∂x∂y)はヘシアンとなる。
H(y)=(∂x∂y)T(∂x∂y)=∂x12∂2y⋮∂xn∂x1∂2y⋯⋱⋯∂x1∂xn∂2y⋮∂xn2∂2y
行列で微分
上で定義した行列勾配である。
∇Xy=∂X∂y=∂x11∂y⋮∂xm1∂y⋯⋱⋯∂x1n∂y⋮∂xmn∂y
クロネッカー積で表現すると、
∂X∂y=∂X∂⊗y=∂x11∂⋮∂xm1∂⋯⋱⋯∂x1n∂⋮∂xmn∂⊗[y]=∂x11∂y⋮∂xm1∂y⋯⋱⋯∂x1n∂y⋮∂xmn∂y
ベクトルを
スカラーで微分
一般的なベクトル値関数の微分と同じだ。
∂x∂y=y′(x)=h→0limhy(x+h)−y(x)
関数値 yが列ベクトルで、変数 xがスカラーであるため、計算結果は列ベクトルになる。クロネッカー積で表現すると、
∂x∂y=∂x∂⊗y=[∂x∂]⊗y1⋮ym=∂x∂y1⋮∂x∂ym
ベクトルで微分
ベクトルをベクトルで微分する場合はヤコビアンと同じだ。ヤコビアンの定義を見てみると、
∂x∂y=∂(x1,x2,…,xn)∂(y1,y2,…,ym)=∂x1∂y1⋮∂x1∂ym⋯⋱⋯∂xn∂y1⋮∂xn∂ym
これはクロネッカー積で表現した結果と同じである。
∂x∂y=∂x∂⊗y=[∂x1∂⋯∂xn∂]⊗y1⋮ym=∂x1∂y1⋮∂x1∂ym⋯⋱⋯∂xn∂y1⋮∂xn∂ym
行列を
スカラーで微分
これは行列関数の微分と同じだ。クロネッカー積で表現すると、
∂x∂Y=∂x∂⊗Y=[∂x∂]⊗y11y21⋮ym1y12y22⋮ym2⋯⋯⋱⋯y1ny2n⋮ymn=∂x∂y11⋮∂x∂ym1⋯⋱⋯∂x∂y1n⋮∂x∂ymn