1. 程式人生 > >論文DenseNet(Densely Connected Convolutional Networks)解讀

論文DenseNet(Densely Connected Convolutional Networks)解讀

Introduction

DenseNet在ResNet的基礎上(ResNet介紹),進一步擴充套件網路連線,對於網路的任意一層,該層前面所有層的feature map都是這層的輸入,該層的feature map是後面所有層的輸入。示意圖如下:

mark

原本L層的網路有L個連線,現在L層的網路共有C2L+1=L(L+1)2個連線。

DenseNet有幾個明顯的優點:

  • 減輕了梯度消失問題(vanishing-gradient problem)
  • 增強了feature map的傳播,利用率也上升了(前面層的feature map直接傳給後面,利用更充分了)
  • 大大減少了引數量

Related Work

在CNN模型裡,傳統的feed-forward架構可以視為狀態模型,狀態在層與層之間傳播,每一層讀取它上一層狀態,改變狀態並保留一些需要保留的資訊並將裝備傳給下一層。ResNet通過增加額外的identity transformations讓狀態內需要保留的資訊顯性化。作者的另一篇paper指出ResNet中有一個非常有意義的現象:網路的許多層貢獻較小並且在訓練過程中可以被隨機丟棄。

這裡引用Lyken的回答,分析ResNet,其gradient的主要來源是residual分支;在測試過程中,即便移除掉正常連結(僅留下 shortcut),模型照樣能保持較好的正確率。

本論文指出了residual connection實質是 highway network 的一種特殊例子,將 ResNet 展開以後,

論文1指出帶 Residual Connection 的深網路可以“近似地”看作寬模型(印證了為什麼移除主幹連線不會大幅影響正確率)。

ResNet再分析

但是ResNet和真正的寬模型還是不同的:Forward 時兩者可以看做相同,但 backward 時有部分 gradient 路徑無法聯通。也就是說, ResNet 在回傳 gradient 時,尚有提升的空間,這就是為什麼 ResNeXt,Wide-ResNet 等文章能有提升的原因:因為 ResNet 並不是真正的寬模型

以ResNet中一個Residual unit的gradient回傳為例,示意圖如下:

mark

y2
=y1+f2(y1,w2)=y0+f1(y0,w1)+f2(y0+f1(y0,w1),w2)y0+f1(y0,w1)+f2(y0,w2)+f2(f1(y0,w1),w2)

注意上式的不等於,為什麼backward的部分gradient路徑無法聯通?這是因為f2()是非線性的,即變現為f2(y0+f1(y0,w1),w2)f2(y0,w2)+f2(f1(y0,w1),w2)

DenseNet的Insight

既然 Residual Connection 能夠讓模型趨向於寬網路,那麼為什麼不直接來個狠得,這就是 Densenet論文核心思想:對每一層的前面所有層都加一個單獨的 shortcut到該層,使得任意兩層網路都可以直接“溝通”。即下圖:

mark

這一舉看似粗暴,實則帶來不少好處:

  • 從feature來考慮,每一層feature 被用到時,都可以被看作做了新的 normalization,論文3可以看到即便去掉BN, 深層 DenseNet也可以保證較好的收斂率。
  • 從perceptual field來看,淺層和深層的field 可以更自由的組合,會使得模型的結果更加robust。
  • 從 wide-network 來看, DenseNet 看以被看作一個真正的寬網路,在訓練時會有比 ResNet 更穩定的梯度,收斂速度自然更好(paper的實驗可以佐證)

DenseNet

記模型的輸入圖片為xo,模型由L層組成,每層的非線性轉換函式為Hl()l是層的序號。將lth層的輸出記為xl

Dense connectivity

DenseNet中每層的輸入是前面的所有層,故任何兩層之間都有連線。但在實際情況下,因為多層之間feature maps大小不同,不便於任何兩層之間的組合,受到GoogleNet的啟發,論文提出了Dense Block,即在每個Block內,所有layer都保持dense connectivity,而在Block之間是沒有dense connectivity,而是通過transition layer連線的。如下圖:

mark

Composite function

即單個Block內,層與層之間的非線性轉換函式Hl()就是Composite function,,每個Composite function的結構如下:

BNReLUConv(3×3)

Transition layer

不同層的feature map大小不同,考慮到池化層在CNN模型內的重要性,提出一個Transition layer用於連線Block與Block,每個Transition layer的結構如下:

BNConv(1×1)AvgPool(2×2)

Growth rate

如果一個Hl輸出k個feature maps,那麼lth層有k0+k×(l1)個feature maps輸入。k0是輸入層的通道數。如果k太多,即feature map太多,從而導致模型引數太多。這裡我們定義Growth rate就是超引數k,用於控制feature maps的數量。

DenseNet-BC

Bottleneck layers

儘管每層只產生k個feature maps,但還是很多。這裡就要用到1×1×n的小卷積來降維了。作者發現在DenseNet上使用1×1×n小卷積很有效,並定義了Bottleneck layers,結構如下:

BNReLUCo