點擊上方【AI人工智能初學者】,選擇【星標】公衆號node
期待您個人相遇與進步git
本文除了討論了衆所周知的深度/寬度/分辨率以外,還提出網絡的"數目"應該是有效模型縮放的新維度。也所以提出了SplitNet;據做者稱,這是首次提出此類討論的工做,可引入現有CNN網絡中(如EfficientNet、SE-ResNet等),漲點明顯!
做者單位:港中文, AIRS, 浙江大學github
一、簡介
神經網絡的寬度很重要,由於增長寬度必然會增長模型的容量。可是,網絡的性能不會隨着寬度的增長而線性提升,而且很快就會飽和。web
爲了解決這個問題,做者提出增長網絡的數量,而不是單純地擴大寬度。爲了證實這一點,將一個大型網絡劃分爲幾個小型網絡,每一個小型網絡都具備原始參數的一小部分。而後將這些小型網絡一塊兒訓練,並使它們看到相同數據的各類視圖,以學習不一樣的補充知識。在此共同訓練過程當中,網絡也能夠互相學習。算法
實驗結果代表,與沒有或沒有額外參數或FLOP的大型網絡相比,小型網絡能夠得到更好的總體性能。這代表,除了深度/寬度/分辨率以外,網絡的數量是有效模型縮放的新維度。經過在不一樣設備上同時運行,小型網絡也能夠比大型網絡實現更快的推理速度。微信
二、相關工做
2.1 神經網絡結構設計
自從AlexNet的獲得很是好的效果之後,深度學習方法便成爲計算機視覺領域的主導,神經網絡設計也成爲一個核心話題。AlexNet以後出現了許多優秀的架構,如NIN、VGGNet、Inception、ResNet、Xception等。不少研究者設計了高效的模型,如1*1卷積核、用小核堆疊卷積層、不一樣卷積與池化操做的組合、殘差鏈接、深度可分離卷積等。網絡
近年來,神經網絡結構搜索(NAS)愈來愈受歡迎。人們但願經過機器學習方法自動學習或搜索某些任務的最佳神經結構。在這裏只列舉幾個,基於強化學習的NAS方法、漸進式神經架構搜索(PNASNet)、可微分架構搜索(DARTS),等等。架構
2.2 協同窗習
協同窗習最初是教育中的一個總稱,指的是學生或教師共同努力學習的教育方法。它被正式引入深度學習中,用來描述同一網絡中多個分類器同時訓練的狀況。併發
然而,按照其最初的定義,涉及兩種或兩種以上模型共同窗習的做品,也能夠稱爲協做學習,如深度相互學習(deep mutual learning, DML)、聯合訓練、互意教學、合做學習、知識蒸餾等。雖然有不一樣的名字,但核心思想是類似的,即經過一些同伴或老師的訓練來提升一個或全部的模型的性能。app
三、本文方法
這裏先簡單回顧了經常使用的深度圖像分類框架。給定一個神經網絡模型M和N個訓練樣本有C類,訓練M模型最經常使用的損失函數是交叉熵損失函數:
其中y爲ground truth label;p爲估計機率,一般由M的最後softmax層給出。
3.1 分割模型
上圖中根據網絡的寬度將一個大網絡M劃分爲S個小網絡 。當按寬度劃分時,實際上指的是按參數量或FLOPs劃分。
3.1.一、如何計算參數量和FLOPs?
例如,若是要把M分紅兩個網絡 , 或 的參數數量應該大約是 的一半。這裏給出計算神經網絡的參數和FLOPs的方法。
一般是卷積層的累加,所以在這裏只討論如何計算一個卷積層的參數量和FLOPs。在PyTorch的conv-layer的定義中,其卷積核大小是 ,輸入和輸出通道的特徵圖爲 和 , d爲累加捲積的數量,這意味着每 個輸入通道將與 的卷積核進行卷積。在這種狀況下,這個conv-layer的參數量(Params)和FLOPs:
其中 是輸出特徵圖的大小,-1是由於 次加法只須要 次操做。爲了簡潔起見,省略了誤差。對於Depthwise卷積來講 。
3.1.二、如何切分網絡?
一般 ,其中 爲常數。所以,若是想經過除以因子S來分割卷積層,只須要用 除以 :
1)切分ResNet
舉例以下:若是咱們想分割一個ResNet的Bottleneck Block:
經過除以2能夠獲得以下的4個小的Blocks:
這裏每一個Block只有原來Block的四分之一的參數量和FLOPs。
在實際應用中,網絡中特徵映射的輸出通道數具備最大公約數(GCD)。大多數ResNet變體的GCD是第一卷積層的 。對於其餘網絡,好比EfficienctNet,他們的GCD是8或者其倍數。通常來講,當想一個網絡切分爲S塊時,只須要找到它的GCD,而後用 就能夠了。
# The below is the same as max(widen_factor / (split_factor ** 0.5) + 0.4, 1.0)
if arch == 'wide_resnet50_2' and split_factor == 2:
self.inplanes = 64
width_per_group = 64
print('INFO:PyTorch: Dividing wide_resnet50_2, change base_width from {} '
'to {}.'.format(64 * 2, 64))
if arch == 'wide_resnet50_3' and split_factor == 2:
self.inplanes = 64
width_per_group = 64 * 2
print('INFO:PyTorch: Dividing wide_resnet50_3, change base_width from {} '
'to {}.'.format(64 * 3, 64 * 2))
2)切分ResNeXt
對於ResNeXt網絡,當 固定時,即 ,其中 爲常數,則式上一個等式須要變化爲:
這意味着只須要經過channel數量除以 即可以獲得d組小的Block。
self.dropout = None
if 'cifar' in dataset:
if arch in ['resnext29_16x64d', 'resnext29_8x64d', 'wide_resnet16_8', 'wide_resnet40_10']:
if dropout_p is not None:
dropout_p = dropout_p / split_factor
# You can also use the below code.
# dropout_p = dropout_p / (split_factor ** 0.5)
print('INFO:PyTorch: Using dropout with ratio {}'.format(dropout_p))
self.dropout = nn.Dropout(dropout_p)
elif 'imagenet' in dataset:
if dropout_p is not None:
dropout_p = dropout_p / split_factor
# You can also use the below code.
# dropout_p = dropout_p / (split_factor ** 0.5)
print('INFO:PyTorch: Using dropout with ratio {}'.format(dropout_p))
self.dropout = nn.Dropout(dropout_p)
3.1.三、權重衰減
對於權重衰減問題,因爲其內在機理尚不清楚,因此有一點複雜。本工做中使用了2種劃分策略:無劃分和指數劃分:
其中 爲原權重衰減值, 爲除法後的新權重值。不除意味着權重衰減值保持不變。如上所述,權重衰減的潛在機制尚不清楚,所以很難找到最佳的、廣泛的解決方案。以上兩種劃分策略只是經驗標準。在實踐中,如今最好的方法是嘗試。
3.1.四、小型網絡的併發運行
儘管小網絡具備更好的集成性能,但在大多數狀況下,小網絡也能夠經過在不一樣的設備上部署不一樣的小型模型,而且經過併發運行來實現比大網絡更快的推理速度。如圖所示。
典型的設備是NVIDIA的GPU。理論上,若是一個GPU有足夠的處理單元,例如流處理器、CUDA核等,小型網絡也能夠在一個GPU內併發運行。然而,一個小的網絡已經可以佔用大部分的計算資源,不一樣的網絡只能按順序運行。所以,本文只討論多設備的方式。
小網絡併發推理的成功也代表了訓練併發性的可能性。目前,小網絡在訓練過程當中是按順序運行的,致使訓練時間比大網絡長。
然而,設計一個靈活的、可伸縮的框架是至關困難的,它可以支持在多個設備上對多個模型進行異步訓練,而且在前向推理和反向傳播的過程當中也須要進行通訊。
3.2 聯合訓練
一個大網絡M分割後變成S個小網絡。如今的問題是如何讓這些小網絡從數據中學習不一樣的互補知識。在引入聯合訓練部分以前,強調劃分和聯合訓練的設計只是爲了說明增長網絡數量是有效模型縮放的一個新維度的核心思想。
而聯合訓練部分是由deep mutual learning(DML)、co-training和mutual mean-teaching(MMT)所啓發的。
不一樣的初始化方式和數據views
一個基本的理解是學習一些相同的網絡是沒有意義的。相比之下,小型網絡則須要學習有關數據的互補的知識,以得到一個全面的數據理解。
爲此,首先,對小網絡進行不一樣權值的初始化。而後,在輸入訓練數據時,對不一樣網絡 的相同數據使用不一樣的數據轉換器 ,如上圖所示。這樣,小模型 即可以在不一樣的變換域下 進行學習和訓練。
在實際應用中,不一樣的數據域是由數據增廣隨機性產生的。除了經常使用的隨機調整/剪切/翻轉策略外,做者還進一步介紹了隨機擦除和AutoAugment 策略。AutoAugment 有14個圖像變換操做,如剪切,平移,旋轉,自動對比度等。該算法針對不一樣的數據集搜索了幾十種由兩種轉換操做組成的策略,並在數據擴充過程當中隨機選擇一種策略。
源碼以下:
train_transform = transforms.Compose([transforms.RandomCrop(32, padding=4),
transforms.RandomHorizontalFlip(),
CIFAR10Policy(),
transforms.ToTensor(),
transforms.Normalize((0.4914, 0.4822, 0.4465),
(0.2023, 0.1994, 0.2010)),
transforms.RandomErasing(p=erase_p,
scale=(0.125, 0.2),
ratio=(0.99, 1.0),
value=0, inplace=False),
])
3.3 聯合訓練損失函數
遵循半監督學習中共同訓練的假設,小網絡雖然對 的view不一樣,但對x的預測是一致的:
所以,在目標函數中加入預測機率分佈之間的Jensen-Shannon(JS)散度,即聯合訓練損失函數:
其中 是一個小網絡 的估計機率, 是分佈p的Shannon熵。聯合訓練損失也用於DML中,但具體形式不一樣,即DML使用的是兩種預測之間的KullbacLeibler(KL)散度。經過這種聯合訓練的方式,一個網絡還能夠從它的同伴那裏學到一些有價值的東西,由於預測的機率包含有關於物體的有意義的信息。
例如,一個將一個物體分類爲Chihuahua的model可能也會對Japanese spaniel有很高的信心,由於它們都是狗。這是有價值的信息,定義了對象上豐富的類似結構。
整體目標函數爲:
式中, 是經過交叉驗證選擇 權重因子。
損失函數源碼以下:
def _co_training_loss(self, outputs, loss_choose, epoch=0):
"""calculate the co-training loss between outputs of different small networks
"""
weight_now = self.cot_weight
if self.is_cot_weight_warm_up and epoch < self.cot_weight_warm_up_epochs:
weight_now = max(self.cot_weight * epoch / self.cot_weight_warm_up_epochs, 0.005)
if loss_choose == 'js_divergence':
# the Jensen-Shannon divergence between p(x1), p(x2), p(x3)...
# https://en.wikipedia.org/wiki/Jensen%E2%80%93Shannon_divergence
outputs_all = torch.stack(outputs, dim=0)
p_all = F.softmax(outputs_all, dim=-1)
p_mean = torch.mean(p_all, dim=0)
H_mean = (- p_mean * torch.log(p_mean)).sum(-1).mean()
H_sep = (- p_all * F.log_softmax(outputs_all, dim=-1)).sum(-1).mean()
cot_loss = weight_now * (H_mean - H_sep)
else:
raise NotImplementedError
return cot_loss
四、實驗
4.一、各個Backbone的增益
經過上圖能夠看出:增長網絡的數量比單純增長網絡的寬度/深度更有效。
4.二、性能對比
經過上圖能夠看出:總體性能與個體性能密切相關。
4.三、CIFAR-100實驗結果
經過上表能夠看出:必要的網絡寬度/深度很重要。
4.四、序列和併發之間的推斷延遲實驗
參考:
[1].SplitNet: Divide and Co-training
[2].https://github.com/mzhaoshuai/SplitNet-Divide-and-Co-training
原文獲取方式,掃描下方二維碼,回覆【SplitNet】便可獲取論文和源碼
聲明:轉載請說明出處
掃描下方二維碼關注【AI人工智能初學者】公衆號,獲取更多實踐項目源碼和論文解讀,很是期待你個人相遇,讓咱們以夢爲馬,砥礪前行!!!
點「在看」給我一朵小黃花唄
本文分享自微信公衆號 - AI人工智能初學者(ChaucerG)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。