從線性模型到神經網路
來自專欄計算主義53 人贊了文章
最近筆者受邀進行了一次分享並為此製作了一個 PPT 。完後 PPT 棄之可惜,做成圖片配上說明分享於此(PDF 版)。
題圖來自波蘭藝術家 Zbigniew Bielak 。他的作品被許多重金屬 / 極端金屬樂隊用作專輯封面。例如 Mayhem ,Behemoth,Ghost 等。
本 PPT 的內容導覽。思路是先介紹線性模型,再從模型集成的視角引入(全連接前饋)神經網路 ANN 。之後介紹 ANN 的訓練、實現和應用。
最小二乘線性回歸的示意圖、計算式和訓練。從最後一個 = 號可看出:輸入向量 x 被投影到了權值向量 w 上。於是 x 在垂直於 w 的子空間中的信息全部丟失。所以如果用響應 y 作為分類依據,那麼只能得到線性的分界面:p 維空間中的一個 p-1 維仿射集——超平面。如果自變數空間 2 維,分界面是一條直線。
線性回歸模型的圖形。紅色箭頭是權值向量 w 的方向(長度做了縮放)。可看出, y 是 p+1 維空間中一個平面。它沿 w 方向傾斜。y 的等高線是垂直於 w 的直線。
在線性回歸基礎上引入一個非線性的激活函數,比如 Logistic 函數(其圖形是 Sigmoid 曲線)。輸出 y 被 Logistic 函數壓縮到 (0,1) 區間內。將 y 作為樣本為正例的概率,使用交叉熵作為損失函數進行優化,使模型判斷的某樣本類別分布接近觀察到的類別分布(正確的類別概率為 1 ,其餘類別概率為 0)。從貝葉斯視角來看,這種優化也使樣本的似然概率達到最大。這個模型其實就是邏輯回歸模型。
邏輯回歸雖然在輸出上施加了非線性的 Logistic 函數,但它仍不具備非線性分類能力。 x 在進入計算一開始就先向 w 方向做了投影。垂直於 w 的子空間上的信息仍然丟失了。和線性回歸一樣,邏輯回歸只能得到線性分界面。所不同的是邏輯回歸採用交叉熵損失函數,更適合分類問題。若想超越線性分類,則必須引入模型集成。
搞 3 個邏輯回歸,再將它們的輸出線性組合(並加上偏置)就得到本頁 PPT 展示的模型。該模型可視作 3 個邏輯回歸的 ensemble ,具體來講是 model stacking 。該模型也是一個兩輸入單輸出、單隱藏層、隱藏層激活函數為 Logistic 、輸出層無激活函數的 ANN 。回過頭來,線性回歸和邏輯回歸其實是 p 輸入單輸出、無隱藏層、無激活函數或激活函數為 Logistic 的 ANN 。
這樣的模型可以形成非線性的分界面。要形成非線性分界面,網狀結構和非線性激活函數缺一不可。如果缺乏網狀結構(邏輯回歸),x 經過投影其信息只在 w 方向上有變化。若缺乏非線性激活函數,則無論有多少層,網路仍然是一個線性回歸。
此處插入一個動圖(gif)。呈現的就是 page 7 中的神經網路的訓練過程。與 page 7 中的網路稍有不同的是:本網路的輸出層有兩個神經元,對這兩個神經元的輸出施加 softmax ,使它們成為一個二分類概率。數據採用同心圓數據集(2 維特徵),外圍的點為正例,中心的點為負例。以交叉熵為損失函數(softmax 和交叉熵在 page 13/14 中闡述)。左上圖呈現預測概率值曲面隨著訓練的變化;右上圖是預測概率值等高線圖;右下是損失函數(交叉熵)下降曲線以及訓練集和測試集上的正確率(accuracy)曲線;左下圖很有意思。它展示網路的 3 個隱藏層神經元對全體樣本的輸出(三維空間中的點),以及由輸出層神經元的權值和偏置所決定的分界面。從右上圖可以看出,隱藏層 3 個神經元的權值決定了三個方向,這三個方向分別負責把該方向上一端的紅色點與其它點分離開,但是另一點仍然藍點紅點混雜,這是數據呈同心圓分布所決定的。等高線圖的藍色區域大致由三條直線構成,這就是三個隱藏層的分界直線。左下圖顯示隱藏層輸出的點在三維空間上的分布。投影到某個坐標軸:一端分離出一部分紅點;另一端藍點紅點混雜。但在其它坐標軸上,這些混雜的點能被分開。在整個三維空間中紅藍點可以被一張平面分開。輸出層有兩個神經元,誰的輸出更大決定了網路對樣本點如何分類。它們輸出相等的點是三維空間中一張平面,這正是一張能夠把隱藏層輸出點分開的平面。(代碼:github)
至此即可定義神經網路了。ReLu 雖然不像 Logistic 和 Tanh 那樣「彎彎繞」,但是它單邊揚起的形狀足以在「網路+激活」條件下提供足夠的擬合能力。
ANN 的示意圖以及計算式。那個圓符號表示對向量的每個元素施加 f 。
自變數在某一點的梯度向量指向原函數一階泰勒展開(近似平面)的上升方向。梯度的反方向就是該近似平面的下降方向,也是原函數在該點小局部內下降最快的方向。梯度下降法計算梯度,沿反方向行走一個小距離,再次計算梯度,重複此過程,迭代地尋找原函數的全局最小點。梯度向量的各元素是原函數對自變數各分量的偏導。
如果把梯度場視作速度場,梯度下降其實就是數值模擬一點在相空間中的運動。好消息是:梯度場是保守場,原函數是該保守場的勢能。保守場中的極小點是李雅普諾夫穩定的,且不存在奇異吸引子。壞消息是:該好消息無甚卵用。對於非凸函數,存在局部極小、鞍點等討厭情況。梯度下降法有一些變體。它們在方向和步長上做文章,以求在非凸情況下儘可能加速和保證收斂。
ANN 視權值和偏置為自變數,利用梯度下降最小化平均損失函數。對於回歸問題,損失函數是樣本的預測值和真實值之間歐式距離平方(2-範數)。對於多分類問題,常用的做法是將輸出進行 softmax 後視作類別概率分布,然後最小化預測分布與觀察分布的交叉熵。觀察分布就是正確的類概率為 1 ,其餘類概率為 0 。
岔開話題簡述交叉熵。K-L 散度衡量分布 p 與 q 之間的相似程度。p 與 q 的交叉熵等於 p 與 q 的 K-L 散度加上 p 的熵。在 ANN 分類訓練中,p 是觀察到的分布,q 是 ANN 預測的分布。 p 的熵為 0 ,故最小化交叉熵就是最小化 K-L 散度。這使 ANN 的預測分布與觀察分布儘可能接近。同時交叉熵也是訓練樣本的對數似然(log likelihood)的相反數。
反向傳播。本頁示意圖是 ANN 的一部分。計算損失函數 L 對各權值 w 的偏導,最關鍵的是計算 L 對每一個神經元激活水平 v (輸入經過線性組合,但還沒有施加激活函數時那個值)的偏導,姑且叫 delta 。有了這些 delta ,每個權值的偏導就很容易計算了——就是該神經元的 delta 乘上權值所在邊上當前的輸入。有了後一層各個神經元的 delta ,前一層各神經元的 delta 也容易計算。就是本頁下部的公式。這裡建議將圖中所示這部分計算分成 3 段,第一段是第 k 層某個神經元的激活水平 v 經過 f 到輸出 x 的計算;第二段是第 k 層該神經元的輸出 x 到 k+1 層各神經元激活水平 v 的計算;第三段是第 k+1 層各神經元激活水平 v 到最終損失函數 L 的計算。三個函數複合在一起。根據鏈式法則,L 對第 k 層那個神經元的 v 的導就是三個函數的導矩陣連乘。這裡注意: m 到 n 的函數的導「數」其實是一個 n x m 矩陣,表示一個 m 到 n 的線性變換。此處更詳細的推導請見:神經網路反向傳播演算法。
至此,ANN 反向傳播梯度下降的迭代公式就呼之欲出了。注意一點:對於分類問題,輸出經 softmax 並以交叉熵為損失函數時,輸出層神經元的 delta 計算推導稍複雜,但美妙的是結果的形式與損失函數是平方誤差時是一致的,都是本頁反向傳播部分第一個式子。
作者用 python 和線性代數庫 numpy 實現了一個 ANN 。本頁展示用它進行函數擬合的效果。
這裡有一個用 TnesorFlow 以三種方式搭建 ANN 進行 MNIST 字元識別的示例。代碼請見 Github
卷積神經網路 CNN 是一種非全連接的神經網路。其關鍵的卷積層可以視作可訓練的濾波器。詳情請見博文:卷積神經網路簡介 。
這張有點湊數了。做個廣告,筆者有一個利用 python 、numpy 和 pandas 實現的機器學習庫 Mentat ,敬請關注 : )
最後一張,引用控制論祖師維納在《人有人的用處》中的一句話。在這個浮躁的時代,與諸君共勉:
The future will be an ever more demanding struggle against the limitations of our intelligence, not a comfortable hammock in which we can lie down to be waited upon by our robot slaves.
-- Norbert Wiener 「The Human Use Of Human Beings」
推薦閱讀:
TAG:人工智慧 | 神經網路 | 深度學習DeepLearning |