神經網路中矩陣求導術的應用
阿新 • • 發佈:2018-12-14
序
本文假設讀者熟悉一元微積分,線性代數,並已經學習過矩陣求導術:知乎專欄. 在神經網路中,矩陣求導術發揮的最重要的作用便是求對某個引數的梯度. 比如在多層神經網路(MLP)中,某一層的推導公式為,我們就需要求 對和的導數以更新它們. 然而,是矩陣,是向量,是標量,用一元微積分的方式很難求得和的梯度,尤其是有矩陣乘法運算和多層連線存在的時候. 這就迫切的需要應用矩陣求導術在神經網路中. 本文所做的就是在矩陣求導術的基礎上新增一些常用公式,並對知乎專欄中涉及不足的方面加深討論.
記法約定
- 本文以表示標量,以 表示列向量,以表示矩陣.
- 特殊的,以表示神經網路輸出和真實值間的,為標量.
- 特殊的,以或者表示元素全是1的列向量,列向量的維數在某題目中第一次出現時標明. 如果在題目剩餘部分未再次提及維數,則預設該題目中所有的向量維數均相同,都等於第一次提及的維數.
- 特殊的,以表示單位矩陣.
- 本文以表示矩陣和矩陣做矩陣乘法,以表示矩陣element-wise的乘法,也稱為逐元素乘法或Hadamard product
- 逐元素乘法和矩陣乘法屬同優先順序運算,不加括號的情況下從左到右進行.
- 本文以括號上標的形式表示神經網路中第層的變數,如表示網路第層的輸出.
- 本文統一以表示神經網路的輸入,雖然網路的輸入可能是向量也可能是矩陣(資料特徵維數是1時網路的輸入是向量). 這裡的是一個batch的資料,一個batch的資料量記為,每條資料的特徵維數記為,由於本文約定每條資料都是列向量,因此
- 上述約定在常用公式和定理部分嚴格遵循,在舉例中有些許不遵循,但會清楚地說明每個符號的維度.
常用公式和定理
- 標量向量求導法則:
- 標量矩陣求導法則:
- 常數: ,這裡和是相對於求導變數為常數的項.
- 加減法:
- 乘法:,
- 轉置和跡:
- 逐元素函式:
- 跡技巧:
- 矩陣求導的複合法則:假設,已求得,則求的方式是,利用標量矩陣求導法則,能夠寫出,然後把用表示出來,代入上式消去,並進行比對,得出. 注意,本方法在中間變數是向量或自變數是向量或中間變數和自變數都是向量的情況下依然適用.
- 多元函式運演算法則:假設,則應該是兩部分的和,第一部分是通過得到的,第二部分是通過得到的. 當中間變數變多時,該法則依然適用.
- 向量重複:由於numpy中的矩陣加法和逐元素乘法有broadcast的功能,因此numpy的加法和逐元素乘法並不要求兩個矩陣有完全相同的形狀,為了嚴謹的用數學公式表達, 通常我們需要進行一些向量重複的技巧來彌補程式碼和公式之間的差異.
-
表示把按行相加,得到的矩陣,程式碼如下:
同理,表示把按列相加,得到的矩陣,程式碼如下:import numpy as np np.sum(X,axis=0)
import numpy as np np.sum(X,axis=1)
舉例
-
多層神經網路(MLP)的梯度推導
在MLP中,每個單元(cell)的推導公式我們一般寫作: