帶你學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儲存下來的話就像下面這張圖片一樣。

標籤是和每一張圖片對應的,比如對應上面的圖片,從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標準的例子,全連線足夠我們用來練手了。
(未完待續。。。)