核心思想
本文是在MAML的思路上進一步改進,提出一種基於參數優化的小樣本學習算法Reptile。首先我們一起回憶一下MAML是如何進行元學習的,在之前的文章中,我們有提到MAML的訓練可以分爲兩個層次:內層優化和外層優化,內層優化就與普通的訓練一樣,假設網絡初始參數爲,在數據集上採用SGD的方式進行訓練後得到參數。如果是普通的訓練,那麼就會接着採樣一個數據集,然後以作爲初始參數繼續訓練了。MAML同樣採集一個數據集,然後用在數據集上訓練得到的模型處理數據集上的樣本,並計算損失。不同的是,MAML利用該損失計算得到的梯度對進行更新。 也就是說MAML的目標是訓練得到一個好的初始化參數,使其能夠在處理其他任務時很快的收斂到一個較好的結果。在梯度計算過程中會涉及到二階導數計算,MAML利用一階導數近似方法(FOMAML)進行處理,發現結果相差並不大,但計算量會減少很多。回到本文,本文提出的算法就是在FOMAML,進一步簡化參數更新的方式,甚至連損失梯度都不需要計算了,直接利用(這裏的符號使用的與原文不同,但表達含義相同)作爲梯度對參數進行更新,即 可能有人會覺得這樣做,不是相當於退化成普通的訓練過程了嗎,因爲還是利用SGD方式得到的,然後讓沿着的方向更新,就得到。如果說在訓練數據集中只有一個訓練樣本,或者說只經過一個batch的訓練,那麼本文的算法的確會退化爲普通的SGD訓練,但如果每個數據集都進行不止一個Batch的訓練,二者就不相同了。
如上圖所示,本文在更新參數時,會在數據集上做多個Batch的計算得到最終的參數(也就是圖中的),然後再回到處,計算,並更新參數得到。而普通的SGD就不會回到處了,而是繼續以作爲初始值進行更新了。MAML,本文提出的算法(Reptile)和普通的SGD(Pre-train)方法的比較如下圖所示
假設訓練集中包含兩個Batch,則對於Pre-train模型會沿着方向更新,MAML會沿着的方向更新,Reptile則會沿着的方向更新,看起來像是傳統方法和MAML結合的產物。作者還從數學的角度上,證明了Reptile與FOMAML在本質上是相同的,但是Reptile的計算效率和內存佔用明顯要優於FOMAML,原諒我才疏學淺,並沒有看懂證明過程,有興趣的讀者請閱讀原文。
創新點
- 本文在MAML的基礎上提出一種更爲簡單的進行參數初始化的元學習算法,並從數學上證明了其與一階近似MAML的等價性
算法評價
本文是一篇充滿學術氣息的文章,包含大量的數學證明,但其提出的算法卻是非常簡單的——直接用向量差作爲梯度,而且通過數學和實驗兩種方式證明了,本文提出的算法Reptile性能與MAML非常接近。但是作者同樣也發現,本文的算法雖然在分類任務中取得了較好的結果,但是在強化學習中,卻沒有MAML表現的那樣好,這也是一個值得探究的方向。這裏推薦臺灣大學李宏毅教授的講解視頻,他生動形象地介紹了MAML和Reptile算法,給了我很大的幫助和啓迪,B站視頻鏈接。
如果大家對於深度學習與計算機視覺領域感興趣,希望獲得更多的知識分享與最新的論文解讀,歡迎關注我的個人公衆號“深視”。