原文連接:Meta Learning單排小教學算法
雖然Meta Learning如今已經很是火了,可是還有不少小夥伴對於Meta Learning不是特別理解。考慮到個人這個AI遊樂場將充斥着Meta Learning的分析解讀及各類原創思考,因此今天Flood就和你們作一個Meta Learning小教學,但願可以用最簡短,最通俗的語言來讓你們明白Meta Learning的概念,Meta Learning的幾種研究方法,以及Meta Learning將來的發展,帶你們上分!相信這個Meta Learning小教學是目前全網惟一的中文教程。網絡
固然要看懂這個小教學,你們至少要對深度學習和加強學習有必定了解。下面咱們就開始吧!架構
要回答這個問題,咱們先來問另外一個問題:app
Deep Learning是在研究什麼?ide
簡單一句話就是Deep Learning研究一個從x到y的映射mapping,只是這個映射函數f是用一個端到端的深度神經網絡來表示:函數
若是是計算機視覺中的圖像識別,那麼x就是圖片,y就是標籤;性能
若是是天然語言處理中的文本翻譯,那麼x就是好比中文,y就是英文;學習
若是是深度加強學習中的玩Atari遊戲,那麼x就是屏幕畫面,y就是輸出的動做。測試
因此,咱們能夠看到,深度學習研究的就是經過深度神經網絡來學習一個針對某一特定任務task的模型。經過大量的樣本進行訓練,訓練完,這個模型就能夠用在特定任務上。this
說完Deep Learning研究什麼,那Meta Learning呢?
Meta Learning的目的是但願學習不少不少的task,而後有了這些學習經驗以後,在面對新的task的時候能夠遊刃有餘,學的快又學的好!
爲何叫Meta呢?Deep Learning是在Task裏面研究,如今Meta Learning是在Task外面,更高層級來研究。也就是在Meta Learning的問題上,Task是做爲樣原本輸入的。這裏咱們將用Few-Shot Learning的問題加以解釋。
但在此以前,咱們要先從人類智能的角度,仿生學的角度說說Meta Learning的意義!
Deep Learning如今的研究,訓練一個模型,都是從0開始,也就是所謂的train from scratch。可是對比一下人,咱們人是從0開始學習嘛?沒有,人就算是剛出生的嬰兒,都已經有一套本能的智能來引導他們去學習,而以後隨着人不斷長大,咱們就慢慢的再也不從0開始學習了,都是基於咱們已有的知識學習,也就是所謂的先驗知識Prior。好比咱們沒有玩過爐石傳說這個遊戲,可是咱們經過咱們的先驗知識知道這是卡牌遊戲,而後咱們理解了遊戲規則,咱們也就能夠上手來玩了。因此,咱們人要玩一個新遊戲是很是快的,而如今Deep Learning,Deep Reinforcement Learning在作什麼?在讓一個嬰兒從0開始學習玩遊戲。這不符合現實,而實際上咱們也發現從0開始學習須要巨量的時間,雖然最後學會了甚至學的比人更好,可是這很不類人,很不智能。
所以,咱們的研究須要轉換一下思路了,咱們爲何要從0開始學習呢?咱們爲何不先學習一個Prior先驗知識呢?若是咱們構建的深度學習系統可以學到先驗知識,而且可以利用這些知識,咱們就能夠在新的問題上學的更快更好!那麼,這個就是Meta Learning要作的事情了,很是有意義,很是符合人工智能的發展路線。更進一步的,若是咱們可以實現lifelong learning終身學習,那麼咱們的人工智能系統就能夠愈來愈智能了。
有了這樣的背景知識,咱們就更好的理解Meta Learning要幹什麼了?咱們不是要學一個具體的模型,咱們要學的是一個先驗知識。這裏我特別喜歡用金庸武俠的武功修煉比喻,若是說Deep Learning是學習具體的外功的話,Meta Learning咱們要學的是內功。
相信你們都看過倚天屠龍記,裏面張無忌自從學習了九陽神功以後,學任何武功什麼太極拳,乾坤大挪移都變得特別快。Meta Learning就是咱們的九陽神功。
那麼從AI的發展角度看,人工智能的發展確定是一個由外向內的過程,簡單的x到y的映射這種其實一點都不知道,想一想人的情感,人的思惟,一句話能夠解毒出無數種可能,怎麼多是簡單的x到y呢? 也所以,Meta Learning是AI研究的必然趨勢。
有了上面的知識基礎,咱們如今就要深刻一點,具體的看一個典型的Meta learning問題,也就是Few-Shot Learning少樣本學習!
這裏我引用了Google Brain的Hugo Larochelle的一張ppt來加以說明。咱們知道通常的圖像識別好比imagenet,就是給你1000個類的訓練集進行訓練,每個類有600張圖片,而後訓練好神經網絡後,咱們要用1000個類裏面新的圖片對這個神經網絡進行測試,看可以識別多好。那麼Few-Shot Learning的要求就是少樣本,咱們但願給你5個類的訓練集進行訓練,每個類只有1張或者幾張圖片,總之很是少,而後訓練好神經網絡以後,咱們要用着5個類裏面的新的圖片進行測試,看識別效果。
那麼咱們直接看這個問題,確定以爲不可能啊,只用幾張圖片怎麼訓練?不得分分鐘過擬合嗎?不要緊,咱們有Meta Learning的設定,這訓練樣本和測試樣本都只是一個task,咱們能夠用不少別的task進行訓練,學習一個Prior,而後咱們但願在新的task上可以學出效果來。
因此就如上圖所示,在Meta Learning上,咱們再也不直接叫train和test了,而是叫Meta-train和Meta-test。在上圖中,每一行都是一個task,包含了task的train set和test set,圖中展現就是所謂的5way 1shot 設定,也就是一個task包含5個類,每個類一個訓練樣本,而後給你2個測試樣本測試。咱們能夠把每個task當作一個meta learning的訓練樣本。咱們要經過多種task的訓練,從而在Meta-test的時候也就是在新的task上取得好效果。
相信經過上面的解釋,你們對於Meta Learning這個問題設定是理解的了。下面咱們就來看看怎麼來學這些task。
咱們仍是根據Few-Shot Learning的問題設定來講明怎麼學。
咱們看到,如今輸入到神經網絡的數據變了,實際上就是多了一個D_train 訓練集,也就是這個task擁有的東西。這個訓練集好比上面說的5way 1shot,也就是5張圖片和5個對應的標籤。咱們但願咱們的神經網絡可以僅根據這幾張圖片獲得一個針對這幾張圖片的神經網絡,從而可以對新的樣本進行識別。因此,這裏就產生一個問題:
怎麼使用D_train來影響咱們的神經網絡呢?
HyperNetwork是一個蠻有名的網絡,簡單說就是用一個網絡來生成另一個網絡的參數。那麼咱們這裏很是直接,咱們的設想就是但願用一個hypernetwork輸入訓練集數據,而後給我輸出個人對應模型也就是上圖f的參數,咱們但願輸出的這個參數可以使得在測試圖片上取得好的識別效果。那麼,有了這樣設計,這個hypernetwork其實就是一個meta network。你們能夠看到,原本基本的作法是用訓練集直接訓練這個模型f,可是如今咱們用這個hypernetwork不訓練了,直接給你輸出參數,這等價於hypernetwork學會了如何學習圖像識別,這也是爲何meta learning也同時叫作learning to learn的緣由。咱們經過hypernetwork學會學習。訓練好了這個模型,連反向傳播梯度降低都不要了,直接給你參數,是否是很酷?
那怎麼訓練這個神經網絡呢?
這裏有個所謂的episodic training!一個episode就是包含了一個task,有訓練集有測試集。咱們使用訓練集輸入到hypernetwork,獲得f的參數,而後使用測試集輸入到f 獲得預測的標籤,最後用測試集的樣本標籤獲得模型的loss,以後就用梯度降低進行訓練。因此咱們能夠看到,整個模型是端到端的。經過大量的episodic training,也就是大量的task進行訓練,咱們就能夠訓練出一個模型出來。
須要稍微說明一下這個task哪裏來呢?咱們採樣出來的。好比咱們給你100個類的訓練樣本,每個類可能有600個圖片,也就是imagenet的規模。可是咱們這裏不是直接batch這些樣本進行訓練,而是隨機採樣出一個task,好比選5個類,每個類1個圖片,而後再每個類選5個圖片做爲task的測試集。這樣採樣是爲了模擬meta-test階段的task構造。
那麼由於meta-train和train和亂,經常會混掉,因此你們約定俗成的把task裏面的訓練集稱爲support set,把task裏面的測試集稱爲query set。而Meta training set和Meta test set分別直接稱爲training set和test set。
使用Hypernetwork在我看來是最直接表現meta learning的一種作法。可是如今實際上咱們好像沒有看到直接用hypernetwork作few shot learning的paper,而都是間接的使用,或者簡單使用一下。具體的優缺點咱們仍是等下再總結。先說第二個方法。
這個作法其實就是上圖啦,咱們直接把D_train當作條件輸入到f中,那麼這個f自己就變成一個meta network了。也就是條件神經網絡實際上可以獲得和上面的hypernetwork同樣的意義。由於咱們能夠想,只要條件D_train變了,那麼y_test確定也就變了。因此這裏就很是很是直接了。把數據所有輸入進去,讓神經網絡本身學就好了,不外乎就是去設計一個合適的網絡結構而已。那麼,這裏最最簡單粗暴的網絡結構就是SNAIL算法使用temporal convolutional network,也就是wavenet的架構:
固然,咱們也能夠巧妙一點的設計,好比個人relation net,不把標籤y做爲輸入:
事實上基於條件神經網絡的作法,效果是最好的。
如今咱們來講MAML,這個能夠單獨算一個不同的作法。
這個思路只能說也太簡單了,就是爲何不用D_train先用通常的監督學習方式更新一下網絡,而後再使用更新參數後的f來使用D_test進行訓練呢?這樣的話,咱們也經過D_train更新了網絡了,只是咱們但願咱們只需用極少的step訓練D_train就能使D_test取得好的效果。
因此,MAML的核心步驟就是
(1)採集Task,獲得D_train和D_test
(2)使用D_train對神經網絡f訓練少數幾步,獲得新的參數
(3)利用新的參數訓練D_test,而後使得梯度降低更新一開始的參數。
這裏最很差理解的可能就是二次梯度了,也就是咱們的目的仍是要訓練一開始的參數,只是中間咱們要先計算梯度獲得新的參數,而後用新的參數再算一次梯度,這樣對於一開始的原始參數就要算兩次梯度。這是MAML比較麻煩的地方,也能夠認爲是一種缺點。固然,如今使用Pytorch能夠分分鐘實現這種二次梯度的操做。
能夠說MAML仍是很是巧妙的,一種不同的方法,固然了已經被Chelsea Finn發揚光大了。
下面咱們來談談三種辦法的優缺點。先說HyperNetwork生成參數的作法。這種作法最大的問題就在於參數空間是很大的,因此要生成合適的參數特別是巨量的參數實際上是比較困難的,因此目前絕大多數生成參數的作法都是隻生成少許參數,好比一層的MLP,或者對於參數的空間進行必定的限制,好比就在[-1,1]之間,不然空間太多,有無數種選擇輸出同樣的結果,就很難訓了。可是採樣HyperNetwork又有其靈活性,意味着咱們能夠只更新少部分參數,而不用所有。
接下來就是條件神經網絡了。這又有什麼問題呢?我以爲在性能上絕對會是最好的,很直接,可是很差看,一直要拖着一個條件,網絡很大。無論是生成參數仍是MAML,他們的模型網絡就是獨立的,以後只要輸入x就好了,而條件神經網絡每次都要輸入條件,很煩啊。
那麼MAML呢?可能最煩人的就是二次梯度了,這意味着MAML的訓練會很慢,那麼就很難hold住大網絡了。實際上MAML目前對於大的網絡結構好比Resnet效果並很差。而後MAML是使用D_train的Loss來更新整個網絡,對比HyperNetwork缺乏靈活性。這個Loss就是最好的嗎?不見得。若是D_train是無監督數據,那怎麼辦?因此MAML是有侷限性的。
目前各類各樣的Meta Learning研究,在方法論上都逃不出這三種方法。要麼改改網絡結構,要麼結合一下上面的方法,好比先MAML再生成參數,或者hypernetwork和conditional neural network混着用等等。那麼什麼纔是終極必殺呢?可能仍是要具體問題具體看吧,對於不一樣的問題採用不一樣辦法效果會不同。這些都值得咱們去探索。
講完了前面的方法論,相信你們對於Meta Learning已經有所瞭解了。可是你們確定會疑問,難道Meta Learning只是在作Few-Shot Learning這種有點boring的任務嗎?
固然不是。
首先咱們能夠改爲加強學習的task,對於加強學習的task,這裏的D_train就是歷史信息了:
所謂的歷史信息也就是以前的transitions(state,action,reward,next_state)。把歷史信息輸入進去,原來的reinforcement learning就分分鐘變成meta reinforcement learning啦。
那麼,Meta Learning也僅僅止步於此嗎?
也固然不是!
擴寬思惟極限的時候到了!
誰說D_train和D_test要同樣呢!!!
這纔是Meta Learning最最重要的思想!一個task裏面的訓練集和測試集能夠徹底不同。只要經過D_test的loss signal可以傳遞到D_train中,整個網絡就能夠端到端的訓練。
好比D_train能夠是徹底的無監督數據(沒有標籤),那麼咱們一樣能夠構造一個hypernetwork來更新咱們的模型,而後用D_test有標籤的數據來訓練。這樣訓練完以後,咱們就獲得了一個可以無監督學習的hypernetwork了。
實際上D_train和D_test的差別性能夠進一步變大,訓練能夠是加強學習,測試能夠是模仿學習,訓練能夠是語音,測試能夠是圖像,等等,會不會頗有趣呢?
最後,咱們能夠舉一個更形象一點的idea:好比有一個虛擬世界,裏面能夠生成虛擬人在裏面生活,咱們的train過程就是讓這個虛擬人在裏面愛幹啥幹啥,能夠玩好比1年的遊戲時間,而後咱們的test過程要求這個虛擬人經過200的智商測試。那麼經過巨量的虛擬meta training以後,咱們就能獲得一個這樣的人工智能系統,這個虛擬人懂得本身去學習了,而咱們還徹底不知道他怎麼學的。
So, this is
Meta
Learning!
The Future of AGI!