摘要:首先第一種當然是在年提出的,它奠定了整個卷積神經網絡的基礎。其中局部感受野表示卷積核只關注圖像的局部特征,而權重共享表示一個卷積核在整張圖像上都使用相同的權值,最后的子采樣即我們常用的池化操作,它可以精煉抽取的特征。
近日,微軟亞洲研究院主辦了一場關于 CVPR 2018 中國論文分享會,機器之心在分享會中發現了一篇非常有意思的論文,它介紹了一種新型卷積網絡架構,并且相比于 DenseNet 能抽取更加精煉的特征。北大楊一博等研究者提出的這種 CliqueNet 不僅有前向的密集型連接,同時還有反向的密集型連接來精煉前面層級的信息。根據楊一博向機器之心介紹的 CliqueNet 以及我們對卷積架構的了解,我們將與各位讀者縱覽卷積網絡的演變。
卷積架構
很多讀者其實已經對各種卷積架構非常熟悉了,因此這一部分只簡要介紹具有代表性的卷積結構與方法。首先第一種當然是 Yann LeCun 在 1998 年提出的 LeNet-5,它奠定了整個卷積神經網絡的基礎。正如 LeCun 在 LeNet-5 原論文中所說,卷積網絡結合了三種關鍵性思想來確保模型對圖像的平移、縮放和扭曲具有一定程度的不變性,這三種關鍵思想即局部感受野、權重共享和空間/時間子采樣。其中局部感受野表示卷積核只關注圖像的局部特征,而權重共享表示一個卷積核在整張圖像上都使用相同的權值,最后的子采樣即我們常用的池化操作,它可以精煉抽取的特征。
原論文:GradientBased Learning Applied to Document Recognition
上圖是 LeNet-5 架構,它疊加了兩個卷積層與池化層來抽取圖像特征,然后再將抽取的特征傳入兩個全連接層以組合所有特征并識別圖像類別。雖然 LeNet-5 很早就提出來了,且架構和現在很多簡單的卷積網絡非常相似,但當時可能限于計算資源和數據集等條件并沒有得到廣泛應用。
第一個得到廣泛關注與應用的卷積神經網絡是 2012 年提出來的 AlexNet,它相比于 LeNet-5 較大的特點是使用更深的卷積網絡和 GPU 進行并行運算。如下所示,AlexNet 有 5 個卷積層和 3 個較大池化層,它可分為上下兩個完全相同的分支,這兩個分支在第三個卷積層和全連接層上可以相互交換信息。AlexNet 將卷積分為兩個分支主要是因為需要在兩塊老式 GTX580 GPU 上加速訓練,且單塊 GPU 無法為深度網絡提供足夠的內存,因此研究者將網絡分割為兩部分,并饋送到兩塊 GPU 中。
原論文:ImageNet Classification with Deep Convolutional Neural Networks
AlexNet 還應用了非常多的方法來提升模型性能,包括第一次使用 ReLU 非線性激活函數、第一次使用 Dropout 以及大量數據增強而實現網絡的正則化。除此之外,AlexNet 還使用了帶動量的隨機梯度下降、L2 權重衰減以及 CNN 的集成方法,這些方法現在都成為了卷積網絡不可缺少的模塊。
到了 2014 年,牛津大學提出了另一種深度卷積網絡 VGG-Net,它相比于 AlexNet 有更小的卷積核和更深的層級。AlexNet 前面幾層用了 11*11 和 5*5 的卷積核以在圖像上獲取更大的感受野,而 VGG 采用更小的卷積核與更深的網絡提升參數效率。一般而言,疊加幾個小的卷積核可以獲得與大卷積核相同的感受野,而疊加小卷積核使用的參數明顯要少于一個大卷積核。此外,疊加小卷積核因為加深了卷積網絡,能引入更強的非線性。
原論文:VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION
VGG-Net 的泛化性能較好,常用于圖像特征的抽取目標檢測候選框生成等。VGG 較大的問題就在于參數數量,VGG-19 基本上是參數量最多的卷積網絡架構。VGG-Net 的參數主要出現在后面兩個全連接層,每一層都有 4096 個神經元,可想而至這之間的參數會有多么龐大。
同樣在 2014 年,谷歌提出了 GoogLeNet(或 Inception-v1)。該網絡共有 22 層,且包含了非常高效的 Inception 模塊,它沒有如同 VGG-Net 那樣大量使用全連接網絡,因此參數量非常小。GoogLeNet 較大的特點就是使用了 Inception 模塊,它的目的是設計一種具有優良局部拓撲結構的網絡,即對輸入圖像并行地執行多個卷積運算或池化操作,并將所有輸出結果拼接為一個非常深的特征圖。因為 1*1、3*3 或 5*5 等不同的卷積運算與池化操作可以獲得輸入圖像的不同信息,并行處理這些運算并結合所有結果將獲得更好的圖像表征。
原論文:Going Deeper with Convolutions
一般 Inception 模塊的參數雖然少,但很多并行的卷積運算需要很多計算量。直接拼接不同的卷積運算會產生巨量的運算,因此修正的 Inception 模塊每一個卷積分支都會先執行一個 1*1 的卷積將通道數大大減少,這也相當于對輸入數據進行降維而簡化運算。此外,GoogLeNet 中間多出來的兩個分類網絡主要是為了向前面的卷積與 Inception 模塊提供額外的梯度進行訓練。因為隨著網絡的加深,梯度無法高效地由后向前傳,網絡參數也就得不到更新。這樣的分支則能減輕深度網絡的梯度傳播問題,但這種修補并不優美,也不能解決更深網絡的學習問題。
最后,何愷明等人于 2015 年提出來的深度殘差網絡驟然將網絡深度由十幾二十層提升到上百層。ResNet 較大的特點即解決了反向傳播過程中的梯度消失問題,因此它可以訓練非常深的網絡而不用像 GoogLeNet 那樣在中間添加分類網絡以提供額外的梯度。根據 ResNet 原論文,設計的出發點即更深的網絡相對于較淺的網絡不能產生更高的訓練誤差,因此研究者引入了殘差連接以實現這樣的能力。
原論文:Deep Residual Learning for Image Recognition
如上黑色曲線,ResNet 引入了殘差連接。在每一個殘差模塊上,殘差連接會將該模塊的輸入與輸出直接相加。因此在反向傳播中,根據殘差連接傳遞的梯度就可以不經過殘差模塊內部的多個卷積層,因而能為前一層保留足夠的梯度信息。此外,每一個殘差模塊還可以如同 Inception 模塊那樣添加 1×1 卷積而形成瓶頸層。這樣的瓶頸結構對輸入先執行降維再進行卷積運算,運算完后對卷積結果升維以恢復與輸入相同的維度,這樣在低維特征上進行計算能節省很多計算量。
DenseNet
ResNet 雖然非常高效,但如此深的網絡并不是每一層都是有效的。最近一些研究表明 ResNet 中的很多層級實際上對整體的貢獻非常小,即使我們在訓練中隨機丟棄一些層級也不會有很大的影響。這種卷積層和特征圖的冗余將降低模型的參數效率,并加大計算力的需求。為此,Gao Huang 等研究者提出了 DenseNet,該論文獲得了 CVPR 2017 的較佳論文。
DenseNet 的目標是提升網絡層級間信息流與梯度流的效率,并提高參數效率。它也如同 ResNet 那樣連接前層特征圖與后層特征圖,但 DenseNet 并不會像 ResNet 那樣對兩個特征圖求和,而是直接將特征圖按深度相互拼接在一起。DenseNet 較大的特點即每一層的輸出都會作為后面所有層的輸入,這樣最后一層將拼接前面所有層級的輸出特征圖。這種結構確保了每一層能從損失函數直接訪問到梯度,因此可以訓練非常深的網絡。
原論文:Densely Connected Convolutional Networks
如上所示為 Dense Block 的結構,特征圖 X_2 在輸入 X_0 與 X_1 的條件下執行卷積運算得出,同時 X_2 會作為計算 X_3 和 X_4 的輸入。一般對于 L 層的 DenseNet,第 l 層有 l 個輸入特征圖和 L-l 個輸出特征圖,因此它一共擁有 L(L+1)/2 個連接。這種密集連接型的網絡也就形象地稱為 DenseNet 了。
此外,Gao Huang 等研究者在原論文表示 DenseNet 所需要的參數更少,因為它相對于傳統卷積網絡不需要重新學習冗余的特征圖。具體來說,DenseNet 的每一層都有非常淺的特征圖或非常少的卷積核,例如 12、24、32 等,因此能節省很多網絡參數。
又因為每一層輸出的特征圖都比較淺,所以每一層都能將前面所有層級的特征圖拼接為一個較深的特征圖而作為輸入,這樣每一層也就復用了前面的特征圖。特征圖的復用能產生更緊湊的模型,且拼接由不同層產生的特征圖能提升輸入的方差和效率。
形式化來說,若給定一張圖像 x_0 饋送到 L 層的 DenseNet 中,且 H_l() 表示第 l 層包含卷積、池化、BN 和激活函數等的非線性變換,那么第 l 層的輸出可以表示為 X_l。對于 DenseNet 的密集型連接,第 l 層的輸出特征圖可以表示為:
其中 [x_0, x_1, . . . , x_{?1}] 表示從 0 到 l-1 層產生的特征圖,為了簡化計算,它們會按深度拼接為單個張量。在原論文的實現中,H_l() 為包含了三個模塊的復合函數,即先執行批量歸一化和 ReLU 激活函數,再執行 1 個 3×3 的卷積。
上述方程若想將特征圖按深度拼接,那么所有特征圖的尺寸就需要相等。一般常用的方法是控制卷積核的移動步幅或添加池化運算,DenseNet 將網絡分為不同的 Dense Block,并在 Dense Block 之間調整特征圖的大小。
如上所示,密集連接塊之間的轉換層會通過卷積改變特征圖深度,通過池化層改變特征圖尺寸。在原論文的實現中,轉換層先后使用了批量歸一化、1×1 的逐點卷積和 2×2 的平均池化。
此外,若 Dense Block 中的 H_l 輸出 k 張特征圖,那么第 l 層的輸入特征圖就有 k_0 + k × (l - 1) 張,其中 k_0 為輸入圖像的通道數。由于輸入特征圖的深度或張數取決于 k,DenseNet 每一個卷積都有比較淺的特征圖,即 k 值很小。在 ImageNet 中,DenseNet 的 k 值設為了 32。
不過盡管 k 值比較小,但在后面層級的卷積運算中,輸入的特征圖深度還是非常深的。因此與 ResNet 的殘差模塊和 GoogLeNet 的 Inception 模塊一樣,DenseNet 同樣在 3×3 卷積運算前加入了 1×1 逐點卷積作為瓶頸層來減少輸入特征圖的深度。因此我們可以將 H_l 由原版的 BN-ReLU-Conv(3×3) 修正為:BN-ReLU-Conv(1× 1)-BN-ReLU-Conv(3×3)。除了加入瓶頸層,DenseBlock 間的轉換層也可以通過 1×1 卷積減低特征圖的維度。
以下表格是 DenseNet 在 ImageNet 數據集上所采用的架構,其中每個卷積層的卷積核數 k=32,「conv」層對應于原版 H_l 或添加了瓶頸層的 H_l。
在實踐中,很多研究者都表示 DenseNet 的參數雖然少,但顯存占用非常恐怖。這主要是因為大量的特征圖拼接操作和 BN 運算結果都會占用新的顯存,不過現在已經有研究者修改代碼而降低顯存占用。此外,DenseNet 的計算量也非常大,很難做到實時語義分割等任務。
CliqueNet
DenseNet 通過復用不同層級的特征圖,減少了不同層間的相互依賴性,且最終的預測會利用所有層的信息而提升模型魯棒性。但是 Yunpeng Chen 等研究者在論文 Dual Path Networks 中表示隨著網絡深度的增加,DenseNet 中的密集型連接路徑會線性地增加,因此參數會急劇地增加。這就導致了在不特定優化實現代碼的情況下需要消耗大量的 GPU 顯存。而在北大楊一博等研究者提出來的 CliqueNet 中,每個 Clique Block 只有固定通道數的特征圖會饋送到下一個 Clique Block,這樣就大大增加了參數效率。
CliqueNet 較大的特點是其不僅有前傳的部分,同時還能根據后面層級的輸出對前面層級的特征圖做優化。這種網絡架構受到了循環結構與注意力機制的啟發,即卷積輸出的特征圖可重復使用,經過精煉的特征圖將注意更重要的信息。在同一個 Clique 模塊內,任意兩層間都有前向和反向連接,這也就提升了深度網絡中的信息流。
論文:Convolutional Neural Networks with Alternately Updated Clique
論文地址:https://arxiv.org/abs/1802.10419
實現地址:https://github.com/iboing/CliqueNet
CliqueNet 的每一個模塊可分為多個階段,但更高的階段需要更大的計算成本,因此該論文只討論兩個階段。第一個階段如同 DenseNet 那樣傳播,這可以視為初始化過程。而第二個階段如下圖所示每一個卷積運算的輸入不僅包括前面所有層的輸出特征圖,同樣還包括后面層級的輸出特征圖。第二階段中的循環反饋結構會利用更高級視覺信息精煉前面層級的卷積核,因而能實現空間注意力的效果。
如上所示在第一階段中,若輸入 0、1、2 號特征圖的拼接張量,卷積運算可得出特征圖 3。在第二階段中,特征圖 1 會根據第一階段輸出的 2、3、4 號拼接特征圖計算得出,我們可將其稱為已更新特征圖 1。第二階段的特征圖 3 在輸入第一階段的輸出特征圖 4 和已更新特征圖 1、2 的情況下得出。
由此可以看出,每一步更新時,都利用最后得到的幾個特征圖去精煉相對最早得到的特征圖。因為最后得到的特征圖相對包含更高階的視覺信息,所以該方法用交替的方式,實現了對各個層級特征圖的精煉。
Clique Block 中的第一階段比較好理解,與上文 Dense Block 的前向傳播相同。可能讀者對第二階段的傳播過程仍然有些難以理解,不過原論文中給出了一個很好的表達式來描述第 2 階段。對于第二階段中的第 i 層和第 k 個循環,交替更新的表達式為:
如上所示有兩套卷積核,即階段 2 中的前向卷積運算與反向卷積運算。每一套卷積核參數在不同階段中是共享的。
對于有五個卷積層的 Clique Block,傳播方式如下表所示。其中 W_ij 表示 X_i 到 X_j 的參數,它在不同階段可以重復利用和更新,「{}」表示拼接操作。
如上所示,第一階段的輸出特征圖都是拼接前面層級的特征圖 X^1 和輸入數據 X_0 ,并做對應的卷積運算而得出。第二階段的輸出特征圖會拼接前面層級更新過的特征圖 X^2 與第一階段的特征圖 X^1 而得出。
除了特征圖的復用與精煉外,CliqueNet 還采用了一種多尺度的特征策略來避免參數的快速增長。具體如下所示我們將每一個 Block 的輸入特征圖與輸出特征圖拼接在一起,并做全局池化以得到一個向量。將所有 Block 的全局池化結果拼接在一起就能執行最后的預測。由于損失函數是根據所有 Block 結果計算得出,那么各個 Block 就能直接訪問梯度信息。
此外,由于每一個 Block 只有第二階段的輸出會作為下一個 Block 的輸入,因此 Block 的特征圖維度也不會超線性的增加,從而具有參數量和計算量上的優勢。
如下所示為 CliqueNet 的關鍵代碼,build_model 函數會先構建 3 個 Clique Block,并將它們全局池化的結果傳入列表中。最終的特征即使用 tf.concat() 函數將所有池化結果拼接在一起,且在進行一個線性變換后可傳入 Softmax 函數獲得類別的預測概率。
import tensorflow as tf
from utils import *
block_num=3
def build_model(input_images, k, T, label_num, is_train, keep_prob, if_a, if_b, if_c):
? ? current=first_transit(input_images, channels=64, strides=1, with_biase=False)
? ? current_list=[]
? ? ## build blocks ? ?
? ? for i in range(block_num):
? ? ? ? block_feature, transit_feature = loop_block_I_II(current, if_b, channels_per_layer=k, layer_num=T/3, is_train=is_train, keep_prob=keep_prob, block_name="b"+str(i))
? ? ? ? if if_c==True:
? ? ? ? ? ? block_feature=compress(block_feature, is_train=is_train, keep_prob=keep_prob, name="com"+str(i))
? ? ? ? current_list.append(global_pool(block_feature, is_train))
? ? ? ? if i==block_num-1:
? ? ? ? ? ? break
? ? ? ? current=transition(transit_feature, if_a, is_train=is_train, keep_prob=keep_prob, name="tran"+str(i))
? ? ## final feature
? ? final_feature=current_list[0]
? ? for block_id in range(len(current_list)-1):
? ? ? ? final_feature=tf.concat((final_feature, current_list[block_id+1]),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? axis=3)
? ? feature_length=final_feature.get_shape().as_list()[-1]
? ? print "final feature length:",feature_length
? ? feature_flatten=tf.reshape(final_feature, [-1, feature_length])
? ? ## ? final_fc
? ? Wfc=tf.get_variable(name="FC_W", shape=[feature_length, label_num], initializer=tf.contrib.layers.xavier_initializer())
? ? bfc=tf.get_variable(name="FC_b", initializer=tf.constant(0.0, shape=[label_num]))
? ? logits=tf.matmul(feature_flatten, Wfc)+bfc
? ? prob=tf.nn.softmax(logits)
? ? return logits, prob
以上的 CliqueNet 就是北京大學和上海交通大學在 CVPR 2018 對卷積網絡架構的探索,也許還有更多更高效的結構,但這需要研究社區長期的努力。
歡迎加入本站公開興趣群商業智能與數據分析群
興趣范圍包括各種讓數據產生價值的辦法,實際應用案例分享與討論,分析工具,ETL工具,數據倉庫,數據挖掘工具,報表系統等全方位知識
QQ群:81035754
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4775.html
摘要:近日,谷歌大腦發布了一篇全面梳理的論文,該研究從損失函數對抗架構正則化歸一化和度量方法等幾大方向整理生成對抗網絡的特性與變體。他們首先定義了全景圖損失函數歸一化和正則化方案,以及最常用架構的集合。 近日,谷歌大腦發布了一篇全面梳理 GAN 的論文,該研究從損失函數、對抗架構、正則化、歸一化和度量方法等幾大方向整理生成對抗網絡的特性與變體。作者們復現了當前較佳的模型并公平地對比與探索 GAN ...
摘要:和是兩個非常重要的網絡,它們顯示了深層卷積神經網絡的能力,并且指出使用極小的卷積核可以提高神經網絡的學習能力。也有工作考察與的關系,與其相似,本文考察了與的關系。與的網絡架構配置以及復雜度見表。 DPN Dual Path NetworksYunpeng Chen, Jianan Li, Huaxin Xiao, Xiaojie Jin, Shuicheng Yan, Jiashi F...
摘要:一個簡單的解釋是,在論文和論文中,恒等映射的輸出被添加到下一個模塊,如果兩個層的特征映射有著非常不同的分布,那么這可能會阻礙信息流。 在 AlexNet [1] 取得 LSVRC 2012 分類競賽冠軍之后,深度殘差網絡(Residual Network, 下文簡寫為 ResNet)[2] 可以說是過去幾年中計算機視覺和深度學習領域最具開創性的工作。ResNet 使訓練數百甚至數千層成為可能...
閱讀 1848·2021-09-29 09:35
閱讀 2710·2021-09-22 15:25
閱讀 1971·2021-08-23 09:43
閱讀 2048·2019-08-30 15:54
閱讀 3348·2019-08-30 15:53
閱讀 2385·2019-08-30 13:50
閱讀 2397·2019-08-30 11:24
閱讀 2268·2019-08-29 15:37