天天看點

矩陣求導與神經網絡反向傳播矩陣求導神經網絡反向傳播

矩陣求導

關于矩陣求導,其實嚴格意義上來說僅僅隻是一種求導的矩陣表示形式,其本質還是和普通多元函數求導過程是一緻的。将矩陣的各個元素拆分開來,将矩陣運算寫成各個元素之間的運算,矩陣變換可以變成多元函數,這樣矩陣求導過程就可以與多元函數求導過程聯系起來了。要了解矩陣求導運算,最主要的其實是了解矩陣導數的表示,将矩陣導數的拆分形式與多元函數求導聯系起來。

本文主要參考《Matrix cookbook》和wiki上面的内容,下面簡單介紹一下矩陣求導的相關内容,為後面介紹前饋神經網絡FNN的反向傳播過程做鋪墊。

矩陣求導的表示形式之一:值函數對向量/矩陣變量的導數

下面表達式中, y y 表示一個實值函數,xx表示一個向量變量,那麼他們的矩陣求導含義為:

∂y∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂x1∂y∂x2⋯∂y∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ x = [ ∂ y ∂ x 1 ∂ y ∂ x 2 ⋯ ∂ y ∂ x n ]

y y 表示一個實值函數,XX表示一個矩陣變量:

∂y∂X=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂x11∂y∂x21⋯∂y∂xp1∂y∂x12∂y∂x22⋯∂y∂xp2⋯⋯⋯⋯∂y∂x1q∂y∂x2q⋯∂y∂xpq⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ X = [ ∂ y ∂ x 11 ∂ y ∂ x 12 ⋯ ∂ y ∂ x 1 q ∂ y ∂ x 21 ∂ y ∂ x 22 ⋯ ∂ y ∂ x 2 q ⋯ ⋯ ⋯ ⋯ ∂ y ∂ x p 1 ∂ y ∂ x p 2 ⋯ ∂ y ∂ x p q ]

上面給出了矩陣求導的表示形式的具體含義,很容易了解。下面給出幾個例子, a a 是實數,ββ和 x x 是向量, A A 、 B B 和 C C 是與 x x 無關的矩陣:

∂βTx∂x=β ∂ β T x ∂ x = β

∂xTx∂x=x ∂ x T x ∂ x = x

∂xTAx∂x=(A+AT)x ∂ x T A x ∂ x = ( A + A T ) x

如果你能發現這三個式子左邊的分子都是一個數,分母都是一個向量,那麼你應該很容易了解這幾個等式。是在不能了解就自己把左右兩邊的矩陣運算拆分開來,然後使用多元函數求導的過程将左右兩邊分别表示出來就行了。以第一個為例:

βTx=∑i=1nβixi β T x = ∑ i = 1 n β i x i

∂βTx∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂βTx∂x1∂βTx∂x2⋯∂βTx∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂∑ni=1βixi∂x1∂∑ni=1βixi∂x2⋯∂∑ni=1βixi∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢β1β2⋯βn⎤⎦⎥⎥⎥=β ∂ β T x ∂ x = [ ∂ β T x ∂ x 1 ∂ β T x ∂ x 2 ⋯ ∂ β T x ∂ x n ] = [ ∂ ∑ i = 1 n β i x i ∂ x 1 ∂ ∑ i = 1 n β i x i ∂ x 2 ⋯ ∂ ∑ i = 1 n β i x i ∂ x n ] = [ β 1 β 2 ⋯ β n ] = β

這樣就能很清楚的了解矩陣矩陣求導的表示形式的具體含義了。

矩陣求導的表示形式之二:向量函數對值/向量/矩陣變量的導數

下面表達式中, y y 表示一個向量函數, x x 表示一個值變量,那麼他們的矩陣求導含義為:

∂y∂x=⎡⎣⎢⎢⎢⎢⎢⎢∂y1∂x∂y2∂x⋯∂yn∂x⎤⎦⎥⎥⎥⎥⎥⎥∂y∂x=[∂y1∂x∂y2∂x⋯∂yn∂x]

接下來是向量函數 y y 對向量變量 x x 的導數含義為:

∂y∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂x1∂y2∂x2⋯∂ym∂xn∂y1∂x2∂y2∂x2⋯∂ym∂x2⋯⋯⋯⋯∂y1∂xn∂y2∂xn⋯∂ym∂xn⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ x = [ ∂ y 1 ∂ x 1 ∂ y 1 ∂ x 2 ⋯ ∂ y 1 ∂ x n ∂ y 2 ∂ x 2 ∂ y 2 ∂ x 2 ⋯ ∂ y 2 ∂ x n ⋯ ⋯ ⋯ ⋯ ∂ y m ∂ x n ∂ y m ∂ x 2 ⋯ ∂ y m ∂ x n ]

以一個最為簡單的例子為例:

y=Wx y = W x

那麼:

∂y∂x=W ∂ y ∂ x = W

最後向量函數 y y 對矩陣變量 W W 的導數是一個張量,具體形狀為:

∂y∂W=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y1∂W11∂y1∂W21⋯∂y1∂Wm1∂y1∂W12∂y1∂W22⋯∂y1∂Wm2⋯⋯⋯⋯∂y1∂W2n∂y1∂W2n⋯∂y1∂Wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y2∂W11∂y2∂W21⋯∂y2∂Wm1∂y2∂W12∂y2∂W22⋯∂y2∂Wm2⋯⋯⋯⋯∂y2∂W2n∂y2∂W2n⋯∂y2∂Wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥⋯⎡⎣⎢⎢⎢⎢⎢⎢⎢∂yk∂W11∂yk∂W21⋯∂yk∂Wm1∂yk∂W12∂yk∂W22⋯∂yk∂Wm2⋯⋯⋯⋯∂yk∂W2n∂yk∂W2n⋯∂yk∂Wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ W = [ ∂ y 1 ∂ W 11 ∂ y 1 ∂ W 12 ⋯ ∂ y 1 ∂ W 2 n ∂ y 1 ∂ W 21 ∂ y 1 ∂ W 22 ⋯ ∂ y 1 ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y 1 ∂ W m 1 ∂ y 1 ∂ W m 2 ⋯ ∂ y 1 ∂ W m n ] [ ∂ y 2 ∂ W 11 ∂ y 2 ∂ W 12 ⋯ ∂ y 2 ∂ W 2 n ∂ y 2 ∂ W 21 ∂ y 2 ∂ W 22 ⋯ ∂ y 2 ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y 2 ∂ W m 1 ∂ y 2 ∂ W m 2 ⋯ ∂ y 2 ∂ W m n ] ⋯ [ ∂ y k ∂ W 11 ∂ y k ∂ W 12 ⋯ ∂ y k ∂ W 2 n ∂ y k ∂ W 21 ∂ y k ∂ W 22 ⋯ ∂ y k ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y k ∂ W m 1 ∂ y k ∂ W m 2 ⋯ ∂ y k ∂ W m n ]

同樣舉出一個例子說明這個形式的含義: l=f(y) l = f ( y ) 其中, y y 為 m m 維向量,然後y=Wxy=Wx, W W 為 m∗n m ∗ n 的矩陣, x x 為 n n 維向量。然後∂l∂y∂l∂y為 m m 維向量,∂y∂W∂y∂W為 m∗m∗n m ∗ m ∗ n 維張量,最後根據鍊式法則有 ∂l∂W=∂l∂y∂y∂W ∂ l ∂ W = ∂ l ∂ y ∂ y ∂ W ,很顯然最後的結果 ∂l∂W ∂ l ∂ W 應該是一個 m∗n m ∗ n 為的矩陣,而等式另外邊為 m m 維向量乘上m∗m∗nm∗m∗n維張量,其結果為 m∗n m ∗ n 維矩陣。将這個過程拆開來看:

∂y∂W=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y∂W11∂y∂W21⋯∂y∂Wm1∂y∂W12∂y∂W22⋯∂y∂Wm2⋯⋯⋯⋯∂y∂W1n∂y∂W2n⋯∂y∂Wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢⎢∑mi=1∂l∂y1∂y1∂W11∑mi=1∂l∂y1∂y1∂W21⋯∑mi=1∂l∂y1∂y1∂Wm1∑mi=1∂l∂y1∂y1∂W12∑mi=1∂l∂y1∂y1∂W22⋯∑mi=1∂l∂y1∂y1∂Wm2⋯⋯⋯⋯∑mi=1∂l∂y1∂y1∂W1n∑mi=1∂l∂y1∂y1∂W2n⋯∑mi=1∂l∂y1∂y1∂Wmn⎤⎦⎥⎥⎥⎥⎥⎥⎥ ∂ y ∂ W = [ ∂ y ∂ W 11 ∂ y ∂ W 12 ⋯ ∂ y ∂ W 1 n ∂ y ∂ W 21 ∂ y ∂ W 22 ⋯ ∂ y ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∂ y ∂ W m 1 ∂ y ∂ W m 2 ⋯ ∂ y ∂ W m n ] = [ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 11 ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 12 ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 1 n ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 21 ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 22 ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W 2 n ⋯ ⋯ ⋯ ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W m 1 ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W m 2 ⋯ ∑ i = 1 m ∂ l ∂ y 1 ∂ y 1 ∂ W m n ]

矩陣求導的表示形式之三:矩陣函數對值/向量/矩陣變量的導數

首先矩陣函數 Y Y 對值變量 x x 的導數含義為:

∂Y∂x=⎡⎣⎢⎢⎢⎢⎢⎢⎢∂y11∂x∂y21∂x⋯∂yp1∂x∂y12∂x∂y22∂x⋯∂yp2∂x⋯⋯⋯⋯∂y1q∂x∂y2q∂x⋯∂ypq∂x⎤⎦⎥⎥⎥⎥⎥⎥⎥∂Y∂x=[∂y11∂x∂y12∂x⋯∂y1q∂x∂y21∂x∂y22∂x⋯∂y2q∂x⋯⋯⋯⋯∂yp1∂x∂yp2∂x⋯∂ypq∂x]

這個也很容易了解,然後矩陣函數對向量變量的導數是形式上是一個張量,矩陣函數對矩陣變量的導數是一個四階張量。

這些導數的形式很少用到,但實際上本質還是一樣的:矩陣求導本質上是多元函數求導的矩陣表示形式,其函數由矩陣運算定義,其導數形式是為了同樣滿足矩陣運算而定義的。還是那句話,如果不了解矩陣求導過程,直接把矩陣運算轉化成基本的多元函數運算,用多元函數求導方法寫出其形式就很容易了解了。

當然,上面幾個僅僅是非常簡單的矩陣求導,更複雜的涉及到求迹(對角線上元素的和) tr(A) t r ( A ) 、行列式 det(A) d e t ( A ) 等就需要去參照《Matrix Cookbook》中的内容自行了解了。了解到上面的内容已經足夠讓我們來了解神經網絡的反向傳播了。

神經網絡反向傳播

講到神經網絡的反向傳播首先不得不提一下求導的鍊式法則:實際上神經網絡本質上可以說是一堆向量操作加上激活函數,也可以說是一堆線性函數操作加上激活函數,整個過程最終都可以展開成一個無比大的函數。為了比較好表述神經網絡的每一層的正向計算以及反向傳播,才表述為矩陣計算與鍊式法則計算梯度,其本質還是非常簡單的多元函數求導。

鍊式法則

鍊式法則是多元函數求導基本,通常意義上的鍊式法則表述如下:

z=f(x,y)x=g(u,v)y=h(u,v) z = f ( x , y ) x = g ( u , v ) y = h ( u , v )

那麼就有:

∂z∂u=∂z∂x∂x∂u+∂z∂y∂y∂u∂z∂v=∂z∂x∂x∂v+∂z∂y∂y∂v ∂ z ∂ u = ∂ z ∂ x ∂ x ∂ u + ∂ z ∂ y ∂ y ∂ u ∂ z ∂ v = ∂ z ∂ x ∂ x ∂ v + ∂ z ∂ y ∂ y ∂ v

這個看起來是不是很簡單,了解偏導和梯度的含義就應該很容易了解這個過程。那麼接下來,重頭戲來了:上面過程中 y y 可以是xx的函數,甚至可以是 x x 。來我們先舉一個簡單的例子來看:

z=xxx=u+vz=xxx=u+v

對于這樣一個例子,我們先把上面式子中指數項的 x x 記做yy,那麼上面的式子就轉化為:

z=xyx=u+vy=u+v z = x y x = u + v y = u + v

接下來我們來根據鍊式法則來求導:

∂z∂u=∂z∂x∂x∂u+∂z∂y∂y∂u=yxy−1∂x∂u+xyln(x)∂y∂u=(u+v)u+v+(u+v)u+vln(u+v) ∂ z ∂ u = ∂ z ∂ x ∂ x ∂ u + ∂ z ∂ y ∂ y ∂ u = y x y − 1 ∂ x ∂ u + x y l n ( x ) ∂ y ∂ u = ( u + v ) u + v + ( u + v ) u + v l n ( u + v )

∂z∂v=∂z∂x∂x∂v+∂z∂y∂y∂v=yxy−1∂x∂v+xyln(x)∂y∂v=(u+v)u+v+(u+v)u+vln(u+v) ∂ z ∂ v = ∂ z ∂ x ∂ x ∂ v + ∂ z ∂ y ∂ y ∂ v = y x y − 1 ∂ x ∂ v + x y l n ( x ) ∂ y ∂ v = ( u + v ) u + v + ( u + v ) u + v l n ( u + v )

額,是不是很神奇: dxxdx=xx+xxln(x) d x x d x = x x + x x l n ( x ) 這個式子也可以通過将兩個 x x 看做不同的xx分别求偏導然後求全微分而得到其導數,當且僅當原函數可微時才能這樣做。

好吧,上面這些内容其實是一些題外話,我們真正需要了解的是:在矩陣操作中,我們可以把例如 y=Wx+b y = W x + b 這樣的矩陣操作看做是多元函數

全連接配接層的反向傳播

一層全連接配接層的神經網絡的本質是一個 output=f(input) o u t p u t = f ( i n p u t ) 的多元函數,例如一般來說一層全連接配接以 x x 表示輸入向量, y y 表示輸出向量,那麼一層全連接配接神經網絡可數學表示為:

y=σ(Wx+b) y = σ ( W x + b )

其中 W W 和 b b 是參數,前者是映射矩陣,後者是偏置向量, σ σ 表示激活函數,這是一個數值函數,也就是對矩陣/向量中的每一個值做這樣一個函數映射,常用的激活函數有如下幾種:

sigmoid激活函數: y=11+e−x y = 1 1 + e − x

sigmoid激活函數的導數:

y′=(11+e−x)′=e−x(1+e−x)2=1+e−x−1(1+e−x)2=11+e−x(1−11+e−x)=y(1−y) y ′ = ( 1 1 + e − x ) ′ = e − x ( 1 + e − x ) 2 = 1 + e − x − 1 ( 1 + e − x ) 2 = 1 1 + e − x ( 1 − 1 1 + e − x ) = y ( 1 − y )

tanh激活函數: y=ex−e−xex+e−x y = e x − e − x e x + e − x

tanh激活函數的導數:

y′=(ex−e−xex+e−x)′=(ex+e−x)2−(ex−e−x)2(ex+e−x)2=1−(ex−e−x)2(ex+e−x)2=1−y2 y ′ = ( e x − e − x e x + e − x ) ′ = ( e x + e − x ) 2 − ( e x − e − x ) 2 ( e x + e − x ) 2 = 1 − ( e x − e − x ) 2 ( e x + e − x ) 2 = 1 − y 2

relu激活函數: y={x,0,x>0x<=0 y = { x , x > 0 0 , x <= 0

relu激活函數的導數:

y′={1,0,x>0x<=0 y ′ = { 1 , x > 0 0 , x <= 0

從上面這三種常用激活函數的導數可以看出,激活函數反向求導都非常簡單直接。然後,我們将從兩種角度來給出全連接配接層反向傳播的導數:矩陣形式和多元函數形式。

全連接配接層的反向傳播的矩陣形式

神經網絡反向傳播時,我們已知的是 ∂l∂y ∂ l ∂ y ,也就是前面層傳過來的 loss l o s s 對于目前層輸出的梯度,然後一方面我們需要知道 loss l o s s 對于參數的梯度 ∂l∂W ∂ l ∂ W 和 ∂l∂b ∂ l ∂ b ,而另一方面我們也需要知道 loss l o s s 對于輸入的梯度 ∂l∂x ∂ l ∂ x ,以便于參數向前面層傳播,更新前面層的參數。假設我們以 sigmoid s i g m o i d 函數作為激活函數:

y=σ(Wx+b) y = σ ( W x + b )

利用鍊式法則我們有:

∂l∂W=∂l∂y∂y∂(Wx+b)∂(Wx+b)∂W=∂l∂y∘(y∘(1−y))xT ∂ l ∂ W = ∂ l ∂ y ∂ y ∂ ( W x + b ) ∂ ( W x + b ) ∂ W = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) ) x T

∂l∂b=∂l∂y∂y∂(Wx+b)∂(Wx+b)∂b=∂l∂y∘(y∘(1−y)) ∂ l ∂ b = ∂ l ∂ y ∂ y ∂ ( W x + b ) ∂ ( W x + b ) ∂ b = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) )

∂l∂x=∂l∂y∂y∂(Wx+b)∂(Wx+b)∂x=∂l∂y∘(y∘(1−y))W ∂ l ∂ x = ∂ l ∂ y ∂ y ∂ ( W x + b ) ∂ ( W x + b ) ∂ x = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) ) W

其中 ∘ ∘ 表示矩陣對應值相乘。

全連接配接層的反向傳播的多元函數形式

接下來給出全連接配接層的多元函數形式:

y=σ(Wx+b) y = σ ( W x + b )

記 y=⎡⎣⎢⎢⎢y1y2⋯ym⎤⎦⎥⎥⎥ y = [ y 1 y 2 ⋯ y m ]

則有:

yi=σ(∑j=1nWijxj+bi),i=1,2,...,m y i = σ ( ∑ j = 1 n W i j x j + b i ) , i = 1 , 2 , . . . , m

那麼有:( Wij W i j 隻影響 yi y i , bi b i 隻影響 yi y i 。)

∂l∂Wij=∂l∂yiyi(1−yi)xj,i=1,2,...,m,j=1,2,...n ∂ l ∂ W i j = ∂ l ∂ y i y i ( 1 − y i ) x j , i = 1 , 2 , . . . , m , j = 1 , 2 , . . . n

∂l∂bi=∂l∂yiyi(1−yi),i=1,2,...,m ∂ l ∂ b i = ∂ l ∂ y i y i ( 1 − y i ) , i = 1 , 2 , . . . , m

( xj x j 影響 y1,y2,...,ym y 1 , y 2 , . . . , y m )

∂l∂xj=∑i=1m∂l∂yiyi(1−yi)Wij,j=1,2,...,n ∂ l ∂ x j = ∑ i = 1 m ∂ l ∂ y i y i ( 1 − y i ) W i j , j = 1 , 2 , . . . , n

把上面的東西寫進矩陣裡面就有:

∂l∂W=⎡⎣⎢⎢⎢⎢⎢⎢∂l∂y1y1(1−y1)x1∂l∂y2y2(1−y2)x1⋯∂l∂ymym(1−ym)x1∂l∂y1y1(1−y1)x2∂l∂y2y2(1−y2)x2⋯∂l∂ymym(1−ym)x2⋯⋯⋯⋯∂l∂y1y1(1−y1)xn∂l∂y2y2(1−y2)xn⋯∂l∂ymym(1−ym)xn⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢∂l∂y1y1(1−y1)∂l∂y2y2(1−y2)⋯∂l∂ymym(1−ym)⎤⎦⎥⎥⎥⎥⎥⎥[x1x2⋯xn]=⎡⎣⎢⎢⎢⎢⎢⎢∂l∂y1∂l∂y2⋯∂l∂ym⎤⎦⎥⎥⎥⎥⎥⎥∘⎡⎣⎢⎢⎢y1y2⋯ym⎤⎦⎥⎥⎥∘⎡⎣⎢⎢⎢1−y11−y2⋯1−ym⎤⎦⎥⎥⎥[x1x2⋯xn]=∂l∂y∘(y∘(1−y))xT ∂ l ∂ W = [ ∂ l ∂ y 1 y 1 ( 1 − y 1 ) x 1 ∂ l ∂ y 1 y 1 ( 1 − y 1 ) x 2 ⋯ ∂ l ∂ y 1 y 1 ( 1 − y 1 ) x n ∂ l ∂ y 2 y 2 ( 1 − y 2 ) x 1 ∂ l ∂ y 2 y 2 ( 1 − y 2 ) x 2 ⋯ ∂ l ∂ y 2 y 2 ( 1 − y 2 ) x n ⋯ ⋯ ⋯ ⋯ ∂ l ∂ y m y m ( 1 − y m ) x 1 ∂ l ∂ y m y m ( 1 − y m ) x 2 ⋯ ∂ l ∂ y m y m ( 1 − y m ) x n ] = [ ∂ l ∂ y 1 y 1 ( 1 − y 1 ) ∂ l ∂ y 2 y 2 ( 1 − y 2 ) ⋯ ∂ l ∂ y m y m ( 1 − y m ) ] [ x 1 x 2 ⋯ x n ] = [ ∂ l ∂ y 1 ∂ l ∂ y 2 ⋯ ∂ l ∂ y m ] ∘ [ y 1 y 2 ⋯ y m ] ∘ [ 1 − y 1 1 − y 2 ⋯ 1 − y m ] [ x 1 x 2 ⋯ x n ] = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) ) x T

∂l∂b=⎡⎣⎢⎢⎢⎢⎢⎢∂l∂y1y1(1−y1)∂l∂y2y2(1−y2)⋯∂l∂ymym(1−ym)∂l∂y1y1(1−y1)∂l∂y2y2(1−y2)⋯∂l∂ymym(1−ym)⋯⋯⋯⋯∂l∂y1y1(1−y1)∂l∂y2y2(1−y2)⋯∂l∂ymym(1−ym)⎤⎦⎥⎥⎥⎥⎥⎥=⎡⎣⎢⎢⎢⎢⎢⎢∂l∂y1∂l∂y2⋯∂l∂ym⎤⎦⎥⎥⎥⎥⎥⎥∘⎡⎣⎢⎢⎢y1y2⋯ym⎤⎦⎥⎥⎥∘⎡⎣⎢⎢⎢1−y11−y2⋯1−ym⎤⎦⎥⎥⎥=∂l∂y∘(y∘(1−y)) ∂ l ∂ b = [ ∂ l ∂ y 1 y 1 ( 1 − y 1 ) ∂ l ∂ y 1 y 1 ( 1 − y 1 ) ⋯ ∂ l ∂ y 1 y 1 ( 1 − y 1 ) ∂ l ∂ y 2 y 2 ( 1 − y 2 ) ∂ l ∂ y 2 y 2 ( 1 − y 2 ) ⋯ ∂ l ∂ y 2 y 2 ( 1 − y 2 ) ⋯ ⋯ ⋯ ⋯ ∂ l ∂ y m y m ( 1 − y m ) ∂ l ∂ y m y m ( 1 − y m ) ⋯ ∂ l ∂ y m y m ( 1 − y m ) ] = [ ∂ l ∂ y 1 ∂ l ∂ y 2 ⋯ ∂ l ∂ y m ] ∘ [ y 1 y 2 ⋯ y m ] ∘ [ 1 − y 1 1 − y 2 ⋯ 1 − y m ] = ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) )

∂l∂x=⎡⎣⎢⎢⎢⎢⎢⎢∑mi=1∂l∂yiyi(1−yi)Wi1∑mi=1∂l∂yiyi(1−yi)Wi2⋯∑mi=1∂l∂yiyi(1−yi)Win⎤⎦⎥⎥⎥⎥⎥⎥=[∂l∂y1y1(1−y1)∂l∂y2y2(1−y2)⋯∂l∂ymym(1−ym)]⎡⎣⎢⎢⎢W11W21⋯Wm1W12W22⋯Wm2⋯⋯⋯⋯W1nW2n⋯Wmn⎤⎦⎥⎥⎥=[∂l∂y∘(y∘(1−y))]TW ∂ l ∂ x = [ ∑ i = 1 m ∂ l ∂ y i y i ( 1 − y i ) W i 1 ∑ i = 1 m ∂ l ∂ y i y i ( 1 − y i ) W i 2 ⋯ ∑ i = 1 m ∂ l ∂ y i y i ( 1 − y i ) W i n ] = [ ∂ l ∂ y 1 y 1 ( 1 − y 1 ) ∂ l ∂ y 2 y 2 ( 1 − y 2 ) ⋯ ∂ l ∂ y m y m ( 1 − y m ) ] [ W 11 W 12 ⋯ W 1 n W 21 W 22 ⋯ W 2 n ⋯ ⋯ ⋯ ⋯ W m 1 W m 2 ⋯ W m n ] = [ ∂ l ∂ y ∘ ( y ∘ ( 1 − y ) ) ] T W

最後一個貌似轉置行列有些對應不上,哈哈哈!!!

繼續閱讀