2
本文作者: AI研習(xí)社 | 2017-08-04 12:02 |
雷鋒網(wǎng)按:本文原作者 YJango,本文原載于其知乎專欄——超智能體。雷鋒網(wǎng)已獲得原作者授權(quán)。
為了研究神經(jīng)網(wǎng)絡(luò),我們必須要對什么網(wǎng)絡(luò)是什么有一個(gè)更直觀的認(rèn)識。
神經(jīng)網(wǎng)絡(luò)是由一層一層構(gòu)建的,那么每層究竟在做什么?
數(shù)學(xué)式子:,其中
是輸入向量,
是輸出向量,
是偏移向量,
是權(quán)重矩陣,
是激活函數(shù)。每一層僅僅是把輸入
經(jīng)過如此簡單的操作得到
。
數(shù)學(xué)理解:通過如下 5 種對輸入空間(輸入向量的集合)的操作,完成 輸入空間 —> 輸出空間 的變換 (矩陣的行空間到列空間)。 注:用 “空間” 二字的原因是被分類的并不是單個(gè)事物,而是一類事物??臻g是指這類事物所有個(gè)體的集合。
1. 升維 / 降維
2. 放大 / 縮小
3. 旋轉(zhuǎn)
4. 平移
5. “彎曲” 這 5 種操作中,1,2,3 的操作由完成,4 的操作是由
完成,5 的操作則是由
來實(shí)現(xiàn)。
每層神經(jīng)網(wǎng)絡(luò)的數(shù)學(xué)理解:用線性變換跟隨著非線性變化,將輸入空間投向另一個(gè)空間。
物理理解:對 的理解就是通過組合形成新物質(zhì)。
又符合了我們所處的世界都是非線性的特點(diǎn)。
情景:是二維向量,維度是碳原子和氧原子的數(shù)量
,數(shù)值且定為
,若確定
是三維向量,就會形成如下網(wǎng)絡(luò)的形狀 (神經(jīng)網(wǎng)絡(luò)的每個(gè)節(jié)點(diǎn)表示一個(gè)維度)。通過改變權(quán)重的值,可以獲得若干個(gè)不同物質(zhì)。右側(cè)的節(jié)點(diǎn)數(shù)決定了想要獲得多少種不同的新物質(zhì)。(矩陣的行數(shù))
1. 如果權(quán)重 W 的數(shù)值如(1),那么網(wǎng)絡(luò)的輸出 就會是三個(gè)新物質(zhì),[二氧化碳,臭氧,一氧化碳]。
(1)
2. 也可以減少右側(cè)的一個(gè)節(jié)點(diǎn),并改變權(quán)重 W 至(2),那么輸出 就會是兩個(gè)新物質(zhì),
。
(2)
3. 如果希望通過層網(wǎng)絡(luò)能夠從 [C, O] 空間轉(zhuǎn)變到空間的話,那么網(wǎng)絡(luò)的學(xué)習(xí)過程就是將 W 的數(shù)值變成盡可能接近 (1) 的過程 。如果再加一層,就是通過組合
這三種基礎(chǔ)物質(zhì),形成若干更高層的物質(zhì)。
4. 重要的是這種組合思想,組合成的東西在神經(jīng)網(wǎng)絡(luò)中并不需要有物理意義。
每層神經(jīng)網(wǎng)絡(luò)的物理理解:通過現(xiàn)有的不同物質(zhì)的組合形成新物質(zhì)。
現(xiàn)在我們知道了每一層的行為,但這種行為又是如何完成識別任務(wù)的呢?
一維情景:以分類為例,當(dāng)要分類正數(shù)、負(fù)數(shù)、零,三類的時(shí)候,一維空間的直線可以找到兩個(gè)超平面(比當(dāng)前空間低一維的子空間。當(dāng)前空間是直線的話,超平面就是點(diǎn))分割這三類。但面對像分類奇數(shù)和偶數(shù)無法找到可以區(qū)分它們的點(diǎn)的時(shí)候,我們借助 x % 2(取余)的轉(zhuǎn)變,把 x 變換到另一個(gè)空間下來比較,從而分割。
二維情景:平面的四個(gè)象限也是線性可分。但下圖的紅藍(lán)兩條線就無法找到一超平面去分割。
神經(jīng)網(wǎng)絡(luò)的解決方法依舊是轉(zhuǎn)換到另外一個(gè)空間下,用的是所說的 5 種空間變換操作。比如下圖就是經(jīng)過放大、平移、旋轉(zhuǎn)、扭曲原二維空間后,在三維空間下就可以成功找到一個(gè)超平面分割紅藍(lán)兩線 (同 SVM 的思路一樣)。
上面是一層神經(jīng)網(wǎng)絡(luò)可以做到的,如果把 當(dāng)做新的輸入再次用這 5 種操作進(jìn)行第二遍空間變換的話,網(wǎng)絡(luò)也就變?yōu)榱硕?。最終輸出是
。 設(shè)想網(wǎng)絡(luò)擁有很多層時(shí),對原始輸入空間的 “扭曲力” 會大幅增加,如下圖,最終我們可以輕松找到一個(gè)超平面分割空間。
當(dāng)然也有如下圖失敗的時(shí)候,關(guān)鍵在于 “如何扭曲空間”。所謂監(jiān)督學(xué)習(xí)就是給予神經(jīng)網(wǎng)絡(luò)網(wǎng)絡(luò)大量的訓(xùn)練例子,讓網(wǎng)絡(luò)從訓(xùn)練例子中學(xué)會如何變換空間。每一層的權(quán)重 W 就控制著如何變換空間,我們最終需要的也就是訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)的所有層的權(quán)重矩陣。
這里有非常棒的可視化空間變換 demo,一定要打開嘗試并感受這種扭曲過程。更多內(nèi)容請看 Neural Networks, Manifolds, and Topology。
線性可分視角:神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)就是學(xué)習(xí)如何利用矩陣的線性變換加激活函數(shù)的非線性變換,將原始輸入空間投向線性可分 / 稀疏的空間去分類 / 回歸。
增加節(jié)點(diǎn)數(shù):增加維度,即增加線性轉(zhuǎn)換能力。
增加層數(shù):增加激活函數(shù)的次數(shù),即增加非線性轉(zhuǎn)換次數(shù)。
類比:回想上文由碳氧原子通過不同組合形成若干分子的例子。從分子層面繼續(xù)迭代這種組合思想,可以形成 DNA,細(xì)胞,組織,器官,最終可以形成一個(gè)完整的人。繼續(xù)迭代還會有家庭,公司,國家等。這種現(xiàn)象在身邊隨處可見。并且原子的內(nèi)部結(jié)構(gòu)與太陽系又驚人的相似。不同層級之間都是以類似的幾種規(guī)則再不斷形成新物質(zhì)。你也可能聽過分形學(xué)這三個(gè)字??赏ㄟ^觀看從 1 米到 150 億光年來感受自然界這種層級現(xiàn)象的普遍性。
人臉識別情景:我們可以模擬這種思想并應(yīng)用在畫面識別上。由像素組成菱角再組成五官最后到不同的人臉。每一層代表不同的不同的物質(zhì)層面 (如分子層)。而每層的 W 存儲著如何組合上一層的物質(zhì)從而形成新物質(zhì)。 如果我們完全掌握一架飛機(jī)是如何從分子開始一層一層形成的,拿到一堆分子后,我們就可以判斷他們是否可以以此形成方式,形成一架飛機(jī)。 附:Tensorflow playground展示了數(shù)據(jù)是如何 “流動” 的。
物質(zhì)組成視角:神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程就是學(xué)習(xí)物質(zhì)組成方式的過程。
增加節(jié)點(diǎn)數(shù):增加同一層物質(zhì)的種類,比如 118 個(gè)元素的原子層就有 118 個(gè)節(jié)點(diǎn)。
增加層數(shù):增加更多層級,比如分子層,原子層,器官層,并通過判斷更抽象的概念來識別物體。
知道了神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程就是學(xué)習(xí)控制著空間變換方式(物質(zhì)組成方式)的權(quán)重矩陣后,接下來的問題就是如何學(xué)習(xí)每一層的權(quán)重矩陣 。
既然我們希望網(wǎng)絡(luò)的輸出盡可能的接近真正想要預(yù)測的值。那么就可以通過比較當(dāng)前網(wǎng)絡(luò)的預(yù)測值和我們真正想要的目標(biāo)值,再根據(jù)兩者的差異情況來更新每一層的權(quán)重矩陣(比如,如果網(wǎng)絡(luò)的預(yù)測值高了,就調(diào)整權(quán)重讓它預(yù)測低一些,不斷調(diào)整,直到能夠預(yù)測出目標(biāo)值)。因此就需要先定義 “如何比較預(yù)測值和目標(biāo)值的差異”,這便是損失函數(shù)或目標(biāo)函數(shù)(loss function or objective function),用于衡量預(yù)測值和目標(biāo)值的差異的方程。loss function 的輸出值(loss)越高表示差異性越大。那神經(jīng)網(wǎng)絡(luò)的訓(xùn)練就變成了盡可能的縮小 loss 的過程。 所用的方法是梯度下降(Gradient descent):通過使 loss 值向當(dāng)前點(diǎn)對應(yīng)梯度的反方向不斷移動,來降低 loss。一次移動多少是由學(xué)習(xí)速率(learning rate)來控制的。
然而使用梯度下降訓(xùn)練神經(jīng)網(wǎng)絡(luò)擁有兩個(gè)主要難題。
梯度下降尋找的是 loss function 的局部極小值,而我們想要全局最小值。如下圖所示,我們希望 loss 值可以降低到右側(cè)深藍(lán)色的最低點(diǎn),但 loss 有可能 “卡” 在左側(cè)的局部極小值中。
試圖解決 “卡在局部極小值” 問題的方法分兩大類:
調(diào)節(jié)步伐:調(diào)節(jié)學(xué)習(xí)速率,使每一次的更新 “步伐” 不同。常用方法有:
隨機(jī)梯度下降(Stochastic Gradient Descent (SGD):每次只更新一個(gè)樣本所計(jì)算的梯度
小批量梯度下降(Mini-batch gradient descent):每次更新若干樣本所計(jì)算的梯度的平均值
動量(Momentum):不僅僅考慮當(dāng)前樣本所計(jì)算的梯度;Nesterov 動量(Nesterov Momentum):Momentum 的改進(jìn)
Adagrad、RMSProp、Adadelta、Adam:這些方法都是訓(xùn)練過程中依照規(guī)則降低學(xué)習(xí)速率,部分也綜合動量
優(yōu)化起點(diǎn):合理初始化權(quán)重(weights initialization)、預(yù)訓(xùn)練網(wǎng)絡(luò)(pre-train),使網(wǎng)絡(luò)獲得一個(gè)較好的 “起始點(diǎn)”,如最右側(cè)的起始點(diǎn)就比最左側(cè)的起始點(diǎn)要好。常用方法有:高斯分布初始權(quán)重(Gaussian distribution)、均勻分布初始權(quán)重(Uniform distribution)、Glorot 初始權(quán)重、He 初始權(quán)、稀疏矩陣初始權(quán)重(sparse matrix)
機(jī)器學(xué)習(xí)所處理的數(shù)據(jù)都是高維數(shù)據(jù),該如何快速計(jì)算梯度、而不是以年來計(jì)算。 其次如何更新隱藏層的權(quán)重? 解決方法是:計(jì)算圖:反向傳播算法這里的解釋留給非常棒的 Computational Graphs: Backpropagation需要知道的是,反向傳播算法是求梯度的一種方法。如同快速傅里葉變換(FFT)的貢獻(xiàn)。 而計(jì)算圖的概念又使梯度的計(jì)算更加合理方便。
下面就結(jié)合圖簡單瀏覽一下訓(xùn)練和識別過程,并描述各個(gè)部分的作用。要結(jié)合圖解閱讀以下內(nèi)容。但手機(jī)顯示的圖過小,最好用電腦打開。
收集訓(xùn)練集(train data):也就是同時(shí)有 input 以及對應(yīng) label 的數(shù)據(jù)。每個(gè)數(shù)據(jù)叫做訓(xùn)練樣本(sample)。label 也叫 target,也是機(jī)器學(xué)習(xí)中最貴的部分。上圖表示的是我的數(shù)據(jù)庫。假設(shè) input 本別是 x 的維度是 39,label 的維度是 48。
設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)(architecture):確定層數(shù)、每一隱藏層的節(jié)點(diǎn)數(shù)和激活函數(shù),以及輸出層的激活函數(shù)和損失函數(shù)。上圖用的是兩層隱藏層(最后一層是輸出層)。隱藏層所用激活函數(shù) a() 是 ReLu,輸出層的激活函數(shù)是線性 linear(也可看成是沒有激活函數(shù))。隱藏層都是 1000 節(jié)點(diǎn)。損失函數(shù) L() 是用于比較距離 MSE:mean((output - target)^2)。MSE 越小表示預(yù)測效果越好。訓(xùn)練過程就是不斷減小 MSE 的過程。到此所有數(shù)據(jù)的維度都已確定:
訓(xùn)練數(shù)據(jù):
權(quán)重矩陣:
偏移向量:
網(wǎng)絡(luò)輸出:
數(shù)據(jù)預(yù)處理(preprocessing):將所有樣本的 input 和 label 處理成能夠使用神經(jīng)網(wǎng)絡(luò)的數(shù)據(jù),label 的值域符合激活函數(shù)的值域。并簡單優(yōu)化數(shù)據(jù)以便讓訓(xùn)練易于收斂。比如中心化(mean subtraction)、歸一化(normalization)、主成分分析(PCA)、白化(whitening)。假設(shè)上圖的 input 和 output 全都經(jīng)過了中心化和歸一化。
權(quán)重初始化(weights initialization):在訓(xùn)練前不能為空,要初始化才能夠計(jì)算 loss 從而來降低。
初始化決定了 loss 在 loss function 中從哪個(gè)點(diǎn)開始作為起點(diǎn)訓(xùn)練網(wǎng)絡(luò)。上圖用均勻分布初始權(quán)重(Uniform distribution)。
訓(xùn)練網(wǎng)絡(luò)(training):訓(xùn)練過程就是用訓(xùn)練數(shù)據(jù)的 input 經(jīng)過網(wǎng)絡(luò)計(jì)算出 output,再和 label 計(jì)算出 loss,再計(jì)算出 gradients 來更新 weights 的過程。
正向傳遞:,算當(dāng)前網(wǎng)絡(luò)的預(yù)測值
計(jì)算 loss:
計(jì)算梯度:從 loss 開始反向傳播計(jì)算每個(gè)參數(shù)(parameters)對應(yīng)的梯度(gradients)。這里用 Stochastic Gradient Descent (SGD) 來計(jì)算梯度,即每次更新所計(jì)算的梯度都是從一個(gè)樣本計(jì)算出來的。傳統(tǒng)的方法 Gradient Descent 是正向傳遞所有樣本來計(jì)算梯度。SGD 的方法來計(jì)算梯度的話,loss function 的形狀如下圖所示會有變化,這樣在更新中就有可能 “跳出” 局部最小值。
更新權(quán)重:這里用最簡單的方法來更新,即所有參數(shù)都
預(yù)測新值:訓(xùn)練過所有樣本后,打亂樣本順序再次訓(xùn)練若干次。訓(xùn)練完畢后,當(dāng)再來新的數(shù)據(jù) input,就可以利用訓(xùn)練的網(wǎng)絡(luò)來預(yù)測了。這時(shí)的 output 就是效果很好的預(yù)測值了。下圖是一張實(shí)際值和預(yù)測值的三組對比圖。輸出數(shù)據(jù)是 48 維,這里只取 1 個(gè)維度來畫圖。藍(lán)色的是實(shí)際值,綠色的是實(shí)際值。最上方的是訓(xùn)練數(shù)據(jù)的對比圖,而下方的兩行是神經(jīng)網(wǎng)絡(luò)模型從未見過的數(shù)據(jù)預(yù)測對比圖。(不過這里用的是 RNN,主要是為了讓大家感受一下效果)
注:此部分內(nèi)容不是這篇文章的重點(diǎn),但為了理解深層神經(jīng)網(wǎng)絡(luò),需要明白最基本的訓(xùn)練過程。 若能理解訓(xùn)練過程是通過梯度下降盡可能縮小 loss 的過程即可。 若有理解障礙,可以用 python 實(shí)踐一下從零開始訓(xùn)練一個(gè)神經(jīng)網(wǎng)絡(luò),體會整個(gè)訓(xùn)練過程。若有時(shí)間則可以再體會一下計(jì)算圖自動求梯度的方便利用 TensorFlow。
打開網(wǎng)頁后,總體來說,藍(lán)色代表正值,黃色代表負(fù)值。拿分類任務(wù)來分析。
數(shù)據(jù):在二維平面內(nèi),若干點(diǎn)被標(biāo)記成了兩種顏色。黃色,藍(lán)色,表示想要區(qū)分的兩類。你可以把平面內(nèi)的任意點(diǎn)標(biāo)記成任意顏色。網(wǎng)頁給你提供了 4 種規(guī)律。神經(jīng)網(wǎng)絡(luò)會根據(jù)你給的數(shù)據(jù)訓(xùn)練,再分類相同規(guī)律的點(diǎn)。
輸入:在二維平面內(nèi),你想給網(wǎng)絡(luò)多少關(guān)于 “點(diǎn)” 的信息。從顏色就可以看出來,左邊是負(fù),右邊是正,
表示此點(diǎn)的橫坐標(biāo)值。同理,
表示此點(diǎn)的縱坐標(biāo)值。
是關(guān)于橫坐標(biāo)值的 “拋物線” 信息。你也可以給更多關(guān)于這個(gè)點(diǎn)的信息。給的越多,越容易被分開。
連接線:表示權(quán)重,藍(lán)色表示用神經(jīng)元的原始輸出,黃色表示用負(fù)輸出。深淺表示權(quán)重的絕對值大小。鼠標(biāo)放在線上可以看到具體值。也可以更改。在(1)中,當(dāng)把輸出的一個(gè)權(quán)重改為 - 1 時(shí),
的形狀直接倒置了。不過還需要考慮激活函數(shù)。(1)中用的是 linear。在(2)中,當(dāng)換成 sigmoid 時(shí),你會發(fā)現(xiàn)沒有黃色區(qū)域了。因?yàn)?sigmoid 的值域是 (0,1)
(1)
(2)
輸出:黃色背景顏色都被歸為黃點(diǎn)類,藍(lán)色背景顏色都被歸為藍(lán)點(diǎn)類。深淺表示可能性的強(qiáng)弱。
上圖中所有在黃色背景顏色的點(diǎn)都會被分類為 “黃點(diǎn) “,同理,藍(lán)色區(qū)域被分成藍(lán)點(diǎn)。在上面的分類分布圖中你可以看到每一層通過上一層信息的組合所形成的。權(quán)重(那些連接線)控制了 “如何組合”。神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)也就是從數(shù)據(jù)中學(xué)習(xí)那些權(quán)重。Tensorflow playground 所表現(xiàn)出來的現(xiàn)象就是 “在我文章里所寫的 “物質(zhì)組成思想”,這也是為什么我把 Tensorflow playground放在了那一部分。
不過你要是把 Tensorflow 的個(gè)名字拆開來看的話,是 tensor(張量)的 flow(流動)。Tensorflow playground 的作者想要闡述的側(cè)重點(diǎn)是 “張量如何流動” 的。
5 種空間變換的理解:Tensorflow playground 下沒有體現(xiàn) 5 種空間變換的理解。需要打開這個(gè)網(wǎng)站嘗試:ConvNetJS demo: Classify toy 2D data
左側(cè)是原始輸入空間下的分類圖,右側(cè)是轉(zhuǎn)換后的高維空間下的扭曲圖。
最終的扭曲效果是所有綠點(diǎn)都被扭曲到了一側(cè),而所有紅點(diǎn)都被扭曲到了另一側(cè)。這樣就可以線性分割(用超平面(這里是一個(gè)平面)在中間分開兩類)
文章的最后稍微提一下深層神經(jīng)網(wǎng)絡(luò)。深層神經(jīng)網(wǎng)絡(luò)就是擁有更多層數(shù)的神經(jīng)網(wǎng)絡(luò)。
按照上文在理解視角中所述的觀點(diǎn),可以想出下面兩條理由關(guān)于為什么更深的網(wǎng)絡(luò)會更加容易識別,增加容納變異體(variation)(紅蘋果、綠蘋果)的能力、魯棒性(robust)。
數(shù)學(xué)視角:變異體(variation)很多的分類的任務(wù)需要高度非線性的分割曲線。不斷的利用那 5 種空間變換操作將原始輸入空間像 “捏橡皮泥一樣” 在高維空間下捏成更為線性可分 / 稀疏的形狀。
物理視角:通過對 “抽象概念” 的判斷來識別物體,而非細(xì)節(jié)。比如對 “飛機(jī)” 的判斷,即便人類自己也無法用語言或者若干條規(guī)則來解釋自己如何判斷一個(gè)飛機(jī)。因?yàn)槿四X中真正判斷的不是是否 “有機(jī)翼”、“能飛行” 等細(xì)節(jié)現(xiàn)象,而是一個(gè)抽象概念。層數(shù)越深,這種概念就越抽象,所能涵蓋的變異體就越多,就可以容納戰(zhàn)斗機(jī),客機(jī)等很多種不同種類的飛機(jī)。
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。