0
雷鋒網(wǎng)按:本文原作者Aaron Yang,原載于知乎專欄。雷鋒網(wǎng)已獲得作者授權(quán)。
導(dǎo)讀:首先我想在這里聲明的是,本篇文章針對的是一些已經(jīng)具備一定神經(jīng)網(wǎng)絡(luò)知識的人。意在幫助大家梳理神經(jīng)網(wǎng)絡(luò)中涉及的數(shù)學(xué)知識,以及理解其物理含義。希望大家讀過之后,可以使大家對于神經(jīng)網(wǎng)絡(luò)有更多角度的理解,幫助大家推導(dǎo)以及理解其中的數(shù)學(xué)公式。(本篇文章在敘述方式上多以白話為主,意在讓大多數(shù)人有形象的概念,所以在嚴謹性與通俗性上難免會出現(xiàn)失衡問題,希望大家理解。分享的目的即分享,非教授?。?/p>
1. 線性代數(shù)
矩陣乘以向量的物理含義
矩陣乘法我更喜歡稱作線性轉(zhuǎn)換。一個矩陣乘以向量中,矩陣相當于一個轉(zhuǎn)換函數(shù),而向量是一個輸入,已知了輸入和函數(shù),我們就可以知道輸出。這里需要強調(diào)的是,向量共有兩種形式,一種為列向量,一種為行向量。在默認情況下,向量是指列向量。大部分的國內(nèi)教材中,并沒有特意提到這一點。很多人接觸到編寫代碼時,都是以行向量的形式開始學(xué)習(xí),導(dǎo)致后續(xù)有很多概念產(chǎn)生混淆。在本文中,若無特殊說明,向量的形式默認為列向量。
首先我們先看以下的 2 道熱身題:
1. 假設(shè)讀者并不知道矩陣乘法的運算準則,能否在假想的幾何空間中,快速地反應(yīng)出答案是多少呢?給大家 30s。(記住,不可以通過運算法則來進行計算)
2. 同樣地,利用假想的幾何空間想象,是否可以立即解答出矩陣是什么?
如果讀者可以快速解答出上面的問題,那么恭喜您,您已經(jīng)了解了線性代數(shù)空間轉(zhuǎn)換的本質(zhì);如果沒有解答出,那就是我寫這篇文章的意義。
先拋開上面兩道題,這里來介紹一下矩陣。
線性代數(shù)與空間幾何是存在緊密的聯(lián)系的?;舅械木€性代數(shù)都有其對應(yīng)的幾何表示方法。理解幾何,是理解線性代數(shù)的核心所在。以二維空間作為例子,與
是二維空間的單位基向量。任何的向量都是由這兩個單位基向量線性組合而成,并表示出來,例如
。
現(xiàn)在,我們來看一張動圖:
更多動圖的信息請關(guān)注 3Blue1Brown主頁,里面有大量沖破你數(shù)學(xué)世界觀的知識。3Blue1Brown 還有視頻集。B 站有做了很贊的漢化,不過更鼓勵大家去看英文原版視頻。
YouTube 視頻集鏈接
B 站漢化視頻集鏈接
在這張動圖的開始的階段,綠色向量代表 ,而紅色向量代表
。我們盯住這兩個基向量,觀察到在動圖的末尾,這兩個向量分別落在了
與
,那么,這兩個基向量組成的坐標系也隨著這兩個基向量的變換而線性變換,形成了動圖末尾中藍色直線組成的二維坐標。假設(shè)經(jīng)歷了上圖的坐標變換,原來的向量
,現(xiàn)在到了何處呢?
通過仔細觀察動圖 (一點一點數(shù)格子) 我們可以看到,原來的向量 變換為向量
。
我們來繼續(xù)看看表示方法:
原來: ,變換后:
。
這其中的區(qū)別就是基向量不一樣了,而線性組合的系數(shù) 與
保持固定不變。
我們把變換后的基向量放在一起,變?yōu)榫仃嚕?/p>
這就是矩陣的由來,其實質(zhì)就是將坐標整體線性變換。向量 在經(jīng)過線性變換
變?yōu)橄蛄?
表示形式為:
(注意:這里的表示順序為變換矩陣在左,向量為列向量在右側(cè)。)
我們在來看另一幅動圖來實踐一下,找到這幅動圖的線性變換矩陣是什么?
根據(jù)上面的方法,鎖定綠色與紅色基向量末尾的位置,這幅動圖的線性變換矩陣為 :
而其原來所有坐標系上的向量都隨之變換發(fā)生改變。
現(xiàn)在再回頭看看上面的兩道題?是否能夠通過想象的空間去快速找到答案?
上面我們講的是方陣,那么如果不是方陣呢?比如一個 的矩陣,或者一個
的矩陣呢? (以下我們只用中括號來代表具體矩陣的形狀,具體數(shù)字并不重要。)
我們來以 矩陣形式舉例,如下所示:
的矩陣的物理含義就是把一個向量從二維表示方法轉(zhuǎn)換到三維表示。而轉(zhuǎn)換矩陣的每一列就代表:將二維空間對應(yīng)的基向量轉(zhuǎn)換到三維的樣子。將這種變換規(guī)律映射到其他變換的二維向量;同樣地,
矩陣物理含義就是將一個向量從三維表示轉(zhuǎn)換成二維表示。轉(zhuǎn)換矩陣每一列代表:三維空間的基向量映射到二維空間之后的樣子。將這種變換規(guī)律映射到其他變換的三維向量。
現(xiàn)在,我們再進行下一步操作。如果我們假設(shè)讓一個 4 維向量,先轉(zhuǎn)化為 3 維向量,在轉(zhuǎn)化為二維向量,那么它的形式是什么樣子的呢?
第一步: 第二步:
將兩步合并到一起為:
通過以上形式,我們可以發(fā)現(xiàn)如果將一個列向量經(jīng)過多次線性轉(zhuǎn)換,他的順序應(yīng)該是從右至左的順序。這就是標準的線性代數(shù)書中所講到的連續(xù)線性變換的形式,從右至左也是線性代數(shù)數(shù)學(xué)家習(xí)慣的順序。
但是,在很多神經(jīng)網(wǎng)絡(luò)包括深度學(xué)習(xí)網(wǎng)絡(luò)的課程中我們可以看到,更符合我們閱讀的順序是將一個輸入數(shù)據(jù)拿進來之后經(jīng)過一次矩陣轉(zhuǎn)換,從左至右得到輸出結(jié)果。他們之間有什么聯(lián)系呢?
通過觀察我們可以知道,這其中最大的原因在于數(shù)據(jù)的形式,也就是上文中提到的每一個樣本表示方法是列向量還是行向量。如果是列向量,變換的順序就是從右至左;如果是行向量,變換順序就是從左至右。而相應(yīng)的矩陣形狀也發(fā)生反轉(zhuǎn)。
對比
所有形式為矩陣乘以矩陣
神經(jīng)網(wǎng)絡(luò)中,大家都希望最終的形式為矩陣乘以矩陣,不希望中間有任何向量的存在,這樣顯得更酷,實際上計算也更快。這很簡單,現(xiàn)在我們只差最后一步。當我們把所有數(shù)據(jù)放在一起,還是如上方有 個
維行向量形式的數(shù)據(jù),我們將這些行向量數(shù)據(jù)堆疊在一起形成
的矩陣,經(jīng)過多個矩陣的變換之后輸出為一個
的矩陣。這樣,在計算過程中,全部為不同形狀的矩陣。當然,大家也可以想想如果是列向量該是什么形式。
以上內(nèi)容想說明的就是,無論是上方哪一種形式,都是正確的。關(guān)鍵看輸入的數(shù)據(jù)是什么形式,形式?jīng)Q定了數(shù)據(jù)變換的順序,以及設(shè)計矩陣的形狀。
通過以上的形式,其實神經(jīng)網(wǎng)絡(luò)前向傳導(dǎo)和向量在不同維度間的連續(xù)線性變換及其相似。唯一不同的一點就在于,在每次線性轉(zhuǎn)換后,神經(jīng)網(wǎng)絡(luò)可以加一個非線性激活函數(shù),使線性轉(zhuǎn)換變?yōu)榉蔷€性轉(zhuǎn)換。實際上,也就這么點區(qū)別。而非線性激活函數(shù)并不會改變數(shù)據(jù)的形狀,對后續(xù)矩陣乘法不造成任何影響。
小結(jié)一下上面線性代數(shù)部分我們發(fā)現(xiàn)了什么:
線性代數(shù)中的向量默認形式是列向量。
矩陣的實質(zhì)就是將坐標整體線性變換。
矩陣的組合以列向量組合在一起,其代表各自的基向量變換之后的新向量是什么。
矩陣與向量相乘,矩陣與矩陣相乘,順序很重要,其決定權(quán)在于實際問題中樣本的表達形式,是行向量還是列向量。
神經(jīng)網(wǎng)絡(luò)的前向傳導(dǎo)與線性代數(shù)中連續(xù)對于向量的線性變換過程極其相似,只是在層與層之間多了非線性激活函數(shù)。
神經(jīng)網(wǎng)絡(luò)求的是什么?其實就是上方這么多矩陣中每一個位置的數(shù)字是多少?這就是我們最終的目的。那么如何求?這就需要微積分中鏈式法則的知識了。
2. 微積分
鏈式反向推導(dǎo)之所以很頭大,很大原因在于它將微積分求導(dǎo)和矩陣知識揉在一起。我盡量用盡量少的公式,記住極少的關(guān)鍵點,幫助大家去順利的推導(dǎo)神經(jīng)網(wǎng)絡(luò)中運用到的鏈式推導(dǎo)。這樣對于公司的面試,還是實際科研過程中均不會發(fā)蒙。
明確目標
我們都知道,神經(jīng)網(wǎng)絡(luò)的目的是訓(xùn)練網(wǎng)絡(luò)中的參數(shù),即矩陣中每一個位置的數(shù)值。我們通過構(gòu)建對于這些參數(shù)的損失函數(shù),最終找到損失函數(shù) 最小值時的參數(shù)。最初的想法就是高中學(xué)習(xí)的求導(dǎo)的思路,只要導(dǎo)數(shù)等于
(這里涉及矩陣求導(dǎo)),就找到了極值,也就找到了答案。但是由于網(wǎng)絡(luò)巨大(輸入數(shù)據(jù)維度大,每層網(wǎng)絡(luò)節(jié)點多,網(wǎng)絡(luò)層數(shù)多),計算資源消耗的也巨大(涉及矩陣求逆),以現(xiàn)在的設(shè)備,我們并不能一步到位的求出最小值,這也是為什么我們在神經(jīng)網(wǎng)絡(luò)中使用梯度下降法一步一步逼近最小值的原因。其公式如下:
這就是梯度下降的公式。 就是我們要所求的參數(shù),它是一個轉(zhuǎn)換矩陣。而
是一個標量,即一個數(shù)字(以下用
來表示)。
是通過迭代一步一步優(yōu)化出來的,在初始的時候隨機賦值。所以我們的目標就是搞清楚
是如何求出來的。
細化在神經(jīng)網(wǎng)絡(luò)每一層,目標就是:
目標明確了,那么我們是如何牽扯到鏈式求導(dǎo)呢?
明確幾個定義
先上圖,一個前饋神經(jīng)網(wǎng)絡(luò)如下所示:
這里展示了一個非常簡單的三層神經(jīng)網(wǎng)絡(luò),更多的層次大家可以開腦洞。圖中的的公式大家應(yīng)該已經(jīng)非常熟悉。 代表神將網(wǎng)絡(luò)每層的輸出值,是一個向量(一般是行向量);第一層的輸出值就是輸入值
;
代表線性輸出;
代表激活函數(shù);
為最終的輸出值;每一個字符的上表代表其層數(shù)。
這里需要特別注意地是對于不同變量的上標層數(shù)對應(yīng)關(guān)系一定不要弄混淆。比如 是神經(jīng)網(wǎng)絡(luò)第
層與第
層之間的轉(zhuǎn)換矩陣,即
為第
層與第
層的轉(zhuǎn)換矩陣。
接下來,主角登場。我們要想知道神經(jīng)網(wǎng)絡(luò)如何反向推導(dǎo),只需記住這里的唯一定義的變量 即可。
定義:
在一些翻譯的變量名中叫做 “殘差”。但是它是什么名字并不重要,但建議不要根據(jù)這個名字去揣測它的物理含義。如果想明白了那當然很好,但是若想不透徹很容易與其他概念弄混淆,最后云里霧里地以為自己懂了,但是自己推的時候仍然會錯??偠灾?,只把它當做一個定義就好,背下來了就是了。而且,在鏈式推導(dǎo)中,只需要記住這個,其他的都好推。(注意:
也是向量,其形狀與
一致。)
開始真正的推導(dǎo)
我們的目標:逐層計算出
將目標展開:
我們看到,我們把目標分為前后兩部分。
第一部分,根據(jù) 的定義可得到
第二部分,根據(jù) 的定義可以得到
所以,我們的目標 或者
到這里,我們很輕松地導(dǎo)出了我們目標的通項公式,是不是很簡單?就是做了個分解,然后分別求導(dǎo),再組合在一起,就可以了。在這里,我們可以得到另外一條很有意思的結(jié)論,那就是我們求每一層轉(zhuǎn)換矩陣的導(dǎo)數(shù)(參數(shù)的導(dǎo)數(shù))與最終目標函數(shù) 的具體形式無關(guān),這點是不是很神奇?
(注意:我們需要驗證分解的兩項是否可以進行矩陣乘法運算,并且最終矩陣的形狀符合規(guī)定。這里又與變量自身的形狀有關(guān)。我們觀察發(fā)現(xiàn),在分解的第一部分中,最后一項多出了一個字符 ,這里代表轉(zhuǎn)置。這個是矩陣求導(dǎo)的法則,通過最后公式的法則也可以驗證。這部分有些復(fù)雜。但是,我們可以完全繞過去這樣復(fù)雜的關(guān)系。這里有個小技巧:若記不住這兩項矩陣相乘誰在前,誰在后,誰轉(zhuǎn)置,誰不動。只要記住
與
的形狀是一致的,在求出
與
之后,根據(jù)矩陣乘法的法則,隨便試出最后相乘的形狀符合
的形狀即可,很快就可以試出正確答案。)
只剩最后一步
所謂反向推導(dǎo),就是根據(jù)后一項的結(jié)果去計算前一項。我們 “通項公式” 搞到手了,那么最后一層的 “殘差” 是多少呢?
我們用 來代表最后一層。根據(jù)
的公式,我們可以依然進行如下分解:
從這個公式中我們可以看出我們將最后一層 “殘差” 又分解為兩部分。下面,我們分別看看在一般的回歸問題與二分類問題中 到底長什么樣子。
1. 回歸問題
損失函數(shù):
求解分解后的第一部分:因為在回歸問題中,最后一層是沒有激活函數(shù)的,或者說激活函數(shù)為 乘以其輸入值。所以,激活函數(shù)的導(dǎo)數(shù)就為
。則有:
求解分解后的第二部分:
所以最終,我們求得:
2. 二分類問題
損失函數(shù):
求解分解后的第一部分:二分類問題中,激活函數(shù) ,其導(dǎo)數(shù)為
。則有:
求解分解后的第二部分:
所以最終,我們求得:
我們驚奇地發(fā)現(xiàn),在對于回歸問題與二分類問題中,雖然損失函數(shù)與最后一層的激活函數(shù)均不一樣,但是其結(jié)果居然是同一個值。這是否是巧合?也許只有深入了解為何這樣設(shè)計損失函數(shù)與激活函數(shù)之后,我們才會知道答案。大家還可以想想,多分類問題的結(jié)果呢?
上述的推導(dǎo)中,我們也可以得到結(jié)論:在最后一層 “殘差” 中,是與損失函數(shù)
和最后一層的激活函數(shù)
兩項有關(guān)的。
小結(jié)一下神經(jīng)網(wǎng)絡(luò)部分的一些要點:
記住前饋網(wǎng)絡(luò)中各個變量上標層數(shù)表達方式。各個教科書上表達可能會存在不同,一定要認真觀察清楚。
牢記 的定義,是推導(dǎo)整個鏈式推導(dǎo)中最重要的一環(huán)。
在神經(jīng)網(wǎng)絡(luò) 層的鏈式推導(dǎo)中,我們的目標是
,將其利用帶有
項進行展開;而在最后一層
層中我們主要推導(dǎo)的目標是
,利用其定義將其展開。
在經(jīng)典的回歸與二分類問題中,其 結(jié)果完全相同,但計算過程卻完全不同。
總結(jié)
希望經(jīng)過上述自己的梳理,大家對于神經(jīng)網(wǎng)絡(luò)中涉及到的數(shù)學(xué)知識有了更進一步形象化的了解。當然,本文中加入大量自己的理解,若有不同意見,歡迎大家來共享 idea。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。