back to index
Meta Learning – MAML (9/9)

link |
好,那接下來就講第二個方法,就是Reptile。
link |
Reptile非常簡單,它比NAML更簡單,它有多簡單呢?
link |
Reptile的想法是這樣,這是你的初始參數的初始參數,也就是Finding。
link |
好,那我們現在先Sample一個Task,DM的Task,然後用Finding來訓練DM的Task。
link |
Reptile沒有限制說你只能夠Update一次參數,你可以Update很多次參數,好,你Update很多次參數。
link |
好,最後找出了Selahat。好,接下來呢,你就看Finding跟Selahat中間的差距。
link |
有Finding要挪動到Selahat的時候要走哪一個方向?就往那個方向走過去,就是Find1。
link |
好,你得到Find1以後,你再Sample一個Task出來,現在Sample是Task1,然後再把Find1當作初始參數,去Train一下Task1,訓練一下,訓練一下,訓練一下。
link |
哦,得到Selahat。好,接下來再看Find1跟Selahat之間的差距,看Find1要怎麼走到Selahat,走這個方向就可以走到Selahat,所以就往這個方向走,得到Find2。
link |
這個就是Reptile,感覺非常的簡單。
link |
那講到這邊,你可能會想說這個跟Model-Put-Training好像也蠻像的啊,因為Model-Put-Training就是要找一個可以讓每一個Task都最好的的初始化參數嘛。
link |
他沒有考慮到訓練以後會不會好,他就是要讓每一個Task都最好。
link |
那Reptile做的事情好像也跟Model-Put-Training蠻像的,那Reptile作者自己也知道這件事,所以他在他Paper裡面加了這句話,他說,"You might be thinking, isn't this the same as training on the expected loss?"
link |
這一句話的意思就是說,這不是跟Put-Training一樣嗎?
link |
他這樣加了一句還蠻有趣的話,他說,"And then checking if the date is April 1st." 他Paper裡面真的有寫這句,但是有趣的就是說,他第一個放到Archive的版本有這句,但後來的版本就把這句拿掉了。
link |
到底為什麼呢?我在想說,會不會是因為第一個放Archive的版本是在三月的時候放上去的,可能是接近三月底的時候放上去的。
link |
他希望你看到那篇文章後知道是四月一號,讀到這句話都會覺得非常的應景。
link |
那到底Reptile跟Put-Training還有M&M有什麼不同呢?我們就用這個圖來展示他們的不同。
link |
這個是你的初始化參數Find,那現在假設這個初始化參數在某一個Task上面訓練的情形是這樣,第一次Update的時候走的是G1,第二次Update的時候走的是G2。
link |
那如果是Put-Training的話,你的參數Update的方向就是G1,如果是M&M流的話,就是有做First Order Approximation的那個M&M流,就是簡化過的M&M流的話,他走的方向就是G2。
link |
如果是Reptile的話,他走的方向就是G1加G2。所以Reptile有點像是把Put-Training跟M&M流綜合起來,但是Reptile並沒有限制說你只能夠走兩步。
link |
所以如果你走更多步的話,也許可以考慮到原來Put-Training跟M&M流都沒有辦法考慮到的東西。
link |
以下是Reptile在Oniqua上面的實驗結果,眾籌的值越高當然就代表說結果越好。其實從這個圖上我們有點難看出M&M流跟Reptile的差別,但是我們可以很明顯的看到藍色這條線特別慘。
link |
藍色這條線是什麼?藍色這條線就是用G1去Update參數,也就是Model Put-Training。比方說Put-Training跟M&M流比起來,它的Performance確實是有一段差距的。
link |
好,剛才我們講M&M流或Reptile,它們都只幫我們找出了Network初始的參數。那能不能找更多呢?其實是可以的,有一整個系列的方法試著去找,比如說Network架構,或者是找Network Excavation Function。
link |
就是你任意一個Function,任意一個Network,這個Network會輸出另外一個Network的Architecture,或者是另外一個Network的Excavation,或者是有人可以輸出如何Update參數的規則,怎麼調整Learning Rate的規則,比如說可以自動輸出Addon之類的。
link |
像這些,如果你是用Network來生Network,那顯然沒有辦法微分嘛,所以這個時候你就必須要用RL或者是基因演算法來Train那個生Network的Network。
link |
相關的東西,其實我在過去的課堂上有講過了,我就把錄影留在這邊給大家參考。一些新的,我們之前沒有講過的東西,我就下週上課的時候我們再另外講。
link |
那這個Made R-Learning的方法,我覺得都有一個本質上的問題,就是舉例來說,NANL幫我們訓練了初始化的參數,但它本身也需要初始化的參數,所以我們會需要找一個初始化的參數的初始化參數。
link |
這就感覺好像是,有人問說世界從哪裡來,那印度的神話就說,世界是在烏龜的背上,那烏龜在什麼東西的背上呢?在更大的烏龜的背上。
link |
更大的烏龜在什麼東西的背上?在更大的烏龜的背上,就窮窮不幸,永遠沒有止境。
link |
所以變成我們從learning變到learn to learn,那未來我們又要learn to learn to learn,那其實最後就有一個crazy的想法,我們剛才講的NANL那些方法,它們的演算法基本上都還是Gradient Descent,你能不能做比Gradient Descent更厲害的做法呢?
link |
你能不能夠說,我的learning algorithm就是一個network,我也不管它做的是不是Gradient Descent不重要,我就是把一堆訓練資料丟到network裡面,它凹不出來就直接給我我們現在要訓練的model的參數。
link |
那是不是Gradient Descent訓練出來不重要,我design了一個network的架構,那network的架構我怎麼design就決定了我的演算法長什麼樣子,甚至還可以做更瘋狂的。
link |
那反正你這個setup,之後你也是要拿它來測試一下你的測試資料,看看結果怎麼樣。
link |
我們能不能夠認一個更大的function,它把訓練和測試這兩件事情都包在裡面,這個function就是吃訓練資料跟測試資料,然後直接output測試資料的結果。
link |
你連你的model訓練出來長什麼樣子通通都不知道,因為連測試都順便幫你做好了,有沒有可能做到這樣的事情?
link |
這個我們就留待下周講,今天上課就上到這邊,我們就休息幾分鐘,助教來換場一下。