背景
卷積神經(jīng)網(wǎng)絡(luò)(Convolutional Neural Networks, CNN)的核心技術(shù)主要包括以下幾個(gè)方面:局部連接、權(quán)值共享、多卷積核以及池化。這些技術(shù)共同作用,使得CNN在圖像和語音識(shí)別等領(lǐng)域取得了顯著成就,并廣泛用于車輛自動(dòng)駕駛的圖像目標(biāo)識(shí)別中。
1.局部連接:CNN通過局部連接的方式減少了網(wǎng)絡(luò)自由參數(shù)的個(gè)數(shù),從而降低了計(jì)算復(fù)雜度,并使網(wǎng)絡(luò)更易于訓(xùn)練。與全連接網(wǎng)絡(luò)不同,CNN中的每個(gè)神經(jīng)元僅與輸入數(shù)據(jù)的一部分相連,這一部分被稱為感受野。這種設(shè)計(jì)模擬了人類視覺系統(tǒng)對(duì)圖像亮度、紋理、邊緣等特性的逐層提取過程。
2.權(quán)值共享:權(quán)值共享是CNN另一個(gè)重要的特性,它進(jìn)一步減少了模型參數(shù)的數(shù)量。在CNN中,同一卷積核在整個(gè)輸入圖像上滑動(dòng)進(jìn)行卷積運(yùn)算,這意味著所有位置共享相同的權(quán)重參數(shù)。這樣不僅減少了需要學(xué)習(xí)的參數(shù)數(shù)量,還增強(qiáng)了模型的泛化能力。
3.多卷積核:使用多個(gè)不同的卷積核可以從輸入數(shù)據(jù)中提取出多種類型的特征。每個(gè)卷積核負(fù)責(zé)檢測(cè)特定類型的模式或特征,如邊緣、角點(diǎn)等。通過組合多個(gè)卷積核的結(jié)果,CNN能夠捕捉到更加豐富和復(fù)雜的特征表示。
4.池化(Pooling):池化操作用于降低特征圖的空間尺寸,減少計(jì)算量并防止過擬合。常見的池化方法有最大池化(Max Pooling)和平均池化(Average Pooling)。池化層通常緊跟在卷積層之后,通過對(duì)特征圖進(jìn)行下采樣來保留最重要的信息,同時(shí)丟棄冗余信息。
可以將整個(gè)過程視為一個(gè)分層特征提取的過程。首先,通過卷積操作提取低級(jí)特征;然后,經(jīng)過非線性激活函數(shù)處理后,利用池化操作降低維度;最后,在高層中逐步構(gòu)建更為抽象和復(fù)雜的特征表示。這樣的架構(gòu)使得CNN特別適合處理具有網(wǎng)格狀拓?fù)浣Y(jié)構(gòu)的數(shù)據(jù),如圖像和視頻。
CNN的基礎(chǔ)框架隨著研究的發(fā)展,新的改進(jìn)和技術(shù)也被不斷引入,例如深度可分離卷積、殘差連接等,以提高性能并解決特定問題。
CNN的基礎(chǔ)網(wǎng)絡(luò),無非是卷積層,池化層和全連接層(FC,full connection)。所謂輸入層和輸出層并不是真正的網(wǎng)絡(luò)layer。
以CNN為基礎(chǔ)架構(gòu)的神經(jīng)網(wǎng)絡(luò)發(fā)展史
1.LeNet-5
由Yann LeCun楊立昆于1998年提出,主要用于手寫數(shù)字識(shí)別,奠定了現(xiàn)代卷積神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)。
2.AlexNet
在2012年的ImageNet競(jìng)賽中贏得了冠軍,顯著提升了深度學(xué)習(xí)在圖像分類領(lǐng)域的影響力。它首次大規(guī)模使用ReLU激活函數(shù),并引入了Dropout技術(shù)來減少過擬合。
3.VGGNet
由牛津大學(xué)的Visual Geometry Group提出,以其簡單而深刻的結(jié)構(gòu)著稱。VGGNet通過堆疊多個(gè)3x3的小卷積核來構(gòu)建更深的網(wǎng)絡(luò),證明了深度對(duì)于提高性能的重要性。
4.GoogLeNet (Inception)
提出了Inception模塊,該模塊允許在一個(gè)層內(nèi)同時(shí)進(jìn)行不同大小的卷積操作,從而有效增加了網(wǎng)絡(luò)寬度而不顯著增加計(jì)算成本。GoogLeNet是2014年ILSVRC比賽的獲勝者之一。
5.ResNet (Residual Network)
解決了非常深網(wǎng)絡(luò)中的梯度消失問題,通過引入殘差連接使得訓(xùn)練更深的網(wǎng)絡(luò)成為可能。ResNet在2015年的ImageNet競(jìng)賽中取得了優(yōu)異成績,并推動(dòng)了深度學(xué)習(xí)模型向更深方向發(fā)展。
殘差連接是CNN發(fā)展的里程碑之一,所以展開論述。
ResNet(殘差網(wǎng)絡(luò),Residual Network)中的殘差連接通過引入直接的跳躍連接來解決深度神經(jīng)網(wǎng)絡(luò)中的梯度消失和梯度爆炸問題,從而使得訓(xùn)練非常深的網(wǎng)絡(luò)成為可能。
殘差連接的核心思想是在網(wǎng)絡(luò)的一層或多層之間引入直接連接,允許輸入特征未經(jīng)處理地傳遞到后續(xù)層。這樣做的目的是讓網(wǎng)絡(luò)學(xué)習(xí)輸入和輸出之間的殘差(即差異),而不是直接學(xué)習(xí)一個(gè)完整的映射。這種機(jī)制有助于梯度在訓(xùn)練過程中更有效地回流,減輕了深度網(wǎng)絡(luò)中梯度消失的問題。
在ResNet中,每個(gè)卷積塊(Residual Block)都包含一個(gè)或多個(gè)卷積層,并且通過殘差連接將當(dāng)前塊的輸出與前一個(gè)塊的輸出相加,然后通過激活函數(shù)(如ReLU)進(jìn)行激活。具體來說,給定一個(gè)輸入x,經(jīng)過一個(gè)殘差塊后,輸出可以表示為:
y=F(x)+x
其中F(x)?表示通過卷積層和其他非線性變換后的結(jié)果,而?x?是原始輸入。這種結(jié)構(gòu)允許網(wǎng)絡(luò)學(xué)習(xí)殘差函數(shù)?F(x)=y?x,從而更容易優(yōu)化深層網(wǎng)絡(luò)。
殘差連接的作用包括緩解梯度消失問題:通過殘差連接,梯度可以在訓(xùn)練過程中更直接地從后向傳播到前面的層,避免了梯度消失現(xiàn)象的發(fā)生;促進(jìn)信息流動(dòng):殘差連接提供了一條額外的數(shù)據(jù)路徑,使數(shù)據(jù)能夠跳過某些層直接到達(dá)網(wǎng)絡(luò)的更深部分。提高模型表達(dá)能力:殘差塊的設(shè)計(jì)使得每一層不僅可以學(xué)習(xí)新的特征,還可以保留來自前面層的信息,增強(qiáng)了模型的整體表達(dá)能力。
敏銳的讀者會(huì)注意到殘差連接會(huì)越過兩層,為什么不是單層呢?
殘差連接經(jīng)過兩層的設(shè)計(jì)主要是為了更好地學(xué)習(xí)復(fù)雜的殘差函數(shù),同時(shí)避免了單層網(wǎng)絡(luò)可能帶來的局限性。主要考慮有如下幾個(gè):
復(fù)雜函數(shù)逼近:在殘差網(wǎng)絡(luò)中,假設(shè)期望的結(jié)果為一個(gè)潛在映射(),可以表示為?()=()+。其中?()是殘差塊中的主要學(xué)習(xí)部分。如果僅使用一層卷積層來構(gòu)建?(),則可能無法充分捕捉到輸入數(shù)據(jù)的復(fù)雜特征。通過引入兩層卷積層,模型能夠更有效地逼近復(fù)雜的非線性映射關(guān)系(單層點(diǎn)積是線性,多層疊加表示是非線性關(guān)系),從而提高模型的表現(xiàn)力。
梯度流動(dòng)與穩(wěn)定訓(xùn)練:深層神經(jīng)網(wǎng)絡(luò)的一個(gè)常見問題是梯度消失或爆炸,這會(huì)阻礙模型的有效訓(xùn)練。通過增加額外的一層(即兩層結(jié)構(gòu)),可以在一定程度上緩解這一問題。具體來說,這種設(shè)計(jì)允許梯度通過跳躍連接直接傳遞到較深的層,而不需要完全依賴每一層的學(xué)習(xí)效果。這樣不僅促進(jìn)了梯度的流動(dòng),還使得訓(xùn)練更加穩(wěn)定和高效。
增強(qiáng)表達(dá)能力:盡管單層殘差塊理論上也可以工作,但它們通常缺乏足夠的容量去描述那些需要更高維度特征空間才能準(zhǔn)確表達(dá)的模式。相比之下,雙層架構(gòu)提供了更多的自由度,讓網(wǎng)絡(luò)能夠在保持簡單性的同時(shí)擁有更強(qiáng)的表達(dá)能力。此外,多層結(jié)構(gòu)還有助于減少過擬合風(fēng)險(xiǎn),并且更容易實(shí)現(xiàn)正則化目標(biāo)。
理論支持與實(shí)驗(yàn)驗(yàn)證:從理論上講,具有兩個(gè)卷積層的殘差塊可以看作是在原始輸入基礎(chǔ)上疊加了一個(gè)小的修正項(xiàng)。這種方法既保留了原始信號(hào)的信息,又允許網(wǎng)絡(luò)專注于學(xué)習(xí)剩余的變化部分。
實(shí)驗(yàn)表明,雙層殘差設(shè)計(jì)優(yōu)于單層。
6.DenseNet (Densely Connected Convolutional Networks)
每一層都與之前的所有層直接相連,最大限度地重用特征,減少了參數(shù)數(shù)量并增強(qiáng)了特征傳播。這種設(shè)計(jì)有助于緩解梯度消失問題并促進(jìn)特征復(fù)用。
7.ZFNet
是AlexNet的一個(gè)改進(jìn)版本,在保持相似復(fù)雜度的情況下提高了精度。ZFNet調(diào)整了卷積核尺寸和其他超參數(shù)以更好地適應(yīng)特定任務(wù)。
總結(jié)表如下:
CNN?架構(gòu) | 年份 | 主要貢獻(xiàn) | 特點(diǎn) |
LeNet-5 | 1998 | 手寫數(shù)字識(shí)別 | 簡單有效的卷積層和池化層 |
AlexNet | 2012 | ImageNet競(jìng)賽冠軍 | 大規(guī)模ReLU、Dropout、GPU加速 |
VGGNet | 2014 | 深度與小卷積核 | 堆疊多層3x3卷積核 |
GoogLeNet | 2014 | Inception模塊 | 不同尺度的卷積操作 |
ResNet | 2015 | 殘差連接 | 訓(xùn)練極深網(wǎng)絡(luò) |
DenseNet | 2017 | 密集連接 | 最大化特征重用 |
表1 CNN架構(gòu)著名神經(jīng)網(wǎng)絡(luò)發(fā)展史
沒有梯度的池化層
池化層的首要目的是減少參數(shù)數(shù)量,也就是減少網(wǎng)格數(shù)量:在卷積層之后,特征圖的尺寸往往較大,包含大量的參數(shù)。池化層通過對(duì)特征圖進(jìn)行下采樣,能夠顯著減少特征圖的尺寸,從而減少后續(xù)層的參數(shù)數(shù)量。例如,使用最大池化或平均池化操作,將特征圖的長和寬縮小為原來的一半,那么參數(shù)數(shù)量就會(huì)減少到原來的四分之一。這樣可以有效降低模型的復(fù)雜度,減少計(jì)算量和內(nèi)存占用,提高訓(xùn)練和推理的速度。
其次的目的是緩解過擬合,可以看做是某種程度的正則化:過多的參數(shù)容易導(dǎo)致模型過擬合,即模型在訓(xùn)練集上表現(xiàn)良好,但在測(cè)試集上表現(xiàn)不佳。池化層通過減少參數(shù)數(shù)量,能夠在一定程度上緩解過擬合問題,提高模型的泛化能力。
直觀講,圖片池化的效果是某種程度的模糊化。
卷積層和全連接層,有明確的連接權(quán)重和權(quán)重梯度,可以用反向傳播算法來根據(jù)梯度來更新權(quán)重。
不同于卷積層和全連接層,池化層沒有明確的連接權(quán)重和權(quán)重梯度,無法用于反向傳播算法。那么在從尾部到頭部訓(xùn)練CNN算法時(shí),如何越過池化層?池化層會(huì)不會(huì)中斷整個(gè)訓(xùn)練過程?
?圖6箭頭方向?yàn)榉聪騻鞑ビ?xùn)練方向,需要經(jīng)過池化層
實(shí)際上,反向傳播算法經(jīng)過池化層時(shí),采取了直接反向賦值的簡化方法。
當(dāng)反向傳播經(jīng)過池化層時(shí),其過程與其他層有所不同,下面針對(duì)不同的池化方式(最大池化和平均池化)分別展開說明。
對(duì)于最大池化層的反向傳播
最大池化在正向傳播時(shí),會(huì)在每個(gè)池化窗口中選取最大值作為輸出。在反向傳播時(shí),梯度只會(huì)傳遞給正向傳播時(shí)選取最大值的那個(gè)位置,而其他位置的梯度為0。以下是具體步驟:
1.記錄最大值位置:在正向傳播進(jìn)行最大池化操作時(shí),要記錄每個(gè)池化窗口中最大值所在的位置。
2.分配梯度:在反向傳播時(shí),對(duì)于每個(gè)池化窗口,將從下一層傳來的梯度分配給正向傳播時(shí)最大值所在的位置,而其他位置的梯度設(shè)為?0。
假設(shè)正向傳播時(shí)最大池化的輸入矩陣為:
使用2*2的池化窗口,池化結(jié)果為?4。若從下一層傳來的梯度為?1,那么在反向傳播時(shí),梯度分配如下:
平均池化層的反向傳播
平均池化在正向傳播時(shí),會(huì)計(jì)算每個(gè)池化窗口內(nèi)元素的平均值作為輸出。在反向傳播時(shí),從下一層傳來的梯度會(huì)平均分配給池化窗口內(nèi)的所有元素。具體步驟如下:
1.確定池化窗口大?。好鞔_平均池化操作所使用的池化窗口大小。
2.分配梯度:將從下一層傳來的梯度平均分配給池化窗口內(nèi)的所有元素。
假設(shè)正向傳播時(shí)平均池化的輸入矩陣為:
使用2*2的池化窗口,池化結(jié)果為(1 + 3 + 2 + 4) / 4 = 2.5)。若從下一層傳來的梯度為?1,那么在反向傳播時(shí),梯度分配如下:
代碼示例(Python + NumPy),展示了最大池化和平均池化的反向傳播過程:
import?numpy?as?np
def?max_pool_backward(dout, cache):
? ??"""
? ? 最大池化層的反向傳播
? ? :param dout: 從下一層傳來的梯度
? ? :param cache: 正向傳播時(shí)記錄的最大值位置
? ? :return: 本層的梯度
? ? """
? ? x, pool_param = cache
? ? N, C, H, W = x.shape
? ? pool_height, pool_width = pool_param['pool_height'], pool_param['pool_width']
? ? stride = pool_param['stride']
? ? dX = np.zeros_like(x)
? ??for?n?in?range(N):
? ? ? ??for?c?in?range(C):
? ? ? ? ? ??for?h?in?range(0, H - pool_height +?1, stride):
? ? ? ? ? ? ? ??for?w?in?range(0, W - pool_width +?1, stride):
? ? ? ? ? ? ? ? ? ? window = x[n, c, h:h + pool_height, w:w + pool_width]
? ? ? ? ? ? ? ? ? ? max_idx = np.unravel_index(np.argmax(window), window.shape)
? ? ? ? ? ? ? ? ? ? dX[n, c, h + max_idx[0], w + max_idx[1]] += dout[n, c, h // stride, w // stride] //stride是卷積核的移動(dòng)步長
? ??return?dX
?
def?avg_pool_backward(dout, cache):
? ??"""
? ? 平均池化層的反向傳播
? ? :param dout: 從下一層傳來的梯度
? ? :param cache: 正向傳播時(shí)的輸入
? ? :return: 本層的梯度
? ? """
? ? x, pool_param = cache
? ? N, C, H, W = x.shape
? ? pool_height, pool_width = pool_param['pool_height'], pool_param['pool_width']
? ? stride = pool_param['stride']
? ? dX = np.zeros_like(x)
? ??for?n?in?range(N):
? ? ? ??for?c?in?range(C):
? ? ? ? ? ??for?h?in?range(0, H - pool_height +?1, stride):
? ? ? ? ? ? ? ??for?w?in?range(0, W - pool_width +?1, stride):
? ? ? ? ? ? ? ? ? ? window_size = pool_height * pool_width
? ? ? ? ? ? ? ? ? ? dX[n, c, h:h + pool_height, w:w + pool_width] += dout[n, c, h // stride, w // stride] / window_size //stride是卷積核的移動(dòng)步長
? ??return?dX
?總結(jié)
歸根結(jié)底,人工智能和優(yōu)化算法以及啟發(fā)式算法一樣,是應(yīng)用數(shù)學(xué),而非純數(shù)學(xué)。和追求嚴(yán)格證明的純數(shù)學(xué)不一樣,應(yīng)用數(shù)學(xué)允許和歡迎“有效的”人為簡化。所謂有效的,是指第一能達(dá)成預(yù)定功能,第二是在達(dá)成功能的前提下,所采取的人為簡化足夠簡單足夠自然。
如果在理解和應(yīng)用人工智能的過程中,采取了純數(shù)學(xué)的嚴(yán)格思維,這是一個(gè)錯(cuò)誤的思考方向。這個(gè)錯(cuò)誤思考方向,會(huì)導(dǎo)致很多概念難于理解和難于想象。
正確的思考方向是,理解人工智能是應(yīng)用數(shù)學(xué),是實(shí)驗(yàn)科學(xué),允許各種人為簡化,只要這些人為簡化在實(shí)驗(yàn)中表現(xiàn)出有效性和高效性即可。本文所描述的卷積神經(jīng)網(wǎng)絡(luò)中,反向傳播算法穿過無梯度的池化層,就是諸多人為簡化的例子之一。