編者按:子曰:“舉一隅不以三隅反,則不復也”。
人類從少量樣本中去思考,還能用這個做什麼;而機器則是見到了上億的資料,卻希望下一個與之前的相似。
在機器學習領域中,隨著更多應用場景的湧現,我們越來越面臨著樣本數量不足的問題。因此,如何通過舉一反三的方式進行小樣本學習,成為了一個重要的研究方向。
本文中,復旦大學的付彥偉教授,將介紹過去一年中小樣本學習領域的研究進展。
文末,大講堂提供文中提到參考文獻的下載連結。


本次報告主要回顧one-shot learning,也可以稱為few-shot learning或low-shot learning領域最近的進展。


首先,one-shot learning產生的動機大家都比較瞭解。現在在網際網路,我們主要用large-scale方法處理資料,但真實情況下,大部分類別我們沒有資料積累,large-scale方法不完全適用。所以我們希望在學習了一定類別的大量資料後,對於新的類別,我們只需要少量的樣本就能快速學習。

存在的問題一方面是知識缺失,另一方面是需要大量的訓練樣本。第一點在本文中不做討論。

對於第二點,目前考慮的解決方法主要有兩個:
第一個是人能夠識別一個從沒有見過的物體,也就是zero-shot learning;
第二個是從已有任務中學習知識,將其應用到未來模型訓練中,可以認為是一個遷移學習的問題。

那麼我們如何定義one-shot learning呢? 它的目的是從一個或幾個影像樣本中學習類別資訊。但我們這裡的one-shot learning並不限於一般影像,也可以在文字,醫療影像等特殊影像,或者物理化學中的掃描影像上進行應用。


One-shot learning的研究主要分為如下幾類:
第一類方法是直接基於有監督學習的方法,這是指沒有其他的資料來源,不將其作為一個遷移學習的問題看待,只利用這些小樣本,在現有資訊上訓練模型,然後做分類;
第二個是基於遷移學習的方法,是指有其他資料來源時,利用這些輔助資料集去做遷移學習。這是我今年一篇綜述裡提到的模型分類。

對於第一類直接進行有監督學習的方法,可以做基於例項的學習,比如KNN,以及非引數方法。

而基於遷移學習的one-shot learning,首先是基於屬性的學習,比如我們最早在做zero-shot learning的時候,會順便做one-shot learning,把特徵投影到一個屬性空間,然後在這個屬性空間中既可以做one-shot learning,又可以做zero-shot learning,但是每個類別都需要屬性標註,也就是需要額外的資訊。最近的機器學習領域裡,所討論one-shot learning一般不假設我們知道這些額外資訊,大體上可以被分為meta-learning,或者metric-learning。 Meta-learning從資料中學習一種泛化的表示,這種泛化的表示可以被直接用於目標資料上,小樣本的類別學習過程。Metric-learning從資料來源中構建一個空間。但是本質上meta-learning和metric-learning還是有很多相似的地方。

接下來是資料增強,這其實是很重要也很容易被忽視的一點,可以有很多方法來實現:
第一,利用流資訊學習one-shot模型,常見的有半監督學習和transductive learning,探討的是如何用無標籤資料去做one-shot learning。
第二,在有預訓練模型時,用這些預訓練模型進行資料增強。
第三,從相近的類別借用資料,來增強訓練資料集。
第四,合成新的有標籤訓練資料,用一些遙感裡的方法,可以合成一些影像,或者3d物體。
第五,用GAN來學習合成模型,比如最近用GAN來做personal ID和人臉相關研究。
第六,屬性引導的增強方法。具體大家可以在文章裡進行詳細瞭解。

首先基於遷移學習的方法,我們目前的實驗結果顯示:大部分已經發表的one-shot learning方法在miniImageNet資料集上的結果,比不過resnet-18的結果,這也是很微妙的一點。我們的程式碼已經放到github上,大家有興趣可以看一下。(如果我們的實驗在什麼地方有問題,歡迎大家給我發郵件)

下面簡單介紹相關文章。首先是Wang Yuxiong的文章Learning to Learn: Model Regression Networks for Easy Small Sample Learning,他們用原資料構建了很多模型庫,然後目標資料直接回歸這些模型庫。具體就是在source class上訓練一個regression network。對於大量樣本我們可以得到一個比較好的分類器。對於少量樣本我們可以得到一個沒那麼好的分類器。這個regression network的目的就是把沒那麼好的分類器對映成比較好的分類器。即,把一個分類器的權重對映到另一個分類器。

第二個是Matching Networks for One Shot Learning,這個文章很有意思,從標題中就能讀出大概做了什麼工作。對於一張圖片,我們訓練一個matching network來提取它的feature。然後用一個簡單的數學公式來判斷feature之間的距離。對於新的圖片,根據它與已知圖片的距離來進行分類。這篇文章精巧地設計了訓練的過程,來使得這個過程與測試時的過程一致。

第三是MAML,是與模型無關的meta-learning的方法,它主要側重於深度網路的快速適應。這篇文章的思想就是找到一個網路最好的初始位置,這個初始位置被定義為:經過幾個小樣本的調整後可以得到最好的表現。

第四個是Optimization as a model for few-shot learning,也是meta-learning的方法,將任務組織成一個最優化的問題。這篇文章將梯度下降的過程與LSTM的更新相對比,發現它們非常相似。所以可以用LSTM來學習梯度下降的過程,以此使用LSTM來做梯度下降的工作。

第五個是meta networks,也是meta-learning方法。其中利用了少量樣本在基礎網路中產生的梯度,來快速生成新的引數權重。


今年CVPR的Learning to compare: Relation network for few-shot learning。簡單來說就是用embedding module來提取feature。然後用relation module來輸出兩個feature之間的距離。一次來通過距離進行分類選擇。
關於on-shot learning,還有其他參考文獻,可在文末的連結中下載。

下面簡單介紹一下資料增強的相關文章。

上圖是我們今年的提交到ECCV的一個工作,用左邊的encoder-trinet把視覺特徵對映到語義空間。因為語義空間上有更豐富的資訊,可以在語義空間上做資料擴充(新增高斯噪聲和尋找最近鄰),再對映回視覺空間來得到更多的擴充樣例。

ICCV2017這篇文章根據已有的影像去生成新的影像,然後做low-shot 視覺識別。具體來說,比如說你有三張圖片:一張是鳥,一張是鳥站在樹枝上,一張是猴子。那麼你可以學習一個網路讓它生成猴子站在樹枝上的圖片。本質上是,想把一個類的變化遷移到另一個類上,以此來做資料擴充。

這是去年在CVPR上發表的文章AGA,主要針對3D資料,把影像投影到一個屬性空間做資料增強。這是一個few-shot learning方法。具體就是,給定幾張距離觀測者不同距離的桌子的照片,以及一張凳子的照片,讓機器學會如何去生成不同距離的凳子的照片,以此來做資料擴充。

最後在 one-shot learning之上,我們還可能遇到一個問題,one-shot learning只關注目標類別上的分類問題,我們希望學習到的模型對源資料類別也適用,否則將帶來一個問題,被稱為災難性遺忘。

發表在PNAS的文章提出EWC 模型來解決這個問題。災難性遺忘往往源於我們學習任務B的時候更新網路,使得任務A做的沒那麼好了。EWC提供了一種方法來計算權重對於任務A的重要性,把重要性引入到損失函式中,來避免更改會影響A效果的權重。

還有learning without forgetting這篇文章,也是側重於解決這個問題。簡單來說就是拿到一個新任務後,我們會更新網路。我們希望在更新網路前後網路沒有太大變化,所以我們新增一個loss來限制網路更新前後對於這個新的任務輸出的特徵不能有太大變化,也就是一個distill loss。
最後,小樣本學習還有很多可以研究的東西。目前的成果主要還是基於把已知類別的一些資訊遷移到新的類別上。可能未來可以嘗試下更多的方向,比如利用無監督的資訊或者是半監督的方法。
參考文獻連結:
https://pan.baidu.com/s/1yzoSeuaZvMjKMQlMfD1Yzw
密碼: xmap