Meta Learning單排小教學
大家好!歡迎來到FloodSung的AI遊樂場!
雖然Meta Learning現在已經非常火了,但是還有很多小夥伴對於Meta Learning不是特別理解。考慮到我的這個AI遊樂場將充斥著Meta Learning的分析解讀及各種原創思考,所以今天Flood就和大家做一個Meta Learning小教學,希望能夠用最簡短,最通俗的語言來讓大家明白Meta Learning的概念,Meta Learning的幾種研究方法,以及Meta Learning未來的發展,帶大家上分!相信這個Meta Learning小教學是目前全網唯一的中文教程。
當然要看懂這個小教學,大家至少要對深度學習和增強學習有一定了解。下面我們就開始吧!
1.Meta Learning到底研究什麼?
要回答這個問題,我們先來問另一個問題:
Deep Learning是在研究什麼?
簡單一句話就是Deep Learning研究一個從x到y的對映mapping,只是這個對映函式f是用一個端到端的深度神經網路來表示:

如果是計算機視覺中的影象識別,那麼x就是圖片,y就是標籤;
如果是自然語言處理中的文字翻譯,那麼x就是比如中文,y就是英文;
如果是深度增強學習中的玩Atari遊戲,那麼x就是螢幕畫面,y就是輸出的動作。
所以,我們可以看到,深度學習研究的就是通過深度神經網路來學習一個針對某一特定任務task的模型。通過大量的樣本進行訓練,訓練完,這個模型就可以用在特定任務上。
說完Deep Learning研究什麼,那Meta Learning呢?
Meta Learning研究Task!
Meta Learning的目的是希望學習很多很多的task,然後有了這些學習經驗之後,在面對新的task的時候可以遊刃有餘,學的快又學的好!
為什麼叫Meta呢?Deep Learning是在Task裡面研究,現在Meta Learning是在Task外面,更高層級來研究。也就是在Meta Learning的問題上,Task是作為樣本來輸入的。這裡我們將用Few-Shot Learning的問題加以解釋。

但在此之前,我們要先從人類智慧的角度,仿生學的角度說說Meta Learning的意義!
2. 為什麼研究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研究的必然趨勢。
3. Few-Shot Learning,一個引子
有了上面的知識基礎,我們現在就要深入一點,具體的看一個典型的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。
4.Meta Learning的三種解決辦法
我們還是根據Few-Shot Learning的問題設定來說明怎麼學。

我們看到,現在輸入到神經網路的資料變了,實際上就是多了一個D_train 訓練集,也就是這個task擁有的東西。這個訓練集比如上面說的5way 1shot,也就是5張圖片和5個對應的標籤。我們希望我們的神經網路能夠僅根據這幾張圖片得到一個針對這幾張圖片的神經網路,從而能夠對新的樣本進行識別。所以,這裡就產生一個問題:
怎麼使用D_train來影響我們的神經網路呢?
1)HyperNetwork 生成引數

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,而都是間接的使用,或者簡單使用一下。具體的優缺點我們還是等下再總結。先說第二個方法。
2)Conditional Neural Network 條件神經網路

這個做法其實就是上圖啦,我們直接把D_train當做條件輸入到f中,那麼這個f本身就變成一個meta network了。也就是條件神經網路實際上能夠得到和上面的hypernetwork一樣的意義。因為我們可以想,只要條件D_train變了,那麼y_test肯定也就變了。所以這裡就非常非常直接了。把資料全部輸入進去,讓神經網路自己學就行了,不外乎就是去設計一個合適的網路結構而已。那麼,這裡最最簡單粗暴的網路結構就是SNAIL演算法使用temporal convolutional network,也就是wavenet的架構:

當然,我們也可以巧妙一點的設計,比如我的relation net,不把標籤y作為輸入:

事實上基於條件神經網路的做法,效果是最好的。
3)MAML 基於梯度的做法
現在我們來說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發揚光大了。
5. 三種解決辦法有什麼優缺點呢?
下面我們來談談三種辦法的優缺點。先說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混著用等等。那麼什麼才是終極必殺呢?可能還是要具體問題具體看吧,對於不同的問題採用不同辦法效果會不一樣。這些都值得我們去探索。
6. Meta Learning的潛在威力!
講完了前面的方法論,相信大家對於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!
最後,歡迎大家關注本人公眾號:FloodSung的AI遊樂場,可以掃描頂部圖片的二維碼,本人所有文章都將先於公眾號釋出!謝謝!