深度學(xué)習(xí)100問 Author:louwill Machine Learning Lab 所謂深監(jiān)督(Deep Supervision),就是在深度神經(jīng)網(wǎng)絡(luò)的某些中間隱藏層加了一個(gè)輔助的分類器作為一種網(wǎng)絡(luò)分支來對(duì)主干網(wǎng)絡(luò)進(jìn)行監(jiān)督的技巧,用來解決深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練梯度消失和收斂速度過慢等問題。 深監(jiān)督作為一個(gè)訓(xùn)練trick在2014年就已經(jīng)通過DSN(Deeply-Supervised Nets)提出來了。具體參見DSN論文。 DSN的一個(gè)缺點(diǎn)在于使用的網(wǎng)絡(luò)結(jié)構(gòu)不夠深,且輔助的分類器為傳統(tǒng)的SVM模型。2015年的一篇Training Deeper Convolutional Networks with Deep Supervision的論文嘗試了在更深層結(jié)構(gòu)的網(wǎng)絡(luò)中使用深監(jiān)督技巧。 深監(jiān)督的結(jié)構(gòu) 通常而言,增加神經(jīng)網(wǎng)絡(luò)的深度可以一定程度上提高網(wǎng)絡(luò)的表征能力,但隨著深度加深,會(huì)逐漸出現(xiàn)神經(jīng)網(wǎng)絡(luò)難以訓(xùn)練的情況,其中就包括像梯度消失和梯度爆炸等現(xiàn)象。為了更好的訓(xùn)練深度網(wǎng)絡(luò),我們可以嘗試給神經(jīng)網(wǎng)絡(luò)的某些層添加一些輔助的分支分類器來解決這個(gè)問題。這種輔助的分支分類器能夠起到一種判斷隱藏層特征圖質(zhì)量好壞的作用。 既然明確了要通過深監(jiān)督來解決深度網(wǎng)絡(luò)難以訓(xùn)練的問題,那么這個(gè)作為監(jiān)督分支結(jié)構(gòu)應(yīng)該加在神經(jīng)網(wǎng)絡(luò)的什么位置?論文作者根據(jù)一些經(jīng)驗(yàn)法則和實(shí)驗(yàn)給出了結(jié)論。作者先是把深監(jiān)督放在網(wǎng)絡(luò)最后一層,然后跑10-50次迭代,繪制出中間層的平均梯度值。最后作者將監(jiān)督分支添加在平均梯度消失(原文中平均梯度小于10_(-7))的那一層。隨迭代次數(shù)變化的各卷積層的平均梯度值如下圖所示。可以看到,Conv1-4層在迭代次數(shù)增加時(shí)平均梯度值都要小于10_(-7)。 帶有深監(jiān)督的一個(gè)8層深度卷積網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示。 帶有深監(jiān)督的一個(gè)13層深度卷積網(wǎng)絡(luò)結(jié)構(gòu)如下圖所示。 其中各個(gè)模塊含義如下: 可以看到,圖中在第四個(gè)卷積塊之后添加了一個(gè)監(jiān)督分類器作為分支。Conv4輸出的特征圖除了隨著主網(wǎng)絡(luò)進(jìn)入Conv5之外,也作為輸入進(jìn)入了分支分類器。如圖所示,該分支分類器包括一個(gè)卷積塊、兩個(gè)帶有Dropout和ReLu的全連接塊和一個(gè)純?nèi)B接塊。 損失函數(shù) 以W和Ws分別表示主干網(wǎng)絡(luò)和深監(jiān)督分支的權(quán)重,則有: 輸出層softmax表示為: 主干網(wǎng)絡(luò)的損失函數(shù)為: 深監(jiān)督分支的softmax輸出表示為: 深監(jiān)督分支的損失函數(shù)為: 可以看到深監(jiān)督分支的損失函數(shù)取決于W,而不是Ws,因?yàn)榉种ЫY(jié)構(gòu)中倒數(shù)第二層的S8特征圖關(guān)聯(lián)到主干網(wǎng)絡(luò)的卷積權(quán)重W1-4。 所以,聯(lián)合損失函數(shù)可以表示為: 其中α_t可以表示為隨訓(xùn)練epoch t衰減的一個(gè)值: 看到這個(gè)聯(lián)合損失函數(shù)是不是有種正則化的味道,實(shí)際也正是如此,輔助loss能夠起到一種類似正則化的效果。可以看到,Conv4在加深監(jiān)督和不加深監(jiān)督的平均梯度差異。如下圖所示: Torch示例 下面以Torch為例實(shí)現(xiàn)一個(gè)帶深度監(jiān)督的卷積模塊。先定義卷積塊: import torch.nn as nn # 定義卷積塊 # 包含3x3卷積+BN+relu def conv3x3_bn_relu(in_planes, out_planes, stride=1): '3x3 convolution + BN + relu' return nn.Sequential( nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False), BatchNorm2d(out_planes), nn.ReLU(inplace=True), ) 帶有深監(jiān)督的卷積模塊如下:
在U-Net等經(jīng)典語義分割網(wǎng)絡(luò)中,使用深監(jiān)督技巧是一個(gè)通用做法。以上就是本文內(nèi)容。 參考資料: Deeply-Supervised Nets Training Deeper Convolutional Networks with Deep Supervision |
|