零次學習(Zero-Shot Learning)入門zz

很久沒有更文章了,主要是沒有找到zero-shot learning(ZSL)方面我特別想要分享的文章,且中間有一段時間在考慮要不要繼續做這個題目,再加上我懶 (¬_¬),所以一直拖到了現在。

最近科研沒什麼進展,就想着寫一個ZSL的入門性的文章,目的是爲了幫助完全沒有接觸過這方面,並有些興趣的同學,能在較短的時間對ZSL有一定的認識,並且對目前的發展情況有一定的把握。

在此之前,需要提到的是:無論是論文筆記,還是總結性的讀物,都包含了作者自己的理解和二次加工,想要做出好的工作必定需要自己看論文和總結。

零次學習(zero-shot learning)基本概念

每次在實驗室做工作彙報的時候,總會把ZSL的基本概念講一遍,但是每次的效果都不是很好,工作都講完了,提的第一個問題依然是:ZSL到底是什麼?這讓我一度認爲我的表達能力有問題。。。。。。不過回憶起我第一次接觸這個題目的時候,也花了挺長的時間才搞清楚到底在做一件什麼事情,那篇入門的文章[1]看了很久才基本看懂。因此,我儘量用最簡單的,不帶任何公式的方式來講一下這到底是個什麼問題。

假設小暗(純粹因爲不想用小明)和爸爸,到了動物園,看到了馬,然後爸爸告訴他,這就是馬;之後,又看到了老虎,告訴他:“看,這種身上有條紋的動物就是老虎。”;最後,又帶他去看了熊貓,對他說:“你看這熊貓是黑白色的。”然後,爸爸給小暗安排了一個任務,讓他在動物園裏找一種他從沒見過的動物,叫斑馬,並告訴了小暗有關於斑馬的信息:“斑馬有着馬的輪廓,身上有像老虎一樣的條紋,而且它像熊貓一樣是黑白色的。”最後,小暗根據爸爸的提示,在動物園裏找到了斑馬(意料之中的結局。。。)。

上述例子中包含了一個人類的推理過程,就是利用過去的知識(馬,老虎,熊貓和斑馬的描述),在腦海中推理出新對象的具體形態,從而能對新對象進行辨認。(如圖1所示)ZSL就是希望能夠模仿人類的這個推理過程,使得計算機具有識別新事物的能力。

圖1 ZSL概念圖[17]

如今深度學習非常火熱,使得純監督學習在很多任務上都達到了讓人驚歎的結果,但其限制是:往往需要足夠多的樣本才能訓練出足夠好的模型,並且利用貓狗訓練出來的分類器,就只能對貓狗進行分類,其他的物種它都無法識別。這樣的模型顯然並不符合我們對人工智能的終極想象,我們希望機器能夠像上文中的小暗一樣,具有通過推理,識別新類別的能力。

ZSL就是希望我們的模型能夠對其從沒見過的類別進行分類,讓機器具有推理能力,實現真正的智能。其中零次(Zero-shot)是指對於要分類的類別對象,一次也不學習。這樣的能力聽上去很具有吸引力,那麼到底是怎麼實現的呢?

假設我們的模型已經能夠識別馬,老虎和熊貓了,現在需要該模型也識別斑馬,那麼我們需要像爸爸一樣告訴模型,怎樣的對象纔是斑馬,但是並不能直接讓模型看見斑馬。所以模型需要知道的信息是馬的樣本、老虎的樣本、熊貓的樣本和樣本的標籤,以及關於前三種動物和斑馬的描述。將其轉換爲常規的機器學習,這裏我們只討論一般的圖片分類問題:

(1)訓練集數據Xtr 及其標籤 Ytr ,包含了模型需要學習的類別(馬、老虎和熊貓),這裏和傳統的監督學習中的定義一致;

(2)測試集數據 Xte 及其標籤 Yte ,包含了模型需要辨識的類別(斑馬),這裏和傳統的監督學習中也定義一直;

(3)訓練集類別的描述 Atr ,以及測試集類別的描述 Ate ;我們將每一個類別 yi∈Y ,都表示成一個語義向量 ai∈A 的形式,而這個語義向量的每一個維度都表示一種高級的屬性,比如“黑白色”、“有尾巴”、“有羽毛”等等,當這個類別包含這種屬性時,那在其維度上被設置爲非零值。對於一個數據集來說,語義向量的維度是固定的,它包含了能夠較充分描述數據集中類別的屬性。

在ZSL中,我們希望利用 Xtr 和 Ytr 來訓練模型,而模型能夠具有識別 Xte 的能力,因此模型需要知道所有類別的描述 Atr 和 Ate 。ZSL這樣的設置其實就是上文中小暗識別斑馬的過程中,爸爸爲他提供的條件。

圖2 ZSL設置圖[16]

如圖2,可以較爲直觀地瞭解ZSL的設置。

講到這,很多同學可能會問:

(1)類別的描述 A 到底是怎麼獲取的?

答:有人工專家定義的,也有通過海量的附加數據集自動學習出來的,但前者的效果目前要好很多。

(2)這樣做讓人覺得有點失望呀!我希望模型能夠在沒有斑馬樣本的情況下,識別斑馬,而現在,雖然我不需要爲模型提供斑馬的樣本,但是卻要爲每一個類別添加一種描述,更離譜的是我還需要斑馬(測試集)的描述,這個過程並沒有想象中智能誒!

答:的確,在我們的想象中,我們期待的智能是:只給機器馬、老虎和熊貓,然後它就可以識別斑馬了,這樣多爽,多神奇。但我們回過頭去,再想想小暗的思考過程,如果爸爸不告訴小暗關於斑馬的任何信息,那麼當小暗看見斑馬的時候,並不會知道它是什麼,只是小暗能夠描述它:“這是一匹有着黑白顏色條紋的馬。”這裏,有同學可能又會說:至少我們可以不用告訴小暗類別的描述呀,但是ZSL就不行。其實,我們是需要告訴小暗類別描述的,或者說小暗在之前就學習到了類別描述,比如怎樣的圖案是“條紋”,怎樣的顏色稱爲“黑白色”,這樣的屬性定義。對於一個模型來說,它就像剛出生的嬰兒,我們需要教會它這些屬性的定義。

(3)就算是這樣,需要實現定義這個描述 A 還是很蛋疼的一件事情。

答:(1)中就有提到,描述 A 可以自動學習,我們將小暗已經掌握的知識描述爲一個知識庫,這個知識庫裏就有對各種屬性的定義;而能夠模仿人類知識庫的最好東西就是“百度百科”,“維基百科”等等各種百科,我們可以利用百科中的各種定義,生成類別的定義,這方面側重於NLP,因此不進一步討論。

在此,我們小小總結一下ZSL問題的定義。利用訓練集數據訓練模型,使得模型能夠對測試集的對象進行分類,但是訓練集類別和測試集類別之間沒有交集;期間需要藉助類別的描述,來建立訓練集和測試集之間的聯繫,從而使得模型有效。

目前的研究方式

在上文中提到,要實現ZSL功能似乎需要解決兩個部分的問題:第一個問題是獲取合適的類別描述 A ;第二個問題是建立一個合適的分類模型。

目前大部分工作都集中在第二個問題上,而第一個問題的研究進展比較緩慢。個人認爲的原因是, 目前A 的獲取主要集中於一些NLP的方法,而且難度較大;而第二個問題能夠用的方法較多,比較容易出成果。

因此,接下來的算法部分,也只介紹研究分類模型的方法。

數據集介紹

先介紹數據集,是因爲希望在算法介紹部分,直接給出實例,讓大家能夠直接上手,這裏順便插個沐神 

 的感悟。

 

雖然在我認識的人裏,好些人能夠讀一篇論文或者聽一個報告後就能問出很好的問題,然後就基本弄懂了。但我在這個上笨很多。讀過的論文就像喝過的水,第二天就不記得了。一定是需要靜下心來,從頭到尾實現一篇,跑上幾個數據,調些參數,才能心安地覺得懂了。例如在港科大的兩年讀了很多論文,但現在反過來看,仍然記得可能就是那兩個老老實實動手實現過寫過論文的模型了。即使後來在機器學習這個方向又走了五年,學習任何新東西仍然是要靠動手。——李沐(MXNet開發者)

(1)Animal with Attributes(AwA)官網:Animals with Attributes

提出ZSL定義的作者,給出的數據集,都是動物的圖片,包括50個類別的圖片,其中40個類別作爲訓練集,10個類別作爲測試集,每個類別的語義爲85維,總共有30475張圖片。但是目前由於版權問題,已經無法獲取這個數據集的圖片了,作者便提出了AwA2,與前者類似,總共37322張圖片。

(2)Caltech-UCSD-Birds-200-2011(CUB)官網:Caltech-UCSD Birds-200-2011

全部都是鳥類的圖片,總共200類,150類爲訓練集,50類爲測試集,類別的語義爲312維,有11788張圖片。

(3)Sun database(SUN)官網:SUN Database

總共有717個類別,每個類別20張圖片,類別語義爲102維。傳統的分法是訓練集707類,測試集10類。

(4)Attribute Pascal and Yahoo dataset(aPY)官網:Describing Objects by their Attributes

共有32個類,其中20個類作爲訓練集,12個類作爲測試集,類別語義爲64維,共有15339張圖片。

(5)ILSVRC2012/ILSVRC2010(ImNet-2)

利用ImageNet做成的數據集,由ILSVRC2012的1000個類作爲訓練集,ILSVRC2010的360個類作爲測試集,有254000張圖片。它由 4.6M 的Wikipedia數據集訓練而得到,共1000維。

上述數據集中(1)-(4)都是較小型(small-scale)的數據集,(5)是大型(large-scale)數據集。雖然(1)-(4)已經提供了人工定義的類別語義,但是有些作者也會從維基語料庫中自動提取出類別的語義表示,來檢測自己的模型。

這裏給大家提供一些已經用GoogleNet提取好的數據集圖片特徵,大家可以比較方便地使用。Zero-Shot Learing問題數據集分享(GoogleNet 提取)

基礎算法介紹

在此,只具體介紹最簡單的方法,讓大家可以快速上手。我們面對的是一個圖片分類問題,即對測試集的樣本 Xte 進行分類,而我們分類時需要藉助類別的描述 A ,由於每一個類別 yi∈Y ,都對應一個語義向量 ai∈A ,因此我們現在可以忘掉 Y ,直接使用 A 。我們把 X (利用深度網絡提取的圖片特徵,比如GoogleNet提取爲1024維)稱爲特徵空間(visual feature space),把類別的語義表示 A ,稱爲語義空間。我們要做的,其實就是建立特徵空間與語義空間之間的映射。

對於分類,我們能想到的最簡單的形式就是嶺迴歸(ridge regression),俗稱均方誤差加範數約束,具體形式爲:

min||XtrW−Atr||2+ηΩ(W) (1)

其中, Ω() 通常爲2範數約束, η 爲超參,對 W 求導,並讓導爲0,即可求出 W 的值。測試時,利用 W 將 xi∈Xte 投影到語義空間中,並在該空間中尋找到離它最近的 ai∈Ate ,則樣本的類別爲 ai 所對應的標籤 yi∈Ytr 。

簡單寫一個matlab實現。

regression_lambda = 1.0;
W = ridge_regression(param.train_set, param.train_class_attributes, regression_lambda , 1024);
S_test = param.test_set * W;
[zsl_accuracy]= zsl_el(S_test, param.S_te, param); 
fprintf('AwA ZSL accuracy on test set: %.1f%%\n', zsl_accuracy*100);

我們使用AwA數據集,圖片事先利用GoogleNet提取了特徵(1024維),在測試集上可以得到59.1%的準確率。

這樣一個嶺迴歸之所以有效,是因爲訓練集類別語義 Atr 與測試集類別語義 Ate 之間存在的密切聯繫。其實任何ZSL方法有效的基礎,都是因爲這兩者之間具體的聯繫。

僅僅利用如此naive的方式,得到的結果顯然不能滿足我們的要求,那麼建立更好的模型,則需要進一步瞭解ZSL問題中,存在着哪些和傳統監督分類的差異。

ZSL中存在的問題

在此,介紹一些目前ZSL中主要存在的問題,以便讓大家瞭解目前ZS領域有哪些研究點。

領域漂移問題(domain shift problem)

該問題的正式定義首先由[2]提出。簡單來說,就是同一種屬性,在不同的類別中,視覺特徵的表現可能很大。如圖3所示,斑馬和豬都有尾巴,因此在它的類別語義表示中,“有尾巴”這一項都是非0值,但是兩者尾巴的視覺特徵卻相差很遠。如果斑馬是訓練集,而豬是測試集,那麼利用斑馬訓練出來的模型,則很難正確地對豬進行分類。

圖3 domain shift示意圖,圖中的prototype表示類別在語義空間中的位置[2]

樞紐點問題(Hubness problem)

這其實是高維空間中固有的問題:在高維空間中,某些點會成爲大多數點的最近鄰點。這聽上去有些反直觀,細節方面可以參考[3]。由於ZSL在計算最終的正確率時,使用的是K-NN,所以會受到hubness problem的影響,並且[4]中,證明了基於嶺迴歸的方法會加重hubness problem問題。

語義間隔(semantic gap)

樣本的特徵往往是視覺特徵,比如用深度網絡提取到的特徵,而語義表示卻是非視覺的,這直接反應到數據上其實就是:樣本在特徵空間中所構成的流型與語義空間中類別構成的流型是不一致的。(如圖4所示)

圖4 流型不一致示意圖[8]

這使得直接學習兩者之間的映射變得困難。

還有其他的,比如semantic loss[5]問題,樣本通過映射坍塌到一點[6]等,由於還不常研究,在此就不再討論。

在此,我們給出解決上述三個問題的基本方法,從而更加深度地瞭解這三個問題。

(1)領域漂移

由於樣本的特徵維度往往比語義的維度大,所以建立從 X 到 S 的映射往往會丟失信息,爲了保留更多的信息,保持更多的豐富性,最流行的做法是將映射到語義空間中的樣本,再重建回去,這樣學習到的映射就能夠得到保留更多的信息。因此,在原來簡單嶺迴歸[1]的基礎上,可以將目標函數改爲:[7]

min||Xtr−WTAtr||2+λ||WXtr−Atr||2 (2)

從目標函數可以看出,這其實完成的是一個簡易的自編碼器過程,我們簡稱這個算法爲SAE,利用matlab可以輕鬆對其實現。

lambda1 = 800000;
W = SAE(param.train_set', param.train_class_attributes', lambda1);
S_test = param.test_set * NormalizeFea(W');
[zsl_accuracy]= zsl_el(S_test, param.S_te, param); 
fprintf('AwA ZSL accuracy on test set: %.1f%%\n', zsl_accuracy*100);

依然是在AwA上進行測試,可以得到83.2%的準確率,比簡單的嶺迴歸(1)提高了24.1%。自編碼器的這個結構目前在ZSL方法中非常流行,稍後我們還會提到。

(2)樞紐點問題

目前對於樞紐點問題的解決主要有兩種方法:

a. 如果模型建立的方式爲嶺迴歸,那麼可以建立從語義空間到特徵空間的映射,從而不加深hubness problem對結果的影響[4],也就是說將目標函數(1)改爲:

min||Xtr−AtrW||2+ηΩ(W) (3)

在AwA數據集上,這種簡單的改變能夠得到76.5%的正確率,比原本提高了17.4%。

b.可以使用生成模型,比如自編碼器、GAN等,生成測試集的樣本,這樣就變成了一個傳統的監督分類問題,不存在K-NN的操作,所以不存在hubness problem的影響。

(3)語義間隔問題

語義間隔問題的本質是二者的流形結構不一致,因此,解決此問題的着手點就在於將兩者的流形調整到一致,再學習兩者之間的映射[8]。最簡單的方法自然是將類別的語義表示調整到樣本的流型上,即用類別語義表示的K近鄰樣本點,重新表示類別語義即可。

有關ZSL的一些其他的概念

這裏將提到一些ZSL涉及到的其他概念。

(1)直推式學習(Transductive setting)

這裏的直推式學習其實是指在訓練模型的時候,我們可以拿到測試集的數據,只是不能拿到測試集的樣本的標籤,因此我們可以利用測試集數據,得到一些測試集類別的先驗知識。這種設置在遷移學習中很常見。

圖5 非直推式(inductive)和直推式學習的區別[16]

(2)泛化的ZSL(generalized ZSL)

上文中提到的ZSL,在測試時使用K-NN進行正確率的評估時,只在測試類別中找最近鄰的類別,但是在現實的問題中,拿到的樣本也可能屬於訓練集類別,因此在測試時,同時加入訓練集類別。[9]現在的很多方法都開始測試模型在這種設置下的能力。

推薦閱讀的論文

我一直不想寫ZSL的發展史,因爲據我的經驗,寫了一大段發展史之後,往往大家的興致不高,而且看完之後一般都不會有什麼特別的感覺,基本也記不得什麼東西。所以倒不如給大家推薦一些論文,從最早的到目前最新的,使得大家在短時間內能對ZSL的發展有一個大概的概念。

(1)Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer[1]

ZSL問題的開創性文章,當然是必讀的嘍,而且可以順便看看別人是如何闡述一個新問題(挖坑)的。

(2)An embarrassingly simple approach to zero-shot learning[10]

有着很強的理論基礎,算法簡單、有效,雖然已經過去很多年了,但還是目前新工作需要進行對比的方法之一。

(3)Transductive Multi-View Zero-Shot Learning[2]

第一次定義了domain shift問題。

(4)Zero-shot recognition using dual visualsemantic mapping paths[11]

解決semantic gap問題的簡單做法。

(5)Predicting visual exemplars of unseen classes for zero-shot learning[12]

從本質的角度出發,將ZSL問題,看作聚類問題,用最簡單的方法直接建立映射。

(6)Semantic Autoencoder for Zero-Shot Learning[7]

引入自編碼器結構的第一篇文章,直接導致現在出現的新方法大都具有這種結構。

(7)Zero-Shot Learning - A Comprehensive Evaluation of the Good, the Bad and the Ugly[14]

綜述性的文章,總結了17年底以前的方法,提出了新的評價標準,對當時領域發展比較混亂的地方做出了一些更標準的評估。

(8)Zero-Shot Learning via Class-Conditioned Deep Generative Models[6]

將[7]改造爲深度模型,並加上一些其他的約束。

(9)Preserving Semantic Relations for Zero-Shot Learning[13]

在自編碼器結構的基礎上,顯示地加入語義類別之間的關係約束。

(10)Recent Advances in Zero-shot Recognition[15]

綜述性的文章,讀起來很順暢,可以看看別人是怎麼寫綜述,中頂刊的。

以上幾篇文章,是我認爲較有代表性,比較值得讀的工作。

代碼

有很多工作,作者都是提供代碼的,我自己也實現了一些工作,如果有時間我會將其整理在一起,方便大家使用。

我自己的看法

我當初做這個課題,純粹是因爲項目的需要,再加上當時並沒有想清楚自己要做什麼,所以就做着試試了。目前這個領域屬於很好發論文的階段,而且並不需要十分深刻的理解,就能發不錯等級的文章,比較容易能夠看到它的發展趨勢及下一步大家扎堆的地方,很多時候是在拼速度,而不是拼想法。但好發論文,並不代表它發展迅速,在我看來,真正有貢獻的工作少之又少,且其對本質的研究發展緩慢。並且,該問題離實際應用還太遠,很可能並不屬於這個時代。基於這些原因,之前有一段時間很不想再繼續這個課題。。。

總結

稍微總結一下,其實我也不知道要總結什麼,只是習慣了每篇文章最後都要寫個總結。花了大概一天的時間,寫了這篇ZSL入門文章。寫它一方面是因爲希望能夠有一篇ZSL的入門性質的讀物,爲大家提供便利;另一方面就是近期科研不順,總是懷疑自己不是讀書的料,寫寫文章讓自己心情好些。希望大家閱讀之後,能夠得到一定的幫助吧!

其他

文章倉促之下寫的,沒有經過什麼構思,就是想到哪,寫到哪。後面我應該還會修改,添加一些其他的內容,如果大家有什麼問題,歡迎評論或者私信。

祝大家科研順利!爲人類理解這個世界做一點點貢獻!

參考文獻

[1]Learning To Detect Unseen Object Classes by Between-Class Attribute Transfer

[2]Transductive Multi-View Zero-Shot Learning.

[3]Hubness and Pollution: Delving into Class-Space Mapping for Zero-Shot Learning.

[4]Ridge Regression, Hubness, and Zero-Shot Learning.

[5]Zero-Shot Visual Recognition using Semantics-Preserving Adversarial Embedding Network.

[6]Zero-Shot Learning via Class-Conditioned Deep Generative Models.

[7]Semantic Autoencoder for Zero-Shot Learning.

[8]Zero-Shot Recognition using Dual Visual-Semantic Mapping Paths.

[9]An Empirical Study and Analysis of Generalized Zero-Shot Learning for Object Recognition in the Wild.

[10]An embarrassingly simple approach to zero-shot learning

[11]Zero-shot recognition using dual visualsemantic mapping paths

[12]Predicting visual exemplars of unseen classes for zero-shot learning

[13]Preserving Semantic Relations for Zero-Shot Learning

[14]Zero-Shot Learning - A Comprehensive Evaluation of the Good, the Bad and the Ugly

[15]Recent Advances in Zero-shot Recognition

[16]

[17]Attribute-Based Synthetic Network (ABS-Net): Learning More From Pseudo Feature Representation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章