對卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練
本文重點(diǎn)介紹卷積神經(jīng)網(wǎng)絡(luò) (CNN) 的特性和應(yīng)用,主要用于模式識別和對象分類。在之前文章中,我們展示了微控制器中經(jīng)典線性程序執(zhí)行與 CNN 的區(qū)別及其優(yōu)勢。我們討論了 CIFAR 網(wǎng)絡(luò),利用該網(wǎng)絡(luò)可以對圖像中的貓、房屋或自行車等對象進(jìn)行分類,或執(zhí)行簡單的語音模式識別。本文解釋了如何訓(xùn)練這些神經(jīng)網(wǎng)絡(luò)來解決問題。
神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程
本系列第一部分討論的 CIFAR 網(wǎng)絡(luò)由不同層的神經(jīng)元組成。32 像素 × 32 像素的圖像數(shù)據(jù)被呈現(xiàn)給網(wǎng)絡(luò)并經(jīng)過網(wǎng)絡(luò)層。CNN 的第一步是檢測和研究要區(qū)分的對象的獨(dú)特特征和結(jié)構(gòu)。為此使用過濾矩陣。一旦設(shè)計(jì)人員對 CIFAR 等神經(jīng)網(wǎng)絡(luò)進(jìn)行建模,這些過濾矩陣最初仍未確定,并且此階段的網(wǎng)絡(luò)仍無法檢測模式和對象。
為了實(shí)現(xiàn)這一點(diǎn),首先需要確定矩陣的所有參數(shù)和元素,以最大限度地提高檢測對象的準(zhǔn)確度或最小化損失函數(shù)。這個(gè)過程稱為神經(jīng)網(wǎng)絡(luò)訓(xùn)練。對于本系列第一部分中描述的常見應(yīng)用,網(wǎng)絡(luò)在開發(fā)和測試期間只訓(xùn)練一次。之后,它們就可以使用了,參數(shù)不再需要調(diào)整。如果系統(tǒng)正在對熟悉的對象進(jìn)行分類,則無需進(jìn)行額外的訓(xùn)練。只有當(dāng)系統(tǒng)需要對全新的對象進(jìn)行分類時(shí),才需要進(jìn)行訓(xùn)練。
訓(xùn)練網(wǎng)絡(luò)需要訓(xùn)練數(shù)據(jù),之后,我們會(huì)使用一組類似的數(shù)據(jù)來測試網(wǎng)絡(luò)的準(zhǔn)確性。例如,在我們的 CIFAR-10 網(wǎng)絡(luò)數(shù)據(jù)集中,數(shù)據(jù)是十個(gè)對象類別中的一組圖像:飛機(jī)、汽車、鳥、貓、鹿、狗、青蛙、馬、船和卡車。但是,在訓(xùn)練 CNN 之前,必須對這些圖像進(jìn)行命名,這是整個(gè) AI 應(yīng)用程序開發(fā)過程中最復(fù)雜的部分。本文將討論的訓(xùn)練過程遵循反向傳播原理;網(wǎng)絡(luò)會(huì)連續(xù)顯示大量圖像,并且每次都會(huì)同時(shí)傳達(dá)一個(gè)目標(biāo)值。在我們的示例中,這個(gè)值是關(guān)聯(lián)的對象類別。每次顯示圖像時(shí),都會(huì)優(yōu)化過濾矩陣,以使對象類別的目標(biāo)值和實(shí)際值相匹配。完成此過程后,網(wǎng)絡(luò)還可以檢測訓(xùn)練期間未在圖像中看到的物體。
過度擬合和欠擬合
在神經(jīng)網(wǎng)絡(luò)建模中,經(jīng)常會(huì)出現(xiàn)這樣的問題:神經(jīng)網(wǎng)絡(luò)應(yīng)該有多復(fù)雜,即它應(yīng)該有多少層,或者它的濾波矩陣應(yīng)該有多大。這個(gè)問題沒有簡單的答案。與此相關(guān),討論網(wǎng)絡(luò)過擬合和欠擬合很重要。過擬合是模型過于復(fù)雜且參數(shù)過多的結(jié)果。我們可以通過比較訓(xùn)練數(shù)據(jù)損失和測試數(shù)據(jù)損失來確定預(yù)測模型與訓(xùn)練數(shù)據(jù)的擬合程度是太差還是太好。如果在訓(xùn)練期間損失較低,而在向網(wǎng)絡(luò)提供從未顯示過的測試數(shù)據(jù)時(shí)損失過度增加,則強(qiáng)烈表明網(wǎng)絡(luò)記住了訓(xùn)練數(shù)據(jù),而不是概括模式識別。這主要發(fā)生在網(wǎng)絡(luò)的參數(shù)存儲(chǔ)過多或卷積層過多時(shí)。在這種情況下,應(yīng)該減小網(wǎng)絡(luò)大小。
損失函數(shù)和訓(xùn)練算法
學(xué)習(xí)分為兩個(gè)步驟。第一步,向網(wǎng)絡(luò)顯示一張圖像,然后由神經(jīng)元網(wǎng)絡(luò)處理該圖像以生成輸出向量。輸出向量的最高值代表檢測到的對象類別,例如我們示例中的狗,這在訓(xùn)練案例中不一定是正確的。此步驟稱為前饋。
輸出端產(chǎn)生的目標(biāo)值與實(shí)際值之間的差異稱為損失,相關(guān)函數(shù)稱為損失函數(shù)。網(wǎng)絡(luò)的所有元素和參數(shù)都包含在損失函數(shù)中。神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)過程的目標(biāo)是定義這些參數(shù),使損失函數(shù)最小化。這種最小化是通過一個(gè)過程實(shí)現(xiàn)的,在這個(gè)過程中,輸出端產(chǎn)生的偏差(損失 = 目標(biāo)值減去實(shí)際值)被反向反饋到網(wǎng)絡(luò)的所有組件,直到到達(dá)網(wǎng)絡(luò)的起始層。學(xué)習(xí)過程的這一部分也稱為反向傳播。
這樣,在訓(xùn)練過程中就形成了一個(gè)逐步確定濾波矩陣參數(shù)的循環(huán),這個(gè)前饋和反向傳播的過程不斷重復(fù),直到損失值降到預(yù)先定義的值以下。
優(yōu)化算法、梯度和梯度下降法
為了說明我們的訓(xùn)練過程,圖 3 顯示了僅由兩個(gè)參數(shù) x 和 y 組成的損失函數(shù)。z 軸對應(yīng)于損失。函數(shù)本身在這里不起作用,僅用于說明目的。如果我們更仔細(xì)地觀察三維函數(shù)圖,我們可以看到該函數(shù)具有全局最小值和局部最小值。
可以使用大量數(shù)值優(yōu)化算法來確定權(quán)重和偏差。最簡單的方法是梯度下降法。梯度下降法基于這樣的思想:使用梯度逐步找到從損失函數(shù)中隨機(jī)選擇的起點(diǎn)到全局最小值的路徑。梯度作為數(shù)學(xué)運(yùn)算符描述了物理量的進(jìn)展。它在損失函數(shù)的每個(gè)點(diǎn)處提供一個(gè)向量(也稱為梯度向量),該向量指向函數(shù)值變化最大的方向。向量的大小與變化量相對應(yīng)。梯度向量將指向右下角某點(diǎn)的最小值(紅色箭頭)。由于表面平坦,震級會(huì)較低。在更遠(yuǎn)的區(qū)域,靠近峰頂?shù)那闆r會(huì)有所不同。在這里,矢量(綠色箭頭)指向下方,并且震級較大,因?yàn)榈貏萜鸱^大。
使用梯度下降法,從任意選擇的點(diǎn)開始,迭代地尋找下降速度最快、通向山谷的路徑。這意味著優(yōu)化算法計(jì)算起點(diǎn)處的梯度,并朝下降速度最快方向邁出一小步。在這個(gè)中間點(diǎn),重新計(jì)算梯度,繼續(xù)通向山谷的路徑。這樣,就創(chuàng)建了一條從起點(diǎn)到山谷中某一點(diǎn)的路徑。這里的問題是,起點(diǎn)不是預(yù)先定義的,而是必須隨機(jī)選擇的。在我們的二維圖中,細(xì)心的讀者會(huì)把起點(diǎn)放在函數(shù)圖左側(cè)的某個(gè)位置。這將確保(例如藍(lán)色)路徑的末端位于全局最小值。另外兩條路徑(黃色和橙色)要么更長,要么以局部最小值結(jié)束。由于優(yōu)化算法必須優(yōu)化的不僅僅是兩個(gè)參數(shù),而是數(shù)十萬個(gè)參數(shù),因此很快就會(huì)發(fā)現(xiàn)起點(diǎn)的選擇只能是偶然正確的。在實(shí)踐中,這種方法似乎沒有幫助。這是因?yàn)?,根?jù)所選的起點(diǎn),路徑以及訓(xùn)練時(shí)間可能會(huì)很長,或者目標(biāo)點(diǎn)可能不在全局最小值,在這種情況下,網(wǎng)絡(luò)的準(zhǔn)確性會(huì)降低。這種方法似乎沒有什么幫助。這是因?yàn)?,根?jù)所選的起點(diǎn)、路徑以及因此,訓(xùn)練時(shí)間可能會(huì)很長,或者目標(biāo)點(diǎn)可能不在全局最小值,在這種情況下,網(wǎng)絡(luò)的準(zhǔn)確性會(huì)降低。這種方法似乎沒有什么幫助。這是因?yàn)?,根?jù)所選的起點(diǎn)、路徑以及因此,訓(xùn)練時(shí)間可能會(huì)很長,或者目標(biāo)點(diǎn)可能不在全局最小值,在這種情況下,網(wǎng)絡(luò)的準(zhǔn)確性會(huì)降低。
因此,過去幾年中開發(fā)了許多優(yōu)化算法來繞過上述兩個(gè)問題。一些替代方案包括隨機(jī)梯度下降法、動(dòng)量、AdaGrad、RMSProp 和 Adam — 僅舉幾例。實(shí)際使用的算法由網(wǎng)絡(luò)開發(fā)人員決定,因?yàn)槊糠N算法都有特定的優(yōu)缺點(diǎn)。
訓(xùn)練數(shù)據(jù)
如上所述,在訓(xùn)練過程中,我們向網(wǎng)絡(luò)提供標(biāo)有正確對象類別(如汽車、船舶等)的圖像。在我們的示例中,我們使用了現(xiàn)有的CIFAR-10 數(shù)據(jù)集。在實(shí)踐中,人工智能的應(yīng)用范圍可能不僅限于識別貓、狗和汽車。例如,如果必須開發(fā)一種新應(yīng)用程序來檢測制造過程中螺絲的質(zhì)量,那么還必須使用來自好螺絲和壞螺絲的訓(xùn)練數(shù)據(jù)來訓(xùn)練網(wǎng)絡(luò)。創(chuàng)建這樣的數(shù)據(jù)集可能非常費(fèi)力且耗時(shí),并且通常是開發(fā)人工智能應(yīng)用程序最昂貴的步驟。編譯數(shù)據(jù)集后,將其分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)。訓(xùn)練數(shù)據(jù)用于如前所述進(jìn)行訓(xùn)練。測試數(shù)據(jù)用于在開發(fā)過程結(jié)束時(shí)檢查訓(xùn)練網(wǎng)絡(luò)的功能。
結(jié)論
現(xiàn)在我們已經(jīng)定義了該函數(shù)所需的所有權(quán)重和偏差,我們可以假設(shè)網(wǎng)絡(luò)可以正常工作。在本系列的最后一篇文章中,我們將通過將神經(jīng)網(wǎng)絡(luò)轉(zhuǎn)換為硬件來測試它是否能識別貓。