前段時間看過一些矩陣求導(dǎo)的教程转砖,在看過的資料中须鼎,尤其喜歡斯坦福大學(xué)CS231n卷積神經(jīng)網(wǎng)絡(luò)課程中提到的Erik這篇文章。循著他的思路府蔗,可以逐步將復(fù)雜的求導(dǎo)過程簡化晋控、再簡化,直到發(fā)現(xiàn)其中有規(guī)律的部分姓赤。話不多說赡译,一起來看看吧。
作者:Erik Learned-Miller? ? ?翻譯:橘子? ? ?來源:橘子AI筆記(datawitch)
本文旨在幫助您學(xué)習(xí)向量不铆、矩陣和高階張量(三維或三維以上的數(shù)組)的求導(dǎo)方法蝌焚,以及如何求對向量、矩陣和高階張量的導(dǎo)數(shù)誓斥。
01.?簡化只洒,簡化,再簡化
在求關(guān)于數(shù)組的導(dǎo)數(shù)時劳坑,大部分困惑都源自于我們想要一次同時做好幾件事毕谴。這“幾件事”包括同時對多個元素求導(dǎo)、在求和符號下求導(dǎo)以及應(yīng)用鏈?zhǔn)椒▌t距芬。至少在我們積累豐富的經(jīng)驗之前涝开,想要同時做這么多件事情是很容易犯錯的。
1.1 寫出矩陣中單個元素的表達(dá)式
為了簡化給定的計算蔑穴,有一種方法是:寫出輸出中單個標(biāo)量元素的表達(dá)式忠寻,這個表達(dá)式只包含標(biāo)量變量。一旦寫出了輸出中單個標(biāo)量元素與其他標(biāo)量值的表達(dá)式存和,就可以使用標(biāo)量的微積分求導(dǎo)方法奕剃,這比同時進(jìn)行矩陣的求和、求導(dǎo)要容易得多捐腿。
例子?假設(shè)我們有一個長度為的列向量纵朋,它是由行列的矩陣與長度為的向量計算得到的:
假設(shè)我們想求對的導(dǎo)數(shù)。完整的求導(dǎo)過程需要計算中的每一個元素對中的每一個元素的(偏)導(dǎo)數(shù)茄袖,在這種情況下操软,我們會算出個元素,因為中有個元素而中有個元素宪祥。
讓我們先從計算其中一個元素開始聂薪,比如家乘,中的第3個元素對中的第7個元素求導(dǎo)。也就是說藏澳,我們要計算
也就是一個標(biāo)量對另一個標(biāo)量求導(dǎo)仁锯。
在求導(dǎo)之前,我們要先寫出的表達(dá)式翔悠。根據(jù)矩陣-向量乘法的定義业崖,矩陣的第3行與向量的點(diǎn)積就是的值。
此時蓄愁,我們已經(jīng)將原始矩陣方程式(1)簡化為了一個標(biāo)量方程双炕,從而更容易計算所需的導(dǎo)數(shù)。
1.2 去掉求和符號
雖然我們可以嘗試直接求式(2)的導(dǎo)數(shù)撮抓,但包含求和符號或連乘符號的表達(dá)式在求導(dǎo)時很容易出錯妇斤。為了確保萬無一失,在剛開始的時候最好去掉求和符號胀滚,把各項相加的表達(dá)式寫出來趟济。我們可以寫出以下表達(dá)式乱投,下標(biāo)由“1”開始
當(dāng)然咽笼,這個表達(dá)式中包括了含有的項,這一項正是我們求導(dǎo)需要的項∑蒽牛現(xiàn)在不難看出剑刑,在求對的偏導(dǎo)數(shù)時,我們只關(guān)心這個表達(dá)式中的一項双肤,施掏。由于其他項都不包括,他們對的導(dǎo)數(shù)都是0茅糜。由此七芭,我們寫出
通過把關(guān)注點(diǎn)放在中的一個元素對中的一個元素的求導(dǎo)過程,我們盡可能地簡化了計算蔑赘。以后當(dāng)你在矩陣求導(dǎo)計算中產(chǎn)生困惑時狸驳,也可以試著將問題簡化到這個最基本的程度,這樣便于看清哪里出了問題缩赛。
1.2.1 完成求導(dǎo):雅可比矩陣
別忘了耙箍,我們的終極目標(biāo)是計算中每個元素對中每個元素的導(dǎo)數(shù),這些導(dǎo)數(shù)總共有個酥馍。以下矩陣可以表示所有這些導(dǎo)數(shù):
在這種特殊情況下辩昆,它被稱為雅可比矩陣(Jacobian maxtirx),但這個術(shù)語對理解我們的目的而言并不那么重要旨袒。
注意汁针,對于公式
對的偏導(dǎo)數(shù)可以簡單地用來表示术辐。如果挨個兒檢查整個矩陣中的所有元素,就不難發(fā)現(xiàn)施无,對所有的i和j來說术吗,都有
也就是說,偏導(dǎo)數(shù)的矩陣可以表示為
現(xiàn)在可以看出帆精,這個矩陣當(dāng)然就是矩陣本身较屿。
因此,推導(dǎo)了這么半天卓练,我們終于能得出隘蝎,對
求對的導(dǎo)數(shù)相當(dāng)于
2.?如果是行向量該怎么算
在使用不同的神經(jīng)網(wǎng)絡(luò)庫時,留意權(quán)重矩陣襟企、數(shù)據(jù)矩陣等矩陣的具體表達(dá)形式是非常重要的嘱么。例如,如果一個數(shù)據(jù)矩陣包含許多不同的向量顽悼,那么曼振,在這個矩陣中,是一個行向量表示數(shù)據(jù)集中的一個樣本蔚龙,還是一個列向量表示一個樣本冰评?
在第一部分的例子中,我們計算的向量是一個列向量木羹。然而甲雅,當(dāng)是行向量的時候你也得明白該怎么算。
2.1 第二個例子
假設(shè)是含有個元素的行向量坑填,它是由含有個元素的行向量與行列的矩陣計算得到的:
雖然和中的元素數(shù)量都和之前一樣抛人,但矩陣的形狀相當(dāng)于我們在第一個例子中使用的矩陣的轉(zhuǎn)置(transpose)。尤其是因為我們現(xiàn)在是矩陣左乘脐瑰,而不是之前的右乘妖枚,現(xiàn)在的矩陣必須是第一個例子中矩陣的轉(zhuǎn)置。
在這個例子中苍在,寫出的表達(dá)式
會得到
注意這個例子中的元素序號與第一個例子中相反绝页。如果寫出完整的雅可比矩陣,我們?nèi)匀豢梢缘贸?/p>
3.?超過二維的情形該怎么算
現(xiàn)在假設(shè)一個與前兩部分密切相關(guān)的情形忌穿,如下式
在這個情況下抒寂,沿一個坐標(biāo)軸變化,而沿兩個坐標(biāo)軸變化掠剑。因此屈芜,整個導(dǎo)數(shù)自然會是一個三維數(shù)組。在這里,我們避免使用“三維矩陣”這樣的術(shù)語井佑,因為尚不清楚矩陣乘法和其他矩陣運(yùn)算在三維數(shù)組中是如何定義的属铁。
在處理三維數(shù)組的時候,嘗試去找出展示它們的方法可能會帶來不必要的麻煩躬翁。相反焦蘑,我們應(yīng)該簡單地用表達(dá)式寫出結(jié)果,用這些表達(dá)式可以計算出所需三維數(shù)組中的任何元素盒发。
讓我們繼續(xù)以標(biāo)量導(dǎo)數(shù)的計算開始例嘱,比如中的一個元素和中的一個元素。我們先用其他標(biāo)量寫出的表達(dá)式宁舰,這個表達(dá)式還要體現(xiàn)出在其計算中所起的作用拼卵。
然而,我們發(fā)現(xiàn)在的計算中沒有起到任何作用蛮艰,因為
也就是說
不過腋腮,對中第3列元素求導(dǎo)的結(jié)果一定是非零的。例如對的偏導(dǎo)數(shù)為
其實仔細(xì)看式(8)就很容易發(fā)現(xiàn)這一點(diǎn)壤蚜。
一般情況下即寡,當(dāng)中元素的下標(biāo)等于中元素的第二個下標(biāo)時,這個偏導(dǎo)數(shù)就是非零的袜刷,反之則為零聪富。我們由此寫出:
除此以外,三維數(shù)組中的其他元素都是0水泉。如果用表示對求導(dǎo)得出的三維數(shù)組
其中
但是中的其他項都為0善涨。
最終,如果我們定義一個新的二維數(shù)組
就可以看出草则,我們需要的所有關(guān)于的信息實際上都可以用來儲存,也就是說蟹漓,的非零部分其實是二維的炕横,而不是三維的。
以緊湊的形式表示導(dǎo)數(shù)數(shù)組對于神經(jīng)網(wǎng)絡(luò)的高效實現(xiàn)而言至關(guān)重要葡粒。
4.?有多條數(shù)據(jù)該怎么算
前面的例子已經(jīng)是很好的求導(dǎo)練習(xí)了份殿,但如果需要用到多條數(shù)據(jù),也就是多個向量堆疊在一起構(gòu)成矩陣時嗽交,又該如何計算呢卿嘲?我們假設(shè)每個單獨(dú)的都是一個長度為的行向量,矩陣是一個行列的二維數(shù)組夫壁。而矩陣拾枣,和之前的例子一樣,是一個行列的矩陣。的定義如下
它是一個行列的矩陣梅肤。因此司蔬,的每一行將給出一個與輸入的相應(yīng)行相關(guān)的行向量。
按照我們寫出給定元素表達(dá)式的方法姨蝴,可以寫出
我們馬上就能從這個式子中看出俊啼,對于偏導(dǎo)數(shù)
只有的時候計算結(jié)果才不為零。也就是說左医,因為中的每一個元素都只對中相應(yīng)的那一行求導(dǎo)授帕,與的不同行之間的偏導(dǎo)數(shù)都為0。
我們可以進(jìn)一步發(fā)現(xiàn)
完全不依賴于我們比較的是和的哪一行浮梢。
事實上豪墅,矩陣完整包含了所有的偏導(dǎo)數(shù)——我們只需要根據(jù)式(10)和下標(biāo)來找到我們想要的特定偏導(dǎo)數(shù)。
如果用表示中的第行黔寇,用表示中的第行偶器,可以發(fā)現(xiàn)
正是對之前式(7)的一個簡單的普遍化形式。
5.?向量和矩陣中的鏈?zhǔn)椒▌t
我們已經(jīng)通過幾個例子學(xué)會了一些基本形式的計算缝裤,現(xiàn)在通過鏈?zhǔn)椒▌t把這些例子結(jié)合在一起屏轰。再次假設(shè)和是兩個列向量,讓我們從下式開始
嘗試計算對的導(dǎo)數(shù)憋飞。我們可以簡單地觀察到兩個矩陣和的乘積就是另一個矩陣霎苗,因此可以寫出
然而,我們想通過鏈?zhǔn)椒▌t來定義中間結(jié)果榛做,以觀察在非標(biāo)量求導(dǎo)過程中是如何應(yīng)用鏈?zhǔn)椒▌t的唁盏。
我們把中間結(jié)果定義為
于是有
然后我們可以運(yùn)用鏈?zhǔn)椒▌t寫出
為了確保我們確切地知道該式的含義,再次采用每次分析一個元素的老辦法检眯,從中的一個元素和中的一個元素開始:
右邊的乘積該怎么解釋呢厘擂?鏈?zhǔn)椒▌t的思想是將對每個標(biāo)量中間變量的導(dǎo)數(shù)與中間變量對的導(dǎo)數(shù)相乘。特別地锰瘸,如果有個元素刽严,那么可以寫出
回憶之前關(guān)于向量對向量求導(dǎo)的計算方法,發(fā)現(xiàn)
其實是避凝,而
其實是舞萄。所以可以寫出
這就是用中的元素寫出的求導(dǎo)表達(dá)式,至此我們得出了答案管削。
綜上所述倒脓,我們可以用鏈?zhǔn)椒▌t來表示向量和矩陣的導(dǎo)數(shù),只需要注意:
清楚說明中間結(jié)果和表示中間結(jié)果的變量含思,
表示出最終導(dǎo)數(shù)中各個元素的鏈?zhǔn)椒▌t崎弃,
對鏈?zhǔn)椒▌t表達(dá)式中的中間結(jié)果適當(dāng)求和。
參考資料:
http://cs231n.stanford.edu/vecDerivs.pdf