1,概述html
目前有效的文本分類方法都是創建在具備大量的標籤數據下的有監督學習,例如常見的textcnn,textrnn等,可是在不少場景下的文本分類是沒法提供這麼多訓練數據的,好比對話場景下的意圖識別,這個時候若是咱們還以傳統的深度學習模型+softmax的形式來分類的話,是極容易陷入過擬合的狀態。所以就有不少人研究在少許樣本下如何建模。one-shot learning,few-shot learning,甚至是zero-shot learning都是旨在解決這類的問題。git
本篇博客將會介紹下幾種比較經典的one-shot learning或者是few-shot learning。github
2,模型介紹算法
接下來咱們來介紹幾篇經典的文章,來看看都是怎麼去作few-shot learning或者one-shot learning的。但由於大部分文章中的例子都是在圖像領域的,所以不會很細的去描述模型的結構,應用到文本中這些結構能夠本身去選擇,在這裏會側重講述其作法,代碼實現見https://github.com/jiangxinyang227/few_shot_learning。數據集採用的是由阿里巴巴團隊整理出來的ARSC數據集。網絡
論文一:Siamese Neural Networks for One-shot Image Recognition
這篇論文的主體結構是孿生網絡(Siamese Network),以前的一片博客有專門介紹過孿生網絡,詳情見孿生網絡(Siamese Network)在句子語義類似度計算中的應用。這一篇介紹下孿生網絡在one-shot learning中的應用。函數
假定你如今對孿生網絡結構有個清晰的瞭解,咱們如今來看看是怎麼用孿生網絡作one-shot learning的。咱們給定三份數據集,用於訓練的train set,用於測試時的support set,query。post
train set包含M個類別,每一個類別下有N個樣本,咱們如今隨機從每一個類別下去採樣,從同一類別下采樣相同的兩個句子做爲正樣本,從不一樣的類別下采樣兩個句子做爲負樣本,保證正負樣本對的數量爲1:1。而後輸入到孿生網絡中做爲一個二分類的任務來度量兩個句子之間的距離。學習
在本論文中的度量方式用的是曼哈頓距離,並採用了加權和的方式來加權,加權係數是經過網絡本身學習的,其表達式以下:測試
上面式子中$h_{1, L-1}^{(j)},h_{2, L-1}^{(j)}$分別表示第一個句子和第二個句子最終的向量表示,$\alpha_j$是上面兩個向量相減後獲得的向量的第$j$個值得係數,這個值是經過網絡本身學習獲得的,$\sigma$表示sigmoid函數,輸入一個0-1之間的機率值。優化
上面說到經過這種採樣方式將問題轉化成一個0,1的二分類問題,所以損失函數能夠採用二元交叉熵損失函數。
論文中也給出了本身的優化算法:
引入了動量和正則,不過這裏的正則的做用是什麼,我不太清楚。
one-shot learning在測試階段是怎麼實現的呢?具體以下:
首先在給定的測試時的support set,support set是一個C個類別(原則上這C個類別和train set中的M個類別是不相交的,這樣才符合one-shot learning的本質),且每一個類別下只有一個樣本的數據集,如今給定一個query,將query和support set中的樣本輸入到孿生網絡中,獲得query和每一個樣本之間的機率分數,在這裏由於是one-shot,所以support set中每一個樣本表示一個類別,而後取機率分數最大的類別做爲輸出類別,表達式以下:
上面式子中$P^{(c)}$表示query和support set中的樣本的機率分數。
論文二:Prototypical Networks for Few-shot Learning
原型網絡(Prototypical Network)中引入了一個混合密度估計的思想,用few-shot樣本集的均值來表示該類別的向量,咱們來看看具體的作法
給定一個訓練時的train set,測試時的support set和query。support set 包含C個類別,每一個類別下含有K個樣本。train set 包含M個類別,每一個類別下含有N個樣本。爲了在訓練時期模擬測試時的場景,咱們在訓練時構造一系列的episode,每一個episode實際上就是一個meta task。那該怎麼構造這樣一個episode呢?從train set中隨機抽取C個類別,而後從每一個類別中隨機抽取K個樣本,構造訓練時期的support set,這樣的問題也稱爲C-way K-shot問題,接着從另外N-K個樣本中選取n個樣本做爲訓練時期的query。構造一系列這樣的episode來訓練網絡。其具體的結構能夠描述以下:
1)embedding層,將訓練時的support set和query embedding成向量表示
2)特徵提取層,這裏能夠用LSTM來提取句子的高層特徵
3)針對support set作的類的向量表示層,其實就是對每一個類中的K個樣本取平均來表示這個類
上面式子中$f_{\phi}(x_i)$表示support set中第$i$個樣本的向量表示,$k$表示第$k$個類別。
4)計算query和每一個類別之間的分數
上面式子中$f_{\phi}(X)$表示query的向量表示,$d(.)$是一個距離度量函數,上面整個式子是一個softmax函數,獲得query和每一個類別的機率分數。
真個算法流程圖以下:
整個算法原理圖示化:
如上圖所示,整個模型也是能夠很好的遷移到zero-shot,one-shot的任務上的。
到了這裏還有一個問題,就是距離度量函數$d(.)$該怎麼選擇,上面咱們說到是經過計算類別下全部樣本的均值來表示該類別,文章中引入了Bregman 散度的概念,Bregman 散度認爲:達到與指定點(query)最小距離的點爲樣本均值點,也就是說當咱們的度量函數$d(.)$選擇Bregman 散度時,用樣本均值來表示類向量是最佳選擇,而歐式距離的平方就是一種Bregman 散度。所以本文的距離度量函數是歐式距離的平方:
上面添加的負號是將求距離最小轉換成求距離最大。
測試的時候和訓練時的episode中的操做同樣,將測試時的support set 和query輸入到模型中,而後計算query和每一個類別的機率分數,選擇最大的機率值的類。
論文三:Learning to Compare: Relation Network for Few-Shot Learning
這篇論文中提出了關係網絡(Relation Network)的概念。整個訓練和預測時的方法和上一篇的原型是同樣的。其主要創新點在於以前的網絡都會給定一個肯定的距離度量函數,然而做者認爲沒有一個肯定的距離函數能做爲全部類別的最佳度量函數,所以做者讓網絡本身去學習一個這樣的度量函數,這裏的Relation network就是經過關係網絡來度量query和各種別之間的關係。
其網絡結構圖以下:
在這裏是一個圖像分類的例子,轉換到文本上只要更改第一個embedding module。在這個模塊以後有一個relation module模塊,這個模塊就是度量query和每一個類別的關係分數的。
假設support set總共有C個類別,以one-shot爲例,其關係分數表達式以下:
上面式子中$x_i$表示support set中第$i$個樣本,由於是one-shot,因此一個樣本表示一個類別,所以$f_{\varphi}(x_i)$表示的是第$i$個類別的向量,$f_{\varphi}(x_j)$表示的是query中第$j$個樣本的向量。
而轉換到few-shot的場景下,論文這裏是經過對樣本向量求和的方式來表示類向量。由於關係網絡獲得是一個關係分數,所以做者認爲用迴歸的方式來訓練網絡更合適,所以這裏的損失函數是均方偏差,表達式以下:
真實的標籤仍是0和1,用計算出來的關係分數和0,1計算均方偏差。
論文四:Few-Shot Text Classification with Induction Network
這篇論文是阿里小蜜團隊提出的,併成功用在了他們的對話平臺中,用來作少樣本的意圖識別。總體的訓練方式和上面兩篇論文一致,可是在類向量的表示上再也不是簡單的求均值或者求和,此外也引入了關係網絡來計算query和類別之間的關係分數。
訓練模型的算法以下:
和上面的訓練方式基本一致。
首先來看下整個網絡結構圖:
整個網絡結構由三個模塊組成:Encoder Module,Induction Module,Relation Module。咱們接下來一一介紹這三個模塊:
1)Encoder Module
這個模塊就是對輸入的樣本提取高層特徵,用向量來表示它們。
在這裏用的方法就是Bi-Lstm + attention的方式,這個作NLP的基本都很清楚,就不詳述。
2)Induction Module
這裏也是整個論文的創新點,提出用膠囊網絡(Capsules Network)來動態的表徵類向量,首先膠囊網絡是有Hinton提出的,關於膠囊網絡具體的描述見看完這篇,別說你還不懂Hinton大神的膠囊網絡,capsule network。在這裏經過動態路由算法來獲得某個類別下不一樣樣本對類向量的貢獻,簡單理解和attention中的加權和相似,因此後面做者也給出了基於attention的方法來表示類向量的實驗結果,可是效果較膠囊網絡要差一些。
首先將Encoder Module獲得的support set的結果表示爲$e^s$,query的結果表示爲$e^q$,具體的流程以下:
(1)首先用一個矩陣將$e^s$映射到另外一個空間,做者認爲這一步很重要,能夠起到相似聚類的效果,將相同的樣本映射到一個相同的子空間中,做者給出了轉換先後可視化圖的對比
能夠看到矩陣映射以後類別之間的界面更加明顯,此外也和論文三作了對比:
能夠看到本論文提出的Induction Network在類別聚合上的效果更好。
這個映射轉換的公式以下:
(2)對動態路由的值歸一化
上面的$i$表示第$i$個類
(3)加權和獲得類向量
(4)通過激活函數squash函數,獲得新的類向量
(5)更新動態路由值
這裏的更新方式確保了和類向量相近的樣本向量對應的路由值會增大,即$e_{i, j}^s$ 和 $c_i$的點積大,則$b_{i, j}$就大,在迭代計算$c_i$的時候,樣本$j$的貢獻就大。
動態路由值在一開始會所有初始化爲0,通過softmax後能夠認爲全部的樣本對類向量的貢獻是同樣的,通過迭代能夠獲得新的動態路由值。在這裏的迭代次數爲3,整個Induction Module的算法以下:
3)Relation Module
關係模塊就是來度量query和類別之間的關係分數的,其計算公式以下:
最後的損失函數也是採用了均方偏差。
參考文獻:
Siamese Neural Networks for One-shot Image Recognition
Prototypical Networks for Few-shot Learning
Learning to Compare: Relation Network for Few-Shot Learning
Few-Shot Text Classification with Induction Network
數據集來源:Mo Yu, Xiaoxiao Guo, Jinfeng Yi, Shiyu Chang, Saloni Potdar, Yu Cheng, Gerald Tesauro, Haoyu Wang, and Bowen Zhou. 2018. Diverse few-shot text classification with multiple metrics