1465224492-2155-33a-600x281
作者:王小龍
0. 分類
神經網路最重要的用途是分類,為了讓大家對分類有個直觀的認識,我們們先看幾個例子:

  • 垃圾郵件識別:現在有一封電子郵件,把出現在裡面的所有詞彙提取出來,送進一個機器裡,機器需要判斷這封郵件是否是垃圾郵件。
  • 疾病判斷:病人到醫院去做了一大堆肝功、尿檢測驗,把測驗結果送進一個機器裡,機器需要判斷這個病人是否得病,得的什麼病。
  • 貓狗分類:有一大堆貓、狗照片,把每一張照片送進一個機器裡,機器需要判斷這幅照片裡的東西是貓還是狗。

這種能自動對輸入的東西進行分類的機器,就叫做分類器。
分類器的輸入是一個數值向量,叫做特徵(向量)。在第一個例子裡,分類器的輸入是一堆 0、1 值,表示字典裡的每一個詞是否在郵件中出現,比如向量 (1,1,0,0,0……) 就表示這封郵件裡只出現了兩個詞 abandon 和 abnormal;第二個例子裡,分類器的輸入是一堆化驗指標;第三個例子裡,分類器的輸入是照片,假如每一張照片都是 320*240 畫素的紅綠藍三通道彩色照片,那麼分類器的輸入就是一個長度為 320*240*3=230400 的向量。
分類器的輸出也是數值。第一個例子中,輸出 1 表示郵件是垃圾郵件,輸出 0 則說明郵件是正常郵件;第二個例子中,輸出 0 表示健康,輸出 1 表示有甲肝,輸出 2 表示有乙肝,輸出 3 表示有餅乾等等;第三個例子中,輸出 0 表示圖片中是狗,輸出 1 表示是貓。
分類器的目標就是讓正確分類的比例儘可能高。一般我們需要首先收集一些樣本,人為標記上正確分類結果,然後用這些標記好的資料訓練分類器,訓練好的分類器就可以在新來的特徵向量上工作了。

1. 神經元
我們們假設分類器的輸入是通過某種途徑獲得的兩個值,輸出是 0 和 1,比如分別代表貓和狗。現在有一些樣本:

1465224492-7159-06

大家想想,最簡單地把這兩組特徵向量分開的方法是啥?當然是在兩組資料中間畫一條豎直線,直線左邊是狗,右邊是貓,分類器就完成了。以後來了新的向量,凡是落在直線左邊的都是狗,落在右邊的都是貓。
一條直線把平面一分為二,一個平面把三維空間一分為二,一個 n-1 維超平面把 n 維空間一分為二,兩邊分屬不同的兩類,這種分類器就叫做神經元。
大家都知道平面上的直線方程是 ,等式左邊大於零和小於零分別表示點 在直線的一側還是另一側,把這個式子推廣到 n 維空間裡,直線的高維形式稱為超平面,它的方程是:
神經元就是當 h 大於 0 時輸出 1,h 小於 0 時輸出 0 這麼一個模型,它的實質就是把特徵空間一切兩半,認為兩瓣分別屬兩個類。你恐怕再也想不到比這更簡單的分類器了,它是 McCulloch 和 Pitts 在 1943 年想出來了。
這個模型有點像人腦中的神經元:從多個感受器接受電訊號 ,進行處理(加權相加再偏移一點,即判斷輸入是否在某條直線 的一側),發出電訊號(在正確的那側發出 1,否則不發訊號,可以認為是發出 0),這就是它叫神經元的原因。
當然,上面那幅圖我們是開了上帝視角才知道“一條豎直線能分開兩類”,在實際訓練神經元時,我們並不知道特徵是怎麼抱團的。神經元模型的一種學習方法稱為 Hebb 演算法:
先隨機選一條直線 / 平面 / 超平面,然後把樣本一個個拿過來,如果這條直線分錯了,說明這個點分錯邊了,就稍微把直線移動一點,讓它靠近這個樣本,爭取跨過這個樣本,讓它跑到直線正確的一側;如果直線分對了,它就暫時停下不動。因此訓練神經元的過程就是這條直線不斷在跳舞,最終跳到兩個類之間的豎直線位置。

2. 神經網路
MP 神經元有幾個顯著缺點。首先它把直線一側變為 0,另一側變為 1,這東西不可微,不利於數學分析。人們用一個和 0-1 階躍函式類似但是更平滑的函式 Sigmoid 函式來代替它(Sigmoid 函式自帶一個尺度引數,可以控制神經元對離超平面距離不同的點的響應,這裡忽略它),從此神經網路的訓練就可以用梯度下降法來構造了,這就是有名的反向傳播演算法。
神經元的另一個缺點是:它只能切一刀!你給我說說一刀怎麼能把下面這兩類分開吧。

1465224492-1940-06

解決辦法是多層神經網路,底層神經元的輸出是高層神經元的輸入。我們可以在中間橫著砍一刀,豎著砍一刀,然後把左上和右下的部分合在一起,與右上的左下部分分開;也可以圍著左上角的邊沿砍 10 刀把這一部分先挖出來,然後和右下角合併。
每砍一刀,其實就是使用了一個神經元,把不同砍下的半平面做交、並等運算,就是把這些神經元的輸出當作輸入,後面再連線一個神經元。這個例子中特徵的形狀稱為異或,這種情況一個神經元搞不定,但是兩層神經元就能正確對其進行分類。
只要你能砍足夠多刀,把結果拼在一起,什麼奇怪形狀的邊界神經網路都能夠表示,所以說神經網路在理論上可以表示很複雜的函式 / 空間分佈。但是真實的神經網路是否能擺動到正確的位置還要看網路初始值設定、樣本容量和分佈。
神經網路神奇的地方在於它的每一個元件非常簡單——把空間切一刀 + 某種啟用函式 (0-1 階躍、sigmoid、max-pooling),但是可以一層一層級聯。輸入向量連到許多神經元上,這些神經元的輸出又連到一堆神經元上,這一過程可以重複很多次。這和人腦中的神經元很相似:每一個神經元都有一些神經元作為其輸入,又是另一些神經元的輸入,數值向量就像是電訊號,在不同神經元之間傳導,每一個神經元只有滿足了某種條件才會發射訊號到下一層神經元。當然,人腦比神經網路模型複雜很多:人工神經網路一般不存在環狀結構;人腦神經元的電訊號不僅有強弱,還有時間緩急之分,就像莫爾斯電碼,在人工神經網路裡沒有這種複雜的訊號模式。

1465224492-9323-06

神經網路的訓練依靠反向傳播演算法:最開始輸入層輸入特徵向量,網路層層計算獲得輸出,輸出層發現輸出和正確的類號不一樣,這時它就讓最後一層神經元進行引數調整,最後一層神經元不僅自己調整引數,還會勒令連線它的倒數第二層神經元調整,層層往回退著調整。這很像中國的文藝體制,武媚娘傳奇劇組就是網路中的一個神經元,最近剛剛調整了引數。

3. 大型神經網路
我們不禁要想了,假如我們的這個網路有 10 層神經元,第 8 層第 2015 個神經元,它有什麼含義呢?我們知道它把第七層的一大堆神經元的輸出作為輸入,第七層的神經元又是以第六層的一大堆神經元做為輸入,那麼這個特殊第八層的神經元,它會不會代表了某種抽象的概念?
就好比你的大腦裡有一大堆負責處理聲音、視覺、觸覺訊號的神經元,它們對於不同的資訊會發出不同的訊號,那麼會不會有這麼一個神經元(或者神經元小集團),它收集這些訊號,分析其是否符合某個抽象的概念,和其他負責更具體和更抽象概念的神經元進行互動。
2012 年多倫多大學的 Krizhevsky 等人構造了一個超大型卷積神經網路[1],有 9 層,共 65 萬個神經元,6 千萬個引數。網路的輸入是圖片,輸出是 1000 個類,比如小蟲、美洲豹、救生船等等。這個模型的訓練需要海量圖片,它的分類準確率也完爆先前所有分類器。紐約大學的Zeiler 和 Fergusi[2]把這個網路中某些神經元挑出來,把在其上響應特別大的那些輸入影像放在一起,看它們有什麼共同點。他們發現中間層的神經元響應了某些十分抽象的特徵。
第一層神經元主要負責識別顏色和簡單紋理:

1465224492-9897-361-600x325

第二層的一些神經元可以識別更加細化的紋理,比如布紋、刻度、葉紋。

1465224492-7444-371-600x300

第三層的一些神經元負責感受黑夜裡的黃色燭光、雞蛋黃、高光。

1465224493-6349-381-600x304

第四層的一些神經元負責識別萌狗的臉、七星瓢蟲和一堆圓形物體的存在。

1465224493-9007-391-600x277

第五層的一些神經元可以識別出花、圓形屋頂、鍵盤、鳥、黑眼圈動物。

1465224493-7863-401-600x340

這裡面的概念並不是整個網路的輸出,是網路中間層神經元的偏好,它們為後面的神經元服務。雖然每一個神經元都傻不拉幾的(只會切一刀),但是 65 萬個神經元能學到的東西還真是深邃呢。

[1] Krizhevsky, A., Sutskever, I., & Hinton, G. E. (2012). Imagenet classification with deep convolutional neural networks. In Advances in neural information processing systems (pp. 1097-1105).

[2] Zeiler, M. D., & Fergus, R. (2013). Visualizing and understanding convolutional neural networks. arXiv preprint arXiv:1311.2901.