0.前言
深度學習中最常見的是各種向量還有矩陣運算,經常會涉及到求導操作。因此準確理解向量矩陣的求導操作就顯得非常重要,對我們推導計算過程以及代碼書寫覈對有非常大的幫助。
神經網絡中最常見的操作爲向量,矩陣乘法,在求導的時候經常需要用到鏈式法則,鏈式法則在計算過程中會稍微麻煩,下面我們來詳細推導一下,推導過程全程簡單明瞭,稍微有點數學基礎的同學都能看明白。
1.標量對標量的鏈式求導
假設x, y, z都爲標量(或者說一維向量),鏈式關係爲x -> y -> z。根據高數中的鏈式法則
∂x∂z=∂y∂z⋅∂x∂y
上面的計算過程很簡單,不多解釋。
2.向量對向量鏈式求導
假設x,y,z都爲向量,鏈式關係爲x -> y -> z。如果我們要求∂x∂z,可以直接用鏈接法則求導
∂x∂z=∂y∂z⋅∂x∂y
假設x, y, z的維度分別爲m, n, p,∂x∂z的維度爲p * m,而∂y∂z的維度爲p * n,∂x∂y的維度爲n * m,p * n與n * m的維度剛好爲p * m,與左邊相同。
3.標量對多向量的鏈式求導
在深度學習中,一般我們的損失函數爲一個標量函數,比如MSE或者Cross Entropy,因此最後求導的目標函數爲標量。
假設我們最終優化的目標爲z是個標量,x,y分爲是m,n維向量,依賴關係爲x->y->z。現在需要求的是∂x∂z,維度爲m * 1。
易知有∂y∂z爲n * 1, ∂x∂y爲n * m,則(∂x∂y)T⋅∂y∂z的維度爲m * 1,與左邊能對上。
因此有
∂x∂z=(∂x∂y)T⋅∂y∂z
擴展到多個向量
y1 -> y2 -> y3 -> …-> yn -> z
∂y1∂z=(∂yn−1∂yn⋅∂yn−2∂yn−1⋯∂y1∂y2)T⋅∂yn∂z
以常見的最小二乘求導爲例:
C=(Xθ−y)T(Xθ−y)
損失函數C是個標量,假設X爲m*n的矩陣,θ爲n∗1的向量,我們要求C對θ的導數,令z=Xθ−y,C=zTz,由上面的連式關係
∂θ∂C=(∂θ∂z)T⋅∂z∂C=2XT(Xθ−y)
覈對一下維度
∂θ∂C是n * 1, XT是n * m,Xθ−y是m * 1, XT(Xθ−y)是n * 1,能與左邊對上。
其中
∂θ∂(Xθ−y)=X
∂z∂(zTz)=2z
Xθ−y爲m * 1, θ爲n * 1, X的維度剛好爲m * n。
zTz是個標量,對z求導結果爲2z,與z的維度一致。
所以最小二乘最優解的矩陣表達式爲
2XT(Xθ−y)=0
θ=(XTX)−1XTy
4.標量對多矩陣鏈式求導
神經網絡中,最常見的計算方式是Y=WX+b,其中W爲權值矩陣。
看個更爲常規的描述:
假設z=f(Y),Y=AX+B,其中A爲m * k矩陣,X爲k * 1向量,B爲m * 1向量,那麼Y也爲m * 1向量,z爲一個標量
如果要求∂X∂z,結果爲k * 1的維度。∂Y∂z的維度爲m * 1, A的維度爲m * k
∂X∂z=AT⋅∂Y∂z
左邊的維度爲k * 1,右邊的維度爲k * m 與m * 1相乘,也是k * 1,剛好能對上。
當X爲矩陣時,按同樣的方式進行推導可以得到一樣的結論。
如果要求∂A∂z,結果爲m * k矩陣。∂Y∂z的維度爲m * 1, X的維度爲k * 1,
∂A∂z=∂Y∂z⋅XT
當X爲矩陣時,按同樣的方式進行推導可以得到一樣的結論。
5.總結
一句話總結就是:標量對向量或者矩陣進行鏈式求導的時候,按照維度將結果對其就特別容易推導。