ofbiz做的網(wǎng)站營銷方案策劃
本節(jié)主要關(guān)注卷積神經(jīng)網(wǎng)絡(luò)發(fā)展過程中具有里程碑意義的基礎(chǔ)模塊,了解它們的原理和設(shè)計(jì)細(xì)節(jié)
1. 批歸一化
在機(jī)器學(xué)習(xí)中,一般會假設(shè)模型的輸入數(shù)據(jù)的分布是穩(wěn)定的。如果這個(gè)假設(shè)不成立,即模型輸入數(shù)據(jù)的分布發(fā)生變化,則稱為協(xié)變量偏移。模型的訓(xùn)練集和測試集的分布不一致,或者模型在訓(xùn)練過程中輸入數(shù)據(jù)的分布發(fā)生變化,這些都屬于協(xié)變量偏移現(xiàn)象。
同樣,對于一個(gè)復(fù)雜的機(jī)器學(xué)習(xí)系統(tǒng),在訓(xùn)練過程中一般也會要求系統(tǒng)里的各個(gè)子模塊的輸入分布是穩(wěn)定的,如果不滿足,則稱為內(nèi)部協(xié)變量偏移。對于深度神經(jīng)網(wǎng)絡(luò),其在訓(xùn)練過程中,每一層的參數(shù)都會隨之更新。以第 i 層為例,其輸入數(shù)據(jù)與之前所有層(第 1 層到第 i - 1 層)的網(wǎng)絡(luò)參數(shù)取值都有很大關(guān)系;在訓(xùn)練過程中,如果之前層的參數(shù)被更新后,第 i 層的輸入數(shù)據(jù)的分布必然也會發(fā)生變化此即為內(nèi)部協(xié)變量偏移。網(wǎng)絡(luò)越深,這種現(xiàn)象越明顯。
內(nèi)部協(xié)變量偏移會給深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程帶來諸多問題:
- 網(wǎng)絡(luò)每一層需要不斷適應(yīng)輸入數(shù)據(jù)的分布的變化,這會影響學(xué)習(xí)效率,并使學(xué)習(xí)過程變得不穩(wěn)定。
- 網(wǎng)絡(luò)前幾層參數(shù)的更新,很可能使得后幾層的輸入數(shù)據(jù)變得過大或者過小,從而掉進(jìn)激活函數(shù)的飽和區(qū),導(dǎo)致學(xué)習(xí)過程過早停止。
- 為了盡量降低內(nèi)部協(xié)變量偏移帶來的影響,網(wǎng)絡(luò)參數(shù)的更新需要更加謹(jǐn)慎,在實(shí)際應(yīng)用中一般會采用較小的學(xué)習(xí)率(避免參數(shù)更新過快),而這會降低收斂速度。
- 在之前的網(wǎng)絡(luò)訓(xùn)練過程中,一般會采用非飽和型激活函數(shù)(如 ReLU)、精細(xì)的網(wǎng)絡(luò)參數(shù)初始化、保守的學(xué)習(xí)率等方法來降低內(nèi)部協(xié)變量偏移帶來的影響。這些方法會使網(wǎng)絡(luò)的學(xué)習(xí)速度太慢,并且最終效果也特別依賴于網(wǎng)絡(luò)的初始化。
批歸一化就是為了解決上述問題而提出的:它的主要作用是確保網(wǎng)絡(luò)中的各層,即使參數(shù)發(fā)生了變化,其輸入/輸出數(shù)據(jù)的分布也不能產(chǎn)生較大變化,從而避免發(fā)生內(nèi)部協(xié)變量偏移現(xiàn)象。采用批歸一化后,深度神經(jīng)網(wǎng)絡(luò)的訓(xùn)練過程更加穩(wěn)定,對初始值不再那么敏感,可以采用較大的學(xué)習(xí)率來加速收斂。
批歸一化可以看作帶參數(shù)的標(biāo)準(zhǔn)化,具體公式為
y ( k ) = γ ( k ) x ( k ) ? μ ( k ) ( σ ( k ) ) 2 + ε + β ( k ) (1.1) y^{(k)}=\gamma^{(k)} \frac{x^{(k)}-\mu^{(k)}}{\sqrt{\left(\sigma^{(k)}\right)^{2}+\varepsilon}}+\beta^{(k)}\tag{1.1} y(k)=γ(k)(σ(k))2+ε?x(k)?μ(k)?+β(k)(1.1)
其中, x ( k ) y ( k ) x^{(k)}y^{(k)} x(k)y(k)分別是原始輸入數(shù)據(jù)和批歸一化后的輸出數(shù)據(jù), μ ( k ) \mu^{(k)} μ(k)和 σ ( k ) \sigma^{(k)} σ(k)分別是輸入數(shù)據(jù)的均值和標(biāo)準(zhǔn)差(在 mini-batch 上), β ( k ) \beta^{(k)} β(k)和 γ ( k ) \gamma^{(k)} γ(k)分別是可學(xué)習(xí)的平移參數(shù)和縮放參數(shù),上標(biāo)k表示數(shù)據(jù)的第k維(批歸一化在數(shù)據(jù)各個(gè)維度上是獨(dú)立進(jìn)行的), ε \varepsilon ε是為防止分母為 0 的一個(gè)小量。可以看到:在批歸一化過程中,設(shè)置了兩個(gè)可學(xué)習(xí)的參數(shù) β \beta β和 γ \gamma γ,它們有如下作用。
- 保留網(wǎng)絡(luò)各層在訓(xùn)練過程中的學(xué)習(xí)成果。如果沒有 β \beta β和 γ \gamma γ,批歸一化退化為普通的標(biāo)準(zhǔn)化,這樣在訓(xùn)練過程中,網(wǎng)絡(luò)各層的參數(shù)雖然在更新,但是它們的輸出分布卻幾乎不變(始終是均值為 0、方差為 1),從而使得網(wǎng)絡(luò)難以學(xué)習(xí)到有效的特征表示。通過引入 β \beta β和 γ \gamma γ,可以讓網(wǎng)絡(luò)在標(biāo)準(zhǔn)化后的數(shù)據(jù)上進(jìn)行適當(dāng)?shù)钠揭坪涂s放,從而保留各層在訓(xùn)練過程中的學(xué)習(xí)成果。
- 保證激活單元的非線性表達(dá)能力。上面提到,沒有 β \beta β和 γ \gamma γ,批歸一化的輸出分布始終是均值為 0、標(biāo)準(zhǔn)差為 1。此時(shí),如果激活函數(shù)采用諸如 Sigmoid、Tanh 等函數(shù),則經(jīng)過批歸一化的數(shù)據(jù)基本上都落在這些激活函數(shù)的近似線性區(qū)域,沒能利用上它們的非線性區(qū)域,這會極大地削弱模型的非線性特征提取能力和整體的表達(dá)能力。添加 β \beta β和 γ \gamma γ參數(shù)后,批歸一化的數(shù)據(jù)就可以進(jìn)入激活函數(shù)的非線性區(qū)域。
使批歸一化模塊具有自我關(guān)閉能力。若 β \beta β和 γ \gamma γ分別取數(shù)據(jù)的均值和標(biāo)準(zhǔn)差,則可以復(fù)原初始的輸入值,即關(guān)閉批歸一化模塊。因此,當(dāng)批歸一化導(dǎo)致特征分布被破壞,或者使網(wǎng)絡(luò)泛化能力減弱時(shí),可以通過這兩個(gè)參數(shù)將其關(guān)閉。
至于批歸一化在網(wǎng)絡(luò)中的位置,直覺上看無論是放在激活層之前還是之后都有一定道理。
- 把批歸一化放在激活層之前,可以有效避免批歸一化破壞非線性特征的分布;另外,批歸一化還可以使數(shù)據(jù)點(diǎn)盡量不落入激活函數(shù)的飽和區(qū)域,緩解梯度消失問題。
- 由于現(xiàn)在常用的激活函數(shù)是 ReLU,它沒有 Sigmoid、Tanh 函數(shù)的那些問題,因此也可以把批歸一化放在激活層之后,避免數(shù)據(jù)在激活層之前被轉(zhuǎn)化成相似的模式從而使得非線性特征分布趨于同化。
在具體實(shí)踐中,原始論文是將批歸一化放在激活層之前的,但學(xué)術(shù)界和工業(yè)界也有不少人曾表示傾向于將批歸一化放在激活層之后(如論文共同作者 Christian Szegedy、Keras 作者 Francois Cholle、知名數(shù)據(jù)科學(xué)平臺 Kaggle 的前首席科學(xué)家 Jeremy Howard 等人)。從近兩年的論文來看,有一大部分是將批歸一化放在激活層之后的,如 MobileNet v2、ShuffleNet v2、NASNet - A。批歸一化究竟應(yīng)該放在什么位置,仍是一個(gè)存爭議的問題。
2. 全連接層
用于分類任務(wù)的卷積神經(jīng)網(wǎng)絡(luò),其前面若干層一般是卷積層、池化層等,但網(wǎng)絡(luò)末端一般是幾層全連接層。這是因?yàn)橐环矫婢矸e層具有局部連接、權(quán)值共享的特性,其在不同位置是采用相同的卷積核進(jìn)行特征提取的。也就是說,卷積層的特征提取過程是局部的(卷積核尺寸一般遠(yuǎn)小于圖片尺寸),且是位置不敏感的。而且,參考文獻(xiàn)[22]中的實(shí)驗(yàn)表明,即使強(qiáng)迫卷積層學(xué)習(xí)如何對位置信息進(jìn)行編碼,其效果也不理想。
因此,如果整個(gè)網(wǎng)絡(luò)全部采用卷積層(包括池化層等),網(wǎng)絡(luò)也許能知道圖片中不同位置有哪些元素(高層語義信息),但無法提取這些元素之間的關(guān)聯(lián)關(guān)系(包括空間位置上的相關(guān)性、語義信息上的相關(guān)性)。而對于分類任務(wù),不僅需要考慮一張圖像中的各個(gè)元素,還需要考慮它們之間的關(guān)聯(lián)關(guān)系(全局信息)。舉例來說,假設(shè)要做人臉檢測任務(wù),僅僅找出圖片上的眼、鼻、口等人臉元素是不夠的,它們之間的相對位置關(guān)系也非常重要(如果一張圖片中人臉的各個(gè)器官被隨機(jī)打亂,我們顯然不會認(rèn)為這還是一張人臉)。
為了提取不同元素之間的關(guān)聯(lián)關(guān)系,我們需要一個(gè)全局的、位置敏感的特征提取器,而全連接層就是最方便的選擇,其每個(gè)輸出分量與所有的輸入分量都相連,并且連接權(quán)重都是不同的。當(dāng)然,卷積層也不是完全不能對位置信息進(jìn)行編碼,如果使用與輸入特征圖同樣尺寸的卷積核就可以,但這實(shí)際上等價(jià)于一個(gè)全連接層(卷積的輸出通道數(shù)目對應(yīng)著全連接層的輸出單元個(gè)數(shù))。
從另一方面來理解,多個(gè)全連接層組合在一起就是經(jīng)典的分類模型——多層感知機(jī)。我們可以把卷積神經(jīng)網(wǎng)絡(luò)中前面的卷積層看作是為多層感知機(jī)提取深層的、非線性特征。從這個(gè)角度講,最后幾層也可以接其他的分類模型,如支持向量機(jī)等,但這樣就脫離了神經(jīng)網(wǎng)絡(luò)體系,處理起來不太方便,不利于模型進(jìn)行端到端的訓(xùn)練和部署。
最近幾年,分類網(wǎng)絡(luò)在卷積層之后、最后一層之前通常采用全局平均池化,它與全連接層有著相似的效果(可以提取全局信息),并且具有如下優(yōu)點(diǎn)。
- 參數(shù)量和計(jì)算量大大降低。假設(shè)輸入特征圖的尺寸為(w\times h),通道數(shù)為(c),則全局平均池化的參數(shù)量為零,計(jì)算量僅為(c\times w\times h);而如果選擇接一個(gè)輸出單元數(shù)為(k)的全連接層,則參數(shù)量和計(jì)算量均為(c\times w\times h\times k)。對于 AlexNet、VGGNet 等這種全連接層單元數(shù)動輒 1024 或 4096 的網(wǎng)絡(luò),全局平均池化與普通卷積層的計(jì)算量能相差千余倍。
- 具有較好的可解釋性,比如:我們可以知道特征圖上哪些點(diǎn)對最后的分類貢獻(xiàn)最大。
3. 瓶頸結(jié)構(gòu)
瓶頸結(jié)構(gòu)是在 GoogLeNet/Inception-v1 中提出的,而后的 ResNet、MobileNet 等很多網(wǎng)絡(luò)也采用并發(fā)展了這個(gè)結(jié)構(gòu)。瓶頸結(jié)構(gòu)的初衷是為了降低大卷積層的計(jì)算量,即在計(jì)算比較大的卷積層之前,先用一個(gè) 1×1 卷積來壓縮大卷積層輸入特征圖的通道數(shù)目,以減小計(jì)算量;在大卷積層完成計(jì)算之后,根據(jù)實(shí)際需要,有時(shí)候會再次使用一個(gè) 1×1 卷積來將大卷積層輸出特征圖的通道數(shù)目復(fù)原。由此,瓶頸結(jié)構(gòu)一般是一個(gè)小通道數(shù)的 1×1 卷積層,接一個(gè)較大卷積層,后面可能還會再跟一個(gè)大通道數(shù)的 1×1 卷積層(可選)。
瓶頸結(jié)構(gòu)是卷積神經(jīng)網(wǎng)絡(luò)中比較基礎(chǔ)的模塊,它可以用更小的計(jì)算代價(jià)達(dá)到與之前相似甚至更好的效果(因?yàn)槠款i結(jié)構(gòu)會增加網(wǎng)絡(luò)層數(shù),所以特征提取能力可能也會有相應(yīng)提升)。瓶頸結(jié)構(gòu)基本上可以用于所有的卷積神經(jīng)網(wǎng)絡(luò)中,場景包括物體檢測和分割、生成式對抗網(wǎng)絡(luò)等大方向,以及諸如人臉匹配、再識別、關(guān)鍵點(diǎn)檢測等細(xì)分領(lǐng)域。
沙漏結(jié)構(gòu)也是卷積神經(jīng)網(wǎng)絡(luò)中比較基礎(chǔ)的模塊,它類似于瓶頸結(jié)構(gòu),但尺度要更大,涉及的層也更多。沙漏結(jié)構(gòu)一般包括以下兩個(gè)分支。
- 自底向上(bottom-up)分支:利用卷積、池化等操作將特征圖的尺寸逐層壓縮(通道數(shù)可能增加),類似于自編碼器中的編碼器(encoder)。
- 自頂向下(top-down)分支:利用反卷積或插值等上采樣操作將特征圖的尺寸逐層擴(kuò)大(通道數(shù)可能降低),類似于自編碼器中的解碼器(decoder)。
參考文獻(xiàn)[24]用一個(gè)具有沙漏結(jié)構(gòu)的網(wǎng)絡(luò)來解決人體姿態(tài)估計(jì)任務(wù),其基本單元如圖 1.19 所示;整個(gè)網(wǎng)絡(luò)則由多個(gè)沙漏結(jié)構(gòu)堆疊而成,如圖 1.20 所示。此外,在物體檢測任務(wù)中,沙漏結(jié)構(gòu)也有著大量應(yīng)用,如 TDM(Top-Down Modulation)、FPN(Feature Pyramid Network)、RON(Reverse connection with Objectness prior Networks)、DSSD(Deconvolutional Single-Shot Detector)、RefineDet 等模型,它們的網(wǎng)絡(luò)結(jié)構(gòu)如圖 1.21 所示。圖中的 RFB(Reverse Fusion Block)是將上采樣后的深層特征和淺層特征進(jìn)行融合的模塊。在這些應(yīng)用中,沙漏結(jié)構(gòu)的作用一般是將多尺度信息進(jìn)行融合;同時(shí),沙漏結(jié)構(gòu)單元中堆疊的多個(gè)卷積層可以提升感受野,增強(qiáng)模型對小尺寸但又依賴上下文的物體(如人體關(guān)節(jié)點(diǎn))的感知能力。