本文的目標讀者是想快速掌握矩陣、向量求導法則的學習者,主要面向矩陣、向量求導在機器學習中的應用。因此,本教程而非一份嚴格的數學教材,而是希望幫助讀者儘快熟悉相關的求導方法並在實踐中應用。另外,本教程假定讀者熟悉一元函數的求導。
本文公式太多,微信上展示會有一些問題。所以本文適合讀者了解矩陣、向量求導,而詳細地學習與分析請下載本文的PDF版。
PDF 下載地址:https://pan.baidu.com/s/1pKY9qht
所謂矩陣求導,本質上只不過是多元函數求導,僅僅是把把函數的自變量以及求導的結果排列成了矩陣的形式,方便表達與計算 而已。複合函數的求導法則本質上也是多元函數求導的鏈式法則,只是將結果整理成了矩陣的形式。只是對矩陣的每個分量逐元素 地求導太繁瑣而且容易出錯,因此推導並記住一些常用的結論在實踐中是非常有用的。
矩陣求導本身有很多爭議,例如:
對於求導結果是否需要轉置?
不同教材對此處理的結果不一樣,這屬於不同的 Layout Convention。本文以不轉置為主,即求導結果與原矩陣/向量同型,術語叫 Mixed Layout。
矩陣對向量、向量對矩陣、矩陣對矩陣求導的結果是什麼?
最自然的結果當然是把結果定義成三維乃至四維張量,但是這並不好算。也有一些繞彎的解決辦法 (例如把矩陣抻成一個 向量等),但是這些方案都不完美 (例如複合函數求導的鏈式法則無法用矩陣乘法簡潔地表達等)。在本教程中,我們認為,這三種情形下導數沒有定義。凡是遇到這種情況,都通過其他手段來繞過,後面會有具體的示例。
因此,本教程的符號體系有可能與其他書籍或講義不一致,求導結果也可能不一致 (例如相差一次矩陣轉置,或者是結果矩陣是否平鋪成向量等),使用者需自行注意。另外,本教程中有很多筆者自己的評論,例如關於變形的技巧、如何記憶公式、如何理解其他的教程中給出的和本教程中形式不同的結果等。
文中如有錯漏,歡迎聯繫 ruanchong_ruby@163.com,我會儘快訂正。
符號表示
標量用普通小寫字母或希臘字母表示,如
等。
向量用粗體小寫字母或粗體希臘字母表示,如 x 等,其元素記作
(注意這裡
沒有加粗。加粗的小寫字母加下標,例如
等,表示這是兩個不同的常數向量)。向量默認為列向量,行向量需要用列向量的轉置表示,例如
等。
矩陣用大寫字母表示,如A 等,其元素記作
(注意這裡 a 用的是小寫字母。大寫字母加下標,例如
等,表示不同 的常數矩陣)。
用字母表中靠前的字母 (如 a,b,c等) 表示常量,用 f,g,h 或字母表中靠後的字母 (如u,v等)等表示變量或函數。
有特殊說明的除外。
綜上所述,本文進行如下約定:
矩陣/向量值函數對實數的導數:
要點:求導結果與函數值同型,且每個元素就是函數值的相應分量對自變量
求導
若函數
,則
也是一個 m×n 維矩陣,且
,也可用劈形算子將導數記作
,或記作
。
由於向量是矩陣的特殊情形,根據上面的定義也可以得到自變量為向量時的定義:若函數
,則
是一個 m 維向量,且
。若函數值
是行向量則結果為行向量,可記作
;若函數值 f 是列向量則求導結果為列向量,可記作
。
注:本文開頭即說明過,變量為向量時僅僅是將其看作多個實數,無所謂行向量與列向量之分。這裡用行向量或列向量的 說法僅僅為了把公式用矩陣相乘的方式表示出來方便,因為在數學公式總要指定向量是行向量或者列向量中的某一個,才能與公式裡的其他部分做矩陣運算時維度相容。下同。
實值函數對矩陣/向量的導數:
要點:求導結果與自變量同型,且每個元素就是f對自變量的相應分量求導
若函數
,則
也是一個 m×n 維矩陣,且
也可使用劈形算子將導數記作
。
由於向量是矩陣的特殊情形,根據上面的定義也可以得到自變量為向量時的定義:若函數
,則
也是一個 m 維向量,且
。若函數值
是行向量則結果為行向量,可記作
;若函數值 f 是列向量則求導結果為列向量,可記作
。
向量值函數對向量的導數(雅克比矩陣 ):
若函數
,則
是一個 m×n 維矩陣,且
。用劈形算子表示時可記作
。
注:如前所述,本教程僅僅是把變量都看成多個實數,無所謂行與列之分,因此在表述從向量
到
的雅克比矩陣時,不區分 x 或者 f 到底是行向量還是列向量,統一用
表示,維度也都是m-by-n。有些教程可能會區分 行對列、列對列、行對行、列對行幾種不同情形的求導,認為有些結果相差一個轉置,有些組合不能求導等等。本教程則認為只有一種求導結果,就是雅克比矩陣。
有一點需要注意的是,若f退化成標量
,則 x 到 f 的雅克比矩陣
是一個行向量,是梯度 (列向量) 的轉置,即
。注意這裡使用的記號:左邊 f 加粗,是把它看做一個長度為 1 的向量,表示求向量 x 到向量 f 的雅克比矩陣;右邊
為普通字體,表示實函數
對向量 x 的導數。
劈形算子
:
在求導的變量比較明確時,可以省略劈形算子的下標寫成
。
劈形算子和偏導數兩種記號大體上可以認為是相同的,只不過在涉及到變量分量的推導過程 (例如用鏈式法則推神經網絡 的 BP 算法) 中,偏導數那一套符號更加常用;而劈形算子的優勢是書寫簡單,在對傳統的機器學習模型的目標函數求導 時,劈形算子有時更常用。
對於一個實函數
,其梯度記為
,也可記作gradf,是一個m 維向量。Hessian 矩陣記為
,其中
,是一個m×m的矩陣。根據上述定義可以發現,Hessian 矩陣其實是 X 到
的雅克比矩陣,因此
不光是一個形式記號,而是可以用
來計算。
註:某些教材區分對行向量和列向量求導,認為 Hessian 矩陣是先對行向量
求導,再對列向量X求導(或者反過來),因此寫作
(或者
)。
對於一個實函數
,其梯度規定為 m×n 維矩陣
,Hessian 矩陣不作定義。
對上述約定的理解
對於實值函數 f,上面的定義滿足轉置關係(f 對某個變量和其轉置的導數互為轉置):即:(其中 x 代表任意維度的向量或矩陣)。
函數增量的線性主部與自變量增量的關係:
實值函數對矩陣/向量的導數:
,此式用到的技巧非常重要:兩個同型矩陣對應元素相乘再求和時常用上面第二個等式轉化為跡,從而簡化表達和運算。從另一個角度講,這是矩陣導數的另一種定義。即:對於函數
,若存在矩陣 A,使得
時(||*|| 為任意範數),成立
,則定義
。矩陣乘積的跡是一個線性算子。事實上,如果有兩個同型矩陣 A、B,他們的內積即定義為 <A, B> = tr(A^T * B)。容易驗證,向量內積也符合這個定義,因此此式可以看成是向量內積的推廣。
實值函數對矩陣/向量的導數:,此式右邊是向量內積,可看做前一個式子的退化情形。
向量值函數對向量的導數:
,此式即為重積分換元時用於坐標變換的Jacobian矩陣。
變量多次出現的求導法則
規則:若在函數表達式中,某個變量出現了多次,可以單獨計算函數對自變量的每一次出現的導數,再把結果加起來。
這條規則很重要,尤其是在推導某些共享變量的模型的導數時很有用,例如 antoencoder with tied weights(編碼和解碼部分的權重矩陣互為轉置的自動編碼器)和卷積神經網絡(同一個 feature map 中卷積核的權重在整張圖上共享)等。
舉例(該規則對向量和矩陣也是成立的,這裡先用標量舉一個簡單的例子):假設函數表達式是
,可以先把三個 x 看成三個不同的變量,即把 f 的表達式看成
,然後分別計算
,
,最後總的導數就是這三項加起來:
,此時再把 x 的下標抹掉並化簡,就得到 6x+1。熟悉這個過程之後,可以省掉添加下標再移除的過程。
如果用計算圖(computation graph,描述變量間依賴關係的示意圖,後面會舉例)的語言來描述本條法則,就是:若變量 x 有多條影響函數 f 的值的路徑,則計算
時需要對每條路經求導最後再加和。 如果想更多地了解計算圖和反向傳播,推薦閱讀 [Colah 君的文章](http://colah.github.io/posts/2015-08-Backprop/)。其中詳細講述了計算圖如何工作,不僅講反向傳播還講了前向傳播(前向傳播對於目前的機器學習算法來說似乎沒有太大的用處,但是對於加深計算圖的理解很有幫助。RNN 有一種學習算法叫 RTRL 就是基於前向傳播的,不過近年來不流行了)。
有了上面的基礎,我們就可以推導 Batch normalization(以下簡稱 BN)的求導公式了。 BN 的計算過程為:
其中 m 是批的大小,x_1 到 x_m 分別是 m 個不同樣本對於某個神經元的輸入,l 是這個批的總的損失函數,所有變量都是標量。求導的第一步是畫出變量依賴圖,如下所示(根據左邊的變量可以計算出右邊的變量,如果為了強調,也可以在邊上添加從左向右的箭頭):
左側,右上,右下分別是三種不同的畫法(讀者也可以嘗試其他的畫法):左邊的圖是把所有變量 x_i 都畫了出來,比較清楚,如果想不清楚變量之間是如何相互依賴的,這樣畫可以幫助梳理思路;右上是我自創的一種方法,借鑑了概率圖模型中的盤記號(plate notation),把帶下標的變量用一個框框起來,在框的右下角指明重複次數;右下我只畫了一個局部,只是為了說明在有些資料中,相同的變量(如本例中的
)只出現一次,而非像左圖那樣出現多次,從而圖中會出現環。不過要不要複製同一個變量的多個拷貝沒有本質的區別。在右下這種表示法中,如果要求 partial σ^2 除以 partial x_i,需要對
和
這兩條路徑求導的結果做加和。(事實上,這種帶下標的畫法有點兒醜,因為我們現在的計算圖裡的變量都是標量……如果用 X 表示
組成的向量,計算圖會更簡潔,看起來更舒服。不過這種醜陋的表示對於我們現在的目的已經夠用了。 )
BN 原論文中也給出了反向傳播的公式,不過我們不妨試著自己手算一遍:
x_i hat 影響損失函數只有唯一的路徑
,根據鏈式法則,得到:
。
λ 影響損失函數有 m 條路徑:對任意一個 i,
都是一條路徑,需要對這些路徑分別求導再加和:
。
partial l 除以 partial β 的計算與上面類似:
。
影響損失函數的路徑也有 m 條:
(此處忽略中間變量 y_i,直接把 l 看成的 x_i hat 函數。)所以
。注意求導的時候把
當成一個整體,想像這就是一個字母,而不要把它想成標準差的平方。
影響損失函數共有 2m 條路徑:
(分別對應於右上圖中較短和較長的路徑)。故有:
。其中最後一步的理由是根據
的定義,後一項為零。
影響損失函數有 3 條路徑:
,所以
。
常用公式
向量求導的鏈式法則
易發現雅克比矩陣的傳遞性:若多個向量的依賴關係為
,則:
證明:只需逐元素求導即可。
,即
的
元等於矩陣
的 i 行 和 矩陣
的第 j 列的內積,這正是矩陣乘法的定義。
註:將兩項乘積的和轉化成向量內積或矩陣相乘來處理,是很常用的技巧。
雅克比矩陣的傳遞性可以很容易地推廣到多層中間變量的情形,採用數學歸納法證明即可。
若中間變量都是向量,但最後的結果變量是一個實數,例如變量依賴關係形如
,則:
由雅克比矩陣的傳遞性知:
再根據 f 退化時雅克比矩陣和函數導數的關係,有:
以上三式相結合,可以得到如下鏈式法則:
上面的結果顯然也可以推廣到任意多層複合的情形(可用於 RNN 的 BPTT 的推導)。
上面的公式是把導數視為行向量(即以
和
的形式)給出的。如果需要把導數視為列向量,只需將公式兩邊同時轉置即可。由於實踐中複合一次的情形較常用,這裡只給出將變量視為列向量時複合一次的公式:
若
,則:
或寫作
。
這裡再給出一個特例:若變量依賴關係為
,u 和x 維度相同且
僅由
計算出而與 x 的其他分量無關,則易知
是對角陣,所以上面的公式可以化簡為:
其中
表示取對角矩陣 D 的對角線上的元素組成列向量,
表示兩個向量逐元素相乘。
由於最終的結果是兩個向量逐元素相乘,所以也可以交換一下相乘的順序,寫成:
本條規則在神經網絡中也很常用,常見的情形包括但不限於:逐元素地應用激活函數
,以及現代 RNN 單元中的門限操作(以 LSTM 為例:
。
* 因為依賴關係簡單,本公式也可以直接根據導數逐分量的定義直接推出來:
此即前述公式的分量形式。
記憶:只需記住結果是一堆雅克比矩陣的乘積,相乘的順序根據維度相容原則調整即可(假設每個中間變量的維度都不一樣,看怎麼擺能把雅克比矩陣的維度擺成矩陣乘法規則允許的形式。只要把矩陣維度倒騰順了,公式也就對了。)
註:網絡上各種資料質量參差不齊,在其他教程中時常會見到向量對矩陣求導的表達式。例如介紹 RNN 的梯度消失問題的文章中,經常會見到
這種式子。如果文中出現這個式子是定性的,只是為了說明鏈式法則中出現了很多連乘項導致了梯度消失,那麼讀者也只需定性地理解即可。如果文中出現這個式子是定量的,是為了推導反向傳播的公式,那麼筆者建議讀者用如下兩種方式之一理解:
其一是把
理解成一種簡寫形式:先把 W 抻成一個向量,然後公式中的每一個雅克比矩陣就都可以計算了,最後再把結果向量重新整理成 W 的同型矩陣。但是這種方法非常複雜,因為把 W 抻成向量以後目標函數關於 W 的表達式就變了,很難推導
這個雅克比矩陣。一個具體的算例見《Optimizing RNN performance》(https://svail.github.io/rnn_perf/)一文中最後的推導。(如果你不打算熟練掌握這種方法,只瀏覽一下看看大意即可。相信我,如果你學了本文中的方法,你不會再想用這種把矩陣抻開的方法求導的。)
其二是把最後一項分母中的 W 理解成矩陣 W 中的任一個元素 w_ij,從而上述表達式中的四項分別是向量(此處看作行向量)、矩陣、矩陣、向量(列向量),從而該表達式可以順利計算。但是這也很麻煩,因為得到的結果不是直接關於 W 的表達式,而是關於其分量的,最後還要合併起來。
其他理解方式,恕我直言,基本上都是作者自己就沒弄懂瞎糊弄讀者的。
實值函數對向量求導
未作特殊說明即為對變量 x 求導。
幾個基本的雅克比矩陣:
,特別地,
。
向量內積的求導法則:
內積是一個實數,因此本節相當於實數對向量求導,結果是與自變量同型的向量。
這是最基本的公式,正確性是顯然的,因為
。
正確性是顯然的,因為
。另外,也可以用變量多次出現的求導法則結合上一條公式證明。
利用變量多次出現的求導法則以及前面的公式容易證明。另外,若 A 是對稱矩陣,上式右邊可以化簡為 2A_x。
向量內積的求導法則:
利用變量多次出現的求導法則(x 同時在 u、v 中出現)+ 複合函數求導法則(列向量形式)易證。
向量數乘求導公式
推導:
,兩邊逐分量對比一下便知等式成立。
記憶:按兩個標量函數相乘的求導法則記,再注意一下維度相容原理即可。向量數乘的結果還是一個向量,所以此處相當於向量對向量求導,結果是一個雅克比矩陣,形狀為 f 的維度乘 x 的維度。
矩陣跡求導
未作特殊說明即為對 X 求導。跡是一個實數,所以相當於實數對矩陣求導,結果是一個和 X 同型的矩陣。
先回顧一下跡的基本性質:
線性性質:
轉置不變性:
輪換不變性:
特別地,
。注意,輪換不變性不等於交換性。例如:
,但是一般情況下
。
基本公式:
推導:逐元素求導驗證
:(事實上這個公式就是矩陣導數的另一種定義,前面也有敘述。)
根據此式容易得到另一個式子:
跡方法的核心公式(非常重要):
推導:利用變量多次出現的求導法則:
(X_c 表示將 X 的此次出現視作常數)
這個公式非常重要,在推導最小二乘解等問題上都會遇到。公式的名字是我瞎起的,我不知道它叫什麼名字。
其他與矩陣跡有關的公式
大部分都是上述核心公式的簡單推論,不必強記
推導:
註:將實數看作是 1*1 矩陣的跡是很常用的技巧。
推導:使用跡方法的核心公式。過程略。
推導:將左式的括號相乘展開,然後用上面的關於矩陣跡的公式。
推導同上,只需注意到
即可。特別地,
(此式也可逐元素求導直接驗證)
行列式的求導公式:
實數對矩陣求導,結果是和 X 同型的矩陣。此條證明較繁瑣,大致過程是用逐元素求導+伴隨矩陣的性質推導,過程可參考 math overflow。最好能直接記住。
矩陣求導的鏈式法則
設
,則:
,或簡寫為
關於維度的說明:X 是矩陣,中間變量 U 也是矩陣(未必與 X 同型),最終結果 y 是實數。因此求導結果是和 X 同型的矩陣。
註:此式似乎用的不多,畢竟這僅僅是對 x_ij 這一個分量求導的結果,很難直接得到對 X 求導的結果。而且這個式子只是最基礎的多元函數複合的鏈式法則而已,沒有得到什麼特別有趣或者重要的結論。
設
,則:
(等式右邊是實數和矩陣的數乘)
關於維度的說明: X,u,y 分別是矩陣、實數、實數,因此相當於實數對矩陣求導,結果是 X 同型的矩陣。
證明是顯然的,逐元素求導驗證即可:
線性變換的導數(非常重要。由於線性變換很常用,記住此式可以簡化很多公式的推導過程):
設有
及線性映射
(因此
),則:
推導:
,而
(
是 Kronecker delta 符號:若l=j 值為 1,否則為 0),將後式代入前式,得:
,即矩陣 A^T的第 i 行 和 矩陣
的第 j 列的內積。
向量的線性變換是上式的退化情形,即:
向量的線性變換還可以求二階導:
推導:記
,則
記憶:同上,記住大概的形狀(對線性變換來說,求一次導就是乘一個矩陣),然後根據維度相容原則擺順了就行。
由於線性變換很常用,這裡不妨把給 X 右乘一個矩陣時的公式一併給出,以便查閱:設有
及線性映射
(因此
),則:
證明:若令
,則變量依賴關係變為:
,且
,根據線性變換的求導法則,知:
,所以
。
記憶:先做線性變換再求導就等於先求導再做線性變換。剩下的細節(如左乘還是右乘等)根據維度相容原則倒騰即可。
註:此式很有用,在神經網絡中,經常有形如
的依賴關係。其中 x 是神經網絡某一層的輸入數據(不是訓練神經網絡時要求導的變量!不過在構造對抗樣本時可能需要對 x 求導), W,b 是該層的參數(這才是訓練神經網絡時要求導的變量),z 是經過變換後預備輸入給下一層的值,l 是最終的損失函數。根據上述線性變換的求導公式,立即可以得到 BP 算法的核心步驟:
。(另註:標準的 BP 算法通常將
定義為變量δ。)
其他公式
這一部分在機器學習中遇到的不多(畢竟常見的情況是求一個標量損失函數對其他變量的導數),不是特別重要,不過偶爾在凸優化裡會碰到一些。這裡收集整理這幾個式子主要是為了資料完整、查閱方便。以下假定 F 是可逆方陣:
自變量和函數值都是實數,求導結果也是實數。推導過程較困難,主要用到了矩陣的雅克比公式(不是雅克比矩陣)。建議記住,或者用時查表。
自變量和函數值都是實數,求導結果也是實數。
推導:根據最基本的一元函數複合的求導法則即可。令
,則:
。
矩陣對實數求導,結果是和 F^-1 同型的矩陣(也即和 F 同型的矩陣)。
推導:對恆等式
兩邊同時求導,再結合 |F| 的導數易得。
常見技巧及注意事項
實數在與一堆矩陣、向量作數乘時可以隨意移動位置。且實數乘行向量時,向量數乘與矩陣乘法(1x1 矩陣和 1xm 矩陣相乘)的規則是一致的。
遇到相同下標求和就聯想到矩陣乘法的定義,即
。特別地,一維下標求和聯想到向量內積
,二維下標求和聯想到跡
(A,B 應為同型矩陣)。
如果在一個求和式中,待求和項不是實數而是矩陣的乘積,不要想著展開求和式,而要按照上面的思路,看成分塊矩陣的相乘!
向量的模長平方(或實數的平方和)轉化為內積運算:
。矩陣的 F 範數的平方轉化為跡運算:
。
多個矩陣相乘時,多用矩陣跡的求導公式轉化、循環移動各項。實數也可看成 1X1 矩陣的跡!
需要用到向量(或矩陣)對矩陣求導的情形,要麼把矩陣按列拆開轉化成向量對向量求導(最終很有可能通過分塊矩陣乘法再合併起來。本文後面的算例 PRML(3.33) 說明了這種方法怎麼用),要麼套用線性變換的求導公式(常見於神經網絡的反向傳播過程)。
算例
最小二乘法
方法一:展開括號,再使用幾個常用公式化簡即可:
方法二:使用線性變換的求導公式:
F 範數的求導公式推導
方法一:先轉化為跡,再裂項,最後通過恰當的輪換,用跡方法的核心公式處理。
方法二:用線性變換的求導公式證。(注意矩陣轉置不改變其 F 範數,並且實值函數對 X 和 X_T 的導數互為轉置)
方法三:根據定義逐元素地算,然後合併成向量、再合併成矩陣。(太原始,易出錯,不推薦)
PRML (3.33) 求導
題目:
求
關於 W 的導數。
說明:上面的
的結果應當是一個向量,但是希臘字母打不出加粗的效果。
方法一:用矩陣的 F 範數推導:
上述幾步的依據分別是:
將若干個列向量拼成一個矩陣,因此它們的二範數平方和就等於大矩陣的 F 範數的平方。
矩陣轉置不改變其 F 範數。
矩陣數乘 (-1) 不改變其 F 範數。
線性變換的求導公式 + F 範數的求導公式。
實數在和矩陣作數乘時位置可以任意移動。
有了導數,再另導數等於零,即得 W 的最大似然解:
。
方法二: 將向量二範數用內積代替,然後逐項展開,最後利用分塊矩陣相乘消掉求和號:
最後一步的化簡的思考過程是把對 n 求和視為兩個分塊矩陣的乘積:
第一個矩陣是分塊行向量,共 1xN 個塊,且第 n 個分量是
。因此第一個矩陣是
第二個矩陣是分塊列向量,共 Nx1 個塊,且第 n 個分量是
。因此,第二個矩陣是:
,注意第二個等號的推導過程中,前一項能夠拆開是因為它被看做兩個分塊矩陣的乘積,兩個分塊矩陣分別由 Nx1和 1x1 個塊組成。
這種方法雖然比較繁瑣,但是更具有一般性。
RNN 的梯度消失爆炸問題
通常 RNN 的狀態方程的更新定義為
(f 表示一個逐元素的激活函數,例如
等。),而這裡我們採用 Pascanu 等人的論文 On the difficulty of training Recurrent Neural Networks 中的定義,即認為
(這兩種方程其實是等價的,只是前一種表述把隱層狀態定義成激活後的值,後一種表述把隱層狀態定義成激活前的值,前述論文中的腳註裡也有說明。這裡採用後一種方式,是因為它稍微好算一點)。展開後的網絡結構示意圖參見 中的 Slide 15。以下內容建議對照這份講義的 15-19 頁一起觀看(另註:建議用 Stanford 的講義梳理大致的思路,但是按照本講稿下述步驟進行具體的求導運算。個人認為本講稿中的過程更加清楚)。
現在我們來計算損失函數 l 對循環連接的權重矩陣 W 的導數:假設每一時間步都有一個誤差 l_t(例如建立一個語言模型,每一步都要預測下一個詞的概率分布,與語料庫裡的真實值計算交叉熵),總的誤差等於每一步的誤差加起來:
,因此
(對一元函數來說,和的導數等於導數的和。根據多元函數偏導數的定義,很容易推廣到多元函數上,進而推廣到矩陣求導上)。
考慮到矩陣 W 出現了多次,計算
需要計算 l_t 對 W 的每一次出現的導數,然後再求和。若用 W^(k) 表示 h_k-1 與 h_k之間的轉移矩陣 W,則
。其中第二個等號用到的是線性變換的求導公式(類似標準 BP 算法的核心步驟)
然後根據雅克比矩陣的運算規則計算損失函數對隱層的導數
(表示將括號裡的向量變成一個對角矩陣,跟前文的
互為逆運算。):
,再將該式帶入上一步中的式子,就得到
,這就是 vanilla RNN 的 BPTT 的公式。(中間很多個隱層之間的雅克比相乘那一部分可以用求積符號來書寫,這裡的寫法更直觀一些)
註:實踐中具體計算梯度的時候,一般還是先定義一組類似於 BP 神經網絡 δ_t 的變量,使用循環逐層進行求導,而不是強行直接展開。這裡展開是為了理論分析方便。
另註:Stanford 的講義和前述論文中,均認為
,這一點應該是錯的,矩陣 W 不應該被轉置,根據雅克比矩陣的定義寫一個梯度檢查的程序即可快速驗證這一點。
Autoencoder with Tied-weight
求函數
對 W 的導數,其中
是逐元素求 Sigmoid。
根據變量多次出現的求導法則計算即可:
,其中 W_c 的含義是將 W 此次出現看做常數。
上式右邊第一項計算如下:
第二項計算如下:
,其中第三個等號裡定義
。
最終結果就是將以上兩項合併起來,並去掉所有 W_c 中的下標,從略。