Deep Learning 基礎
原創: 施天璐 Refinitiv創新實驗室ARGO
本文含有部分易懂的數學公式,預計閱讀時間10分鐘
本文是深度學習的基礎入門篇,著重描述以下三個部分:
-
什麼是深度學習
-
人工神經網路的概念
-
反向傳播演算法的理解
一 什麼是深度學習
深度學習正處於計算機領域的最前沿,也是資料科學和電腦科學領域最火熱的話題之一。最近幾年,人們時常提起深度學習,機器學習或者人工智慧。幾乎每一家網際網路公司都在AI 探索中投入了大量的人力物力和財力。當這些術語不時在我們耳旁響起的時候,人們也許會好奇,這些術語之間到底是一種怎樣的關係。
表達他們之間關係的最好的方式大概是將它們用同心圓來視覺化地表現出來。
(圖片來源: https://blog.algorithmia.com/introduction-to-deep-learning/)
深度學習是機器學習的一個特定子集,機器學習又是人工智慧的一個子集。對於每個單獨的定義來說:
• 人工智慧是寬泛意義上讓機器可以像人類一樣智慧思考
• 機器學習是實現上述目的的方式,它利用演算法去搜集出資料背後隱藏的規律
• 深度學習則是利用人工神經網路來實現機器學習的一種方式
既然深度學習的基礎是人工神經網路,那我們接下來有必要了解一下人工神經網路。
二 人工神經網路的概念
人工神經網路,故名思議,是從生物神經網路受到啟發,從而用計算機的方式實現神經網路的一種技術。而實際上,有如人類從鳥類受到啟發而發明了飛機,但飛機的速度和續航遠超鳥類一樣,人工神經網路雖然仿生,但其設計也並不完全受限於生物的表現形式,從而能展現出超越人類的能力。本節先從生物學角度觀察神經元,並由此介紹感知機模型。
i) 生物神經元、人工神經元以及神經網路
(圖片來源: http://shakthydoss.com/technical/deep-learning-for-layman/)
生物學意義上的神經元由接受電訊號的樹突,負責處理電訊號的細胞體,向其他神經元發出訊號的軸突組成。每個神經可能有多個樹突,但只有一個軸突。如上圖右邊所示,抽象成函式模型f(x),其不少於一個輸入訊號,但是隻有一路輸出訊號。但是注意,雖然軸突只有一路輸出,但是並不意味著軸突下游只能接一個樹突,軸突可能會有多個突觸對接不同的樹突。
人工神經元是對生物學意義上的神經元的模擬,由幾路輸入(如樹突),一個處理函式(如細胞體)和一路輸出(如軸突)組成。用方程的形式表示,輸入可以表示為:
人工神經網路則是由很多個上述的神經元組成。其典型連線如下圖所示
(圖片來源: http://ufldl.stanford.edu/tutorial/)
ii) 感知機(Perceptron)
在有了神經元,人工神經網路的基本概念之後,接下來的一部分將會介紹在人工神經網路歷史上有著濃重一筆的感知機。1957 年,Frank Rosenblatt 提出了感知機。感知機是神經網路和SVM演算法的基礎。它是一個線性二分類模型。
(圖片來源: https://blog.csdn.net/White_Idiot/article/details/68952338)
在感知機模型中,激勵函式是一個階躍函式。因此,感知機的預測函式為:
感知機的學習過程
假設資料集線性可分,那麼訓練感知機的目的就是找到可以正確劃分訓練集的超平面,即是找到合適的w 和b 引數,使得損失函式最小。但是感知機的損失函式怎麼選擇呢?
我們知道,已分類點到超平面的距離公式是:
其中,
是L2範數。
感知機的樣本標籤一般設定為1,-1。所以,對於誤分類樣本:
當時,有。
所以,誤分類樣本的距離公式為
取所有誤分類樣本集M的所有距離之後,我們得到了其損失函式:
同樣,要訓練這個模型,又回到了函式求解極值問題。這裡一般使用的是梯度下降方法,不再詳細展開。
感知機的侷限
儘管感知機在機器學習領域掀起了不小的浪潮,它的缺點也迅速為人所知。單層的感知機並不能解決非線性分類的問題(例如模擬一個簡單的異或XOR函式)。Marvin Minsky 曾經發表了一本叫做《感知機》的書來指出感知機的不足。
對於非線性問題來說,只能依靠多個計算層來解決。
但是,因為沒有辦法得知一個權重的小小的變化會怎樣影響其餘神經元的輸出,所以除了隨機變換各連線之間的權重之外,並沒有簡單有效的方法來進行訓練多層網路。這個缺陷導致人工神經網路的研究進入了多年的停滯期,直至反向傳播演算法(BP演算法)的提出。
三 反向傳播演算法(Backpropagation)
1986 年,Rumelhar 和Hinton 提出了反向傳播(BP)演算法來解決多層神經網路計算的複雜性的問題,將神經網路又重新帶回到人們的視野中。在這裡不詳述BP演算法的倒推公式,我們將以一個例子向讀者們展示BP演算法的計算過程。
示例前,有必要知道的是,在多層的神經網路中,啟用函式一般用Sigmoid函式代替感知機中的階躍函式。也就是說,邏輯迴歸模型成為神經網路的一個基本單元。
示例
為了防止有過多複雜的數學公式,這裡僅僅展示一個雙層網路的簡單模型,並且僅用一條訓練資料做引數估計來展示BP演算法的原理。(例子來源參考 : https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/)
假設一個神經網路如下圖所示:
第一層是含有兩個神經元的輸入層i1、i2以及偏置b1,第二層為隱藏層,包含兩個神經元h1、h2 和偏置b2, 第三層為輸出層o1和o2。每條線上的w1...w8 代表神經元和各層之間的權重。
現在我們先給它們一個初始值。
我們的目標是當給定輸入i1 和i2(0.05 和0.10) 時,使它們的輸出接近原始輸出o1和o2(0.01 和0.99)。
Step 1:正向傳播過程
輸入層 到 隱藏層
計算神經元h1 的總輸入:
h1的輸出:
以同樣的方法計算h2 的輸出:
隱藏層到輸出層
計算神經元o1,o2 的輸入和輸出:
同樣方法計算得到,
到這裡前向傳播的過程就結束了,我們得到結果[0.75136079, 0.772928465],與實際值[0.01,0.99]相差甚遠。所以現在我們使用反向傳播法來更新這些權值。
Step 2:反向傳播過程
計算損失
通過採用平方誤差公式計算損失:
因為我們有兩個輸出,所以我們分別計算誤差然後求和。
更新隱藏層與輸出層之間的權重
以w5 為例。如果我們想知道w5 對於最後的總誤差有多大影響,即偏導。根據鏈式求導法則有:
用圖來描述這個過程如下:
我們可以分別計算分解出來的三個部分
:
:
根據sigmoid 函式的特性,這部分的偏導是o1 輸出乘以(1-o1 輸出)
:
於是,三者相乘得:
現在我們得到了 對的偏導。可以根據該偏導值以及梯度下降法更新的設定值:
以同樣的方式更新:
更新隱藏層之間的權重
方法其實與上面類似,見下圖
(圖片來源: https://en.wikipedia.org/wiki/Chain_rule)
在隱含層之間的權值更新時,會影響 和,因此 需要考慮兩個輸出神經元。
得:
類似的,
這一輪更新完權重引數w1~w4,一輪誤差反向傳播法就完成了,在本例的第一次迭代之後,對於輸入0.05 和0.1,總誤差 由0.298371109 下降至0.291027924。一輪迭代的變化看上去也許很小,但是當如此迭代10000 次後,總誤差降到0.000035085,輸出為[0.015912196,0.984065734](對比[0.01,0.99])就比較明顯了,這也是梯度下降的精髓所在。
總結
上述例子是對於反向傳播演算法的一個小小的演示。反向傳播演算法的優點在於它能夠快速計算出所有偏導,訓練神經網路的速度得到了極大的加快。正是因為反向傳播演算法,神經網路才能得到復興並被大量應用。反向傳播也是深度學習不可或缺的一部分,不過反向傳播演算法也不是萬能的。80 年代後期,人們觸及到了效能的瓶頸,利用反向傳播演算法來訓練深度神經網路時尤為明顯,由於篇幅的限制,會在以後的文章裡介紹現代計算機和新的想法是如何訓練深度神經網路的。
好了,深度學習基礎介紹就到著這裡了。我們的公眾號從這期開始,將交叉為大家講解深度學習基礎部分和基本機器學習領域的一些演算法,願讀者朋友們關注我們的公眾號,與我們一同進步。