雷鋒網按:本文原作者 YJango,本文原載於其知乎專欄——超智能體。雷鋒網(公眾號:雷鋒網)已獲得原作者授權。
介紹為了研究神經網絡,我們必須要對什麼網絡是什麼有一個更直觀的認識。
一、基本變換:層神經網絡是由一層一層構建的,那麼每層究竟在做什麼?
每層神經網絡的數學理解:用線性變換跟隨著非線性變化,將輸入空間投向另一個空間。<img src="https://static.leiphone.com/uploads/new/article/pic/201708/3ff9ebd942879748f95d91555321698f.jpg" data-rawwidth="144" data-rawheight="164" class="content_image" width="144" _src="https://static.leiphone.com/uploads/new/article/pic/201708/3ff9ebd942879748f95d91555321698f.jpg"/>
每層神經網絡的物理理解:通過現有的不同物質的組合形成新物質。二、理解視角:現在我們知道了每一層的行為,但這種行為又是如何完成識別任務的呢?
數學視角:「線性可分」<img src="https://static.leiphone.com/uploads/new/article/pic/201708/4a29ebcdbc580732f249253dfd5c6325.jpg" data-rawwidth="370" data-rawheight="63" class="content_image" width="370" _src="https://static.leiphone.com/uploads/new/article/pic/201708/4a29ebcdbc580732f249253dfd5c6325.jpg"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/08662ec286aa83566fc02ad36b7ab184.jpg" data-rawwidth="197" data-rawheight="204" class="content_image" width="197" _src="https://static.leiphone.com/uploads/new/article/pic/201708/08662ec286aa83566fc02ad36b7ab184.jpg"/>
神經網絡的解決方法依舊是轉換到另外一個空間下,用的是所說的 5 種空間變換操作。比如下圖就是經過放大、平移、旋轉、扭曲原二維空間後,在三維空間下就可以成功找到一個超平面分割紅藍兩線 (同 SVM 的思路一樣)。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/6d3997dcebb8b2d431a292c3bef44d97.jpg" data-rawwidth="197" data-rawheight="198" class="content_image" width="197" _src="https://static.leiphone.com/uploads/new/article/pic/201708/6d3997dcebb8b2d431a292c3bef44d97.jpg"/>
上面是一層神經網絡可以做到的,如果把 當做新的輸入再次用這 5 種操作進行第二遍空間變換的話,網絡也就變為了二層。最終輸出是。 設想網絡擁有很多層時,對原始輸入空間的 「扭曲力」 會大幅增加,如下圖,最終我們可以輕鬆找到一個超平面分割空間。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/1a059f45f735f249b448c97280e550ef.gif" data-rawwidth="239" data-rawheight="233" data-thumbnail="https://static.leiphone.com/uploads/new/article/pic/201708/2e5cd18516c20235636108232aaf533e.jpg" class="content_image" width="239" _src="https://static.leiphone.com/uploads/new/article/pic/201708/1a059f45f735f249b448c97280e550ef.gif"/>
當然也有如下圖失敗的時候,關鍵在於 「如何扭曲空間」。所謂監督學習就是給予神經網絡網絡大量的訓練例子,讓網絡從訓練例子中學會如何變換空間。每一層的權重 W 就控制著如何變換空間,我們最終需要的也就是訓練好的神經網絡的所有層的權重矩陣。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/eb7d8c68190405b4d0f7a65869c1b227.gif" data-rawwidth="239" data-rawheight="233" data-thumbnail="https://static.leiphone.com/uploads/new/article/pic/201708/adf56ee267562ede061b26adf997ef6f.jpg" class="content_image" width="239" _src="https://static.leiphone.com/uploads/new/article/pic/201708/eb7d8c68190405b4d0f7a65869c1b227.gif"/>
這裡有非常棒的可視化空間變換 demo,一定要打開嘗試並感受這種扭曲過程。更多內容請看 Neural Networks, Manifolds, and Topology。
線性可分視角:神經網絡的學習就是學習如何利用矩陣的線性變換加激活函數的非線性變換,將原始輸入空間投向線性可分 / 稀疏的空間去分類 / 回歸。<img src="https://static.leiphone.com/uploads/new/article/pic/201708/3272533ad6055f6af84000f0d9483497.jpg" data-rawwidth="488" data-rawheight="340" class="origin_image zh-lightbox-thumb" width="488" data-original="https://pic1.zhimg.com/v2-3ec7216f7ab84dac089836b166c0ae28_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201708/3272533ad6055f6af84000f0d9483497.jpg"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/2645069b637ec0528082379f59f7ce4b.png" data-rawwidth="624" data-rawheight="218" class="origin_image zh-lightbox-thumb" width="624" data-original="https://pic4.zhimg.com/v2-82f05552fd2ddde28a0ef20814d7acbb_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/2645069b637ec0528082379f59f7ce4b.png"/>
物質組成視角:神經網絡的學習過程就是學習物質組成方式的過程。知道了神經網絡的學習過程就是學習控制著空間變換方式(物質組成方式)的權重矩陣後,接下來的問題就是如何學習每一層的權重矩陣 。
如何訓練:既然我們希望網絡的輸出儘可能的接近真正想要預測的值。那麼就可以通過比較當前網絡的預測值和我們真正想要的目標值,再根據兩者的差異情況來更新每一層的權重矩陣(比如,如果網絡的預測值高了,就調整權重讓它預測低一些,不斷調整,直到能夠預測出目標值)。因此就需要先定義 「如何比較預測值和目標值的差異」,這便是損失函數或目標函數(loss function or objective function),用于衡量預測值和目標值的差異的方程。loss function 的輸出值(loss)越高表示差異性越大。那神經網絡的訓練就變成了儘可能的縮小 loss 的過程。 所用的方法是梯度下降(Gradient descent):通過使 loss 值向當前點對應梯度的反方向不斷移動,來降低 loss。一次移動多少是由學習速率(learning rate)來控制的。
梯度下降的問題:然而使用梯度下降訓練神經網絡擁有兩個主要難題。
1、局部極小值梯度下降尋找的是 loss function 的局部極小值,而我們想要全局最小值。如下圖所示,我們希望 loss 值可以降低到右側深藍色的最低點,但 loss 有可能 「卡」 在左側的局部極小值中。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/8d1f34de5b4492625d426cab466c9f8d.png" data-rawwidth="420" data-rawheight="250" class="content_image" width="420" _src="https://static.leiphone.com/uploads/new/article/pic/201708/8d1f34de5b4492625d426cab466c9f8d.png"/>
試圖解決 「卡在局部極小值」 問題的方法分兩大類:
調節步伐:調節學習速率,使每一次的更新 「步伐」 不同。常用方法有:
隨機梯度下降(Stochastic Gradient Descent (SGD):每次只更新一個樣本所計算的梯度
小批量梯度下降(Mini-batch gradient descent):每次更新若干樣本所計算的梯度的平均值
動量(Momentum):不僅僅考慮當前樣本所計算的梯度;Nesterov 動量(Nesterov Momentum):Momentum 的改進
Adagrad、RMSProp、Adadelta、Adam:這些方法都是訓練過程中依照規則降低學習速率,部分也綜合動量
優化起點:合理初始化權重(weights initialization)、預訓練網絡(pre-train),使網絡獲得一個較好的 「起始點」,如最右側的起始點就比最左側的起始點要好。常用方法有:高斯分布初始權重(Gaussian distribution)、均勻分布初始權重(Uniform distribution)、Glorot 初始權重、He 初始權、稀疏矩陣初始權重(sparse matrix)
2、梯度的計算機器學習所處理的數據都是高維數據,該如何快速計算梯度、而不是以年來計算。 其次如何更新隱藏層的權重? 解決方法是:計算圖:反向傳播算法這裡的解釋留給非常棒的 Computational Graphs: Backpropagation需要知道的是,反向傳播算法是求梯度的一種方法。如同快速傅立葉變換(FFT)的貢獻。 而計算圖的概念又使梯度的計算更加合理方便。
基本流程圖:下面就結合圖簡單瀏覽一下訓練和識別過程,並描述各個部分的作用。要結合圖解閱讀以下內容。但手機顯示的圖過小,最好用電腦打開。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/1e3e67cb624a1d4ff378927325247bf3.png" data-rawwidth="734" data-rawheight="339" class="origin_image zh-lightbox-thumb" width="734" data-original="https://pic4.zhimg.com/v2-69c014a15afde18a4086950c30e97d1b_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/1e3e67cb624a1d4ff378927325247bf3.png"/>
收集訓練集(train data):也就是同時有 input 以及對應 label 的數據。每個數據叫做訓練樣本(sample)。label 也叫 target,也是機器學習中最貴的部分。上圖表示的是我的資料庫。假設 input 本別是 x 的維度是 39,label 的維度是 48。
設計網絡結構(architecture):確定層數、每一隱藏層的節點數和激活函數,以及輸出層的激活函數和損失函數。上圖用的是兩層隱藏層(最後一層是輸出層)。隱藏層所用激活函數 a() 是 ReLu,輸出層的激活函數是線性 linear(也可看成是沒有激活函數)。隱藏層都是 1000 節點。損失函數 L() 是用於比較距離 MSE:mean((output - target)^2)。MSE 越小表示預測效果越好。訓練過程就是不斷減小 MSE 的過程。到此所有數據的維度都已確定:
數據預處理(preprocessing):將所有樣本的 input 和 label 處理成能夠使用神經網絡的數據,label 的值域符合激活函數的值域。並簡單優化數據以便讓訓練易於收斂。比如中心化(mean subtraction)、歸一化(normalization)、主成分分析(PCA)、白化(whitening)。假設上圖的 input 和 output 全都經過了中心化和歸一化。
權重初始化(weights initialization):在訓練前不能為空,要初始化才能夠計算 loss 從而來降低。初始化決定了 loss 在 loss function 中從哪個點開始作為起點訓練網絡。上圖用均勻分布初始權重(Uniform distribution)。
訓練網絡(training):訓練過程就是用訓練數據的 input 經過網絡計算出 output,再和 label 計算出 loss,再計算出 gradients 來更新 weights 的過程。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/cd1896d89059e20ecdc3d02446fda640.png" data-rawwidth="469" data-rawheight="227" class="origin_image zh-lightbox-thumb" width="469" data-original="https://pic4.zhimg.com/v2-0c0e7f5ffa98c2c1eb87763dd5d1d9a3_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/cd1896d89059e20ecdc3d02446fda640.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/e9e9a2c61a83c72b995da42d30953f9f.jpg" data-rawwidth="2000" data-rawheight="1600" class="origin_image zh-lightbox-thumb" width="2000" data-original="https://pic1.zhimg.com/v2-a675e692f7f7755d91bcdba5e988e910_r.jpg" _src="https://static.leiphone.com/uploads/new/article/pic/201708/e9e9a2c61a83c72b995da42d30953f9f.jpg"/>
註:此部分內容不是這篇文章的重點,但為了理解深層神經網絡,需要明白最基本的訓練過程。 若能理解訓練過程是通過梯度下降儘可能縮小 loss 的過程即可。 若有理解障礙,可以用 python 實踐一下從零開始訓練一個神經網絡,體會整個訓練過程。若有時間則可以再體會一下計算圖自動求梯度的方便利用 TensorFlow。
打開網頁後,總體來說,藍色代表正值,黃色代表負值。拿分類任務來分析。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/2a634170594c37b7566a8cf3ffab820d.png" data-rawwidth="173" data-rawheight="169" class="content_image" width="173" _src="https://static.leiphone.com/uploads/new/article/pic/201708/2a634170594c37b7566a8cf3ffab820d.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/64298fa8de56e12ac4d93bdf9989a401.png" data-rawwidth="92" data-rawheight="228" class="content_image" width="92" _src="https://static.leiphone.com/uploads/new/article/pic/201708/64298fa8de56e12ac4d93bdf9989a401.png"/>
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/3476511e93d170a5702a719b82cd3e74.png" data-rawwidth="315" data-rawheight="136" class="content_image" width="315" _src="https://static.leiphone.com/uploads/new/article/pic/201708/3476511e93d170a5702a719b82cd3e74.png"/>(1)
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/e34ff5b8369daac328df9994fc3175ab.png" data-rawwidth="294" data-rawheight="123" class="content_image" width="294" _src="https://static.leiphone.com/uploads/new/article/pic/201708/e34ff5b8369daac328df9994fc3175ab.png"/>(2)
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/e4010bdb6584992a4113191bacd09e09.png" data-rawwidth="1116" data-rawheight="363" class="origin_image zh-lightbox-thumb" width="1116" data-original="https://pic2.zhimg.com/v2-dff3f6e72881ebd222414eabb9504671_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/e4010bdb6584992a4113191bacd09e09.png"/>
上圖中所有在黃色背景顏色的點都會被分類為 「黃點 「,同理,藍色區域被分成藍點。在上面的分類分布圖中你可以看到每一層通過上一層信息的組合所形成的。權重(那些連接線)控制了 「如何組合」。神經網絡的學習也就是從數據中學習那些權重。Tensorflow playground 所表現出來的現象就是 「在我文章裡所寫的 「物質組成思想」,這也是為什麼我把 Tensorflow playground放在了那一部分。
不過你要是把 Tensorflow 的個名字拆開來看的話,是 tensor(張量)的 flow(流動)。Tensorflow playground 的作者想要闡述的側重點是 「張量如何流動」 的。
5 種空間變換的理解:Tensorflow playground 下沒有體現 5 種空間變換的理解。需要打開這個網站嘗試:ConvNetJS demo: Classify toy 2D data
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/632ae02d5d23cc0b0fe177ddbddb34e5.png" data-rawwidth="841" data-rawheight="425" class="origin_image zh-lightbox-thumb" width="841" data-original="https://pic2.zhimg.com/v2-55811ac3d91f56f19543714b1b5abe49_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/632ae02d5d23cc0b0fe177ddbddb34e5.png"/>
左側是原始輸入空間下的分類圖,右側是轉換後的高維空間下的扭曲圖。
<img src="https://static.leiphone.com/uploads/new/article/pic/201708/ac25860b3ae70a8765ec17a05c708fbf.png" data-rawwidth="848" data-rawheight="417" class="origin_image zh-lightbox-thumb" width="848" data-original="https://pic4.zhimg.com/v2-a81a10592b96a1d2b067e1d4ae3951e7_r.png" _src="https://static.leiphone.com/uploads/new/article/pic/201708/ac25860b3ae70a8765ec17a05c708fbf.png"/>
最終的扭曲效果是所有綠點都被扭曲到了一側,而所有紅點都被扭曲到了另一側。這樣就可以線性分割(用超平面(這裡是一個平面)在中間分開兩類)
四、表現原因文章的最後稍微提一下深層神經網絡。深層神經網絡就是擁有更多層數的神經網絡。
按照上文在理解視角中所述的觀點,可以想出下面兩條理由關於為什麼更深的網絡會更加容易識別,增加容納變異體(variation)(紅蘋果、綠蘋果)的能力、魯棒性(robust)。
數學視角:變異體(variation)很多的分類的任務需要高度非線性的分割曲線。不斷的利用那 5 種空間變換操作將原始輸入空間像 「捏橡皮泥一樣」 在高維空間下捏成更為線性可分 / 稀疏的形狀。
物理視角:通過對 「抽象概念」 的判斷來識別物體,而非細節。比如對 「飛機」 的判斷,即便人類自己也無法用語言或者若干條規則來解釋自己如何判斷一個飛機。因為人腦中真正判斷的不是是否 「有機翼」、「能飛行」 等細節現象,而是一個抽象概念。層數越深,這種概念就越抽象,所能涵蓋的變異體就越多,就可以容納戰鬥機,客機等很多種不同種類的飛機。
雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。