作者:黎檳華 耿瑞瑩 李永彬 孫健
單位:雲小蜜Conversational AI團隊
隨著深度學習和自然語言處理技術的發展,很多公司都在致力於發展人機對話系統,希望人和機器之間能夠通過自然語言進行交互。筆者所在的小蜜北京團隊打造了一個智能對話開發平臺--Dialog Studio,以賦能第三方開發者來開發各自業務場景中的任務型對話,而其中一個重要功能就是對意圖進行分類。大量平臺用戶在創建一個新對話任務時,並沒有大量標註數據,每個意圖往往只有幾個或十幾個樣本,那如何使用現有的少量樣本構建意圖分類模型呢?面對這類冷啟動問題,我們提出使用小樣本學習(few-shot learning)來解決對話平臺中的意圖識別冷啟動問題。關於few-shot learning的系統知識和最新進展情況,請參考我們之前的綜述,本文主要詳細介紹我們的工作:首先總結前人工作提出了Encoder-Induction-Relation的Few-shot Learning Framework,然後融合capsule network和dynamic routing,提出了Induction Network,在兩個小樣本文本分類數據集上,都做到了state-of-the-art。
問題定義
人類非常擅長通過極少量的樣本識別一類物體,比如小孩子只需要書中的一些圖片就可以認識什麼是“斑馬”,什麼是“犀牛”。在這種人類的快速學習能力的啟發下,我們希望模型在大量類別中學會通過少量數據正確地分類後,對於新的類別,我們也只需要少量的樣本就能快速學習,這就是Few-shot learning 要解決的問題。
Few-shot learning是meta learning在監督學習領域的一種應用場景,我們training階段將數據集按類別分解為不同的meta-task,去學習類別變化的情況下模型的泛化能力,在testing階段,面對全新的類別以及每個類別僅有少量數據,不需要變動已有的模型,就可以完成分類。
形式化來說,few-shot的訓練集中包含了大量的類別,每個類別中有少量樣本。在訓練階段,會在訓練集中隨機抽取C個類別,每個類別K個樣本(總共C×K個數據)構建一個meta-task,作為模型的支撐集(Support set)輸入;再從這C個類中抽取一批樣本作為模型的預測對象(Query set或者Batch set)。即要求模型從C×K個數據中學會如何區分這C個類別,這樣的任務被稱為C-way K-shot問題。
訓練過程中,每輪(episode)都會採樣得到不同meta-task的,即包含了不同的類別組合,這種機制使得模型學會不同meta-task中的共性部分,比如,如何提取重要特徵及比較樣本相似等,忘掉meta-task中領域相關部分。通過這種學習機制學到的模型,在面對新的未見過的meta-task時,也能較好地進行分類。詳情見Algorithm 1.
Few-shot Learning 框架
Few shot learning中較為熱門的方法大多是metric-based,即通過類別中少量樣本計算得到該類別的表示,然後再用某種metric方法計算得到最終的分類結果。下面簡單的介紹現有的相關方法。
Siamese Network
如圖1所示,孿生網絡(Siamese Network)[1]通過有監督的方式訓練孿生網絡來學習,然後重用網絡所提取的特徵進行one/few-shot學習。具體的網絡是一個雙路的神經網絡,訓練時,通過組合的方式構造不同的成對樣本,輸入網絡進行訓練,在最上層通過樣本對的距離判斷他們是否屬於同一個類,併產生對應的概率分佈。在預測階段,孿生網絡處理測試樣本和支撐集之間每一個樣本對,最終預測結果為支撐集上概率最高的類別。
Match Network
相比孿生網絡,匹配網絡(Match Network)[2] 如圖2所示,它為Support集和Batch集構建不同的編碼器,最終分類器的輸出是支撐集樣本和query之間預測值的加權求和。該網絡在不改變模型的前提下能對未知類別生成標籤,同時提出了基於memory和attention的matching nets,使得可以快速學習。此外該文章還使整個任務遵循傳統機器學習的一個原則,即訓練和測試是要在同樣條件下進行的,提出在訓練的時候不斷地讓網絡只看每一類的少量樣本,這使得訓練和測試的過程是一致的。這一點也使得後續文章都會基於這樣的方式進行訓練和測試。
Prototype Network
原型網絡(Prototype Network)[3]基於這樣的想法:每個類別都存在一個原型表達,該類的原型是support set在embedding空間中的均值。然後,分類問題變成在embedding空間中的最近鄰。如圖3所示,c1、c2、c3分別是三個類別的均值中心(稱Prototype),將測試樣本x進行embedding後,與這3箇中心進行距離計算,從而獲得x的類別。
文章採用在Bregman散度下的指數族分佈的混合密度估計,文章在訓練時採用相對測試時更多的類別數,即訓練時每個episodes採用20個類(20 way),而測試對在5個類(5 way)中進行,其效果相對訓練時也採用5 way的提升了2.5個百分點。
Relation Networks
前面介紹的幾個網絡結構在最終的距離度量上都使用了固定的度量方式,如cosine,歐式距離等,這種模型結構下所有的學習過程都發生在樣本的embedding階段。而Relation Network[4]認為度量方式也是網絡中非常重要的一環,需要對其進行建模,所以該網絡不滿足單一且固定的距離度量方式,而是訓練一個網絡來學習(例如CNN)距離的度量方式,在loss方面也有所改變,考慮到relation network更多的關注relation score,更像一種迴歸,而非0/1分類,所以使用了MSE取代了cross-entropy。
Few-shot Learning Framework
回顧上述方法,從表1中可以看出,現有的方法在表示新的類別時只是通過簡單對樣本向量加和(Relation Net)或求平均(Prototype Net),在這種情況下,由於自然語言的多樣性,同一個類的不同表述只有一部分是和類別的內容相關,其他部分則隨每個人的語言習慣而產生較大的變化,所以很多關鍵信息都會丟失在同一個類的不同表述產生的噪音之中。比如,在運營商領域,同樣是表述“換套餐”的意圖,既可以說的簡單明瞭:“我想換套餐”,也可以說的十分繁瑣:“我想下個月換套餐,就是把原本不需要的套餐取消掉,換個便宜的…”。如果只是對不同話術簡單加和,那麼和分類無關的信息就會產生累積,進而影響分類的效果。
與大量樣本的監督學習不同,噪音問題會在few shot learning中變得更為明顯,因為在監督學習的大量樣本下,某個類別的數據中關鍵信息和噪音的比例懸殊,模型容易區別哪些是噪聲(例如:詞或n-gram),哪些是有效信息(例如:業務關鍵詞或句式),相反few shot learning僅有少量樣本,很難用簡單的機制來捕獲這樣的信息,因此顯式建模類別表示的步驟是非常有意義的,具體的實現細節在下文會詳細描述。
所以更好的學習方法應該是建模歸納類別特徵的能力:忽略掉和業務無關的細節,從樣本級別多種多樣的表達之中總結出類別的語義表示。因此,我們需要站在一個更高的視角,去重構支撐集中不同樣本的層次化語義表示,動態的從樣本信息中歸納出類別特徵。在本工作中,我們提出了Induction Network,通過將動態路由算法與meta learning機制結合,顯式建模了從少量樣本中歸納出類別表示的能力。
首先,我們團隊總結了metric-based方法的的共性,提出了Encoder-Induction-Relation的三級框架[5],如圖5所示,Encoder模塊用於獲取每個樣本的語義表示,可以使用典型的CNN、LSTM、Transformer等結構,Induction模塊用於從支撐集的樣本語義中歸納出類別特徵,Relation模塊用於度量query和類別之間的語義關係,進而完成分類。
如表1所示,之前的工作往往致力於學習不同的距離度量方式,而忽視了對樣本表示到類別表示的建模。而在自然語言當中,由於每個人的語言習慣不同,同一個類別的不同表述往往有很多種,如果僅僅是簡單加和或取平均來作為類別的表示,這些與分類無關的干擾信息就會累加,影響最終的效果,因此我們的工作顯式的建模了從樣本表示到類別表示這一能力。
Few-shot learning意圖識別模型
如圖6所示,我們的模型基於Encoder-Induction-Relation的三級框架,其中Encoder模塊使用基於自注意力的Bi-LSTM,Induction 模塊使用動態路由算法,Relation模塊使用神經張量網絡。
Encoder模塊
本工作共使用bi-lstm self-attention建模句子級別的語義,輸入句子的詞向量矩陣,經編碼得到句子級的語義表示e。
Induction 模塊
將支撐集中每個樣本編碼為樣本向量以後,Induction模塊將其歸納為類向量
這一過程中我們將支撐集中的樣本向量視為輸入膠囊,經過一層dynamic routing變換後,輸出膠囊視為每個類的語義特徵表示。
首先,是對所有樣本做一次矩陣轉換,意味著將樣本級的語義空間轉換到類別級的語義空間,在此過程中我們對支撐集中所有的樣本向量使用同一個轉換矩陣,如此對於任意規模的支撐集都能進行處理,也就意味著我們的模型可以應對any-way any-shot的場景。
然後,通過dynamic routing的方式過濾無關信息,提取類別特徵。在每次dynamic routing的迭代中,我們動態的調整上下兩層之間的連接係數並確保其加和為1:
其中b_i連接係數的邏輯值,在第一次迭代時初始化為0。對於給定的樣本預測向量,每個候選類向量如下:
然後使用一個非線性的squash函數來保證每個類向量的模長不超過1:
每次迭代的最後一步是通過“routing by agreement”的方式來調節連接強度,如果產生的類候選向量和某樣本預測向量之間有較大的點乘結果,則增大他們之間的連接強度,否則減小之。
通過這種動態路由的方式建模樣本向量到類別向量的映射過程,能夠有效過濾與分類無關的干擾信息,得到類別特徵,詳情見Algorithm 2。
Relation 模塊
我們通過Induction模塊得到支撐集中每個類別的類向量表示,通過Encoder模塊得到Batch set中每個query的向量,接下來要做到就是衡量二者之間的相關性。 Relation 模塊是典型的neural tensor layer,首先通過三維tensor建模每個類向量和query向量對之間的交互關係,然後使用全連接層得到關係打分。
目標函數
我們使用最小平方損失來訓練我們的模型,將關係打分迴歸至真實標籤:匹配的類和query對之間的打分趨向於1而不匹配的打分趨向於0。在每個episode中,損失函數定義如下:
我們使用梯度下降法更新Encoder、Induction和Relation三個模塊的參數。訓練完成之後,我們的模型在識別全新的類別時不需要任何finetune,因為在meta 訓練階段已經賦予了模型足夠的泛化能力,而且會隨著模型的迭代不斷累加。
實驗
我們在兩個few-shot文本分類的數據集上驗證模型的效果,所有的實驗使用tensorflow實現。
數據集
ARSC數據集由Yu 等人[6]在NAACL 2018提出,取自亞馬遜多領域情感分類數據,該數據集包含23種亞馬遜商品的評論數據,對於每一種商品,構建三個二分類任務,將其評論按分數分為5、4、 2三檔,每一檔視為一個二分類任務,則產生233=69個task,然後取其中12個task(43)作為測試集,其餘57個task作為訓練集。
ODIC數據集來自阿里巴巴對話工廠平臺的線上日誌,用戶會向平臺提交多種不同的對話任務,和多種不同的意圖,但是每種意圖只有極少數的標註數據,這形成了一個典型的few-shot learning任務,該數據集包含216個意圖,其中159個用於訓練,57個用於測試。
參數設置
預訓練詞向量使用300維glove詞向量,LSTM隱層維度設為128,dynamic routing的迭代器愛次數設為3,Relation模塊的張量數h=100。我們在ARSC數據集上構建2-way 5-shot的模型,在ODIC數據集上C和K在[5,10]中選取得到四組實驗。在每個episode中,除了為支撐集選取K個樣本以外,我們還為採到的每個類再採20個樣本作為query set,也就是說在5-way 5-shot 場景下每次迭代訓練都會有55+520=125個樣本參與訓練。
實驗結果
在ARSC和ODIC數據集上實驗結果如表2和表3所示,
由表2可知,我們提出的Induction-Network-Routing比ROBUSTTC-FSL正確率高出3%,他們是這個數據上之前的state-of-the-art。這是因為ROBUSTTC-FSL試圖在樣本層面構造一個足夠魯棒的度量方法,所以將多種度量方式進行組合,這種方法無法擺脫同一個類別中不同表述所產生的干擾。
在ODIC數據集上,我們提出的Induction-Network-Routing模型在四個不同的實驗設置中都取得了最好的效果,通過表1可以看到,在Encoder使用相同結構的情況下,我們的模型通過建模class級別的歸納能力和更復雜的距離度量方式,取得了最好的結果,進一步的,我們通過比較不同的Induction方式,最終選取了Dynamic Routing的方式來構建樣本級到class級的歸納表示能力。
如表1所示,我們將基於metric的方法都納入Encoder-Induction-Relation框架中,可以發現之前的工作往往致力於學習不同的距離度量方式,而忽視了對樣本表示到類別表示的建模。而在自然語言當中,由於每個人的語言習慣不同,同一個類別的不同表述往往有很多種,如果僅僅是簡單加和或取平均來作為類別的表示,這些與分類無關的干擾信息就會累加,影響最終的效果,因此我們的工作顯式的建模了將樣本表示歸納為類別表示的能力,並超過了之前的state-of-the-art的模型。
實驗分析
我們進一步分析轉置矩陣的影響和模型對encoder模塊的影響。
轉置矩陣的作用
在5-way 10-shot場景下,我們用t-sne降維並可視化經過transformation轉置矩陣前後支撐集樣本的變化,如圖所示,可以發現經過轉置矩陣之後的支撐集樣本向量可分性明顯變好。這也證明了矩陣轉置過程對於轉換樣本特徵到類別特徵的有效性。
Query 可視化
我們發現Induction Network不僅能夠生成質量更高的類向量,而且可以幫助encoder模塊學習更好的樣本語義表示。通過隨機抽取5個測試集的類別,並將其中所有樣本Encoder之後的向量可視化,我們發現Induction Network中學到的樣本向量可分性明顯高於Relation Network,這說明我們的Induction模塊和Relation模塊通過反向傳播給了Encoder模塊更為有效的信息,使其學到了更易於分類的樣本表示
結論
在本工作中,我們提出了Induction Network 來解決少樣本文本分類的問題。我們的模型重構支撐集樣本的層次化語義表示,動態歸納出類別的特徵表示。我們將動態路由算法和meta learning的框架結合,模擬了類人的歸納能力。實驗結果表明我們的模型在不同的少樣本分類數據集上都超過了當前的state-of-the-art模型。
參考文獻
[1] Koch, Gregory, Richard Zemel, and Ruslan Salakhutdinov. "Siamese neural networks for one-shot image recognition." ICML Deep Learning Workshop. Vol. 2. 2015.
[2] Oriol Vinyals, Charles Blundell, Tim Lillicrap, Daan Wierstra, et al. Matching networks for one shot learning. In Advances in Neural Information Processing Systems, pages 3630–3638, 2016.
[3] Snell, Jake, Kevin Swersky, and Richard Zemel. "Prototypical networks for few-shot learning." Advances in Neural Information Processing Systems. 2017.
[4] Sung, Flood, et al. "Learning to compare: Relation network for few-shot learning." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
[5] Geng R, Li B, Li Y, et al. Few-Shot Text Classification with Induction Network[J]. arXiv preprint arXiv:1902.10482, 2019.
[6] Yu, Mo, et al. "Diverse few-shot text classification with multiple metrics." arXiv preprint arXiv:1805.07513