本文並非是作為工具書來查詢各種各樣的向量矩陣與張量之間的求導公式,而是試圖從最簡單的層面來對這些求導公式的推導過程進行介紹。

1、將導數表達式簡化為最簡單的形式

涉及向量與矩陣之間的求導的運算難點往往在於你要一次性的完成多項任務。這些任務包括並行的對對應元素進行求導,考慮表達式中的求和符號以及連乘符號,考慮鏈式法則。將一個看起來很棘手的求導問題分解為最簡單的形式有助於我們仔細理解計算的整個過程。

1.1 考慮單個分量的導數並對求和符號展開

當拿到一個複雜的矩陣求導問題時,首先考慮其每個標量元素對其他標量元素的導數值往往能夠簡化問題。當將一個複雜的問題轉化到最簡單的標量間的求導問題時,我們能夠對矩陣間的求和、微分

等數學運算進行簡化。

例如我們考慮這樣的一個問題:假設我們有一個維數為 C×D 的矩陣 W ,一個長度為 D 的列向量 mathbf{x}=[x_1,x_2,cdots,x_D]^T ,一個長度為 C 的列向量 mathbf{y}=[y_1,y_2,cdots,y_C]^T ,滿足如下的關係,

egin{equation*} mathbf{y} = Wmathbf{x}. end{equation*}

我們要求向量 mathbf{y} 對向量 mathbf{x} 的導數。該求導運算的結果是由 mathbf{x} 的每個分量對 mathbf{y} 的每個分量組合而成,因此求導後會得到一個規模為 C×D 的矩陣。我們考慮導數的一個分量 frac{partial y_3}{partial{x_7}} 的計算,其為一個標量對另一個標量的求導運算。我們只需要找到 y_3x_7 的關係,然後按照最普通的求導法則進行計算即可。事實上,我們注意到:

egin{equation*} y_3 = sum_{j=1}^D W_{3,j}x_j end{equation*}\

通過這一轉化,我么便將原始的矩陣表達式轉換為普通的標量表達式。

1.2 去掉求和符號

儘管從上面的表達式中直接計算導數並不困難,但是當求和符號$sum$和連乘符號$prod$裡面的內容較為複雜時,將其展開將會有助於我們的計算。於是我們可以將連乘符號展開以確保我們的每步計算都精確無誤,從而可以得到:

egin{equation} y_3 = W_{3,1}x_1+W_{3,2}x_2 + cdots +W_{3,7}x_7 +cdots+ W_{3,D}x_D. end{equation}

這一公式就是最簡單的線性等式,於是我們有:

egin{align*} frac{partial y_3}{partial x_7} &= frac{partial}{partial x_7}[W_{3,1}x_1+W_{3,2}x_2 + cdots +W_{3,7}x_7 +cdots+ W_{3,D}x_D]\ &= W_{3,7}. end{align*}

通過關注 mathbf{x}mathbf{y} 的單個分量之間的關係,我們能將求導的計算過程化簡為最簡單的導數計算問題,當我們在計算複雜的導數時,通過這一方法可以幫助我們理清思路。

1.3 補全計算結果

我們最初的目的是為了計算向量 mathbf{y} 對向量 mathbf{x} 的導數,通過上面的分析我們注意到,其計算結果是一個維數為 C×D 的矩陣,該矩陣具有如下的形式:

egin{equation*} left[ egin{matrix} frac{partial y_1}{partial x_1} & frac{partial y_1}{partial x_2} & frac{partial y_1}{partial x_3} & cdots & frac{partial y_1}{partial x_D}\ frac{partial y_2}{partial x_1} & frac{partial y_2}{partial x_2} & frac{partial y_2}{partial x_3} & cdots & frac{partial y_2}{partial x_D}\ vdots & vdots & vdots & ddots & vdots\ frac{partial y_C}{partial x_1} & frac{partial y_C}{partial x_2} & frac{partial y_C}{partial x_3} & cdots & frac{partial y_C}{partial x_D}\ end{matrix} 
ight] end{equation*}

在我們的這個例子中,這一矩陣被稱為 	extit{Jacobian matrix} .我們對每個分量執行上面一小節的對應過程可以得到如下的關係:

egin{equation} frac{partial{y_i}}{partial{x_j}} = W_{i,j}. end{equation}

這意味著,導數計算結果所對應的矩陣為:

egin{equation*} frac{d mathbf{y}}{dmathbf{x}} = left[ egin{matrix} frac{partial y_1}{partial x_1} & frac{partial y_1}{partial x_2} & frac{partial y_1}{partial x_3} & cdots & frac{partial y_1}{partial x_D}\ frac{partial y_2}{partial x_1} & frac{partial y_2}{partial x_2} & frac{partial y_2}{partial x_3} & cdots & frac{partial y_2}{partial x_D}\ vdots & vdots & vdots & ddots & vdots\ frac{partial y_C}{partial x_1} & frac{partial y_C}{partial x_2} & frac{partial y_C}{partial x_3} & cdots & frac{partial y_C}{partial x_D}\ end{matrix} 
ight] =  left[ egin{matrix} W_{1,1} & W_{1,2} & W_{1,3} & cdots & W_{1,D}\ W_{2,1} & W_{2,2} & W_{2,3} & cdots & W_{2,D}\ vdots & vdots & vdots & ddots & vdots\ W_{C,1} & W_{C,2} & W_{C,3} & cdots & W_{C,D}\ end{matrix} 
ight]. end{equation*}\

也就是說,經過這些詳細的計算過程,我們可以得到對於 mathbf{y} = Wmathbf{x} ,我們有:

egin{equation*} frac{d mathbf{y}}{dmathbf{x}} =  W. end{equation*}

1.4 行向量間的求導

行向量對行向量的求導過程與上面的分析過程沒有本質的區別,我們考慮, mathbf{y} = mathbf{x}W. 其中, mathbf{y} = [y_1,y_2,cdots,y_C] 是長度為 C 的行向量, mathbf{x}=[x_1,x_2,cdots,x_D] 是長度為 D 的行向量, W 的維數為 D×C. 同樣,我們有,

egin{equation*} y_3 = sum_{j=1}^{D}x_jW_{j,3}. end{equation*}

於是,

egin{equation*} frac{partial{y_3}}{partial{x_7}}=W_{7,3}. end{equation*}

從而,

egin{equation*} frac{d{mathbf{y}}}{dmathbf{x}} = W. end{equation*}

1.5 處理更高的維度

我們同樣考慮, mathbf{y} = mathbf{x}W. 其中, mathbf{y} = [y_1,y_2,cdots,y_C] 是長度為 C 的行向量, mathbf{x}=[x_1,x_2,cdots,x_D] 是長度為 D 的行向量, W 的維數為 D×C .在這一小節,我么考慮行向量 y 對矩陣 W 的求導表達式:

egin{equation*} frac{dmathbf{y}}{dW}. end{equation*}

在這種情形下, mathbf{y} 沿著一個坐標軸變化, W 沿著兩個坐標軸變化,因此很自然的會想到其導數計算結果應該是一個三維張量,事實上,經過之後的推導我們可以發現這一求導結果完全可以用二維的矩陣進行表示。

我們還是首先從向量 mathbf{y} 的一個分量對矩陣進行求導開始進行推導,事實上,我們有:

egin{equation*} y_j = x_1W_{1,j}+x_2W_{2,j}+cdots+x_DW_{D,j}. end{equation*}

於是我們可以看出:

egin{equation*} frac{partial{y_j}}{partial W_{i.j}} = x_i, end{equation*}

y_{j} 對矩陣中其他元素的偏導數為0.於是我們可以將求導結果定義為新的二維矩陣:

egin{equation*} frac{dmathbf{y}}{dW}= left[ egin{matrix} frac{partial y_1}{partial W_{1,1}} & frac{partial y_1}{partial W_{2,1}} & frac{partial y_1}{partial W_{3,1}} & cdots & frac{partial y_1}{partial W_{D,1}}\ frac{partial y_2}{partial W_{1,2}} & frac{partial y_2}{partial W_{2,2}} & frac{partial y_2}{partial W_{3,2}} & cdots & frac{partial y_2}{partial W_{D,2}}\ vdots & vdots & vdots & ddots & vdots\ frac{partial y_C}{partial W_{1,C}} & frac{partial y_C}{partial W_{2,C}} & frac{partial y_C}{partial W_{3,C}} & cdots & frac{partial y_C}{partial W_{D,C}} end{matrix} 
ight] =  left[ egin{matrix} x_1 & x_2 & x_3 & cdots & x_D\ x_1 & x_2 & x_3 & cdots & x_D\ vdots & vdots & vdots & ddots & vdots\ x_1 & x_2 & x_3 & cdots & x_D end{matrix} 
ight]. end{equation*}

可以看出行向量對矩陣的求導結果同樣可以用一個矩陣來表示,這種表示方法在實現神經網路時非常有用。

1.6 矩陣對矩陣求導(多個數據點)

我們考慮將多個數據點進行疊加從而得到如下的關係式:

egin{equation*} Y=XW. end{equation*}

其中 X 的維度是 N×D , W 的維度是 D×C , Y 的維度是 N×C ,並且矩陣 Y 的每行是由矩陣 X 的對應行的元素經過線性變換得到的。同樣考慮其中的分量我們可以得到:

egin{equation*} Y_{i,j}=sum_{k=1}^{D}X_{i,k}W_{k,j}. end{equation*}

從這一表達式中我們可以看出對於偏微分

egin{equation*} frac{partial Y_{a,b}}{partial X_{c,d}}, end{equation*}

a
eq c 時值均為0.這也就是說,既然 Y 的當前行是由 X 的對應行算出來的,那麼當求導時行數不一致時其導數值均為0.於是我們可以得到

egin{equation*} frac{partial Y_{i,j}}{partial X_{i,k}} = W_{k,j} end{equation*}

從而我們有:

egin{equation*} frac{partial Y_{i,:}}{partial X_{i,:}} = W. end{equation*}

這一結果是上一小節結果的自然推廣。

1.7 將鏈式法則考慮進去

在這裡我們考慮兩個列向量 mathbf{x,y} 之間的線性變換,其關係如下所示:

egin{equation} mathbf{y} = VWmathbf{x}, end{equation}

我們想要計算向量 mathbf{y} 對向量 mathbf{x} 的導數值。我們可以簡單的觀察到矩陣 V 與矩陣 W 的乘積依然是一個矩陣,因此借用上面的結論我們立馬能得到求導結果:

egin{equation} frac{partial{mathbf{y}}}{partialmathbf{x}} = VW=U. end{equation}

在這裡為了對鏈式法則進行應用我們採取一種更為複雜的方式進行求導運算,我們先定義中間變數 mathbf{m} = Wmathbf{x}, 其中 mathbf{m} 具有 M 個分量,於是我們有 mathbf{y} = Vmathbf{m} ,根據鏈式法則我們可以得到:

egin{equation} frac{dmathbf{y}}{dmathbf{x}}=frac{dmathbf{y}}{dmathbf{m}}frac{dmathbf{m}}{dmathbf{x}} end{equation}

我們考慮單個分量之間的標量求導,可以寫為

egin{equation} frac{d{y_i}}{d{x_j}} = frac{d{y_i}}{dmathbf{m}}frac{dmathbf{m}}{d{x_j}}=sum_{k=1}^{M}frac{d{y_i}}{d{m_k}}frac{d{m_k}}{d{x_j}}=sum_{k=1}^{M}V_{i,k}W{k,j} end{equation}

將上述分量合併為矩陣便可得到同樣的求導結果 VW 。當涉及到利用鏈式法則進行求導運算時,我們可以採取類似的方法首相將各個中間變數找出來,然後考慮單個分量之間的求導計算,最後將涉及到的相關中間結果進行相加即可。

參考資料:

Syllabus | CS 231N?

cs231n.stanford.edu

http://cs231n.stanford.edu/vecDerivs.pdf?

cs231n.stanford.edu


推薦閱讀:
相关文章