在本文中會站在代碼的角度上為你解讀深度學習的前世今生,文章根據六段代碼從不同的階段解說,并將相關的代碼示例都上傳展示了。如果你是FloydHub新手,在本地計算機上的示例項目文件夾中安裝好CLI之后,可以使用以下命令在FloydHub上啟動項目:
接下來我們一起跟著原作者細讀這六段極富歷史意義歷史的代碼,最小二乘法
最小二乘法最初是由法國數學家勒讓德(Adrien-Marie Legendre)提出的,他曾因參與標準米的制定而聞名。勒讓德癡迷于預測彗星的位置,基于彗星曾出現過的幾處位置,百折不撓的計算彗星的軌道,在經歷無數的測試后,他終于想出了一種方法平衡計算誤差,隨后在其1805年的著作《計算慧星軌道的新方法》中發表了這一思想,也就是著名的最小二乘法。
勒讓德將最小二乘法運用于計算彗星軌道,首先是猜測彗星將來出現的位置,然后計算這一猜測值的平方誤差,最后通過修正猜測值來減少平方誤差的總和,這就是線性回歸思想的源頭。
在Jupyter notebook上執行上圖的代碼。 m是系數,b是預測常數,XY坐標表示彗星的位置,因此函數的目標是找到某一特定m和b的組合,使得誤差盡可能地小。
這也是深度學習的核心思想:給定輸入和期望輸出,尋找兩者之間的關聯性。
梯度下降
勒讓德的方法是在誤差函數中尋找特定組合的m和b,確定誤差的最小值,但這一方法需要人工調節參數,這種手動調參來降低錯誤率的方法是非常耗時的。在一個世紀后,荷蘭諾貝爾獎得主彼得·德比(Peter Debye)對勒讓德的方法進行了改良。
假設勒讓德需要修正一個參數X,Y軸表示不同X值的誤差。勒讓德希望找到這樣一個X,使得誤差Y最小。如下圖,我們可以看出,當X=1.1時,誤差Y的值最小。
如上圖,德比注意到,最小值左邊的斜率都是負數,最小值右邊的斜率都是正數。因此,如果你知道任意點X值所處的斜率,就能判斷最小的Y值在這一點的左邊還是右邊,所以接下來你會盡可能往接近最小值的方向去選擇X值。
這就引入了梯度下降的概念,幾乎所有深度學習的模型都會運用到梯度下降。
假設誤差函數 Error = X5 - 2X3 - 2
求導來計算斜率:
如果讀者需要補充導數的知識,可以學習Khan Academy的視頻。
下圖的python代碼解釋了德比的數學方法:
上圖代碼最值得注意的是學習率 learning_rate,通過向斜率的反方向前進,慢慢接近最小值。當越接近最小值時,斜率會變得越來越小,慢慢逼近于0,這就是最小值處。
Num_iterations 表示在找到最小值前估算的迭代次數。
運行上述代碼,讀者可以自行調參來熟悉梯度下降。
線性回歸
線性回歸算法結合了最小二乘法和梯度下降。在二十世紀五六十年代,一組經濟學家在早期計算機上實現了線性回歸的早期思想。他們使用穿孔紙帶來編程,這是非常早期的計算機編程方法,通過在紙帶上打上一系列有規律的孔點,光電掃描輸入電腦。經濟學家們花了好幾天來打孔,在早期計算機上運行一次線性回歸需要24小時以上。
下圖是Python實現的線性回歸。
梯度下降和線性回歸都不是什么新算法,但是兩者的結合效果還是令人驚嘆,可以試試這個線性回歸模擬器來熟悉下線性回歸。
感知機
感知機最早由康奈爾航空實驗室的心理學家弗蘭克·羅森布拉特(Frank Rosenblatt)提出,羅森布拉特除了研究大腦學習能力,還愛好天文學,他能白天解剖蝙蝠研究學習遷移能力,夜晚還跑到自家屋后山頂建起天文臺研究外太空生命。1958年,羅森布拉特模擬神經元發明感知機,以一篇《New Navy Device Learns By Doing》登上紐約時報頭條。
羅森布拉特這臺機器很快吸引了大眾視線,給這臺機器看50組圖片(每組由一張標識向左和一張標識向右的圖片組成),在沒有預先設定編程命令的情況下,機器可以識別出圖片的標識方向。
每一次的訓練過程都是以左邊的輸入神經元開始,給每個輸入神經元都賦上隨機權重,然后計算所有加權輸入的總和,如果總和是負數,則標記預測結果為0,否則標記預測結果為1。
如果預測是正確的,不需要修改權重;如果預測是錯誤的,用學習率(learning_rate)乘以誤差來對應地調整權重。
下面我們來看看感知機如何解決傳統的或邏輯(OR)。
Python實現感知機:
等人們對感知機的興奮勁頭過后,馬文·明斯基(Marvin Minsky)和西摩·帕普特(Seymour Papert) 打破了人們對這一思想的崇拜。當時明斯基和帕普特都在MIT的AI實驗室工作,他們寫了一本書證明感知機只能解決線性問題,指出了感知機無法解決異或問題(XOR)的缺陷。很遺憾,羅森布拉特在兩年后的一場船難中遇難離世。
在明斯基和帕普特提出這一點的一年后,一位芬蘭的碩士學生找到了解決非線性問題的多層感知機算法。當時因為對感知機的批判思想占主流,AI領域的投資已經干枯幾十年了,這就是著名的第一次AI寒冬。
明斯基和帕普特批判感知機無法解決異或問題(XOR,要求1&1返回0):
對于左圖的OR邏輯,我們可以通過一條線分開0和1的情形,但是對于右邊的XOR邏輯,無法用一條線來劃分。
人工神經網絡
到了1986年,魯梅爾哈特(David Everett Rumelhart)、杰弗里·辛頓(Geoffrey Hinton)等人提出反向傳播算法,證明了神經網絡是可以解決復雜的非線性問題的。當這種理論提出來時,計算機相比之前已經快了1000倍。讓我們看看魯梅爾哈特等人如何介紹這篇具有重大里程碑意義的論文:
我們為神經元網絡提出了一種新的學習過程——反向傳播。 反向傳播不斷地調整網絡中的連接權重,最小化實際輸出與期望輸出之間的誤差。 由于權重調整,我們加入了隱藏神經元,這些神經元既不屬于輸入層,也不屬于輸出層,他們提取了任務的重要特征,并對輸出進行了正則化。反向傳播這種創造有效特征的能力,將其與之前的算法(如感知器收斂過程)區別開來。
Nature 323,533-536(1986年10月9日)
為了理解這篇論文的核心,我們實現了DeepMind大神Andrew Trask的代碼,這并不是隨機選擇的代碼,這段代碼被Andrew Karpathy斯坦福的深度學習課程、Siraj Raval在Udacity的課程中采用。更為重要的是,這段代碼體現的思想解決了XOR問題,融化了AI的第一個冬季。
在我們繼續深入之前,讀者可以試試這個模擬器,花上一兩個小時來熟悉核心概念,然后再讀Trask的博客,接下來多熟悉代碼。注意在X_XOR數據中增加的參數是偏置神經元(bias neurons),類似于線性函數中的常量。
這里結合的反向傳播,矩陣乘法和梯度下降可能會繞暈你,讀者可以通過可視化過程來理解。先注重去看背后的邏輯,不要想著一下子就能完全參透全部。
另外,讀者可以看看Andrew Karpathy的反向傳播那一課,玩轉一下可視化過程,讀讀邁克爾·尼爾森(Michael Nielsen)的《神經網絡與深度學習》書上這一章。
深度神經網絡
深度神經網絡指的是除了輸入層和輸出層,中間還存在多層網絡的神經網絡模型,這一概念首先由加利福尼亞大學計算機系認知系統實驗室的Rina Dechter提出,可參考其論文《Learning While Searching in Constraint-Satisfaction-Problems》,但深度神經網絡的概念在2012年才得到主流的關注,不久后IBM IBM Watson在美國智力游戲危險邊緣(eopardy)取得勝利,谷歌推出了貓臉識別。
深層神經網絡的核心結構仍保持不變,但現在開始被應用在不同的問題上, 正規化也有很大的提升。一組最初應用于簡化噪音數據的數學函數,現在被用于神經網絡,提高神經網絡的泛化能力。
深度學習的創新很大一部分要歸功于計算能力的飛速提升,這一點改進了研究者的創新周期,那些原本需要一個八十年代中期的超級計算機計算一年的任務,今天用GPU只需要半秒鐘就可以完成。
計算方面的成本降低以及深度學習越來越豐富的庫資源,使得大眾也可以走進這一行。我們來看一個普通的深層學習堆棧的例子,從底層開始:
GPU 》 Nvidia Tesla K80。通常用于圖像處理,對比CPU,他們在深度學習任務的速度快了50-200倍。
CUDA 》 GPU的底層編程語言。
CuDNN 》 Nvidia優化CUDA的庫
Tensorflow 》 Google的深度學習框架
TFlearn 》 Tensorflow的前端框架
我們來看一個數字分類的例子(MNIST數據集),這是一個入門級的例子,深度學習界的“hello world”。
在TFlearn中實現:
有很多經典的文章解釋了MNIST問題,參考Tensorflow文檔、Justin Francis的文章以及Sentdex發布的視頻。
如果讀者還想對TFlearn有進一步了解,可參考作者Emil Wallner之前的博客文章。
總結
如同上圖的TFlearn示例,深度學習的主要思想仍然很像多年前羅森布拉特提出的感知機,但已經不再使用二進制赫維賽德階躍函數(Heaviside step function),今天的神經網絡大多使用Relu激活函數。在卷積神經網絡的最后一層,損失設置為多分類的對數損失函數categorical_crossentropy,這是對勒讓德最小二乘法的一大改良,使用邏輯回歸來解決多類別問題。另外優化算法Adam則起源于德比的梯度下降思想。此外, Tikhonov的正則化思想被廣泛地應用于Dropout層和L1 / L2層的正則化函數。
評論
查看更多