【机器学习基础】从Few-shot Learning再次认识机器学习
一定要看完,一定要看完,一定要看完,重要的事情說三遍!!!首先申明本人并不是在研究這個領域有著深入研究的“專家”,如果文中有講解不對的地方,還請各位大佬留言批評指正。
當我看完?《Generalizing from a few examples: A survey on few-shot learning》?這篇文章的時候,我對于機器學習又有了一種新的認知,與其說它讓我理解了什么是Few-shot learning,不如說它讓我明白了如何更好地處理機器學習問題,不論是科研還是在實際應用當中(可以說是所有其它模型算法),都可以從文章指出的三個角度去考慮:數據、模型、算法。有人也許會說,是個人都知道從這三個角度去入手,問題是怎么樣從這三個角度入手,依據是什么,做什么改進,文章對于少樣本場景下解釋的非常清晰,我認為思考問題的思維方式和角度很重要!!!
什么是Few-shot learning?
1)符號定義
給定一個任務??,以及由訓練集??(??的數量很少)和測試集??組成的數據集,??是數據的真實分布,而FSL就是要通過訓練數據??去訓練擬合出這個真實分布,也就是最優假設??。為了得到最優的假設??,FSL定義了一個關于參數??的假設空間??,即??,這里使用參數化模型??,因為非參數模型通常需要大量數據集,因此不適合FSL。FSL算法是一個最優化搜索策略算法,目的是在假設空間??中找到一個最接近??的假設??,FSL的模型性能可以由損失函數來表示,在這里??是由你選擇的模型和參數的初始化分布決定的,而??的尋找過程其實就是一個優化過程,而通常的優化方法就是梯度下降。
2)問題描述
前面描述的FSL過程本質上就是一個機器學習過程,那自然FSL符合機器學習的一些性質,我們先來看下關于機器學習任務的定義:
Machine Learning: 在經典的機器學習中,給定一個任務??,任務的性能??,給定一些額外的條件??,可以提升任務??的性能??。舉例:圖像分類任務??,Machine Learning通過對大量帶有標注的圖像進行訓練得到??,從而提高分類準確率??。Table 1 給出了一個圖像分類和Alpha Go強化學習的例子:
Few-Shot Learning:FSL是機器學習的一個特例,定義和Machine Learning一樣,只不過它的目標是在??訓練集只提供的少量監督樣本信息(??)的情況下獲得良好的學習性能。現有的FSL問題主要是監督學習問題,具體來說,few-shot分類法學習的是在只給出每個類僅有少量標簽數據的情況下的分類器。Table 2 列舉了三個不同的任務,具體任務可以查看相關文獻,值得注意的是,Few-Shot Learning相比于一般的Machine Learning在條件??上除了是few data之外,還需要引入一些先驗知識,自然而然,如何將先驗知識嵌入進模型之中成了優化的關鍵。
注:當??中只有一個帶有監督信息的例子時,FSL稱為one-shot learning,當E不包含任何對目標?任務???有監督信息的例子時,FSL就成為zero-shot learning (ZSL),由于目標類不包含有監督信息的示例,所以ZSL要求??包含來自其他形式的信息(如屬性、WordNet等),從而傳遞一些監督信息,使學習成為可能。
核 心 問 題?
我認為這篇綜述最出彩的地方就在這里,文章從機器學習期望風險最小化的角度去思考問題,并嘗試在少樣本的情況下,如何降低這種風險,我們先來大致回顧一下期望風險。(以下分析適用于包括分類和回歸在內的FSL監督學習,也可以為理解FSL強化學習提供見解。)
在機器學習中尋找最適合的假設時通常都是通過找到一組最優的參數來確定這個假設,并通過給定的訓練集下期望風險最小化這一目標來指示最優參數的搜索,期望風險如下所示:?
其中??數據的真實分布,??為損失函數,但由于真實分布往往不太容易知道,因此我們常常用經驗風險來代替期望風險,經驗風險就是在訓練集上預測的結果和真實結果的差異,也是我們常說的損失函數的期望,表達式如下:??因此,我們可以得到這樣幾個假設:
??是期望風險最小化的最優解,可以理解為百分百沒有誤差的解,不需要知道假設空間,同時已知所有的數據樣本,顯然,這個是辦不到的。
??是在假設空間??下期望風險最小化的最優解。顯然,這個解相對于??存在一定的誤差。
??是在假設空間??下經驗風險最小化的最優解。顯然,這個解相對于??還存在一定的誤差。
根據機器學習中的error分解可得:?等式右邊第一項表示的是假設空間??中最優的假設和真實假設的誤差,這一項其實由你所選擇的模型和參數的初始化分布決定的(模型),這也就是為什么有的時候,模型選擇的簡單了,你給再多的數據也訓練不好,欠擬合。第二項就是我們訓練得到的假設和??中最優假設的誤差,這項強調經驗風險的重要性(數據、算法),但有時候會陷入局部最優,或者提供的訓練數據分布有偏差,導致無法得到全局最優。也就是說,這里的error,是由我們定義的假設空間??和訓練樣本共同決定的,換一句話說,可以嘗試從以下三個角度去減少誤差:數據(一定量訓練數據)、模型(限定假設空間)、算法(優化搜索,避免陷入局部最優)
? 解 決 方 法?
一、Data
使用弱監督或者無監督的數據集
使用一些無監督或者弱監督的數據集,并在few data上training過的模型(比如SVM等簡單的分類模型)進行預測,形成“有監督”的數據集,以此來擴充數據集。
對原始數據集進行數據增強
使用一些數據增強的手段,對數據進行擴增,比如圖像的幾何變換或者其它一些數據轉換的方式用于數據增強等等。
增加一些相似的數據集(比如數據聚合生成)
該策略通過從相似但數量較大的數據集中聚合和調整輸入-輸出對來擴充數據集。聚合權值通常基于樣本之間的某種相似性度量。
二、Model
????????在FSL問題上,如果假設空間太大,很難找到最優的??,因此需要通過一些先驗知識將這個空間中無效的hypothesis去掉,縮小假設空間,比如一開始給一個小的模型,這個模型空間離真實假設太遠了,而你給一個大的模型空間,它離真實假設近的概率比較大,然后通過先驗知識去掉那些離真實假設遠的假設,那如何將先驗知識嵌入到模型當中去成了問題的關鍵,Table 4 展示了四種嵌入先驗知識的方法。
?????1.?多任務學習(Multitask learning)
多任務學習方法的主要作用是通過多任務模型參數共享的方式,壓縮在few-shot task任務上模型的假設空間,主要的做法有Parameter Sharing和Parameter Tying兩種方式。
?Parameter Sharing(可以是數據相同任務不同,也可以是數據和任務都不同,但是數據具有領域性等等)
例如利用同領域內的其它數據做task(通常這些數據會比較多),在做Multitask learning的時候,不同task之間共享相關層的參數,而在task-specific層和classification層對于特定的任務不做共享,這樣做就能利用先驗知識縮小假設空間。
Parameter Tying
? ? ? ?參數綁定是指不同任務之間的參數具有相似性,而不是共享,這種相似性可以通過兩兩間參數正則的方式加以保證,如下圖所示,通過保證??、??、??之間相似,從而將task2和task3的先驗知識嵌入到task1中,縮小task 1模型的假設空間。
????2.?Embedding Learning
? ? ? Embedding Learning主要是將原始數據壓縮至一個更小的低維空間,以此換來一個更小的解空間。所以Embedding Learning方法的關鍵在于如何構建一個數據集的Embedding低維空間,主要有以下三種方法。
Task-Specific Embedding Model
?????? Task-Specific Embedding Model是只在few shot任務數據上進行訓練,訓練時通過組合的方式構造不同的成對樣本,輸入網絡訓練,在上層網絡通過計算樣本對的距離判斷是否屬于同一類,并生成對應的概率分布,測試時,網絡處理Query?set和Support set集之間的每一個樣本對,最終預測結果為Support set上預測概率最高的類別。代表網絡是siamese network(說明:如果我們將一個測試集看做是一個task,而這個task中有訓練集和測試集,這個時候的訓練集和測試集分別是Support set和Query?set)。
Task-Invariant Embedding Model
Task-Invariant Embedding Model則是先在大規模相似數據集中學習一個通用的embeddingfunction,然后在測試的時候直接用于當前任務的訓練集(few shot training set)和測試集(test example set)嵌入,并做相似性判別。代表網絡有Match network。
Hybrid Embedding Model
?????? 盡管Task-Invariant Embedding Model可以應用于新任務,且計算成本較低,但它們不利用當前任務的特定知識,并且當特定任務的樣本非常少的時候,只利用Task-Invariant Embedding不太合適。為了緩解這個問題,混合嵌入模型(Hybrid Embedding Model)通過??中的特定于任務的信息來適應從先驗知識中學到的通用Task-Invariant Embedding Model,并通過學習將??中提取的信息作為輸入并返回一個embedding來作為embedding function f函數的參數。
????3.?Learning with External Memory
????????Learning with External Memory是從訓練樣本??中提取知識,并存儲在外記憶中(在這里就是在一個用大量類似的數據訓練的具有外部存儲機制的網絡上,用具體task的樣本來更新外部記憶庫)。每個新的樣本??,用從內存中提取的內容進行加權平均表示,然后將其用作簡單分類器(例如softmax函數)的輸入進行預測。這就限制了??只能用內存中的內容來表示,因此從本質上減少了假設空間的大小。由于每個??都被定義為從內存中提取的值的加權平均值,因此內存中key-value對的質量很重要。
????4.?Generative Modeling
?????? 生成式建模方法利用先驗知識估計觀測樣本的概率分布??,可以生成新的數據。這個類中的方法可以處理許多任務,例如生成、識別、重構和圖像翻轉。
三、算法
在機器學習中我們通常使用SGD以及它的變體,如ADAM,RMSProp等來更新參數,尋找最優的參數,對應到假設空間中最優的假設。這種方式在有大量的數據集的情況下可以用來慢慢迭代更新尋找最優參數,但是在FSL任務中,樣本數量很少,這種方法就失效了。
假如模型能根據先驗知識初始化模型參數,這樣在算法優化或許只需要在少量數據集的情況下就能找到最優解,下面提供三種初始化模型參數的方法。
????1.?提供預訓練初始化參數
該方法大家都比較熟悉,最常見的就是引入pretrain model,然后在新的task上進行fine-tune。
???? 2.?基于meta?learning的方式更新參數
關于meta-learning,和我們比較熟悉的machine learning相比,通常machine learning是根據訓練數據,讓機器學習到一個功能函數??的能力(比如分類器),而meta-learning則是根據訓練數據,讓機器訓練出一個能找一個功能函數??的函數??的能力,即learn to learn,這里借用李宏毅老師授課內容。
通常情況,machine learning我們只需要準備好某個任務的訓練集和測試集就可以,meta-learning我們也需要準備一個訓練集和測試集,但是這里的訓練集和測試集都是由一個個的task組成,且每個task都有各自的訓練集(Support set)和測試集(Query set),因為machine learning的目的是讓機器學習學習的能力,因此我們的測試集應該是一個新的task,而這個task需要機器能自動的去學習出一個功能函數function,以適應具體任務的需要。
那在這里,怎么將meta learning和few shot learning聯系起來呢?
few shot learning需要將先驗知識嵌入進模型中去,使得最優化算法在搜索的時候,能縮小搜索空間,或者是達到快速搜索的目的,這就需要模型能有一個較好的初始化參數,而這個較好的初始化參數就是需要通過meta learning的方式訓練得到。這里簡單介紹一下machine learning領域內的經典模型:MAML。該模型利用meta learning學習一個好的初始化參數,之后在新的任務上,只要對這個初始化參數少量迭代更新就能很好的適應新的任務。
??????假設模型的初始化參數為??,??表示模型基于task n(??)已完成一輪梯度更新的參數,??取決于??,??是模型在task n測試集上的損失,于是有了總的損失函數:?基于該損失函數,我們對模型進行梯度更新:??
? ? ? 為了更清晰的表示訓練流程,這里我展示一下李宏毅老師關于meta learning的講解示意圖。需要說明的是,這一步通常是先遍歷每個task,求出每個task下的梯度并緩存起來,最后更新整個初始化參數??,這里的??和??是同一個模型下的參數,表示不一樣是為了區分前者是初始化參數(也是我們真正最后想要的)和不同任務下的模型的更新參數,這里的??是模型在task n上已經訓練過并更新之后的參數,區別于??,所以用了不同的符號,再講的明白一些就是,MAML模型并不在意更新后的模型參數??在各個訓練任務上的表現,更多的是在意由更新后的模型參數??在各個task n上訓練出來的??的表現,如果它們都能比較好的收斂到最優值,那這個??就是我們想要訓練得到的模型參數,也就是說MAML更關注模型的訓練“潛力”,而 Model pretraining則更關注模型參數在現有task上的表現。
????? 我們回頭再來看few?shot learning,few shot learning是在小樣本訓練集上訓練一個最優的模型,如果我們先用meta learning的方式在不同的相似task任務上對模型進行training,以此獲得一個較優的初始化參數??,這樣就能在new task少量樣本的情況下,只需進行少許的迭代更新就能收斂到局部最優解。
????3.?學習出好的搜索優化器
前一節使用meta learning來獲得一個較好的初始化參數,而本節旨在用meta learning來學習一個參數更新的策略。通常情況下,梯度更新方式為?也就是說學習率是人為設定的,參數優化的方式基本是固定的,基于meta learning的優化器則是用一個可學習的梯度更新規則,替代手工設計的梯度更新規則?這里的??代表其梯度更新規則函數,通過參數??來確定,其輸出為目標函數??當前迭代的更新梯度值,??函數在這里使用RNN來實現,因為RNN具有時序記憶功能,而梯度迭代的過程中正好是一個時序操作。當我們學習好了這樣一個RNN的策略模型之后(這里亦是通過先驗知識優化了參數搜索空間),后期在更新參數時就可以直接使用這個策略在few-shot任務上進行參數更新了。如下圖所示,圖中的Optimizee是模型參數??的更新過程,Optimizer是優化器參數的更新過程,m則代表meta-learner,m的學習方式和meta learning一樣,每一個t時刻在更新是都會先遍歷所訓練集中的task,求出每個任務下損失和,然后再更新t時刻的梯度,這里的t是迭代的次數。(此處本人尚未看過源碼,如有理解不對,歡迎大佬們指正)
?總 結?
???????文章在少樣本情況下,對于如何利用先驗知識,找到假設空間中的最優解,訓練出一個好的模型的方法描述的很清楚、很清晰,是值得反復品味的綜述性好文。文章根據機器學習誤差理論,先后從數據、模型、算法三個角度進行不同層次的先驗知識嵌入,總體上來說就是如何利用相似且較大的數據集,如何初始化一個好的模型參數,以及如何找到一個好的優化策略,不光是在few shot learning 領域內可以這樣思考,其實我們在實際科研和工作中遇到類似的問題,也可以從這三個方面去考慮,就拿我們非常熟悉的BERT預訓練語言模型,難道不就是這個道理嗎?
參考文獻
[1] Wang, Yaqing, et al. "Generalizing from a few examples: A survey on few-shot learning." ACM Computing Surveys (CSUR) 53.3 (2020): 1-34.
[2] https://www.cnblogs.com/jiangxinyang/p/12163215.html FSL(小樣本學習)綜述
[3] Finn C, Abbeel P, Levine S. Model-agnostic meta-learning for fast adaptation of deep networks[C]//International Conference on Machine Learning. PMLR, 2017: 1126-1135.
[4] Andrychowicz, Marcin, et al. "Learning to learn by gradient descent by gradient descent." arXiv preprint arXiv:1606.04474 (2016).
[5]?https://blog.csdn.net/senius/article/details/84483329 Learning to learn by gradient descent by gradient descent - PyTorch實踐
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯 本站qq群704220115,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【机器学习基础】从Few-shot Learning再次认识机器学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ浏览器怎么把文件添加到私密空间 怎么
- 下一篇: win7系统5分钟自动注销的解决方法