零次学习(zero-shot learning)
零次學習(zero-shot learning)基本概念
假設小暗(純粹因為不想用小明)和爸爸,到了動物園,看到了馬,然后爸爸告訴他,這就是馬;之后,又看到了老虎,告訴他:“看,這種身上有條紋的動物就是老虎?!?#xff1b;最后,又帶他去看了熊貓,對他說:“你看這熊貓是黑白色的?!比缓?#xff0c;爸爸給小暗安排了一個任務,讓他在動物園里找一種他從沒見過的動物,叫斑馬,并告訴了小暗有關于斑馬的信息:“斑馬有著馬的輪廓,身上有像老虎一樣的條紋,而且它像熊貓一樣是黑白色的?!弊詈?#xff0c;小暗根據爸爸的提示,在動物園里找到了斑馬(意料之中的結局。。。)。
上述例子中包含了一個人類的推理過程,就是利用過去的知識(馬,老虎,熊貓和斑馬的描述),在腦海中推理出新對象的具體形態,從而能對新對象進行辨認。(如圖1所示)ZSL就是希望能夠模仿人類的這個推理過程,使得計算機具有識別新事物的能力。
圖1 ZSL概念圖[17]
如今深度學習非常火熱,使得純監督學習在很多任務上都達到了讓人驚嘆的結果,但其限制是:往往需要足夠多的樣本才能訓練出足夠好的模型,并且利用貓狗訓練出來的分類器,就只能對貓狗進行分類,其他的物種它都無法識別。這樣的模型顯然并不符合我們對人工智能的終極想象,我們希望機器能夠像上文中的小暗一樣,具有通過推理,識別新類別的能力。
ZSL就是希望我們的模型能夠對其從沒見過的類別進行分類,讓機器具有推理能力,實現真正的智能。其中零次(Zero-shot)是指對于要分類的類別對象,一次也不學習。這樣的能力聽上去很具有吸引力,那么到底是怎么實現的呢?
假設我們的模型已經能夠識別馬,老虎和熊貓了,現在需要該模型也識別斑馬,那么我們需要像爸爸一樣告訴模型,怎樣的對象才是斑馬,但是并不能直接讓模型看見斑馬。所以模型需要知道的信息是馬的樣本、老虎的樣本、熊貓的樣本和樣本的標簽,以及關于前三種動物和斑馬的描述。將其轉換為常規的機器學習,這里我們只討論一般的圖片分類問題:
(1)訓練集數據?及其標簽??,包含了模型需要學習的類別(馬、老虎和熊貓),這里和傳統的監督學習中的定義一致;
(2)測試集數據??及其標簽??,包含了模型需要辨識的類別(斑馬),這里和傳統的監督學習中也定義一直;
(3)訓練集類別的描述??,以及測試集類別的描述??;我們將每一個類別??,都表示成一個語義向量??的形式,而這個語義向量的每一個維度都表示一種高級的屬性,比如“黑白色”、“有尾巴”、“有羽毛”等等,當這個類別包含這種屬性時,那在其維度上被設置為非零值。對于一個數據集來說,語義向量的維度是固定的,它包含了能夠較充分描述數據集中類別的屬性。
在ZSL中,我們希望利用??和??來訓練模型,而模型能夠具有識別??的能力,因此模型需要知道所有類別的描述??和??。ZSL這樣的設置其實就是上文中小暗識別斑馬的過程中,爸爸為他提供的條件。
圖2 ZSL設置圖[16]
如圖2,可以較為直觀地了解ZSL的設置。
講到這,很多同學可能會問:
(1)類別的描述??到底是怎么獲取的?
答:有人工專家定義的,也有通過海量的附加數據集自動學習出來的,但前者的效果目前要好很多。
(2)這樣做讓人覺得有點失望呀!我希望模型能夠在沒有斑馬樣本的情況下,識別斑馬,而現在,雖然我不需要為模型提供斑馬的樣本,但是卻要為每一個類別添加一種描述,更離譜的是我還需要斑馬(測試集)的描述,這個過程并沒有想象中智能誒!
答:的確,在我們的想象中,我們期待的智能是:只給機器馬、老虎和熊貓,然后它就可以識別斑馬了,這樣多爽,多神奇。但我們回過頭去,再想想小暗的思考過程,如果爸爸不告訴小暗關于斑馬的任何信息,那么當小暗看見斑馬的時候,并不會知道它是什么,只是小暗能夠描述它:“這是一匹有著黑白顏色條紋的馬。”這里,有同學可能又會說:至少我們可以不用告訴小暗類別的描述呀,但是ZSL就不行。其實,我們是需要告訴小暗類別描述的,或者說小暗在之前就學習到了類別描述,比如怎樣的圖案是“條紋”,怎樣的顏色稱為“黑白色”,這樣的屬性定義。對于一個模型來說,它就像剛出生的嬰兒,我們需要教會它這些屬性的定義。
(3)就算是這樣,需要實現定義這個描述??還是很蛋疼的一件事情。
答:(1)中就有提到,描述??可以自動學習,我們將小暗已經掌握的知識描述為一個知識庫,這個知識庫里就有對各種屬性的定義;而能夠模仿人類知識庫的最好東西就是“百度百科”,“維基百科”等等各種百科,我們可以利用百科中的各種定義,生成類別的定義,這方面側重于NLP,因此不進一步討論。
在此,我們小小總結一下ZSL問題的定義。利用訓練集數據訓練模型,使得模型能夠對測試集的對象進行分類,但是訓練集類別和測試集類別之間沒有交集;期間需要借助類別的描述,來建立訓練集和測試集之間的聯系,從而使得模型有效。
目前的研究方式
在上文中提到,要實現ZSL功能似乎需要解決兩個部分的問題:第一個問題是獲取合適的類別描述??;第二個問題是建立一個合適的分類模型。
目前大部分工作都集中在第二個問題上,而第一個問題的研究進展比較緩慢。個人認為的原因是, 目前?的獲取主要集中于一些NLP的方法,而且難度較大;而第二個問題能夠用的方法較多,比較容易出成果。
因此,接下來的算法部分,也只介紹研究分類模型的方法。
數據集介紹
先介紹數據集,是因為希望在算法介紹部分,直接給出實例,讓大家能夠直接上手。
雖然在我認識的人里,好些人能夠讀一篇論文或者聽一個報告后就能問出很好的問題,然后就基本弄懂了。但我在這個上笨很多。讀過的論文就像喝過的水,第二天就不記得了。一定是需要靜下心來,從頭到尾實現一篇,跑上幾個數據,調些參數,才能心安地覺得懂了。例如在港科大的兩年讀了很多論文,但現在反過來看,仍然記得可能就是那兩個老老實實動手實現過寫過論文的模型了。即使后來在機器學習這個方向又走了五年,學習任何新東西仍然是要靠動手?!钽?#xff08;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 提取)
基礎算法介紹
在此,只具體介紹最簡單的方法,讓大家可以快速上手。我們面對的是一個圖片分類問題,即對測試集的樣本??進行分類,而我們分類時需要借助類別的描述??,由于每一個類別??,都對應一個語義向量??,因此我們現在可以忘掉??,直接使用??。我們把??(利用深度網絡提取的圖片特征,比如GoogleNet提取為1024維)稱為特征空間(visual feature space),把類別的語義表示??,稱為語義空間。我們要做的,其實就是建立特征空間與語義空間之間的映射。
對于分類,我們能想到的最簡單的形式就是嶺回歸(ridge regression),俗稱均方誤差加范數約束,具體形式為:
?(1)
其中,??通常為2范數約束,??為超參,對??求導,并讓導為0,即可求出??的值。測試時,利用??將??投影到語義空間中,并在該空間中尋找到離它最近的??,則樣本的類別為??所對應的標簽??。
簡單寫一個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%的準確率。
這樣一個嶺回歸之所以有效,是因為訓練集類別語義??與測試集類別語義??之間存在的密切聯系。其實任何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)領域漂移
由于樣本的特征維度往往比語義的維度大,所以建立從??到??的映射往往會丟失信息,為了保留更多的信息,保持更多的豐富性,最流行的做法是將映射到語義空間中的樣本,再重建回去,這樣學習到的映射就能夠得到保留更多的信息。因此,在原來簡單嶺回歸[1]的基礎上,可以將目標函數改為:[7]
?(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)改為:
?(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]
綜述性的文章,讀起來很順暢,可以看看別人是怎么寫綜述,中頂刊的。
以上幾篇文章,較有代表性,比較值得讀的工作。
參考文獻
[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]http://people.duke.edu/~ww107/material/ZSL.pdf
[17]Attribute-Based Synthetic Network (ABS-Net): Learning More From Pseudo Feature Representation
總結
以上是生活随笔為你收集整理的零次学习(zero-shot learning)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 条件GAN
- 下一篇: Sierpinski镂垫