都怪當初看了這6段程式碼,造成了如今的深度學習!

Python探索牛發表於2019-01-10

回憶當初我們看到的這6段程式碼,造就了我們如今的深度學習,這6段程式碼的創作者及其取得 的這些輝煌成就的那些故事。這些故事都對應的有簡單的程式碼示例,小夥伴們在FloydHub 和 GitHub 上找到相關程式碼。

 

提示一下:要執行 FloydHub 上的程式碼,需要確保你的電腦上已經安裝了Floyd命令工具,並且複製程式碼儲存到本地計算機。在本地計算機示例專案中初始化命令列介面之後,您就可以執行以下命令在 FloydHub 上啟動專案:

 

最小二乘法

所有的深度學習演算法都始於下面這個數學公式(我已將其轉成 Python 程式碼)

 

最小二乘法在 1805 年由 Adrien-Marie Legendre 首次提出(1805, Legendre),這位巴黎數學家也以測量儀器聞名。他極其痴迷於預測彗星的方位,堅持不懈地尋找一種可以基於彗星方位歷史資料計算其軌跡的演算法。

他嘗試了許多種演算法,一遍遍試錯,終於找到了一個演算法與結果相符。Legendre 的演算法是首先預測彗星未來的方位,然後計算誤差的平方,最終目的是通過修改預測值以減少誤差平方和。而這也正是線性迴歸的基本思想。

讀者可以在 Jupyter notebook 中執行上述程式碼來加深對這個演算法的理解。m 是係數,b 是預測的常數項,coordinates 是彗星的位置。目標是找到合適的 m 和 b 使其誤差儘可能小。

 

這是深度學習的核心思想:給定輸入值和期望的輸出值,然後尋找兩者之間的相關性。

梯度下降

Legendre 這種通過手動嘗試來降低錯誤率的方法非常耗時。荷蘭的諾貝爾獎得主 Peter Debye 在一個世紀後(1909 年)正式提出了一種簡化這個過程的方法。

假設 Legendre 的演算法需要考慮一個引數 —— 我們稱之為 X 。Y 軸表示每個 X 的誤差值。Legendre 的演算法是找到使得誤差最小的 X。在下圖中,我們可以看到當 X = 1.1 時,誤差 Y 取到最小值。

 

Peter Debye 注意到最低點左邊的斜率是負的,而另一邊則是正的。因此,如果知道了任意給定 X 的斜率值,就可以找到 Y 的最小值點。

這便是梯度下降演算法的基本思想。幾乎所有的深度學習模型都會用到梯度下降演算法。

要實現這個演算法,我們假設誤差函式是 Error = x ^ 5 -2x ^ 3-2。要得到任意給定 X 的斜率,我們需要對其求導,即 5x^4 – 6x^2:

如果您需要複習導數的相關知識,請觀看 Khan Academy 的視訊。

下面我們用 Python 實現 Debye 的演算法:

Python

 

這裡的竅門在於 learning_rate。我們通過沿斜率的相反方向行進來逼近最低點。此外,越接近最低點,斜率越小。因此當斜率接近零時,每一步下降的幅度會越來越小。

num_iterations 是你預計到達最小值之前所需的迭代次數。可以通過除錯該引數訓練自己關於梯度下降演算法的直覺。

線性迴歸

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

下面是用 Python 實現線性迴歸的一個示例(我們不需要在打卡機上完成這個操作):

Python

 

線性迴歸本身並沒有引入什麼新的內容。但是,如何將梯度下降演算法運用到誤差函式上就需要動動腦子了。執行程式碼並使用這個線性迴歸模擬器來加深你的理解吧。

感知機

接下來讓我們來認識一下 Frank Rosenblatt。這是一個白天解剖老鼠大腦,晚上尋找外星生命跡象的傢伙。1958年,他發明了一個模仿神經元的機器(1958, Rosenblatt),並因此登上《紐約時報》的頭條:“New Navy Device Learns By Doing”。

如果向 Rosenblatt 的機器展示 50 組分別在左右兩側有標記的影像,它可以在沒有預先程式設計的情況下分辨出兩張影像(標記的位置)。大眾被這個可能真正擁有學習能力的機器震驚了。

 

如上圖所示,每個訓練週期都是從左側輸入資料開始。給所有輸入資料新增一個初始的隨機權重。然後將它們相加。如果總和為負,將其輸出為 0,否則輸出為 1。

如果預測結果是正確的,就不改變迴圈中的權重。如果預測結果是錯誤的,可以用誤差乘以學習率來相應地調整權重。

我們用經典的“或”邏輯來執行感知機。

輸入輸出00 =001 =110 =111 =1

下面是用 Python 實現的感知機模型:

Python

 

經過最初的炒作一年之後,Marvin Minsky 和 Seymour Papert 擊碎了這個想法(1969, Minsky & Papert)。當時,Minsky 和 Papert 都在麻省理工學院的 AI 實驗室工作。他們寫了一本書,證明感知機只能解決線性問題。他們還批判了關於多層感知機的想法。可悲的是,Frank Rosenblatt 兩年後因船難去世。

在 Minsky 和 Papert 的書籍出版一年之後,一位芬蘭碩士研究生提出了用多層感知機解決非線性問題的理論(Linnainmaa, 1970)。由於業內主流對感知機普遍不看好,十多年來 AI 的研究資金也非常短缺。這是 AI 首次遇冷。

Minsky 和 Papert 對感知機的批判主要針對“異或”問題。這個邏輯與“或”邏輯相同,但有一個例外 —— 對兩個 true 語句取和(1&1)時,結果返回 False(0)。

 

如上圖所示,在“或”邏輯中,我們可以將 true 和 false 分開。但是可以看出,我們無法使用一個線性函式將“異或”邏輯的結果進行區分。

人工神經網路

到 1986 年,幾項實驗證明,神經網路可以解決複雜的非線性問題(Rumelhart et al., 1986)。 當時計算機的運算速度比該理論提出的時候快了一萬倍。Rumelhart 等人是這樣介紹他們赫赫有名的論文的:

 

為了理解這篇文章的核心內容,我會在下面重現 DeepMind 團隊 Andrew Trask 的程式碼。這不是一段普通的程式碼。它曾被用於史丹佛大學 Andrew Karpathy 的深度學習課程,以及 Siraj Raval 的 Udacity 課程。最重要的是,它解決了“異或”問題,也結束了 AI 遇冷的時代。

 

學習這段程式碼之前,我們首先通過這個模擬器互動學習一到兩個小時來掌握神經網路的核心邏輯。然後閱讀 Trask 的部落格,然後再閱讀四次。需要注意到,X_XOR 資料中新增的引數 [1] 是偏置神經元,它們等價於線性函式中的常數項。

Python

 

反向傳播,矩陣乘法和梯度下降放在一起會讓人很難理解。這個過程的視覺化通常是對其背後原理的簡化。專注於理解其背後的邏輯,但不要過多地考慮直覺上的理解。

另外,讀者們也可以看看 Andrew Karpathy 關於反向傳播的課程,在這個視覺化網站互動學習,以及閱讀 Michael Nielsen 關於反向傳播的章節。

深度神經網路

深度神經網路就是在輸入層和輸出層之間具有多箇中間層的神經網路。這個概念最早是由 Rina Dechter (Dechter, 1986) 引入的,但在2012年,也就是在 IBM 的人工智慧程式 Watson 贏得美國電視智力競賽節目 Jeopardy 和 Google 推出貓咪識別器之後才受到廣泛關注。

深度神經網路與之前神經網路的核心結構相同,但是應用於一些不同的問題。在正則化方面也有很大改進。最初,這只是一組用來簡化冗雜的地球資料的數學函式(Tikhonov,A.N.,1963)。而現在被用於神經網路中,以加強其泛化能力。

這種技術創新很大程度上依賴於計算機的運算能力。而運算能力的提升大大縮短了研究者的創新週期 —— 如今的 GPU 技術只需半秒鐘就可以完成一個八十年代中期的超級計算機一年的運算量。

計算成本的降低和各種深度學習庫的發展將深度學習帶入了大眾視野。我們來看一個常見的深度學習堆疊示例,從底層開始:

GPU > Nvidia Tesla K80。該硬體常用於圖形處理。它們深度學習的速度平均要比 CPU 快50-200倍。

CUDA > GPU 的底層程式語言

CuDNN > Nvidia 的庫,用來優化 CUDA

Tensorflow > 由 Google 開發,基於 CuDNN 的深度學習框架

TFlearn > Tensorflow 的前端框架

下面我們來看看 MNIST 數字分類影像,它被稱作深度學習的 “Hello World”。

 

我們用 TFlearn 來實現:

Python

 

本文到此就高一段落了,小夥伴們看了本文是否有所觸動?希望對你有所幫助!喜歡本文的小夥伴可以轉發或者點波關注!

本文來自網路,如有侵權,請聯絡小編刪除!

相關文章