# Few shot learning for Small Data ML ###### tags: `Small Data` `FSL` `Overview` ## 何謂小資料?為何要小資料AI? 從2005 年Roger Mougalas首次提出Big data這個詞彙之後,相關的題目一直都很夯。Big data是指企業為了自動化做機器學習所需要的大量資料。 其中包含了5個V:資料量(Volume)大、資料種類(Vriety)多、資料生產速度(Velocity)快、資料可信度(Veracity)要高、產生的價值(Value)要能回本。在這個5V增長之下,雖然每筆資料花費變少了,但收集、訓練資料的總花費節節攀升。 因此在近年小公司訓練資料量不足、訓練資料不夠多元、資料標註不足的情況下,小資料的機器學習開始興起。其中有很多key words,包含Small data、few shot learning、meta learning等等,都是解決小資料問題的一些技術方向。 ![](https://i.imgur.com/wWA1lvW.png) 先來看看small data有什麼應用場景。第一是使用少量資料學習更接近人類學習的方式、第二是用在改善稀有資料的建模、第三是節省收集資料、標註的人力成本。 1. **更接近人類學習的方式** 對人類而言,只需要幾個例子便能學習。例如雖然沒看學過梵文,但是能夠在一串不同文字中,辨識相似的梵文。而能夠辨識,是因為之前學過其他的文字,由經驗而來。在有了其他文字學習的經驗後就能因為學習到精隨而舉一反三,或者可以將資訊拆解。因為人類這種學習方式的有效性,學習人類學習的方式便成了小資料AI的一個目標 ![](https://i.imgur.com/0x1eW0l.png) 2. **改善稀有資料的建模** 再來,有些資料是真的稀有。例如稀有動物、罕見疾病的資料。或者是新種類的資料,像是新種病毒、新上市產品等,這種資料還很少但是模型應用有時效性。再者,有些情景是不適合重複的,像是意外發生、或者個人疾病預測這種。這些都可能使能夠建模的資料很少。 3. **降低人力成本** 最後,隨著機器學習目標越來越複雜,這個資料收集和標記所需要的人力成本越來越高。例如在圖像相關任務中,一開始分類問題只需要標註分類;若有要求學習分辨位置還要標註範圍;到了物件偵測則需要標註不同物件分類和範圍;到了實例切割問題則需要一個一個像素標註所屬分類。那要是圖一萬張怎麼辦? 能不能只標註一部分呢?這時候就需要專門對應小資料的AI技術。 ![](https://i.imgur.com/swjf8cs.png) ## Few shot learning長什麼樣子? 首先預習下機器學習。機器學習的任務是希望給予機器資料,機器能從中擷取特徵,並且給出預測。 像是語音辨識任務中,輸入音訊,經過機器判定後,能給出文字;或者在圖像分類中,輸入圖片,經過機器判定後,能給出類別。 ![](https://i.imgur.com/T1c21pw.png) (圖源:李弘毅老師講義https://www.slideshare.net/tw_dsconf/ss-62245351) 機器學習的訓練就是給予機器訓練資料,讓它對資料以特定算法(模型)做特徵擷取,得到預測值。這個預測值與標準答案相比後,根據誤差更新模型。 當資料太少的時候會使,模型和資料真正特性不符。第一是under fitting,模型太簡單,但資料分布太複雜,很多資料都會被錯估。第二是over fitting,模型太複雜,而只能適用於訓練資料,用於其他資料時會容易錯估。 所以small data要解決的核心問題就是在資料少時也能好好擬合資料。 ![](https://i.imgur.com/9VD06a4.png) 在資料少時怎麼才能學得好呢? 對人類學習而言,最基礎的就是善用手上資料,同樣的資料可能有不同的用處,一兼二顧,例如文件夾也可以拿來當手機架。對應到機器學習上就是將手上資料做擴增以模擬資料的變化。 ![](https://i.imgur.com/DpCOEjf.png) 再來是轉換思考方向,用其他的角度學習同一件事情,或許可以降低難度,例如要拿磅秤秤大象很難,但是如果用船在承載後的吃水深度找出跟大象等重石頭,就能透過秤這些石頭估出大象的重量。對應到機器學習上就是改便建模目標,選擇比較簡單的目標可能可以使資料需求量變少。 ![](https://i.imgur.com/tvk4Mu6.png) 最後一種就是要能學到核心,學到核心就能舉一反三,在更多的場景使用同樣的核心知識加快學習進程。像是在學習歐系語言過程中,領悟到抓取字根字首字尾,這樣學習更多歐系語言就會變得更加容易。對應到機器學習上就是要學習如何學習,像是學習如何初始化模型、如何更新模型,稱為元學習(Meta learning)。 ![](https://i.imgur.com/LN7aJhh.png) 這些增強學習效果的共通特色是需要利用先前的知識(prior knowledge)。 第一是先前的資料(prior data),用於比較或者組合出新資料 例如,如果今天要學習韓文,而我先前已經學了中文、日文、英文,那樣我只要拿韓文分別跟三種語言做比較,會發現他比較接近中文和日文、跟英文比較遠。 ![](https://i.imgur.com/HNRlihi.png) 第二是先前的模型(prior model),可以直接用到其他任務中共通的部分,或者透過多種任務的學習,學習到任務共通的核心特徵。 例如已經學會騎腳踏車,那樣騎摩托車時至少雙輪平衡跟側身轉彎就不需要學,只需要學習配合適應按油門驅動就好。 ![](https://i.imgur.com/Ui9vHYl.png) 簡而言之FSL模型的目標就是利用source datasets/tasks快速學習、適用於未見過的新task (target dataset/task)。 ![](https://i.imgur.com/slDQLq2.png) 至於多快適應多大的任務,在FSL classification有個術語叫n-way-k-shot。Way是分類的類別數,代表任務的複雜度;而shot是每個類別只提供多少學習用的例子,代表要求的學習速度。 ![](https://i.imgur.com/bagd7lW.png) 在Google meta dataset的論文有對數種FSL方案做不同way和shot數的實驗。 結果顯示,ways越多,FSL準確度越低;shots越多FSL分類鑑別度越高。 ![](https://i.imgur.com/GIZc3Yw.png) ## 擴增訓練資料 擴增訓練資料主要有兩種方式,一種是用固定規則擴增資料,另一種是訓練模型對資料做轉換產生新資料。 用固定的規則比較簡單,就是對圖像做不同角度、大小的翻轉、拉伸、縮放等等,而針對物建辨識,近年也有人將物件先建成3D模型在對它做轉換、散布。 ![](https://i.imgur.com/tXxuF8p.png) 第二種是訓練模型做新資料,例如Generative Adversarial Netwrok(GAN)。簡單的作法就是利用一個generatro模型生成資料,再用另個discriminator模型判斷它是不是真的資料,輪流訓練genenrator和discriminator,最終使generator生成更真實的資料。 ![](https://i.imgur.com/QYVmnTu.png) 另外還有人利用舊有類別的資料生成新的資料。例如原本有非常多老虎、狗、豹的資料,而現在我想擴增少量的貓的資料。這樣就可以先依相似度訓練老虎到貓(t1)、狗到貓(t2)、豹到貓(t3)的轉換模型,然後接著再拿轉換模型轉換更多資料,像是拿老虎另外不像的照片轉出新的貓(cat4)。 ![](https://i.imgur.com/TmXZNLE.png) ## 改變建模目標 接著還有另個方案是去改變建模目標。第一種是把分類變成學習如何比較,可以簡化訓練目標;第二種是多工學習,善用TASK之間共通性增加模型的適用範圍;第三種是建構式學習,把學習拆成好幾部分,只要學習怎麼整合各個部份的結果。 學習如何比較的方案最有名的是Siamese Network,Google 的Face Net就是用這個架構。會訓練轉換方程將資料兩筆轉換到高維特徵空間上,再用距離函式去取兩筆資料距離,決定這兩筆資料是否屬於同個類別。 ![](https://i.imgur.com/Fm8r2Z2.png) 在這個高維空間中,同種類的距離較短、不同種類距離較長。這種network只需要學習比較意思就是可以適用於完全沒看過的task,甚至可以達到zero-shot learning的效果。 ![](https://i.imgur.com/i1qOaMv.png) 常見於人臉辨識,例如這邊利用兩兩比較的資料集,就可以訓練判斷右邊照片是本人還是假冒者,沒見過的照片也可以辨識。 ![](https://i.imgur.com/k9NeC31.png) 第二是多工學習,算transfer learning的一種。在舊的任務和新的任務中某些層可以共用,而在多個舊有任務中,我共同訓練部分層,在新的任務中我將共同訓練層凍結,只訓練任務相關的層。像是下圖我在source先用動物辨識1和動物辨識2訓練shared層。這個層也接到target task,而在狗種辨識的task中只訓練task-specific層。 ![](https://i.imgur.com/Q4vq6QY.png) 最後是建構式學習,範例的method是decomposable component learning。先將source dataset每個圖不同部件拆出來,分成不同class訓練。例如這個代步機,把手柄、支架、輪胎拆開,分成三個class。若我訓練出辨識手柄、支架、輪胎的model,再加上一個這三者如何組合的model,我就可以訓練代步機的辨識。而有了三個component的model以後看到新的東西像是機車、汽車之類的,我就只需要訓練如何組合的model就好。 ![](https://i.imgur.com/jRe1OGa.png) ## 學習如何學習 在FSL中目前最新潮的方案是學習如何學習。例如學習如何初始化模型、還有學習如何更新模型參數。 先複習一下深度學習模型中的梯度下降法: 假設我們希望學習$y=\phi(x)$,意思是input x在經過深度學習的模型$\phi$後能預估出應有的判決y。 1. 首先初始化$\phi$為$\phi_0$ 2. 對每組資料(第i組): a. 放入$x_1$,得到預估$\phi_{i-1}(x_i)$。 b. 計算最佳化模型(最小化$\phi_{i-1}(x_i)$。與$y_i$之誤差)所需要模型改變量(gradient) $g_i$,並對這個變量做scaling變成$gd_i=\lambda g_i$($\lambda$是學習率,控制學習速度跟精度) c. 更新參數$\phi_i=\phi_{i-1}+gd_i$ (此處式子簡化很多) 3. 對下一組資料重複2.直到沒有資料 4. 對2.~3.重複數次 ![](https://i.imgur.com/NcFceoO.png) 對於一個任務而言有最佳$\phi$,但這組$\phi$並不適用於其他任務。 Optimization based meta learning解決這個問題。其中最有名的流派是Model-agnostic-meta-learning(MAML),但這個開山始祖比較複雜我們講它的變形叫做Reptile做為範例。 這個流派想做的事情是這樣:既然每個任務有不同的最佳模型,那樣我讓模型想辦法學習初始化,讓初始值離每個任務需要的$\phi$最接近就可以縮短每個任務的訓練時間。 ![](https://i.imgur.com/7xhwNRF.png) Reptile是其中一種變形。 1. 首先針對task1,做完訓練,得到$\phi_{12}$,接者計算更新向量($\phi_{12}-\phi_0$),乘上learning rate $\lambda_{meta}$得到第一次meta更新後的值$\phi_{R1}$。 2. 再來針對task2,從$\phi_{R1}$開始訓練,訓練完得到$\phi_{22}$接者計算更新向量乘上$\lambda_{meta}$得到第二次meta更新後的值$\phi_{R2}$。 3. 針對更多task反覆重複以上過程 ![](https://i.imgur.com/Yc8K0kH.png) 再來除了學習初始化外,還有學習如何gradient descent。Meta-SGD,利用recurrent network,取代原本的更新$\phi$的固定程式。簡單講就是原本是使用固定的learning rate$\lambda$更新,現在這個每次會是用一個function f來更新,而這個funciton f是可以訓練的。 ![](https://i.imgur.com/Xtg1Pwb.png) 更進階,有一篇叫做"Learning to Learn by Gradient Descent by Gradient Descent"。也就是希望剛剛 update function本身的學習,也可以被訓練。這邊就不多做贅述,有興趣可以去看原文。 ![](https://i.imgur.com/qY7cBRl.png) 以上就是大致上,目前FSL的幾個重要方向。 ## 小資料AI相關資源 第一個是dataset,除了做Visual AI常見的ImageNet之外,為了讓模型可以適應更多的任務,google做了一個meta-dataset。其中混了10個主流的dataset,中間包含imagenet(ILSVRC)、飛行器資料集、鳥類資料集、紋理資料集、菇類資料集、花的資料集、德國交通號誌資料集還有MSCOCO,做圖像分割和物件偵測的資料集。另外複雜度比較低的有Omniglot世界手寫文字資料集還有Quick draw手繪資料集。這些資料集的並用可以提升模型適應跨領域能力,通常訓練會從任一個資料集中所有類別中挑出N個為一組來訓練,每次給K個範例。這個meta dataset也可以做為小資料AI、Meta learning方案之比較標準。 ![](https://i.imgur.com/ONRfhQS.png) 因為小資料AI常常要改動到dataset,需要特製的data loader,而且有些方案需要改動到訓練過程,所以會改到backend training process。為此一些組織有為Small data/Meta learning做工具包。 1. Pytorch出了learn2learn toolbox,使用pytorch backend,其中提供pre-train model、dataset、meta learning演算法(如MAML)、Meta-optimizer、task切分工具還有其他utilities。 2. Facebook出了higher toolbox,使用pytorch backend,提供Meta-optimizer、task切分工具還有其他utilities,不過不支援平行運算。 3. Amazone出了Xfer toolbox,使用MxNet backend,蒐羅2019~2020 meta learning paper的implementation,有methods和相關utilities。 除此之外 Open AI的 GPT系列也有few shot 功能,目前GPT3做為服務可提供免費申請,有提供dataset和API。 ![](https://i.imgur.com/FB9lnm7.png) 最後分享幾個範例。如果想體驗一下meta learning 可以到open AI的網站看他們Reptile 辨識手繪圖的範例遊戲:https://openai.com/blog/reptile/ 任意畫三個不同類別的圖做source,可以再畫其中一種圖,直接可辨認是哪個類別。 另外附上learn2laern工具包範例,使用MAML辨識Omiglet手寫文字。 https://colab.research.google.com/drive/1_Nwszeyr5CPFm-tlOz1MH4n8-swTHFmd?usp=sharing ###### tags: `Small Data`