Deepmind連續學習(序列學習)三連彈

名字就是隨便取的。。。

最近deepmind有兩篇關於連續學習的論文放出來,所以我就連帶著去年的一篇一道寫一點。這篇會比較簡短,因為只是一點簡單的整理。

三篇論文分別是:Progressive Neural Networks(arxiv.org/pdf/1606.0467), PathNet: Evolution Channels Gradient Descent in Super Neural Networks(arxiv.org/pdf/1701.0873) 和 Overcoming catastrophic forgetting in neural networks(後面我就簡寫EWC了)(pnas.org/content/early/).

其中Progressive NN已經快一年了,去年RSS workshop上好像就有present,然後最後是在nips發表的。雖然舊,但是可以說是是之後兩篇的先鋒,提到後面兩篇不得不提到這篇。而後面兩篇比較新,都是最近一個月放出來的。當然啦,EWC是發在pnas上,應該有審稿周期,所以會比較舊一點我猜。反正後面兩篇idea有點類似。

研究的問題

這三篇主要研究的是什麼問題呢?比方講打遊戲,如果你玩COD或者CS很好,那麼你玩屁股先鋒應該也不錯,至少學習周期會很快,因為他們都是FPS遊戲。所以人有能夠將一個任務的知識用到另一個任務上的能力,同時也不會忘記如何做第一個任務。這個它們叫連續學習,或者序列學習,就是有順序的學習任務。主要考慮兩個問題,1是如何能把之前的經驗用上,2就是不能忘記之前學習的任務。

Progressive NN

Progressive NN是第一篇我看到的deepmind做這個問題的。思路就是說我不能忘記第一個任務的網路,同時又能使用第一個任務的網路來做第二個任務。

為了不忘記之前的任務,他們的方法簡單暴力:對所有的之前任務的網路,保留並且fix,每次有一個新任務就新建一個網路(一列)。

而為了能使用過去的經驗,他們同樣也會將這個任務的輸入輸入進所有之前的網路,並且將之前網路的每一層的輸出,與當前任務的網路每一層的輸出一起輸入下一層。

有圖為證。

每次有一個新的任務,就重新添加一列,然後將前幾列的輸出fuse到當前列來。

比如說,如果兩個任務的low level特徵類似,則當前任務網路中的前幾層可能完全沒有用處,只需要用之前任務的輸出就夠了。

但是一個很明顯的問題是,這個網路不能學到自己的low level feature的網路,然後使用之前網路的high level決策。因為1,當low level不一樣的時候,將輸入輸入之前的網路就不make sense了;更重要的是,當前列的輸入根本無法輸入進之前列的網路,只復用高層網路根本無從談起。

所以這裡的限制就是,兩個任務需要有類似的low level feature。當然啦,這篇文章還是有很酷的視頻,也確實用到了一些任務上。

PathNet

Pathnet可以說是progressive nn的進階版,是progressive nn的generalization。

你可以把網路中每一層都看作一個模塊(綠色方塊),然後把構建一個網路看成搭積木。pathnet的想法就是復用積木。

一開始我們每一層都有N個候選模塊,對每一個potential的網路,每一層可以使用k個模塊。然後我們隨機若干個網路(也就是path,如何連接這些模塊),然後訓練若干episodes。訓練了之後,我們用遺傳演算法,把不好的path都淘汰,留下好的path,然後對這些path進行變異,然後繼續訓練。最後我們就能獲得一個很好的path。(上圖,從圖1到圖4)

注意,這個演算法本身就是可以是一個獨立的演算法,用來訓練一個任務。

而這個演算法如何拓展到連續學習呢。在訓練完第一個任務之後,我們將所有第一個任務path上的模塊的參數都固定,然後將所有其他的模塊重新初始化,然後像之前一樣的訓練。唯一的區別就是有些模塊已經固定死了。(上圖,圖5到圖9)

仔細一看,其實這跟progressive network非常類似,只是這裡不再有列,而是不同的path。在pathnet的設定下,就不存在我之前所說無法訪問高層的問題了。對一個新的任務,我們可以使用新的底層,然後用之前任務的高層。

EWC

EWC其實也是類似的想法。對之前任務學到的參數,我們應該進行保留;區別在於,ewc (elastic weight consolidation)用的是彈性的保留。

很重要的一點是,這裡和pathnet和progressive nnn不一樣;EWC是使用一個網路來做不同的任務(而不是多個column或多個path)

我們看著這張圖一步步來,首先最腦殘的連續學習的方法就是,我們先訓練了一個task1的網路,然後直接在task2上finetune(上圖藍色)。但是這樣的問題就是,你學到了第二個任務之後,就就會基本忘記怎麼做第一個任務了。

然後你就想,那怎麼辦呢,那我就設個限制吧,在第二個任務上更新網路的時候,不能離第一個網路的參數太遠,也就是相對於之前的網路參數上加了l2 regularizaiton。(上圖綠色)

但是這樣還不夠好,然後就想到了。其實網路中有些參數是沒有用的,有些參數是有用的,那我讓那些重要的參數不要變太多,就更新哪些不重要的參數就行了嘛(上圖紅色)。然後這就是這篇文章的演算法。你可以認為,就是對之前任務重要的參數,learning rate特別低,而那些不重要的,learning rate就相對高。而這個重要程度,則是使用fisher information(二階導?)。

他們做了analysis,用fisher information precision很好,但是有recall,因為他們只用了fisher information matrix的對角線,而沒有考慮二元關係。


推薦閱讀:

如何獲得Bengio的《Deep Learning》的pdf版?
Deepmind的Alpha Zero是如何把各種棋類規則融入神經網路的?
神經網路的損失函數為什麼是非凸的?
萬元深度學習電腦如何配置?
AlphaGo 演算法的通用性到底有多廣?

TAG:GoogleDeepMind | 遗传算法 | 深度学习DeepLearning |