在這裡仍然先說聲抱歉,正如昨日提到的這兩天有臨時的活動參加,因此今日先以自己的部落格文做個充數,待週六再把原本的主題補回來。這篇部落格文談的是比較新的東西,希望能帶給大家一些幫助。
※ ※ ※
為什麼想寫類神經網路的設計模式呢?一方面是從 2015 年起,很多關於類神經網路的架構設計的學術文章陸續出現,因此去年 2015 我就零星在追蹤這些文章,另一方面,是最近看到一篇比較詳細綜述類型的文章,因此想把這個新東西帶給大家,本篇文章主要參考 2016-11 在 arXiv 的 Deep Convolutional Neural Network Design Patterns 考古請見前方連結,中文翻譯可見 解析深度卷积神经网络的14种设计模式 然而翻譯並沒有考古文獻,請留心
本文內容部分沒有嚴謹依據參考模型進行表示,為求簡單易懂還請見諒。
對於進行混合式類神經網路開發的人而言,我們其實在架構上十分的自由,我們想在任何一層、任何一個神經元去做任何事情,都不會有難度。但是難的是在是否對於我們各自想解決的問題,有個普遍共通性的架構設計可以參考?這是我從 2014 就在想的問題,我到現在還沒有想得很清楚,不過或許有幾個點值得注意。
這些點普遍來自於深度學習的反思,因為深度學習比起傳統的類神經網路更需要細膩的架構設計,在深度學習變得超夯之後,不難想像早晚都要有人解決這個問題。只是沒想到在 ICLR 2017 就有還算完備又淺顯易懂的文章,作者將重點放在卷積類神經網路但是不影響我們思考問題,無論如何讓我們來看一下 14 個設計要點(打*號為本部落格文章會提到):
在本部落格文章中只會特別介紹幾種個人認為比較廣泛、可以類比到多數類神經網路的設計模式,這不意味著我不採用本篇文章中提到的深度學習專門的設計模式,而是仍靜待更完整、完備的設計模式的討論,對於我個人而言,底下提到的幾種設計模式,能更快的被我應用於近期要解決的問題。
如果仔細觀察 ImageNet 挑戰賽 的 獲獎者,你會發現大家使用的類神經網路深度不斷加深,除此之外還有一個重要趨勢:每一個神經元往後接出去的路徑往往都是倍增的:
提升對稱性的設計模式,想法主要是來自於 FractalNet(碎形網路)的設計
FractalNet 具有很不錯的對稱性,讓我們來看張碎形:
圖片來源:維基多媒體 Wikimedia (GNU自由文件授權)
那到底在類神經網路中,這種對稱性表現在哪裡呢?
讓我們來看一下碎形的網路架構:
是不是有一種碎形的感覺呢?
這邊要特別注意到,碎形網路的對稱性是從左至右
而從上而下的對稱性是比較常見的,也是前面提到的設計模式 02 擴增路徑的方法
雖然碎形網路從上而下沒有對稱性,但仍然具備了擴增路徑的設計模式:
什麼叫做漸進式的特徵呢?在深度學習裡面我們每一層的輸出,基本上可以看做是不同層次的特徵。越深層次的網路輸出,通常也就是越高層次的抽象特徵,這些特徵的建構原則上不能太過跳躍(skip),才能使得特徵具有漸進式的建構路徑。
讓我們來看一個跳躍式的特徵建構:
關於跳躍的討論,其實牽涉到一篇我覺寫得非常讚的今年(2016)年中的論文 Understanding intermediate layers using linear classifier probes 這篇特別關注的是類神將網路中每一層的神經元到底為結果貢獻了什麼?找時間再分享吧(TODO - 文章方法結合啟發式演算法的實務應用)
合併分支的方法設計也很重要,如果在深度學習中我們常用的是串聯(concatenation)、求和(Summation Join)、平均(fractal join)或是取最大值(Maxout),參考文章中提及目前還沒有明顯的優劣勢,當然各種分支的結合有其訓練上的意義,例如總和和平均在 drop-out/drop-path 上表現不同,最大值能保持不變性,這些可以把它當作一個架構設計上的問題。