人臉識別技術(shù)已經(jīng)有了非常廣泛的應(yīng)用,國內(nèi)大規(guī)模監(jiān)控系統(tǒng)背后運用的技術(shù)就是人臉識別。
與大家常規(guī)見到的搭建人臉識別的神經(jīng)網(wǎng)絡(luò)方法不同,本文作者 Dave Smith 走了一次不同尋常路,他在 Excel 中用 9 步就搭建了一個人臉識別的CNN 神經(jīng)網(wǎng)絡(luò),讓神探 Sherlock 識別出世界的終結(jié)者“Elon”!在這篇文章中,作者試圖以直觀的可視化方式呈現(xiàn)出代碼背后發(fā)生的事情,希望可以幫助大家消除學(xué)習(xí)過程中的一些疑慮,
本文的目標(biāo)就是為您提供一個簡單的機器學(xué)習(xí)入門,將涵蓋下圖所示的 9 個步驟。
補充工具:幫助大家了解如何在 30 秒左右的時間將任意一張圖片轉(zhuǎn)換為有條件格式的Excel 文件
http://think-maths.co.uk/spreadsheet
終結(jié)者視角—在電子表格中創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)
背景
我們首先假設(shè),在終結(jié)者的大腦中有一個名叫'Sherlock Convolution Holmes'的特殊偵探。他的工作就是仔細查看證據(jù)(輸入圖像)并使用敏銳的眼睛和推演能力(特征檢測),預(yù)測圖片中的人物是誰以此來破案(正確分類圖像)。
注:為了減少大家對后面內(nèi)容的疑惑,首先劇透一點,這篇文章的“男主”其實是 Sherlock Convolution Holmes 。作者可能是神探夏洛克的粉絲,整篇文章都是圍繞 Sherlock 是如何破案來展開的。
我們將用電子表格模型來查看圖片,分析像素值,并預(yù)測它是否是 Elon Musk,Jeff Bezos 或者 Jon Snow,顯然這三個人是 Skynet 最大的威脅。用圖像化來比喻,CNN就像 Sherlock Holmes。這個過程中會使用到一些數(shù)學(xué)公式,我們在這里給出了參考鏈接,方便大家學(xué)習(xí)。
參考鏈接:
https://drive.google.com/open?id=1TJXPPQ6Cz-4kVRXTSrbj4u4orcaamtpGvY58yuJbzHk
以下9個步驟中的每個步驟都是這個圖像化比喻的一部分。
卷積神經(jīng)網(wǎng)絡(luò)體系結(jié)構(gòu)
第一步
▌輸入:一張圖片就像是成千上萬的數(shù)字
下面是我們的輸入圖片,我們是如何對這張照片進行操作的呢?
將數(shù)碼照片看作3個電子表格(1個紅色,1個綠色,1個藍色)堆疊在一起,每個電子表格都是一個數(shù)字矩陣。拍攝照片時,相機會測量每個像素的紅色,綠色和藍色光量。然后,按 0-255 的等級對每個像素進行排名,并將它們記錄在電子表格中:
在上面的 28x28 圖像中,每個像素由 3 行(1個紅色,1個藍色和1個綠色)表示,其值為 0-255。其中像素已根據(jù)其值進行了格式化。
沒有看到真實的眼睛,看到的只是一堆數(shù)字
如果我們將每種顏色分成單獨的矩陣,就會得到 3 個 28x28 矩陣,而每個矩陣都是訓(xùn)練神經(jīng)網(wǎng)絡(luò)的輸入:
模型輸入
▌訓(xùn)練概述
在你剛出生的時候并不認識什么是狗。但在你成長的過程中,你的父母會在書中,動畫片,現(xiàn)實生活中向你展示狗的照片,最終你可以指著那些四條腿毛茸茸的動物說“這是只狗”。這是由于大腦中數(shù)十億神經(jīng)元之間的聯(lián)系變得足夠強大,讓你可以識別狗。
終結(jié)者也是以同樣的方式學(xué)會誰是 Elon。通過一個監(jiān)督訓(xùn)練的過程,我們給它展示成千上萬張 Elon Musk,Jeff Bezos 和 Jon Snow 的照片。起初,它有三分之一的機會猜中,但就像一個小孩,隨著時間的推移這個幾率會提高。網(wǎng)絡(luò)的連接或“權(quán)重/偏差”就會隨著時間更新,使得它可以基于像素級的輸入去預(yù)測圖片輸出。
那么是什么使卷積神經(jīng)網(wǎng)絡(luò)與普通神經(jīng)網(wǎng)絡(luò)不同呢?
5個字:平移不變性。讓我們來簡單解析它一下:
平移 = 從一個地方移動到另一個地方
不變性 = 保持不變
對于計算機視覺,這意味著無論我們把目標(biāo)移動到哪個位置(平移),它都不會改變目標(biāo)的內(nèi)容(不變性)。
平移不變性(還可加上尺度不變性)
無論他在圖像中什么位置(平移),什么大小(尺度不變),卷積神經(jīng)網(wǎng)絡(luò)經(jīng)過訓(xùn)練都能識別到 Elon 的特征。CNN 擅長識別圖像任何部分的模式,然后將這些模式疊加在一起,以構(gòu)建更復(fù)雜的模式,就像人類一樣。
在普通神經(jīng)網(wǎng)絡(luò)中,我們將每個單獨的像素視為我們模型的輸入(而不是3個矩陣),但這忽略了相鄰像素是具有特殊的意義和結(jié)構(gòu)。對于 CNN,我們關(guān)注彼此相鄰的像素組,這允許模型學(xué)習(xí)像形狀,線條等的局部模式。例如,如果 CNN 在黑色圓圈周圍看到許多白色像素,它會將此模式識別為眼睛。
為了讓 CNN 實現(xiàn) translation variance,他們必須依靠特征檢測,也就是Sherlock Convolution Holmes 。
第二步
▌特征檢測:遇見 Sherlock Convolution Holmes
Sherlock 使用放大鏡,仔仔細細地檢查每一張圖像,找到該圖像的重要特征或“線索”。然后將這些簡單的線條和形狀特征堆疊在一起,就可以開始看到像眼睛或鼻子這樣的面部特征。
每個卷積層都會包含一堆特征圖或相互構(gòu)建的“線索”。在所有卷積完成過后,他將所有這些線索放在一起,就破解了案件并正確識別出目標(biāo)。
每個特征圖都像是另一個“線索”
網(wǎng)絡(luò)的每個卷積層都有一組特征圖,這些特征圖使用分層方式來識別越來越復(fù)雜的圖案/形狀。CNN 使用數(shù)字模式識別來確定圖像最重要的特征。它使用更多的層將這些模式堆疊在一起,因此可以構(gòu)建非常復(fù)雜的特征圖。
卷積神經(jīng)網(wǎng)絡(luò)檢測特征
讓人吃驚的是,CNN 他們可以自己學(xué)習(xí)到這些特征,而不需要工程師編寫代碼教他學(xué)習(xí)什么是2只眼睛,1個鼻子,嘴巴等等。
在這種方式下,工程師更像是建筑師。他們告訴 Sherlock,“我給你 2 個空白特征圖(“線索”)的堆棧(“卷積層”),你的工作是分析圖片并找到最重要的線索。第一個堆棧包含 16 個特征圖(“線索”),第二個堆棧包含 64 個特征圖.。接下來就可以利用這些偵探技巧去解決問題吧!”
第三步:
為了讓 Sherlock 找到案件中的“線索”(即“計算一張?zhí)卣鲌D”),他需要使用幾個工具,我們將一一介紹:
濾波器——sherlock 的放大鏡
卷積數(shù)學(xué)——濾波器的權(quán)重x輸入圖像的像素
步長——在輸入圖像上移動濾波器
填充——像“犯罪現(xiàn)場的警戒線”,用來保護線索
▌Sherlock 的放大鏡(濾波器)
Sherlock 毫無疑問非常敏銳且具有極高的洞察能力。但如果沒有他的特殊放大鏡或“濾波器”,他就無法完成他的工作。因此他使用不同的放大鏡來幫助他填充每個空白特征圖的細節(jié)。 所以,如果他有 16 張?zhí)卣鲌D,他就會用 16 個放大鏡。
每個放大鏡由多層玻璃組成,每層玻璃重量不同。玻璃層的數(shù)量,也就是我們的“濾波器深度”,總是與觀察的神經(jīng)網(wǎng)絡(luò)層的深度相匹配。
一開始,Sherlock查 看的輸入圖像,它有3層,紅色,綠色和藍色。所以,我們的放大鏡也有 3 層。當(dāng)我們構(gòu)建 CNN時,隨著層深度增加,我們的放大鏡也會變得更厚。
為了建立 1 個特征圖或“線索”,Sherlock 首先取出 1 個放大鏡并將其放在輸入圖像的左上部分。紅色玻璃層只能看到紅色輸入圖像,綠色玻璃看到綠色圖像,而藍色玻璃看到的是藍色圖像。
接下來是進行數(shù)學(xué)計算。
▌卷積數(shù)學(xué)
我們特征圖中的每個像素都是線索的一部分。為了計算每個像素,Sherlock 必須運用一些基本的乘法和加法。
在下面的例子中,我們將使用 5x5x3 的輸入圖像和 3x3x3 的濾波器,每個像素點需要 27 次乘法:
3 層 x 每層 9 次卷積= 27
將 27 個數(shù)字加在一起。
將 27 個計算結(jié)果加在一起之后,我們再加上1個數(shù)字—也就是偏置(bias)。
卷積計算——建立特征地圖
讓我們放大來看。一個像素由27次乘法組成,下面圖片顯示了 27次 乘法中的 9 次:
就偏置而言,您可以將其視為每個放大鏡的手柄。與權(quán)重一樣,它是模型的另一個參數(shù),每次訓(xùn)練都會調(diào)整這些參數(shù)以提高模型的準確性并更新特征圖。
濾波器權(quán)重——在上面的例子中,將權(quán)重保持在1 和 0 是為了計算更方便; 但是,在正常神經(jīng)網(wǎng)絡(luò)中,可以使用隨機較低的值來初始化權(quán)重,如使用(0.01)和(0.1)之間的鐘形曲線或正態(tài)分布類型方法。
元素乘法—用來計算1條線索
▌步長:移動放大鏡
在計算了特征圖中的第一個像素后,Sherlock 會怎樣移動他的放大鏡?
答案就是步長參數(shù)。作為神經(jīng)網(wǎng)絡(luò)的建筑師/工程師,在 Sherlock 計算特征圖下一個像素之前,我們必須告訴他應(yīng)該向右移動多少像素。在實踐中,2 或 3 的步長是最常見的,為了便于計算我們這里設(shè)置步長為 1。這意味著 Sherlock 將他的放大鏡向右移動 1 個像素,然后再執(zhí)行與之前相同的卷積計算。
當(dāng)放大鏡到達輸入圖像的最右邊時,他會將放大鏡向下 1 個像素并移動到最左邊。
▌為什么步長會超過 1?
優(yōu)點:通過減少計算和緩存,使模型訓(xùn)練速度更快。
缺點:步長大于 1 時,你會因為跳過一些像素從而導(dǎo)致丟失圖片的信息,并可能錯過一些學(xué)習(xí)模式。
但是設(shè)置步幅為 2 或 3 也是合理的,因為緊鄰的像素通常具有相似的值,但是如果它們相距 2-3 個像素,則更有可能是對于特征圖/模式更重要的像素值變化。
▌如何防止信息丟失(丟失線索)
為了破解這個案子,Sherlock 在一開始的時候就需要很多線索。在上面的例子中,我們采用了一張 5x5x3 圖像,也就是 75 位像素的信息(75 = 5 x 5 x 3)。在第一個卷積層后,我們只得到了一個 3x3x2 圖像,也就是 18 位像素(18 = 3 x 3 x 2)。這意味著我們丟失了部分證據(jù),這將會讓他的搭檔John Watson 非常生氣。
在 CNN 的前幾層中,Sherlock 會看到很多細微的模式,這是一個增加線索的過程。而在后面的層中,可以通過“下采樣”的方法來減少線索,Sherlock會將細微的線索堆積起來以便查看更清晰的模式。
▌那么我們?nèi)绾畏乐剐畔G失呢?
1:填充:我們必須在圖像周圍進行“填充”來保護犯罪現(xiàn)場。
在我們的例子中,在到達右邊緣之前需要移動濾波器 3 次,從上到下都是一樣的。這意味著我們得到的輸出高度/寬度為 3x3,那我們從左到右時丟失了2 個像素,而從上到下移動時我們又損失了 2 個像素。
為了防止這種信息丟失,通常用零填充原始圖像(稱為“零填充”或“相同填充”),就像犯罪現(xiàn)場布置的警戒線一樣,來保證沒有人篡改線索。
在填充之后,如果 Sherlock 再次使用相同的放大鏡,那他的 2 個特征圖將是 5x5 而不是 3x3。這意味著我們將留下 50 個像素的信息,因為這個卷積的新輸出是 5x5x2 = 50。50 像素比 18 像素要好。但是,我們是從 75 像素開始的,所以我們?nèi)匀粊G失了一些線索。
除此之外我們還能做些什么呢?
2:使用更多的濾波器—通過在卷積層中添加至少 1 個特征圖,為 Sherlock提供更多線索
我們模型的特征圖或“線索”數(shù)量是沒有限制,這是一個可以控制的參數(shù)。
如果我們將特征圖從 2 增加到 3(5x5x2 到 5x5x3),那么總輸出像素(75)與輸入像素(75)剛好匹配,可以確保沒有信息丟失。如果我們將特征圖增加到 10,那么就會有更多的信息(250像素= 5 x 5 x 10)讓Sherlock 篩選以找到線索。
總之,前幾層中的總像素信息通常高于輸入圖像,是因為我們希望為Sherlock 提供盡可能多的線索/模式。在我們網(wǎng)絡(luò)的最后幾層中,通常做法是下采樣得到少量的特征。因為這些層是用來識別圖像更明確的模式。
第四步
▌ReLU:非線性模式識別
給 Sherlock 提供充足的信息是非常重要的,但現(xiàn)在是時候進行真正的偵探工作了——非線性模式識別!像識別耳廓或鼻孔等。
到目前為止,Sherlock 已經(jīng)做了一堆數(shù)學(xué)來構(gòu)建特征圖,但每個計算都是線性的(取輸入像素并對每個像素執(zhí)行相同的乘法/加法),因此,他只能識別像素的線性模式。
為了在 CNN 中引入非線性,我們使用稱為 Relu 的激活函數(shù)。從第一個卷積計算我們的特征圖之后,激活函數(shù)會檢查每個值來確認激活狀態(tài)。如果輸入值為負,則輸出變?yōu)榱?。如果輸入為?則輸出值保持不變。ReLU 的作用類似于開/關(guān),每個特征圖的像素值經(jīng)過 Relu 后,就得到了非線性的模式識別。
回到我們最初的 CNN 示例,我們將在卷積后立即應(yīng)用 ReLU:
雖然有許多非線性激活函數(shù)可用于將非線性引入神經(jīng)網(wǎng)絡(luò)(比如 sigmoids,tanh,leakyReLU 等),但 ReLU 是 CNN 中最常用的,因為它們計算效率高,并可以加速訓(xùn)練過程。
第五步
▌Max Pooling:保留關(guān)鍵的少數(shù)信息在大腦中
現(xiàn)在,Sherlock 已經(jīng)有了一些特征圖或“線索”,那么他如何確定哪些信息是不相關(guān)的細節(jié),哪些是重要的?答案就是最大池化!
Sherlock 認為人腦就像一個記憶宮殿。傻瓜會存儲各種各樣的信息,最終有用的信息卻在雜亂無章中丟失了。而聰明人只存儲最重要的信息,這些信息可以幫助他們迅速做出決定。Sherlock 采取的方法就是 Max Pooling,使他只保留最重要的信息,從而可以快速做出決定。
最大池化就像Sherlock Holmes 記憶宮殿
通過最大池化,他可以查看像素的鄰域并僅保留“最大”值或“最重要”的證據(jù)。
例如,如果他正在觀察 2x2 的區(qū)域(4個像素),那只保留最高值的像素并丟掉其他 3 個。這種技術(shù)使他能夠快速學(xué)習(xí)還有助于歸納出可以存儲和記憶未來圖像中的線索。
與之前的放大鏡濾波器類似,我們還可以控制最大池化的步長和池的大小。在下面的示例中,我們假設(shè)步長為 1,最大池化為 2x2:
最大池化—在定義的值鄰域中選擇“最大”值
在最大池化做完之后,我們就完成了 1 輪卷積 / ReLU / 最大池化的過程。
在典型的CNN中,進入分類器之前,我們一般會有幾輪卷積 / ReLU / 池的過程。每一輪,我們都會在增加深度的同時擠壓高度/寬度,這樣我們就不會丟失一些證據(jù)。
前面的這 1-5 步,重點就是收集證據(jù),接下來就是 Sherlock 查看所有線索并破案的時候了:
第六步
當(dāng) Sherlock訓(xùn)練循環(huán)結(jié)束時,他有很多零散的線索,然后他需要一個方法可以同時看到全部的線索。其實每條線索都對應(yīng)一個簡單的二維矩陣,但是有成千上萬條這樣的線索堆積在一起。
現(xiàn)在他必須獲得的全部線索都收集并組織起來,以便在法庭上展示給陪審團。
拉平前的特征圖
他采用了 Flatten Layer 來完成這項工作(Flatten Layer 常用在從卷積層到全連接層的過渡),簡單來說這個技術(shù)的做法就是:
每個 2 維像素矩陣變成 1列像素
將 2 維矩陣進行疊加
下圖展示了人眼識別的示例:
回到我們的例子,下面是計算機看到的
現(xiàn)在 Sherlock 已經(jīng)組織完了他的證據(jù),接下來他需要讓陪審團相信他的證據(jù)最終都指向同一個嫌疑人。
第七步
在全連接層中,我們將證據(jù)與每個嫌疑人相連。換句話說就是我們在展示證據(jù)與每個嫌疑人之間的聯(lián)系。
全連接層—連接證據(jù)與每個嫌疑人
以下是計算機看到的內(nèi)容:
全連接層
在 Flatten Layer 和 3 個輸出的每個證據(jù)之間是權(quán)重和偏差。與網(wǎng)絡(luò)中的其他權(quán)重一樣,當(dāng)我們首次開始訓(xùn)練 CNN 時,這些權(quán)重將以隨機值初始化,并且隨著時間的推移,CNN 會“學(xué)習(xí)”如何調(diào)整這些權(quán)重/偏差來得到越來越準確的預(yù)測結(jié)果。
現(xiàn)在是 Sherlock 破解案件的時候了!
第八步
在 CNN 的圖像分類器階段,模型的預(yù)測結(jié)果就是最高分數(shù)的輸出。
這個評分函數(shù)有兩部分:
Logit Score:原始分數(shù)
Softmax:每個輸出的概率在 0-1 之間。所有分數(shù)的總和等于 1。
▌第1部分:Logits ——邏輯分數(shù)
每個輸出的 logit 分數(shù)是基本的線性函數(shù):
Logit分數(shù) =(證據(jù)x權(quán)重)+ 偏差
每一個證據(jù)乘以連接證據(jù)與輸出的權(quán)重。所有這些乘法都加在一起,然后在末尾添加一個偏差項,得到的最高分就是模型的猜測。
Logit 分數(shù)計算
為什么得到了最高分數(shù)卻不是最終結(jié)果? 有 2 個直觀的原因:
Sherlock 的置信水平:我們想知道 Sherlock 有多么自信。當(dāng)他很自信并且結(jié)果是對的時候,我們可以對他進行獎勵;但當(dāng)信他很自信,結(jié)果卻是錯誤的時候,我們要對他進行懲罰。當(dāng)我們在最后計算損失(“Sherlock的準確性”)時,Sherlock 會獲得相應(yīng)的獎勵/懲罰。
Sherlock 的置信加權(quán)概率:我們希望用一種簡單的方法,通過 0 到 1 之間的概率來描述這些結(jié)果,并得到與實際輸出(0或1)相同的預(yù)測分數(shù)。正確匹配的圖像(Elon)為 1,其他不正確的圖像(Jeff和Jon)為 0。將正確輸出轉(zhuǎn)換為 1 并將錯誤輸出轉(zhuǎn)換為 0 的過程稱為獨熱編碼。
Sherlock 的目標(biāo)是讓他的預(yù)測盡可能接近 1,以此獲得正確的輸出。
▌第2部分:Softmax——Sherlock 的置信度加權(quán)概率分數(shù)
2.1.Sherlock 的置信水平:
為了找到 Sherlock 的置信水平,我們?nèi)∽帜?e(等于2.71828)為底,并計算 logit 得分做冪運算。讓高分值越高,而低分值越低。
在進行冪運算中還保證了沒有負分數(shù)。由于 logit 分數(shù)“可能”為負數(shù),所以下圖是置信度曲線:
置信度曲線
2.2. Sherlock 的置信加權(quán)概率:
為了找到置信加權(quán)概率,我們將每個輸出的置信度量除以所有置信度得分的總和,就可以得到每個輸出圖像的概率,所有這些加起來為 1。用 Excel 示例如下:
Softmax
這個 softmax 分類器非常直觀。Sherlock 認為,終結(jié)者看到的照片是 Elon Musk 的機率是97%(置信度加權(quán))。我們模型的最后一步是計算損失。損失值告訴我們偵探 Sherlock 的辨識能力究竟有多好(或者多差)。
第九步
損失函數(shù)
每個神經(jīng)網(wǎng)絡(luò)都有一個損失函數(shù),我們將預(yù)測結(jié)果與實際情況進行比較。當(dāng)訓(xùn)練 CNN 時,隨著網(wǎng)絡(luò)權(quán)重/偏差的調(diào)整,我們的預(yù)測結(jié)果會得到改善(Sherlock的偵探技能變得更好)。
CNN 最常用的損失函數(shù)是交叉熵損失函數(shù)。在 Google 上搜索交叉熵會出現(xiàn)很多希臘字母的解釋,很容易混淆。盡管描述各不相同,但它們在機器學(xué)習(xí)的背景下都是相同的,我們將覆蓋下面最常見的3個。
比較正確類(Elon,1.00)的概率與 CNN 預(yù)測 Elon (his softmax score,0.97)的概率
當(dāng)CNN的預(yù)測接近1時,獎勵 Sherlock
當(dāng)CNN的預(yù)測接近0時,懲罰 Sherlock
以上得到的答案都相同!存在 3 種不同的解釋
▌解釋 1:實際概率與預(yù)測概率之間距離的度量
直覺是,如果我們的預(yù)測概率接近 1,則我們的損失接近 0。如果我們的預(yù)測接近于 0,那么將受到嚴厲的懲罰。目標(biāo)是最小化預(yù)測結(jié)果(Elon,0.97)與實際概率(1.00)之間的“距離”。
交叉熵 1.距離解釋
▌解釋 2:最大化對數(shù)似然或最小化負對數(shù)似然
在 CNN 中,“l(fā)og” 實際上意味著“自然對數(shù)(ln)”,它是在 softmax 的步驟1中完成的“指數(shù)/置信度”的倒數(shù)。
我們不是用實際概率(1.00)減去預(yù)測概率(0.97)來計算損失,而是通過log 來計算損失,當(dāng) Sherlook 的預(yù)測結(jié)果離 1 越遠的時候,損失是指數(shù)級增長的。
交叉熵 2.對數(shù)損失解釋
▌解釋 3:KL 散度(Kullback–Leibler divergence)
KL 散度是用來衡量預(yù)測概率(softmax得分)與實際概率的差異程度。
該公式分為兩部分:
實際概率不確定的數(shù)量。在監(jiān)督學(xué)習(xí)的不確定量始終為零。我們 100% 肯定訓(xùn)練圖像是 Elon Musk。
如果我們使用預(yù)測概率,會損失多少的“信息”。
交叉熵 3.KL散度解釋
總結(jié)
在偵探 Sherlock Holmes 的幫助下,我們給了終結(jié)者一雙眼睛,所以他現(xiàn)在有能力尋找并摧毀自由世界的保護者 Elon Musk。(Sorry Elon!)
雖然,我們只訓(xùn)練終結(jié)者來辨別 Elon,Jeff 和 Jon,但是 Skynet 擁有無限多的資源和訓(xùn)練圖像,它可以利用我們構(gòu)建的網(wǎng)絡(luò)去訓(xùn)練終結(jié)者來識別世間萬物!
原文標(biāo)題:神探Sherlock如何用AI破案?教你在Excel中搭建一個人臉識別CNN網(wǎng)絡(luò)
文章出處:【微信號:rgznai100,微信公眾號:AI科技大本營】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。