數學不行還學AI - 第5話 - 神經網路平話演義(上)

原文:Learning AI if You Suck at Math?—?P5?—?Deep Learning and Convolutional Neural Nets in Plain English!

作者:Daniel Jeffries

翻譯:Kaiser(王司圖)

(原文較長,故分為三個章節發布。「平話演義」是根據原標題Plain English發揮的。)

歡迎你來!這裡是《數學不行還學AI》第5話,如果你還沒有看過前面的章節,請點擊這裡

今天,我們要來寫一個自己的Python圖像識別程序。

為此我們要了解一個強大的深度學習架構——深度卷積神經網路(Deep Convolutional Neural Network, DCNN)。

卷積神經網路可謂計算機視覺界的勞模,從無人汽車到Google圖片搜索,背後都有其功勞。在TensorFlow 2017 峰會上,一位研究者展示了用手機里的卷積神經網路診斷皮膚癌。

為什麼卷積神經網路如此強勁呢?一個關鍵原因在於:

自動模式識別

那模式識別又是什麼?自動了又如何?

模式可能以很多種形式存在,這裡只看兩個最重要的例子:

  • 定義物理形式的特徵

  • 完成特定任務的步驟

計算機視覺

在圖像處理的模式識別中,又叫作特徵提取。

當你看一張照片或者實物的時候,你會選擇性地拎出關鍵特徵來進行認識,這是無意識中發生的。

當你看到我家貓Dove的照片,會想到「貓」或者「鏟屎官」,但是你並不知道自己是如何想到的,而只是單純地那樣去做了,這都是自動而且無意識發生的

聽起來非常簡單,每時每刻都在經歷,但這是因為真正的複雜性隱藏在深處。大腦是個黑盒,我們誰也沒有說明書。哪怕只是一個微小的動作,也包含了巨量的步驟,表面上看似簡單,實則無比複雜。

  • 轉動眼珠。

  • 接收並分解光線。再傳遞信號給大腦。

  • 大腦開始工作,將光信號轉換為電化學信號。

  • 信號在我們內置的神經網路中傳播,激活不同的區塊——記憶、聯想、感覺等等。

  • 大腦首先感知了低階模式(耳朵,鬍鬚,尾巴),再組成高階模式(動物)。

  • 最後,我們進行了分類,轉換成辭彙,也就是對真實事物的象徵表達,這裡就是「貓」。

以上種種,全部發生在一瞬之間。

如果你想要教電腦來執行這些,你會如何開始?

  • 如何找到耳朵?

  • 什麼是耳朵?

  • 如何描述耳朵?

  • 為什麼貓耳不同於人耳、蝙蝠耳(或蝙蝠俠的耳朵)?

  • 耳朵從不同角度看都是什麼樣?

  • 所有的貓耳朵都一樣嗎?(當然不,看看蘇格蘭折耳貓)

類似問題無窮無盡。如果你想不出如何用C++或Python教會電腦的好方法,也不要灰心,因為這已經困擾了計算機科學家們50多年了!

你自然而然完成的,正式深度學習神經網路的關鍵應用之一——分類器,這裡是圖像分類器。

起初,AI研究者想做的跟我們剛才一樣。他們希望事無巨細,手動定義每一個步驟,比如對於自然語言處理(NLP),他們召集了最頂尖的語言學專家,讓他們總結出語言的所有規律,這也是為什麼早期的AI又叫「專家系統」。

語言學家坐成一圈開始琢磨了,然後一個接一個,目不暇接的判斷語句冒了出來:

  • 鳥會飛嗎?

會。否則:

  • 鳥死了
  • 鳥殘了
  • 沒翅膀
  • 企鵝

這樣下去就沒完了,而且還不一定靠譜,花很長時間創造這些判斷,最後只剩下無盡的爭論、表述的偏差、定義的模糊。

深度神經網路代表著真正的突破,因為你不再需要知曉所有細節,而是讓機器自動提取出貓的特徵

這裡的關鍵是「自動」,因為每個複雜的行為背後都有數以百萬計的隱藏步驟,是不可能去全部明確的,只能選擇繞過,然後讓電腦自己領悟。

萬物皆步驟

來看第二個例子:計算任務的步驟。

今天我們手動為計算機定義好了每一個步驟,這就是編程。比如你想找到硬碟上所有的圖片文件,然後移動到新文件夾。對絕大多任務而言,程序員就是神經網路,就是智能。他學習任務,分解成步驟,再用符號表示(編程語言)告訴計算機。這裡是一個Python的小例子,來自Stack Exchange上的Jolly Jumper:

import globnimport shutilnimport osnnsrc_dir = your/source/dirndst_dir = your/destination/dirnnfor jpgfile in glob.iglob(os.path.join(src_dir, *.jpg)):n shutil.move(jpgfile, dst_dir)n

Jolly Jumper為計算機定義好了每一個步驟:

  • 我們需要知道源路徑和目標路徑
  • 需要分類方法選出目標文件格式,這裡是"jpg"
  • 進入路徑,搜索jpg並移動到目標路徑

對於簡單的,甚至一般複雜的問題,這都是可行的。操作系統由上億行代碼組成,可以算是地球上最複雜的軟體了,每一行都在顯式地知道計算機該做什麼(繪圖,存儲,更新),也幫助人完成任務(複製文件,輸入文本,收發郵件,瀏覽照片等)。

但是隨著問題複雜度的增加,我們手動定義問題步驟的能力,也遇到了瓶頸。舉個例子,如何開車?這種想想就很複雜的任務,包含數以百萬計的小步驟:

  • 沿直線行駛
  • 知道什麼是直線,並認出來
  • 從某地行駛到另一地
  • 識別障礙物如牆,人,渣渣
  • 區分有益物(交通號誌)還是危險物(作死的人)
  • 實時掌握周邊車輛狀況
  • 決定下一個動作

在機器學習里,這就是決策制定問題,複雜的該類問題例如:

  • 機器人的運動與感知
  • 語言翻譯系統
  • 自動駕駛汽車
  • 股票交易系統

神經網路的秘密

來看深度學習如何通過自動特徵提取,來幫助我們解決那些複雜到令人發狂的問題。

如果讀過V.Anton Spraul的經典書籍像程序員一樣思考(強烈推薦閱讀),就會知道編程是有關解決問題的。程序員化大為小,分而治之,臨陣畫策,寫碼執行

而深度學習是代替我們解決問題,但是目前AI還是需要人類(萬幸)設計測試AI架構的。讓我們對神經網路也分而治之,再創建程序認出我家Dove是只貓。

「神經網路」是在1950年代受人腦研究啟發而來,研究者們創造了神經元的數學表達如下(感謝斯坦福大學的優秀公開課件和維基百科):

生物神經元

數學神經元

忘掉所有複雜的數學符號,因為你不需要它們。

基礎非常簡單,X0代表數據,在神經元的連接當中流動,連接的強度由權重(W0X0, W1X1)代表。如果信號足夠強,就會通過「激勵函數」激活神經元。

這裡是一個三層神經網路的例子:

有些神經元被激活,有些神經元之間的連接被增強,由此系統學習到了那些才是重要的。

建立並訓練神經網路

接下來我們邊寫代碼,邊深入理解深度學習。系統的必要特性有:

  • 訓練
  • 輸入數據
  • 權重
  • 目標
  • 損失函數
  • 優化函數
  • 預測

訓練

訓練就是我們如何教會神經網路要學什麼,分為五個步驟:

  1. 建立訓練集, 記作x,並導入標籤為目標y
  2. 前饋數據給網路,得到預測結果y
  3. 定義網路的「損失」,即預測y和真實目標y之差
  4. 計算損失的「梯度」,即我們接近或遠離正確目標的速度
  5. 沿著梯度的反方向調整網路權重,並周而復始

輸入數據

在本例中,DCNN的輸入數據是一組圖片,圖片越多越好。與人類不同,計算機需要大量的圖片才能學會分類。AI研究者正致力於用儘可能少的數據達到學習目的,但這仍是個前沿問題。

一個著名例子就是ImageNet數據集,由很多手動標註過的圖片組成。換句話說就是預先讓人類用他們內置的神經網路把圖片全部看一遍,然後給數據賦予意義。人們上傳照片,並打上標籤,比如「狗」,或者某個品種的狗「獵兔犬」。標籤代表了網路的準確預測,網路的預測輸出(y)與手動標記數據(y)越接近,就說明其越準確。

數據被分為兩部分,訓練集和測試集。訓練集就是我們給神經網路的輸入,根據它們學習多種物體的關鍵特徵,再與測試集中的隨機數據相比較以衡量準確性。

在我們的程序中,將用到的是著名的CIFAR-10數據集,由加拿大高等研究所提供。CIFAR10有60000張32x32的彩色圖片,共分為10類,每類6000個。其中50000個作為訓練集,10000個充當測試集。

當我第一次使用CIFAR的時候,我誤以為這會比ImageNet的大尺寸圖片更簡單。而事實卻是,CIFAR10更具挑戰性,因為圖片尺寸小、數量少,可供神經網路識別的特徵也少。

一些最大也是最差的DCNN架構如ResNet可以在ImageNet上達到97%的準確率,但在CIFAR 10卻只有87%。根據我的經驗,目前處理CIFAR 10的業界標杆是DenseNet,準確率可達95%。但是需要足足250層和1500萬個參數!我把這些框架附在了文末,可供參考,但是開始階段最好還是先關注些簡單的問題。

理論已經講的差不多了,是時候放碼過來了。如果你對Python還不是很熟悉,我熱烈,強烈,猛烈,劇烈地推薦Fabrizio Romano的Learning Python,此書把每個點都解釋得特別好。我從未見過如此優秀的Python書,反而被很多耽誤了不少時間。

代碼基於Github上的Keras示例代碼,我個人的修改可見這裡。我已經調整了架構和參數,並加入了TensorBoard來輔助可視化。首先初始化我們的Python程序,導入數據集和建立DCNN所需的類。所幸,Keras已經集成了很多,所以十分方便。

(完整代碼請等待中、下篇)

最後,繼續推薦騰訊雲總監朱建平老師知乎Live:《如何成為AI工程師?》,時間為3月22日晚8點。

現送出免費參與禮券,請點擊: 知乎Live - 免費禮券 - 如何成為AI工程師


推薦閱讀:

PRML第一章公式1.68如何推導?
現在圖像處理和模式識別前景如何?
拓撲學在機器學習里有哪些應用呢?
自學模式識別應該看些什麼書?
任天堂的商業模式是什麼?

TAG:深度学习DeepLearning | 人工智能 | 模式识别 |