閱讀1001 返回首頁    go 阿裏雲 go 技術社區[雲棲]


想改進你的卷積神經網絡?看看這14種設計模式!

更多深度文章,請關注雲計算頻道:

https://yq.aliyun.com/cloud

screenshot
自2011年以來,深度卷積神經網絡(CNN)在圖像分類的工作中的表現就明顯優於人類,它們已經成為在計算機視覺領域的一種標準,如圖像分割,對象檢測,場景標記,跟蹤,文本檢測等。
但,想要熟練掌握訓練神經網絡的能力並不是那麼容易。與先前的機器學習思維一樣,細節決定成敗。但是,訓練神經網絡有更多的細節需要處理。你的數據和硬件有什麼限製?你應該是從何種網絡開始?你應該建立多少與卷積層相對的密集層?你的激勵函數怎樣去設置?即使你使用了最流行的激活函數,你也必須要用常規激活函數。
學習速率是調整神經網絡訓練最重要的超參數,也是最難優化的參數之一。太小,你可能永遠不會得到一個解決方案;太大,你可能剛好錯過最優解。如果用自適應的學習速率的方法,這就意味著你要花很多錢在硬件資源上,以此來滿足對計算的需求。
設計選擇和超參數的設置極大地影響了CNN的訓練和性能,但對於深度學習領域新進入者來說,設計架構直覺的培養可能就需要資源的稀缺性和分散性。
screenshot
《神經網絡:權衡技巧》是一本主要著重於實際調優的書,出版於2003年,並在2012年再版。而深度學習的火爆始於2012年《紐約時報》報道的Geoffrey Hinton 的團隊在 Merck Drug Discovery Challenge 上的驚人成功。然而,最近幾年最先進的研究成果卻消失了。
幸運的是,美國海軍研究室的研究員 Leslie Smith發表了關於CNN架構改進和技術提升的係統性研究。下麵是他所強調的最重要的一些設計模式

14種圖像分類的CNN設計模式

根據 Smith 的觀點,“這14 種原創設計模式可以幫助沒有經驗的研究者去嚐試將深度學習與新應用結合”。盡管高級的AI研究員可以依靠直覺、經驗以及針對性的實驗,但這些建議對於那些沒有機器學習博士學位的人來說是一個很好的起點。

1) 架構遵循應用
你也許會被 Google Brain 或者 Deep Mind 這些有想象力的實驗室所發明的那些耀眼的新模型所吸引,但是其中許多要麼是不可能實現的,要麼是不實用的對於你的需求。或許你應該使用對你的特定應用最有意義的模型,這種模型或許非常簡單,但是仍然很強大,例如 VGG。
screenshot

2) 路徑的激增
每年ImageNet Challenge的贏家都比上一年的冠軍使用更加深層的網絡。從AlexNet 到Inception到Resnets,Smith和他的團隊也觀察到“網絡的路徑數量成倍增長”的趨勢,而且,ResNet可以是不同長度的網絡的指數集合。
3) 追求簡約
更大的並不一定是更好的。在名為“Bigger is not necessarily better”的論文中,Springenberg 等人演示了如何用更少的單元實現最先進的結果。
4)增加對稱性
無論是在建築上,還是在生物上,對稱性被認為是質量和工藝的標誌。Smith 將 FractalNet 的優雅歸功於網絡的對稱性。
5) 金字塔形狀
你總是在表征能力和減少冗餘或者無用信息之間權衡。CNNs通常會降低激活函數的采樣,並會增加從輸入層到最終層之間的連接通道。
6) 過渡訓練
另一個權衡是訓練準確度和泛化能力。用正則化的方法類似 drop-out 或 drop-path進行提升泛化能力,這是神經網絡的重要優勢。用比實際用例更難的問題訓練你的網絡,以提高泛化性能。
7) 覆蓋問題的空間
為了擴大你的訓練數據和提升泛化能力,要使用噪聲和人工增加訓練集的大小,例如隨機旋轉、裁剪和一些圖像操作。
8) 遞增的功能結構
當架構變得成功時,它們會簡化每一層的“工作”。在非常深的神經網絡中,每個 層隻會遞增地修改輸入。在ResNets中,每一層的輸出可能類似於輸入。所以,在 實踐中,請在ResNet中使用短的跳過長度。
9) 標準化層的輸入
標準化是可以使計算層的工作變得更加容易的一條捷徑,並且在實際中可以提升訓練的準確性。批量標準化的發明者認為標準化發揮作用的原因在於處理內部的協變量,但Smith 認為,“標準化把所有層的輸入樣本放在了一個平等的基礎上(類似於單位轉換),這允許反向傳播可以更有效地訓練”。
10)輸入變換
研究表明,在Wide ResNets中,性能隨著通道數量的增加而提升,但是要權衡訓練成本與準確性。AlexNet,VGG,Inception和ResNets都是在第一層中進行輸入變換,以保證多種方式檢查輸入數據。
11)可用的資源決定層寬度
可供選擇的輸出數量並不明顯,相應的是,這取決於您的硬件功能和所需的準確性。
12)Summation joining
Summation是一種流行的合並分支的方式。在 ResNets 中,使用求和作為連接機製可以讓每一個分支都能計算殘差和整體近似。如果輸入跳躍連接始終存在,那麼Summation會讓每一層學到正確地東西(例如:輸入的差別)。在任何分支都可以被丟棄的網絡(例如 FractalNet)中,你應該使用這種方式保持輸出的平滑。
13)下采樣變換
在匯聚的時候,利用級聯連接來增加輸出的數量。當使用大於1的步幅時,這會同時處理加入並增加通道的數量。
14)用於競爭的Maxout
Maxout 用在隻需要選擇一個激活函數的局部競爭網絡中。用的方法包含所有的激活函數,不同之處在於 maxout 隻選擇一個“勝出者”。Maxout 的一個明顯的用例是每個分支具有不同大小的內核,而 Maxout 可以尺度不變。

提示&技巧

除了這些設計模式,還有幾個技巧和訣竅,以減少架構複雜性和培訓時間。
1)使用細調過的預訓練網絡
機器學習公司 Diffbot 的 CEO Mike Tung 說,“如果你的視覺數據和 ImageNet 相似,那麼用預訓練網絡會幫助你學習得更快”。低水平的CNN通常可以被重複使用,因為它們大多能夠檢測到像線條和邊緣這些常見的模式。用你自己的層替換分類層,並且用你特定的數據去訓練最後的幾個層。
2)使用 freeze-drop-path
Drop-path 會在迭代訓練的過程中隨機地刪除一些分支。Smith 測試了一種相反的方法,被稱為 freeze-path,就是一些路徑的權重是固定的、不可訓練的,而不是整體刪除。該網絡可能會獲得更高的精度,因為下一個分支比以前的分支包含更多的層,並且修正項更容易得到。
3)使用循環的學習率
學習率的實驗會消耗大量的時間,並且會讓你遇到錯誤。自適應學習率在計算上可能是非常昂貴的,但是循環學習率不會。使用循環學習率時,你可以設置一組最大最小邊界,並且在這個範圍改變它。Smith 在論文中提供了計算學習率的最大值和最小值的方法。
4)在有噪聲的標簽中使用 bootstrapping
在實踐中,很多數據都是混亂的,標簽都是主觀性的或是缺失的,而且目標有可能是從未遇到過的。Reed 等人在文章中描述了一種給網絡預測目標注入一致性的方法。直觀地講,這可以實現,通過網絡對環境的已知表示(隱含在參數中)來過濾可能具有不一致的訓練標簽的輸入數據,並在訓練時清理該數據。
5)用有 Maxout 的 ELUs,而不是 ReLUs
ELUs是 ReLUs 的一個相對平滑的版本,它能加速收斂並提高準確度。研究調查表明,與 ReLUs 不同,ELUs 擁有負值,這就能允許它們以更低的計算複雜度將平均單位激活推向更加接近0的值,就像批量標準化一樣。如果您使用具有全連接層的 Maxout,它們是特別有效的。
作者介紹:
Mariya是TOPBOTS的研究和設計主管。screenshot
Linkedin:https://www.linkedin.com/in/mariyayao
Twitter:https://www.twitter.com/thinkmariya
以上為譯文
本文由北郵@愛可可-愛生活老師推薦,阿裏雲雲棲社區組織翻譯。
文章原標題《14 DESIGN PATTERNS TO IMPROVE YOUR CONVOLUTIONAL NEURAL NETWORKS》,作者:Mariya Yao ,譯者:袁虎,審校:我是主題曲哥哥。
文章為簡譯,更為詳細的內容,請查看原文

最後更新:2017-05-24 15:31:25

  上一篇:go  《STM32庫開發實戰指南:基於STM32F4》----1.4 安裝STM32芯片包
  下一篇:go  《STM32庫開發實戰指南:基於STM32F4》----1.3 開始安裝KEIL5