天天看點

帶你學AI(二)

人工智能的Hello World--入門

不管你學的是什麼語言,第一個程式肯定是Hello World。

從在螢幕上打出這行字開始,你就進入了這個語言的世界。

如果你寫的是java,那麼代碼就是

System.out.println("Hello World!");           

複制

如果你是用python寫的,那麼就是

print('Hello World!')           

複制

但如果你寫的是人工智能,那麼第一個需要學會寫的程式是什麼呢?

MNIST

如果你對AI有所了解,或者學習過深度神經網絡,那麼對MNIST應該不陌生。

MNIST是一個資料集,它不包含任何代碼邏輯,隻包含兩部分

· 一堆 28 * 28 的手寫圖檔

· 對應每張圖檔的一個标簽

因為這個資料集的資料足夠簡單,是以它經常被用來作為AI入門的工具。它的每一張圖檔都歸一化到了28x28的大小,而且隻有灰階值,是單通道資料。

通常來說,一張jpg圖檔的每一個像素都有RGB三種色值,我們也稱之為3通道。如果一張圖檔隻有黑色和白色,并且沒有灰階的話,那麼我們用1跟0就可以描述每個像素點的黑或者白了。

MNIST就是這麼一個資料集,如果你把它的每一張圖檔資料轉成jpg儲存下來的話就像下面這張圖檔一樣。

帶你學AI(二)

标簽是和每一張圖檔對應的,比如對應上面的圖檔,從MNIST裡取出來的标簽是

label[4]{5, 0, 4, 1}           

複制

我們要寫的第一個人工智能Hello World,就是用MNIST資料集來實作的。

第一個Hello World

人工智能做的事情基本可以分為兩個,分類和預測。

對于MNIST資料集來說,我們想要寫一個AI網絡,這個網絡能夠自動識别每一張圖檔的數字是什麼。網絡的輸入是28x28像素的圖檔,輸出則是一個長度10的浮點數組。

這裡思考個問題,為什麼輸出是一個長度10的數組,而不是單個值?

其實對于分類問題都是這樣的,AI最終輸出的是一個機率分布,而不是一個直接的分類結果。雖然說我們也可以通過代碼技巧讓最終結果隻有一個值,但明白這一點很關鍵,就是AI的輸出是一個機率。

具象點地解釋,假設我們把一張圖檔給AI進行分類,它的輸出假設是下面這樣子

[0.1, 0.1, 0, 0, 0, 0, 0, 0, 0, 0.8,]

AI認為這張圖檔有10%的機率是0,10%的機率是1,還有80%的機率是9。這就是為什麼AI的輸出是一個10維向量的原因了。

說完了輸出和輸出,還缺兩個東西才能構成一個AI網絡,分别是

· 網絡結構

· 評價函數/損失

評價函數

對于很多初學者來說評價函數是個很難的點,學習它的過程中涉及很多高等數學知識。但對于MNIST分類網絡來說不需要太高深的東西,隻要能明白一些基本的加減乘除就行了。

什麼是評價函數呢,有些材料把它稱為cost,也有叫lost的。其實他們都在描述同一個問題,就是網絡分類結果跟正确結果之間的誤差。

神經網絡的訓練是這麼個過程,有點像隔壁鄰居的孩子學鋼琴。剛開始學的時候彈的一塌糊塗,一個音都沒彈對。這個時候鄰居孩子彈出來的曲子跟正确的曲子之間會有一個誤差,我們就可以把這個誤差認為是評價函數,或者也可以叫損失。

每彈完一次,鄰居家長對孩子彈的曲子做一個評價,根據評價結果對孩子做出不同的懲罰。錯的太多的話就加大懲罰力度,錯的少的話就小力度懲罰。如果彈對了那懲罰為0。

一個AI網絡的訓練過程就是這麼回事。通過不斷地縮小網絡輸出和正确值之間的誤差來完成訓練。最終達到目标,神經網絡的預測結果跟實際結果一緻。

基于MNIST資料集的評價函數計算的是預測結果和标簽之間的差距,下面的資料第一行是預測結果,第二行是标簽

pred: [0.1, 0.1, 0, 0, 0, 0, 0, 0, 0, 0.8,]

label: [0, 0, 0, 0, 0, 0, 0, 0, 0, 1,]

對于這種資料,有一種專門的評價方法叫做交叉熵。交叉熵本身是屬于資訊論中的一種手段,用來評價兩個機率區間的差異。那麼當然它也可以用來對AI的分類結果和正确結果之間的差異性進行評價。我們先不要去關心交叉熵的數學實作是怎樣的,先記住它計算的結果表明的是 pred和 label之間有多不一樣。

網絡結構

深度學習的網絡結構千變萬化。每年在深度學習領域的論文有幾百上千篇,幾乎每一篇都有一個不同的網絡結構。但總的來說,不管是什麼網絡都由基礎的幾個構成

· 全連接配接

· 卷積

· 循環卷積

在MNIST資料集上我們隻需要用到全連接配接網絡,更複雜的網絡雖然能帶來更準确的結果,但同時也增加了相應的記憶體和空間開銷。作為一個Hello World标準的例子,全連接配接足夠我們用來練手了。