1. 程式人生 > >6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

【導讀】深度學習為什麼會成為今天的樣子?讓我們用六段程式碼來刻畫深度學習簡史,用Python展現深度學習歷史上關鍵的節點和核心要素,包括最小二乘法、梯度下降、線性迴歸、感知器、神經網路和深度神經網路。

最小二乘法

深度學習的一切都起源於這個數學片段(我把它用Python 寫了出來):

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

這一方法是 1805 年巴黎數學家阿德利昂·瑪利·埃·勒讓德首次提出的(1805,Legendre),勒讓德建立了許多重要的定理,尤其是在數論和橢圓積分(Elliptic Integrals)方面,提出了對素數定理(Prime Number Theorem)和二次互反律(Quadratic Reciprocity)的猜測並發表了初等幾何教科書。他對預測彗星的未來位置特別痴迷。他找到了根據彗星此前的幾個位置計算其軌跡的方法。

他嘗試了幾種方法,終於找到了一個讓他滿意的方法。勒讓德先猜測彗星的未來位置,然後平方其誤差,重新做出猜測,以減少平方誤差的和。這是線性迴歸的種子。

上述程式碼中,m 是係數,b是預測中的常數,座標是彗星的位置。我們的目標是找到m和b的組合,使其誤差儘可能小。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

進群:548377875   即可獲取數十套PDF哦!

這就是深度學習的核心理念:輸入,然後設定期望的輸出,找到二者的相關性。

梯度下降

勒讓德手工降低誤差率的方法很耗時。荷蘭諾貝爾獎得主Peter Debye 在一個世紀後(1909年,Debye)正式確定瞭解決方案。

讓我們想象一下,勒讓德有一個引數需要擔心——我們稱之為X。Y軸表示每個X的誤差值。勒讓德尋找的是最低誤差時X的位置。在這種圖形化表示中,我們可以看到誤差Y最小化時,X = 1.1。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

彼得·德比(Peter Debye)注意到最低點左邊的斜率是負的,而另一邊則是正的。因此,如果知道任何給定X值的斜率值,就可以將Y 導向最小值。

這引出了梯度下降的方法。幾乎每一個深度學習模型中都在使用這個原則。

寫成Python:

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

這裡要注意的是learning_rate。通過沿斜率相反方向接近最小值。此外,越接近最小值,斜率越小。每一步都會減少,因為斜率向零趨近。

num_iterations 是達到最小值前的預計迭代次數。

線性迴歸

通過組合最小二乘法和梯度下降法,就可以得到線性迴歸。 20世紀50年代和60年代,一批實驗經濟學家在早期的計算機上實現了這個想法。這個邏輯是在卡片計算機上實現的,那是真正的手工軟體程式。當時需要幾天的時間準備這些打孔卡,最多24小時才能通過計算機進行一次迴歸分析。

現在用不著打孔卡了,用Python 寫出來是這樣的:

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

將誤差函式與梯度下降合併可能會有一點不好理解。可以執行程式碼試一試。

感知器

查查弗蘭克·羅森布拉特(Frank Rosenblatt)這個人——他白天解剖大鼠的大腦,並在夜間尋找外星生命的跡象。1958 年,他造了一個模仿神經元的機器(1958,Rosenblatt ),登上了“紐約時報”的頭版《新海軍裝備學習》。

如果你給Rosenblatt的機器看50組影象,每組中的一張標有“向左”,另一張標著“向右”,這臺機器能夠在沒有預程式設計的情況下對它們進行區分。公眾被機器真正能學習的這種可能性吸引了。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

對於每個訓練週期,您從左側輸入資料。初始隨機權重新增到所有輸入資料上。權重之和被計算出來。如果和為負,則被寫為0,否則寫為1。

如果預測是正確的,那麼該迴圈中的權重就不做任何調整。如果有錯誤的,就將誤差乘以學習率。這會相應地調整權重。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

把感知器寫成Python:

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

經過頭一年的炒作,Marvin Minsky 和Seymour Papert 否定了這個想法(1969, Minsky& Papert)。當時,, Minsky 和 Papert 都在麻省理工學院的AI實驗室工作。他們寫了一本書,證明感知器只能解決線性問題。他們還駁斥了關於多層感知器的想法。不幸的是,弗蘭克·羅森布拉特兩年後遭遇了海難。

在, Minsky 和 Papert 專著出版一年之後,芬蘭的一名大學生髮現瞭解決多層感知器的非線性問題的理論(Linnainmaa,1970)。由於感知器遭受的批評,AI相關投資枯竭了十多年。這被稱為AI 的第一個寒冬。

Minsky 和 Papert 的批評是XOR Problem。邏輯與OR邏輯相同,但有一個例外 - 當你有兩個true語句(1&1)時,返回False(0)。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

在 OR 邏輯中,可能將 true combination 從 false 中分離出來。但如你所見,你無法將 XOR 和一個線性函式分離。

人工神經網路

到1986年,幾項實驗證明了,神經網路可以解決複雜的非線性問題(Rumelhart等,1986)。當時的計算機比理論提出時快了一萬倍。這時,Rumelhart提出了他們具有傳奇色彩的論文:

我們描述了神經元式單元網路的新的學習過程,反向傳播。該過程反覆地調整網路中的連線權重,以便最小化網路的實際輸出向量與期望的輸出向量之間的差異。作為權重調整的結果,不屬於輸入或輸出的內部“隱藏”單元代表了任務域的重要特徵,並且任務中的規則由這些單元的互動捕獲。創造有用的新函式的能力將反向傳播與早期更簡單的方法區分開來,例如感知器收斂過程“Nature 323,533-536(1986年10月9日)。

這一方法解決了XOR問題,解凍了第一個AI 寒冬。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

請注意,X_XOR資料中新增的引數[1]是偏置神經元,它們與線性函式中的常量具有相同的行為。

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

反向傳播、矩陣乘法和梯度下降組合可能很難包圍你的頭腦。這個過程的視覺化通常是對發生事情的簡化。請專注於理解背後的邏輯。

深度神經網路

深層神經網路是輸入層和輸出層之間具有很多層的神經網路。這個概念是由Rina Dechter(Dechter,1986)引入的,但在2012年獲得了主流關注。不久之後就出現了IBM Watson 的Jeopardy 大勝和谷歌識貓的成功。

深度神經網路的核心結構保持不變,但現在應用於幾個不同的問題。正則化也有很多改進。最初,這是一組數學函式,來簡化嘈雜的資料(Tikhonov,A.N,1963)。它們現在用於神經網路,以提高其泛化能力。

創新的很大一部分是原因計算能力的飛躍。它改進了研究者的創新週期——80年代中期的超級計算機需要計算一年的東西,今天GPU 技術半秒就能算好。

計算方面的成本降低以及深度學習庫的發展現在已經眾所周知。我們來看一個普通的深度學習的例子,從底層開始:

  • GPU > Nvidia Tesla K80。硬體常用於圖形處理。與CPU相比,深度學習平均速度要快50-200倍。
  • CUDA > GPU的低階程式語言
  • CuDNN > Nvidia 優化 CUDA的庫
  • Tensorflow > Google 在 CuDNN 之上的深度學習框架
  • TFlearn > Tensorflow的前端框架

我們來看看MNIST影象分類,深度學習的入門任務。

 

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

 

用 TFlearn 執行:

6段里程碑式Python程式碼,帶你瞭解深度學習歷史!

 

如您在TFlearn示例中所看到的,深度學習的主要邏輯仍然類似於Rosenblatt的感知器。不使用二進位制Heaviside step function,今天的網路大多使用Relu activition。在卷積神經網路的最後一層,損失等於categorical_crossentropy。這是勒讓德最小二乘法的演變,是多類別的邏輯迴歸。優化器adam起源於 Debye 梯度下降的工作。 Tikhonov的正則化概念以停用層和正則化函式的形式得到廣泛實施。