Excel實現卷積神經網路
- 2019 年 10 月 6 日
- 筆記
來源:Medium
編譯:weakish
編者按:Dave Smith使用Excel電子表格深入淺出地講解了卷積神經網路(CNN)是如何識別人臉的。

當你入門的時候,可能覺得機器學習很複雜……甚至很可怕。另一方面,電子表格卻很簡單。電子表格並不酷炫,但卻能避免分散你的注意力,同時幫助你以直觀的方式可視化程式碼後面發生的事情。
我將循序漸進地通過電子表格(你可以通過下面的鏈接下載)向你展示卷積神經網路(CNN)是如何應用於電腦視覺任務的。其中包括一些數學,不過電子表格中包含了所有的公式。
https://drive.google.com/open?id=1TJXPPQ6Cz-4kVRXTSrbj4u4orcaamtpGvY58yuJbzHk
這一電子表格模型查看一幅影像,分析它的像素,並預測是否是Elon Musk、Jeff Bezos、Jon Snow……顯然這三位是天網的最大威脅。

終結者視覺——在電子表格中創建卷積神經網路
本文將介紹上圖中的9個步驟,每個步驟都會使用類比的方法給你的直覺增壓。
本文的目標是使用容易操作的電子表格,提供入門機器學習的簡單路徑,並向充滿好奇心的讀者展示尖端AI技術的奧秘。如果本文對你有幫助,請註冊我創建的郵件列表,註冊後可以收到更多後續的電子表格,幫助你入門機器學習和創建神經網路。

Facebook面部識別系統、某國奧威爾式的大規模監控系統、你的汽車(不久的將來)背後的基礎都是電腦視覺。

CNN神探
讓我們假裝終結者的頭腦里住著一個特別的偵探,名叫「夏洛克·卷積·福爾摩斯」。他的工作是仔細查看證據(輸入影像),使用敏銳的眼神和推理能力(特徵檢測),預測影像中的人是誰,從而破案(正確分類影像)。

卷積網路架構
你將學習:
- 輸入:電腦如何看
- 特徵檢測:像福爾摩斯一樣思考
- 卷積數學:福爾摩斯的偵探工具
- ReLU:非線性模式識別
- 最大池化:保留最重要的線索
- 扁平化:排列所有線索
- 全連接:完成案件拼圖
- Logit + Softmax:破案
- 交叉熵損失:福爾摩斯的「正/誤」

輸入——一圖勝千言

天網的最大威脅——Elon Musk
我從上面的影像中看到了一個有遠見的人。他一方面不斷改善地球這顆星球,另一方面創建逃離地球的火箭,以防終結者試圖摧毀地球。和電腦不同,我看不到像素值,也無法辨認出一張影像不過是紅光、綠光、藍光的堆疊:

另一方面,一台電腦(比如天網)是瞎的……它只能看到數字。
想像一下由3張電子表格(紅、綠、藍)堆疊構成的電子影像,每張表格是一個數字矩陣。拍照的時候,相機測量到達每個像素的紅光、綠光、藍光的量。接著它在0-255的範圍內評估每個像素,然後將其記錄到電子表格中。

電腦看到電子表格
上為一張28×28的影像,每個像素由三行(紅、藍、綠)表示,取值範圍0-255. 每個像素的顏色對應其數值。

終結者沒有看到眼睛,他看到的是一串數字
將每種顏色單獨放到一個矩陣中,我們得到了3個28×28矩陣,也就是我們之後用來訓練神經網路的輸入:

模型輸入
如果你想知道如何將任意影像轉換成電子表格,請訪問以下網址:
http://think-maths.co.uk/spreadsheet
你將學到如何得到一張「Ex拍」,你的Excel迷朋友們會喜歡的……相信我,在電子表格中找到你的馬克杯(或者他們的)會讓他們捧腹大笑的? (小圖效果最佳)。
訓練概覽——像電腦,又像小孩
你剛出生的時候知道狗是什麼樣的嗎?當然不知道。但隨著時間的推移,你的父母會給你看書中、動畫片中、真實生活中的狗的影像,漸漸地,你可以指著那些4條腿、毛茸茸的動物說「狗」。你的大腦中數億神經元間的連接變得足夠強,所以你可以識別狗。
終結者以同樣的方式學習識別Elon。在一個被稱為監督訓練的過程中,人們給終結者看數千張Elon Musk、Jeff Bezos、Jon Snow的影像。剛開始,它只能隨便亂猜(1/3的幾率猜對),漸漸地,就像小孩一樣,隨著它在訓練過程中看到越來越多的影像,它猜得越來越准。網路的連接(也就是「權重/偏置」)隨著時間的推移而更新,使得它可以基於像素輸入預測輸出。這是我上一篇文章中討論過的學習過程(梯度下降)。

CNN訓練周期
卷積神經網路和普通神經網路的區別何在?
用兩個詞概括:平移不變性。
不知所云?讓我們解構一下:
- 平移 = 將某物從一個地方移動到另一個地方
- 不變性 = 沒有改變
在電腦視覺中,這意味著,不管對象移動到影像中的何處(平移),不會改變對象是什麼(不變性)。

平移不變性(以及縮放不變性)
這需要訓練卷積神經網路識別Elon的特徵,不管Elon在影像中的位置在哪裡(平移),也不管Elon在影像中的大小(縮放不變性)。
在普通神經網路中,我們本來會將每個像素作為模型的一個輸入(而不是3個矩陣),但這忽略了相近的像素具有特別的意義和結構這一事實。在CNN中,我們查看像素組,這允許模型學習形狀、線條等局部模式。比方說,如果CNN看到許多白像素包圍一個黑圓圈,它會識別出眼睛這一模式。
為了達到平移不變性,CNN需要依靠它的特徵偵探夏洛克·卷積·福爾摩斯的服務。
類比: 影像就像由像素組成的電子表格。

遇見夏洛克·卷積·福爾摩斯——特徵偵探

尋找特徵的夏洛克
夏洛克住在終結者的頭腦中。他每次使用放大鏡仔細檢查一小片影像,尋找影像的重要特徵(「線索」)。在收集到簡單的線條和形狀之類的線索後,他將它們堆疊起來,開始看到眼睛或鼻子之類的面部特徵。
每個卷積層儲存基於另一層構建的一組特徵映射。最後,夏洛克組合所有線索,這樣他就可以破案了(識別目標)。

每個特徵映射就像一條線索
網路的每個卷積層都包含一組特徵映射,這些映射能夠以下圖所示的層次化的方式識別越來越複雜的模式/形狀。
CNN基於數字的模式識別找到任意影像的最重要特徵。隨著CNN以更多的網路層不斷堆疊這些模式,它可以創建非常複雜的特徵映射。

特徵層次
真實生活中的CNN和夏洛克做一樣的事情:
CNN的奇妙之處在於可以自行學習這些特徵……工程師不用編寫尋找一雙眼睛、一個鼻子、一張嘴的集合這樣的程式碼。
以這種方式工作的工程師更像架構師,他們告訴夏洛克:「我給你兩疊(『卷積層』)空白特徵映射(『線索』),你的工作是分析影像,找出最重要的線索。第一疊有16個特徵映射(『線索』),第2疊有64個特徵映射……現在發揮你的偵探技能,解決這個案件!」
類比: 每個特徵映射就像案件中的一條線索。

為了查明案件中的「線索」(即計算特徵映射),夏洛克需要依靠他的偵探工具箱中的一些工具,我們會逐一介紹:
- 過濾器 —— 夏洛克的放大鏡 ?
- 卷積數學 —— 過濾器權重 x 輸入影像像素
- 步進 —— 沿著輸入影像移動過濾器 ? ➡️ ? ➡️
- 補齊 —— 保護線索的犯罪現場隔離膠帶 ?
夏洛克的放大鏡/過濾器
毫無疑問,夏洛克非常敏銳,具備出色的觀察技能,但是,如果沒有那些特製的放大鏡(過濾器),夏洛克沒法完成他的工作。他使用不同的放大鏡幫助填充每張空白特徵映射的細節。所以,如果他有16個特徵映射……他會有16塊放大鏡。

每塊放大鏡由多層玻璃組成,而每層玻璃由不同的權重組成。玻璃的層數,也就是過濾器深度,總是等於輸入層的深度。
剛開始,夏洛克看到的輸入影像有3層——紅、綠、藍。所以,放大鏡也有3層。
隨著我們進一步創建CNN,層的深度會增加,相應地,放大鏡也會變厚。
為了創建1個特徵映射(一條線索),夏洛克從取出一個放大鏡,並置於輸入影像的左上角開始。紅層玻璃只能看到紅輸入影像,綠層玻璃只能看到綠圖,而藍層玻璃只能看到藍圖。
現在是數學部分。
卷積數學
特徵映射中的每個像素是線索的一部分。為了計算每個像素,夏洛克需要進行一些基本的乘法和加法。
在下面的例子中,我們使用5x5x3的輸入影像和3x3x3的過濾器,每個像素需要進行以下計算:
- 3x3x3過濾器每層的卷積乘法 = 27
- 將27個數字加起來
- 再加上1個數字——偏置
讓我們仔細看下數學。一個像素需要27次乘法(3層,每層9次乘法),下面的截圖顯示了27次乘法中的9次:

分素相乘
至於偏置,你可以把它想像成放大鏡的把手。像權重一樣,它是模型的另一個參數,在訓練過程中自動調整,以提高模型的精確度,並更新特徵映射細節。
過濾器權重——在上面的例子中,我為了簡化數學,將權重的值設為-1、0、1;然而,一般而言,你需要用較小的值隨機初始化權重……比如0.01到0.1之間的值,基於鐘形曲線或正態分布取樣。想要了解更多權重初始化的知識,可以看這篇入門。
步進 —— 移動放大鏡
計算特徵映射的第1個像素之後,夏洛克將把放大鏡往哪移呢?

步進:每次移動放大鏡1像素
答案取決於步進參數。作為架構師/工程師,我們需要告訴夏洛克,他應該將他的放大鏡向右移動(步進)多少像素。實踐中最常見的步長值為2或3,但出於簡單性,這裡我們將步長設為1. 這意味著夏洛克將放大鏡向右移動1像素,然後進行和之前一樣的卷積運算。
當他的放大鏡到達輸入影像的最右邊時,他將放大鏡移到最左,然後往下移動1像素。
步長為何大於1?
優點:更少運算,記憶體中儲存的運算結果更少,從而使模型更快。
缺點:由於跳過像素有錯過模式的潛在可能性,損失了關於影像的數據。
2或3步長通常是合理的,因為緊跟著一個像素的像素通常具有相似的值,而隔著2-3個像素的像素,更可能具有不同的值,這樣的值對特徵映射/模式而言可能很重要。
如何預防資訊損失(丟失線索)
為了破案,夏洛克剛開始接觸案件的時候需要大量線索。在我們上面的例子中,我們的輸入為一張5x5x3的影像,或者75像素資訊(75 = 5 x 5 x3),在第一個卷積層後,我們得到了一張3x3x2的影像,或者18像素(18 = 3 x 3 x 2)。這意味著我們損失了證據,這讓夏洛克的搭檔約翰·華生非常反感。

在CNN的剛開始幾層,夏洛克傾向於查看大量細微模式(更多線索)。在靠後的卷積層中,隨著夏洛克堆疊細微的線索,查看較大的模式,「降取樣」也就是降低像素的總量(更少線索)沒什麼問題。
那麼,在CNN剛開始的時候,我們如何預防這樣的資訊損失呢?
一、補齊——通過補齊影像保護犯罪現場

在上面的例子中,我們在撞上右邊緣前,只能移動過濾器3次……從上往下同樣如此。這意味著我們所得輸出的高/寬為3×3,從左往右,損失了2像素,而從上往下又損失了2像素。
為了預防這種資訊損失,常見的做法是用零「補齊」原始影像(稱為全零補齊(zero padding或same padding))……有點類似用犯罪現場隔離膠帶確保沒人破壞證據。

補齊之後,如果夏洛克再次使用相同的放大鏡,他的兩個特徵映射的大小會是5×5而不是3×3.
這意味著我們最終得到了50像素的資訊(5x5x2=50)。
50像素比18要好。不過別忘了……我們剛開始有75像素,所以我們仍然錯過了一些線索。
所以我們還能做什麼讓夏洛克和約翰·華生滿意?
二、更多過濾器——至少在我們的卷積層中加上一個特徵映射,給夏洛克更多線索
模型對特徵映射(「線索」)的數量並沒有限制……這是我們可以控制的超參數。
如果我們至少將特徵映射從2增加到3(5x5x2到5x5x3),那麼總輸出像素(75)就和輸入像素(75)相等了。如果我們將映射增加到10,那麼我們會有更多資訊供夏洛克探究(5x5x10 = 250)。

事情變得越來越有趣了
總結一下,剛開始幾層的資訊像素總數一般高於輸入影像,因為我們想要給夏洛克儘可能多的細微模式/線索。在網路的最後幾層,我們常常進行降取樣,資訊像素變少,這是因為這些層識別影像中較大的模式。
類比: 過濾器就像放大鏡,而補齊就像犯罪現場隔離膠帶。

非線性模式識別——ReLU
給夏洛克足夠的案件資訊很重要,但現在到了進行真正的偵探工作的時候了——非線性模式識別!比如耳廓和鼻洞。
到目前為止,夏洛克進行了大量數學運算以構建特徵映射,但所有運算都是線性的(在每個輸入像素上進行一些乘法和加法操作),因此,他只能識別像素的線性模式。
為了給CNN引入非線性,我們將使用一種稱為修正線性單元(Rectified Linear Unit)的激活函數,簡稱ReLU。在我們初次進行卷積運算得出特徵映射後,每個值都通過這一函數,看看是否點亮/激活。
如果輸入值是負數,那麼輸出將為零。如果輸入值是正數,那麼輸出將和輸入一樣。ReLU就像一個開關,讓特徵映射的每個值通過ReLU之後,就創建了非線性模式識別。
回到我們原本的CNN例子,我們在卷積之後馬上應用ReLU:

儘管有許多非線性激活函數可以為神經網路引入非線性(Sigmoid、Tanh、Leaky ReLU等),ReLU是CNN中目前最流行的激活函數,因為ReLU在算力上很高效,能加快訓練。你可以參閱Andrej Karpathy的overview on non-linear activation functions了解每種函數的優劣(譯者註:也可以參考理解神經網路的激活函數,同樣比較了不同激活函數的優劣)。
類比: ReLU就像開關。

最大池化——在大腦閣樓中保留關鍵的少量資訊
現在夏洛克有一些特徵映射(「線索」)要查看,如何確定哪些資訊是關鍵的,哪些資訊是無關的細節?最大池化。
夏洛克認為人類的大腦就像一個空閣樓。傻瓜會在裡面存放各種各樣的傢具和物品,讓有用的資訊在一堆雜物中不知所蹤。而智者僅僅儲存最重要的資訊,從而在需要的時候可以快速做出決定。從這個意義上說,最大池化是夏洛克版的大腦閣樓。為了更快地做出決定,他只保留最重要的資訊。

通過最大池化,夏洛克在相鄰的像素中僅僅保留最大值,證據中最重要的部分。
例如,如果他查看一個2×2區域(4像素),他僅僅保留其中值最高的像素,丟棄其餘3個像素。這一技術讓他可以快速地學習,同時也有助於他概括(而不是「記憶」)可用於未來影像的線索。
和之前的放大鏡過濾器類似,我們同樣可以控制最大池化的步長和大小。在下面的例子中,我們將步長設為1,池化尺寸設為2×2:

最大池化之後,我們完成了1回合卷積/ReLU/最大池化。
典型的CNN在分類器之前會有若干回合卷積/ReLU/池化。在每一回合中,我們將在增加深度的同時擠壓高/寬,這樣我們不會在此過程中遺失證據。
第一步至第五步,我們專註於收集證據,現在是時候讓夏洛克查看所有線索,偵破案件了:

現在我們已經有了證據,讓我們開始挖掘證據的意義……
類比: 最大池化就像夏洛克的閣樓理論,保留關鍵資訊,拋棄駁雜無用的資訊。

在訓練周期的末尾,夏洛克得到了堆積如山的線索,需要找到一下子查看所有線索的方式。每條線索不過是一個2維矩陣,但我們有堆疊在一起的數以千計的矩陣。
作為一名私家偵探,夏洛克很擅長應付這樣的混沌,但他需要將證據呈上法庭,整理證據以供陪審團查看。

扁平化之前的特徵映射
他通過一種簡單的轉換技術(稱為扁平化)做到了這一點:
- 將每個由像素組成的2維矩陣轉換為一列像素
- 將原本的二維矩陣(現在的一列像素)一個接一個地排列起來
在人類的眼睛看來,變換是這樣的:

而在電腦看來,是這樣的:

現在夏洛克已經整理好證據了,是時候說服陪審團證據清楚地指向一個嫌疑人。
類比:扁平化就像把證據呈上法庭。

在全連接層中,我們將方方面面的證據連接起來。某種意義上,我們完成案件的拼圖,向評審團表明證據和每個嫌疑人之間的聯繫:

在電腦看來,全連接層是這樣的:

在扁平層的每份證據和3個輸出之前是一組權重和偏置。類似網路中的其他權重,這些值會在剛開始訓練CNN的時候隨機初始化,而隨著時間的推移,CNN將「學習」如何調整這些權重/偏置以得到更精確的預測。
現在,到了夏洛克揭曉謎底的時間了!
類比:全連接層就像說服陪審團下決定。

在CNN的影像分類器階段,模型的預測為得分最高的輸出。模型的目標是讓正確的輸出得分最高,而讓錯誤的輸出得分較低。
評分分為兩部分:
- Logit分數——原始得分
- Softmax——每個輸出的概率(0-1之間)。所有輸出得分之和等於1.
1. Logit——邏輯得分
每個輸出的Logit得分是一個基本的線性函數:
Logit得分 = (證據 x 權重) + 偏置
每片證據乘以連接證據至輸出的權重。所有乘積相加,最後加上偏置項,得分最高的為模型的猜測。

所以,為什麼不到此為止?直觀地說,有兩個原因:
- 夏洛克的置信度——我們想要知道夏洛克對結果有多自信,這樣,當夏洛克的置信度很高同時他是正確的時候,我們會獎勵他,而在夏洛克的置信度很高同時他是錯誤的時候,我們會懲罰他。我們在下一部分計算損失(「夏洛克的精確度」)時會具體討論獎勵/懲罰。
- 夏洛克的置信度加權概率——我們想要能夠方便地解釋這些0到1之間的概率,並且我們想要預測得分和實際輸出(0或1)處於同一尺度。實際正確的結果(Elon)的概率為1,其他錯誤的結果(Jeff和Jon)的概率為0. 將正確輸出轉為一,錯誤輸出轉為零的過程稱為獨熱編碼。
夏洛克的目標是讓他對正確輸出的預測儘可能接近1.
2. Softmax——夏洛克的置信度加權概率得分
2.1 夏洛克的置信度
為了得出夏洛克的置信度,我們以e(等於2.71828…)為底數,以logit得分為指數。這樣,一個較高的得分將變為非常高的置信度,而一個較低的得分將變為非常低的置信度。
這番指數運算同時也確保了我們不會有任何負分(logit得分「可能」是負數)。

2.2 夏洛克置信度加權概率
為了得出置信度加權概率,我們將每個輸出置信度除以所有置信度得分之和,這就確保了所有概率之和為1.

softmax分類器很直觀。夏洛克認為有97%(置信度加權)的幾率終結者查看的影像是Elon Musk.
模型的最後一步是計算損失。損失告訴我們偵探夏洛克到底有多棒(或者到底有多糟)。
類比:Logit + Softmax就像查看一排嫌疑人,並指出罪犯

所有神經網路都有一個損失函數,用來比較預測和實際值。在CNN訓練的過程中,隨著網路權重/偏置的調整,預測改進了(夏洛克的偵探技能變得更厲害了)。
CNN最常用的損失函數是交叉熵。用Google搜索交叉熵出現的一些解釋都涉及大量希臘字母,很容易讓人困惑。儘管這些描述各不相同,在機器學習的語境下它們都意味著一樣東西,我們下面將介紹最常見的3種解釋,便於你理解。
在描述每種公式變體之前,先概括一下它們的共同點:
- 比較正確分類的概率(Elon,1.00)和CNN的預測(Elon的softmax得分,0.97)。
- 當夏洛克對正確分類的預測接近1時(低損失),獎勵他?
- 當夏洛克對正確分類的預測接近0時(高損失),懲罰他?

結果是一樣的!3種不同的解釋……
1號解釋——衡量實際概率和預測概率的距離
距離捕捉了以下直覺:如果對正確標籤的預測接近1,那麼損失接近0. 如果對正確標籤的預測接近0,那麼將受到嚴厲的懲罰。目標是最小化正確分類的預測(Elon,0.97)和正確分類的實際概率(1.00)的距離。
賞罰「對數」公式背後的直覺將在2號解釋中討論。

2號解釋——最大化log似然或最小化負log似然
在CNN中,「對數」實際上指「自然對數(ln)」,它是softmax中以自然對數為底的指數的逆運算。
對夏洛克遠離1.00的預測而言,相比直接從實際概率(1.00)中減去預測概率(0.97)來計算損失,對數運算將懲罰以指數級別加重了。
最小化負對數似然和最大化對數似然均導向softmax預測趨向1.0,損失趨向0.0的結果。


3號解釋——KL散度
KL(Kullback-Leibler)散度衡量預測概率(softmax得分)和實際概率的差異。
KL散度的公式包括兩部分:
- 實際概率的不確定性。
- 使用預測概率損失的資訊量。
在監督學習分類問題的模型訓練中,實際概率的不確定性總是等於0. 我們百分之百確定訓練影像的分類無誤。此時,最小化預測概率分布和實際概率分布之間的KL散度等價於最小化交叉熵。

類比:交叉熵損失就像評估夏洛克的偵探技能。
總結
在夏洛克·卷積·福爾摩斯這位特別的偵探的幫助下,終結者有了一對能夠搜索並摧毀自由世界的保護者Elon Musk的眼睛(對不住了,Elon!)。
雖然我們僅僅訓練了終結者識別Elon、Jeff、Jon……天網有無窮多的資源,可以隨意訓練影像,因此天網可以利用我們創建的模型訓練終結者識別任何人類和物體。
訂閱郵件列表和分享
如果你喜歡本文,並想收到更多通過Excel進行機器學習的內容,可以訪問excelwithml.com免費訂閱郵件列表。
你也可以在Twitter上關注ExcelwithML。
更多可交互資源
- 畫一個數字,查看CNN如何預測它:http://scs.ryerson.ca/~aharley/vis/conv/flat.html
- 用Google和你的攝影機訓練自己的CNN: https://experiments.withgoogle.com/teachable-machine
- Andreij Karpathy的實時影像分類模型:https://cs.stanford.edu/people/karpathy/convnetjs/demo/cifar10.html
- Fast.AI講解CNN的影片(不可交互,不過是一個很好的講座):https://www.youtube.com/watch?time_continue=2548&v=9C06ZPF8Uuc
在未來與機器的戰爭中,我們的命運就在你的手中