數學不行還學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/dir」ndst_dir = 「your/destination/dir」nnfor 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)代表。如果信號足夠強,就會通過「激勵函數」激活神經元。
這裡是一個三層神經網路的例子:
有些神經元被激活,有些神經元之間的連接被增強,由此系統學習到了那些才是重要的。
建立並訓練神經網路
接下來我們邊寫代碼,邊深入理解深度學習。系統的必要特性有:
- 訓練
- 輸入數據
- 層
- 權重
- 目標
- 損失函數
- 優化函數
- 預測
訓練
訓練就是我們如何教會神經網路要學什麼,分為五個步驟:
- 建立訓練集, 記作x,並導入標籤為目標y
- 前饋數據給網路,得到預測結果y
- 定義網路的「損失」,即預測y和真實目標y之差
- 計算損失的「梯度」,即我們接近或遠離正確目標的速度
- 沿著梯度的反方向來調整網路權重,並周而復始
輸入數據
在本例中,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 | 人工智能 | 模式识别 |