DenseNet
DenseNet(Huang、Liu、van der Maaten 與 Weinberger,2017)採納了殘差連接的洞見——捷徑路徑有助於梯度與特徵流動——並把它推向極致。ResNet 區塊是把它的輸入加到它的輸出,而 DenseNet 則把一個區塊內的每一層連接到其後的每一層,並以串接(concatenation)而非相加來結合它們。具體來說,第 k 層接收的輸入,是該區塊內所有前面層的串接特徵圖(原始輸入加上第 1 到 k-1 層的輸出),而它自己的輸出隨後也被提供給每一個後面的層。在一個 L 層的區塊中,有 L(L+1)/2 個直接連接,而非僅 L 個。
實務上的回報是特徵重用與強健的梯度流動。由於每一層都能直接看到所有更早層所產生的原始特徵,網路不必透過深度去重新學習並重新傳遞資訊,所以每一層可以非常薄,只新增固定的一小撮新特徵圖,稱為成長率(growth rate,通常是 12、24 或 32)。這使 DenseNet 在參數上格外高效:它們往往以顯著更少的參數就追平 ResNet 的準確率。而且因為每一層都有一條通往損失與通往輸入的短路徑,梯度傳播良好,網路內建了一種深度監督(deep supervision)的形式。
DenseNet 由稠密區塊(dense block)與分隔它們的過渡層(transition layer)構築而成。串接只有在特徵圖共享空間維度時才行得通,所以在一個稠密區塊內解析度維持不變;區塊之間的過渡層套用一個 1x1 卷積(壓縮累積的通道)與一個 2x2 平均池化(降採樣)後再進入下一個區塊。主要的取捨是記憶體:雖然 DenseNet 參數少,但若天真地為反向傳播儲存所有串接的激活值會消耗大量記憶體,這促成了在反向傳遞時重新計算串接的記憶體高效實作。DenseNet 至今仍是一個乾淨的例證,說明「你如何連接層」與「你堆疊多少層」同等重要,而它的特徵重用哲學與 ResNet 的加法式捷徑形成了富啟發性的對照。
別把 DenseNet 的串接與 ResNet 的相加搞混。相加(ResNet)融合資訊並維持通道數固定;串接(DenseNet)原封不動保留每個特徵、並讓通道數隨深度線性成長,這正是為何過渡層的壓縮不可或缺。