什麼是超網路?

【編者按】機器學習開發者hardmaru撰寫博客,介紹了他在2016-2017年度Google Brain Residency期間和同事合作發表的論文HyperNetworks(超網路)。

介紹

用於手寫生成的超網路,LSTM的權重矩陣隨時間而改變

大部分現代的神經網路架構或者是一個深度卷積網路,或者是一個長長的循環神經網路,再不然就是兩者的組合。這兩個架構看起來是光譜的兩端。循環網路可以看成是一個非常深的前饋網路,網路每層使用同一套權重(這叫做權重系聯(weight-tying))。而深度卷積網路允許每層的權重不同。但是也許某種程度上這兩者是相關聯的。每年,ImageNet優勝模型變得越來越深。想想我們時常聽到的那些110層的深度網路,甚至1001層的循環網路。這110層都需要各不相同嗎?甚至,大多數層有用嗎?

上:前饋網路,不共享權重;下:循環網路,共享權重

人們已經考慮過迫使深度卷積網路更像循環神經網路的方案,也就是每層使用同一套權重。然而,如果我們強迫一個深度殘差網路使用同一套權重,表現會令人尷尬。在我們的論文中,我們使用超網路探索中道——強制寬鬆版本的權重系聯。超網路僅僅是一個小型網路,該網路為一個大得多的網路生成權重,比如為一個深度殘差網路生成權重,高效地設定殘差網路每層的權重。我們可以使用超網路來探索模型的表達力和捆綁深度卷積網路權重的程度之間的權衡。這有些像壓縮圖像時可以調整壓縮率,超網路不過是把圖像換成深度卷積網路的權重。

儘管神經網路壓縮是一個很不錯的主題,如果你讀過我以前的文章的話,你可能知道,我更想背道而馳。已經有很多演算法接受一個完全訓練好的網路,接著應用壓縮方法到預訓練網路的權重,以減少網路的體積。雖然這些方法很有用,我覺得從數目較少的參數開始,學習創建一個更大、更複雜的表示,會更有意思。在自然界中,一套簡單的規則可以生成許多美麗複雜的模式。數字藝術家已經基於這個概念設計了美麗的生成式作品。我的機器學習研究打算探索這種複雜度抽象的概念。在我看來,神經網路解壓縮是一個比壓縮更有趣的問題。特別地,我也想探索解壓縮一個已經壓縮過的神經網路,例如,循環網路的權重。

更激動人心的部分是我們的論文的第二部分,我們將超網路應用到循環網路。循環網路的權重在每一時步是捆綁的,限制了它的表達力。如果我們找到一種允許循環神經網路的權重因每一時步和每個輸入序列而不同的方法,那會怎麼樣?

靜態超網路為前饋網路生成權重

動態超網路為循環網路生成權重

這篇論文的主要成果是挑戰循環網路的權重共享範式。我們在一個大型LSTM網路中嵌入了一個小型的超網路,因此,主LSTM網路可以根據超網路修改自己的權重。在這一例子中,超網路也是一個LSTM,只不過比主網路小,並且具有在每一時步和每一個輸入序列修改主網路權重的能力。最終模型在Penn Treebank和維基百科資料庫的字元層次語言建模任務中達到了當前最先進水平。更重要的,我們探索了用我們的模型生成生成式模型。

最終得到的HyperLSTM(超LSTM)模型感覺和一個普通的通用TensorFlow循環神經網路細胞差不多。就像我們中的某些人具有超能力一樣,在HyperLSTM模型中,如果主LSTM網路是人腦的話,那麼HyperLSTM是某種在人腦內進行操控的奇異智能生物。

我本人很歡迎我們的新Arquillian統治者

背景

使用神經網路生成大得多的神經網路的權重的概念源於神經演化。儘管演化演算法使用起來很方便、很有趣,但通過演化演算法直接尋找一個巨大的模型參數集合卻很困難。Ken Stanley想出了一個天才的方法來解決這個問題——HyperNEAT(超NEAT)。他在嘗試使用NEAT演算法創建美麗的神經網路生成藝術時想出了這個方法。NEAT是一個演化神經網路,接受每個像素的位置作為輸入,然後輸出每個像素的顏色,因而,它可用於生成藝術作品。如果我們使用NEAT來繪製權重矩陣的權重,那會怎麼樣?HyperNEAT試圖做這個。它使用一個小型NEAT網路生成大型神經網路的所有權重參數。小型NEAT網路通常包括不到幾千個參數,給定一個包含每個權重連接的虛擬坐標的集合,它的架構逐漸演化以產生大型網路的權重。

儘管通過數量較少的參數設定大型權重集合的概念在神經演化中非常有用,另一些研究者認為HyperNEAT多少有點「殺雞焉用牛刀」的感覺。編寫和調試NEAT需要耗費很多精力,而在研究中,選擇性懶惰很有市場。Schmidhuber團隊決定嘗試另一種方法,直接使用離散餘弦變換壓縮大型權重矩陣,通過一個較小的係數集合來逼近原本的權重矩陣(JPEG壓縮正是這麼做的)。接著他們使用遺傳演算法來解決尋找最優參數集合的問題,從而使循環網路的權重好到可以在TORCS模擬中駕駛一輛虛擬汽車沿著軌道前進。基本上,他們是把JPEG壓縮技術應用到了自動駕駛的權重矩陣上。

包括我在Deepmind的同事在內的一些人,也嘗試使用HyperNEAT來演化一個小型的權重生成網路,但使用反向傳播代替了遺傳演算法來求解小型網路的權重。他們關於DPPN的論文總結了一些很酷的成果。

我個人對神經網路權重生成的另一方面更感興趣。我喜歡把神經網路看成一種強大的計算設備,神經網路的權重某種程度上像是計算機的機器指令。神經元的數目越多,神經網路的表達力變得越強。但和普通計算機的機器指令不同,神經網路的權重是強韌的,所以如果我們給網路的一些部分加上一些雜訊,某種程度上它仍然能工作。基於這一原因,我發現使用少量參數表達一大組權重的概念很吸引人。這種形式的權重抽象有點像美麗的高級抽象語言(LISP或Python)編譯為原始的機器代碼(神經網路權重)。或者,從生物學的視角而言,它像是在基因層面表達大型的複雜生物學結構。

靜態超網路

在這篇論文中,我使用了一個與HyperNEAT、DPPN略微不同的方法。如前所述,這些方法接受一組虛擬坐標作為小型網路的輸入,然後生成大型網路的輸出。我就這一概念做了大量試驗(見論文附件A),但在深度卷積網路和LSTM這樣的現代架構上,它沒有效果。儘管HyperNEAT和DCT可以生成看起來不錯的權重矩陣(由於正弦之類的平滑函數強制應用的先驗),在很多實際應用中,這樣的人造平滑性也是局限。看起來不錯的權重矩陣如果不工作,那也是毫無幫助。下面的圖像展示了一個典型的深度殘差網路的矩陣:

在CIFAR-10上訓練的典型的殘差網路的16x16x3x3和32x32x3x3的權重核

儘管我不會把這樣的殘差網路權重圖片掛在自己的起居室里,它們的效果真不錯,我想通過更少的參數生成這些權重的圖像。我採用了一個更簡單的方法,一個更類似VAE或者GAN的方法。像GAN和VAE這樣更現代的生成式模型接受一個短小的嵌入向量Z,比如說,包含64個數字的向量,然後基於這64個值,嘗試生成逼真的貓咪圖像或其它有趣的圖像。為何不嘗試生成殘差網路的權重矩陣呢?所以我們使用的方法是訓練一個簡單的雙層網路,以通過由64個數字組成的嵌入向量生成16x16x3x3權重核。更大的權重核將通過堆疊較小的版本創建(也就是說,右面的那個需要256個數字來生成)。我們將使用同樣的雙層網路來生成深度殘差網路的每個核。當我們訓練殘差網路進行圖像分類的時候,我們並沒有直接訓練殘差網路的權重,而將訓練Z的集合與雙層網路的參數。

在同樣任務上訓練的殘差網路,16x16x3x3和32x32x3x3的權重核由超網路生成

我們嘗試了一個現成的典型殘差網路(這一使用「WRN-40-2」配置的出色的殘差網路變體叫做廣殘差網路),其中36個網路層為這類權重核。寫作本文時,CIFAR-10上最好的測試分類精確度大約為96%(使用了幾千萬參數)。而上面的廣殘差網路僅僅使用大約二百二十萬參數就能在CIFAR-10上達到大約94%的精確度,我認為這相當不錯了。我們的基於超網路生成權重的殘差網路版本僅使用大約15萬參數,達到了同級別的精確度(93%)。

廣殘差網路結構。我們的參數為N=6、k=2

這些結果讓我懷疑,那些在ImageNet測試上表現非常好的超級深的1001層殘差網路,大部分的權重也許不是那麼有用,許多權重可能只是某種佔位符,讓大量的神經元參與運算,那才是為什麼它們表現如此好的原因。

如果你想看下實現,請參考這個IPython Notebook,它展示了論文中的MNIST試驗中概述的權重生成概念。它可以擴展,並與Tensor框架中的殘差網路模型相結合。

動態超網路

正如「介紹」一節提到的,我們也嘗試了將超網路應用到循環網路上,我覺得這是這項研究的主要貢獻。通過在殘差網路上應用超網路,我們得到的其中一個洞見是,儘管模型的參數數量大大減少了,作為代價,精確度也有所下降。所以如果我們嘗試另一個方向會出現什麼情況?如果我們使用一個可以放寬循環神經網路的權重分享限制的超網路,允許權重矩陣在每個展開的時步中改變,它會更像一個深度卷積網路,因此也許我們可以壓榨出更好的表現?

HyperRNN系統。黑色系統表示主RNN,橙色系統表示權重生成HyperRNN細胞

我們的方法是在一個大型LSTM細胞(主LSTM)內放置一個小型LSTM細胞(稱為HyperLSTM細胞)。HyperLSTM細胞有它自己的隱藏狀態和輸入序列。HyperLSTM細胞的輸入系列通過以下兩個來源構建:連接主LSTM的前一個隱藏狀態與主LSTM的實際輸入序列。HyperLSTM細胞的輸出將是嵌入向量Z,用於生成主LSTM的權重矩陣。

和靜態超網路不同,權重生成嵌入向量不是保持不變的,而是由HyperLSTM細胞動態生成的。這允許我們的模型為每個時步和每個輸入樣本生成一組新的權重。在論文中我討論了一些實踐上的事情,包括更節省算力和內存的基於嵌入向量生成權重的方法,簡化和降低了這一方法的計算限制。我得到的一個經驗是,儘管在研究中想像新演算法和新方法很重要,最終確保它們可行可用也很重要。此外,讓其他人易於使用你的成果也很重要。

因此,我們實現動態超網路時,確保HyperLSTM細胞可以插入任何使用tf.nn.rnn_cell對象編寫的TensorFlow代碼,因為HyperLSTM繼承自這一抽象類。這使得我們的研究代碼可以很容易地插入為使用原始LSTM細胞而設計的現有代碼。例如,當我在維基百科數據集上試驗我們的HyperLSTM細胞時,我直接使用了char-rnn-tensorflow,直接插入研究模型以進行訓練和推理。下面是在維基百科enwik8數據集訓練後,配備了我們的HyperLSTM模型的char-rnn-tensorflow生成的一個段落:

生成文本,及相應的主LSTM權重矩陣的權重改變活動程度。HyperLSTM通過某種方式學習將蘇維埃、法西斯、一家電腦公司和一種非常重要的機器放在一句話里

上圖不僅顯示了生成文本,同時可視化了主LSTM的權重是如何被HyperLSTM細胞可視化的。我選擇用4種顏色可視化了LSTM的hidden-to-gate權重矩陣隨著時間的變化,以表示LSTM的輸入門、候選門、遺忘門、輸出門(這篇博客很好地解釋了這些概念)。我們可以將高亮度區域解讀為HyperLSTM細胞剛剛對主LSTM的權重做出了巨大的改動(在主LSTM生成每個字元之前)。低亮度區域意味著HyperLSTM細胞正稍事休息,因此主LSTM的權重沒什麼大變動。下面是另一個生成段落的樣本:

有一個有趣的地方值得注意,在HyperLSTM細胞不那麼活躍的時候,單詞的類別看起來更容易預測。例如,在第一個例子中,Microsoft Windows是在Micros之後的一個或多或少靜止的網路上生成的。在第二個例子中,elections in the early 1980s(1980年代早期的大選)是由一個相對不變的主LSTM生成的,但就在1980s之後,HyperLSTM細胞突然蘇醒了,決定在開始討論savage employment concerns(殘酷的就業問題)前給主LSTM模型一點震動。從某種意義上說,當生成式模型生成序列的時候,HyperLSTM細胞持續生成生成式模型。

這樣動態生成生成式模型的元能力看起來非常強大,事實上,我們的HyperLSTM模型能夠擊敗之前最先進的字元級別預測數據集基準,例如Character-Level Penn Treebank和Hutter Prize Wikipedia(enwik8)。在未使用動態評估的前提下,我們的模型在兩個數據集上分別取得了1.25 bpc和1.38 bpc的成績(27-Sep-2016),超過了之前的記錄1.27和1.40(10-Sep-2016)。

考慮到機器學習研究領域的發展速度,幾周之後,其他人大概就會超過這些最先進的數字,更別提ICLR 2017的死線快到了。事實上,我並不真的認為在某個文本數據集上擊敗最先進的記錄和探索這樣的多層動態模型抽象下的動態模型同等重要。我覺得以後人們會更少關注架構設計,轉而關注兩個方向,或者是應用側,或者是基礎的構建模塊側。我喜歡我們的方法的地方是我們事實上創建了一個稱為HyperLSTM的構建模塊,在TensorFLow的用戶看來,和普通的LSTM模塊很像。HyperLSTM對現存的TensorFlow代碼而言是即插即用的,就像替換RNN、GRU、LSTM細胞一樣,因為我們將HyperLSTM實現為tf.nn.rnn_cell.RNNCell的一個實例,稱為HyperLSTMCell(這包括整個系統,別和HyperLSTM細胞混淆了)。

生成生成式模型

我也在書寫生成任務中嘗試使用了HyperLSTM。在之前的文章中,我探索了使用Alex Grave的方法讓LSTM生成隨機手寫序列。這一生成方法將筆的運動坐標Δx、Δy建模為2維混合高斯分布,並使用一個二元Bernoulli隨機變數建模筆停留在紙上的概率。

取樣自基於原始LSTM模型生成的2維混合高斯分布與Bernoulli分布。高斯分布和Bernoulli分布均隨時間改變

在手寫的過程中,兩個分布的參數將隨時間改變,同時互相依賴。例如,當書寫完畢一個單詞後,筆離開紙的概率增加了,同時,筆的下一個位置很可能會遠離現在的位置,差異也更大。我們可以讓LSTM輸出混合高斯分布和Bernoulli分布的參數,然後基於時步根據LSTM的內部狀態改變這些參數的值。上圖中的紅色氣泡可視化了高斯分布的改變,紅色氣泡表明了下一筆的位置和尺寸。我們可以從這個隨時間改變的分布中取樣,從而通過連接取樣點取樣整個模擬手寫的過程。在我看來,這種模型和動態超網路很像,因為LSTM隨著時間的推移,動態地改變生成分布(高斯和Bernoulli)的參數。在手寫數據集上訓練整個網路後,它生成手寫樣本的能力令人驚嘆。

我們的論文應用動態超網路擴展了這一方法。我們將代碼中的BasicLSTMCell替換為HyperLSTMCell。因此,隨著時間的推移,LSTM的權重矩陣和偏置將由一個較小的LSTM網路修改。作了這一簡單的改動之後,我們將這一模型生成模型方法提升至另一層,每一時步,較小的LSTM動態生成較大的LSTM模型,相應地,生成的較大的LSTM模型也在每一時步為高斯和Bernoulli分布生成參數。所以模型生成模型變成了模型生成模型生成模型。

和之前的文本生成任務類似,和普通乃至多層LSTM相比,這一新方法在使用數目類似的訓練參數的前提下,達到了更優的表現。我修改了write-rnn-tensorflow代碼以精確復現Grave論文的4.2小節中的試驗,並驗證了使用BasicLSTMCell的Log損失結果和之前發表的結果足夠相似。在試驗了歷史結果後,我們將BasicLSTMCell切換為HyperLSTMCell,然後重新運行了試驗。不過,在此之前,我們首先嘗試了改進基線方法。對基線技術表達一些敬意、給它們面子很重要,因為它們為我們開闢了道路。我們發現,應用數據增強和dropout之類的黑魔法技術,我們已經可以改善基線單層BasicLSTMCell的分數(從-1026奈特到-1055奈特)。在切換到我們的模型之後,HyperLSTMCell將Log損失評分推進到-1162奈特,這是很大、很有意義的一個改進。除了定量結果,論文的附錄也展示了不同模型實際生成的許多樣本。

我製作了一個小的demo,展示手寫生成過程是如何通過HyperLSTM工作的,作為本文的結尾。我希望通過這個demo顯示HyperLSTM單元是如何修改主LSTM權重的。和字元生成的例子不同,時間軸並不嚴格對應手寫的x軸,所以我發現使用web demo的形式可視化這一過程更容易,因為提交到arXiv的.pdf論文並不能添加動畫。未來,更多的科學研究將從期刊和會議的靜態.pdf文件轉移到網頁文章。我的同事@ch402和@shancarter最近也創建了一個叫做distill.pub的平台,以鼓勵研究結果以更現代的基於web的格式發表。我未來會開始使用這一平台。

demo截屏

我只可視化了主LSTM的4個權重矩陣Whi、Whg、Whf、Who的改變(使用4種不同的顏色),雖然理論上Wxi、Wxg、Wxf、Wxo及所有偏重也能可視化。較高的亮度意味著HyperLSTM細胞正對主LSTM的權重做較大的改動。你可以看到,較大的改動通常出現在字元和單詞之間,儘管沒有人顯式地告知網路書寫字元這一概念,更別說單詞了。LSTM和HyperLSTM需要互相配合,自行摸索出這些概念。

本地實現

我通過閱讀開源代碼和教程學到了很多東西,基於TensorFlow實現循環網路,我推薦Denny Britz的博客,以及神秘的r2rt超博客,這篇Recurrent Batch Norm,以及TensorFlow With The Latest Papers Implemented(基於TensorFlow實現最新論文)。

HyperLSTMCell的本地實現基於LeavesBreathe實現的Layer Norm和OlavHN實現的Batch Norm代碼。你也可以嘗試在char-rnn-tensorflow中插入HyperLSTMCell,或在其他有趣的任務中使用它。它可以工作,但目前沒有原始LSTM那麼快,但隨著時間的推移,我預期TensorFlow核心中的許多改進能夠允許更快速的優化實現。

Character PTB驗證集上的TensorBoard結果

HyperLSTMCell

TensorFlow實現:github.com/hardmaru/sup

原文 超網路

感謝原作者hardmaru授權論智編譯,未經授權禁止轉載。詳情見轉載須知

推薦閱讀:

TensorFlow下簡單的卷積網路實現
MobileNet教程(2):用TensorFlow做一個安卓圖像分類App
機器學習:通過深度神經網路再識評估器

TAG:機器學習 | 神經網路 | TensorFlow |