谷歌最新模型pQRNN:效果接近BERT,參數量縮小300倍

文本分類是NLP最常見的應用之一,有了BERT之後更是可以通過小批量數據精調達到不錯的效果。但在對速度要求高、沒有錢買GPU、移動設備部署的場景下,還是得用淺層網絡。

今天就跟大家介紹Google最近新出的一個模型——pQRNN,只利用監督數據(無蒸餾),以約1/300的參數量達到了接近BERT的效果。pQRNN是Google去年更小模型PRADO的一個改進版本,下面從PRADO講起,來看看它們是如何以小博大的叭。

pQRNN官方博客:

https://ai.googleblog.com/2020/09/advancing-nlp-with-efficient-projection.html

PRADO論文:

https://www.aclweb.org/anthology/D19-1506/

PRADO代碼:

https://github.com/tensorflow/models/tree/master/research/sequence_projection

關注「NLPCAB」回覆「1001」下載論文~

PRADO模型

Embedding

對於我們常用的NLP模型來說,Embedding詞表往往是參數量佔比較大的一塊兒。中文如果選用字級別的詞表,大概在一兩萬級別,詞級別則會幾萬或者更大,還會出現OOV。英文多出了子詞級別,但無論哪種粒度的劃分都是存在缺點的:

太細了就對模型要求很高,單獨的詞也不具有太大意義,而太粗了又沒法涵蓋所有詞彙

這就需要我們在不同的任務上選取不同的粒度。PRADO的作者認爲,對於文本分類這樣的簡單任務,很多詞彙是和任務無關的,比如 a, the等。另外,也不需要embedding可以準確的表示每個詞,只需要大概表示出詞所屬的類目就可以了。比如在情感分析任務中,只需要讓模型知道「超棒」和「太讚了」都是一個positive的詞彙,而不用知道這兩個詞的區別在哪裏,甚至用一個embedding去表示這兩個詞都是可以的。

下面是不同任務和細粒度詞表示的相關性,對於語言模型和翻譯任務,就需要準確地區分每個詞:

那PRADO是如何壓縮embedding的呢?

以往在拿到token之後,我們會有一個轉one-hot向量的操作,向量的大小是詞表維度V,然後再經過lookup table得到embedding。而PRADO則是將向量進行了壓縮,具體的操作是:

  1. 對token進行哈希,得到 2B bits 的哈希值,比如 011001010

  2. 用一個投影函數P,將每2個連續的bit映射到 {-1, 0, 1} 中

  3. 得到B維的三元向量,比如 [-1, -1, 1, 0, 1] 這樣

  4. 將 1xB 的三元向量和 Bxd 的矩陣相乘,得到 d維embedding表示

這樣,我們就得到了一個壓縮後的token表示,不用準確地用one-hot來表示每個token。作者把B的維度限制在 [128, 512],d的維度限制在[32, 96],從詞表參數量上比BERT小了三四個數量級。

整體結構

PRADO主要的創新就在Embedding部分,後續就比較普通,選擇了性價比較高的CNN+Attention。這裏Attention其實是對CNN的結果進行了Pooling:先計算了一路CNN的結果,再計算softmax得到每個step的權重,然後把另一路CNN的結果加權起來,得到一個向量。

最後把不同尺寸kernel輸出的向量concat,再過classifier(我們熟悉的套路又漸漸回來了)。

PRADO模型結構

實驗效果

在效果上,PRADO肯定是比之前的淺層模型要好,然而我去看了一眼每個數據集的SOTA,emm。。效果上還需努力鴨

PRADO效果

令我感興趣的是,8-bit量化之後的PRADO居然效果更好!作者認爲主要是量化減少了過擬合,在數據越少的數據集上效果提升就更明顯。

對比實驗,性價比吊打LSTM

最後,作者還做了遷移實驗,證明這種embedding改進的可遷移性,發現只freeze上embedding和encoder,只finetune分類器就收斂得很快

PRADO遷移學習實驗

pQRNN

介紹完了PRADO,再來看谷歌新出的pQRNN就很好懂了,實際上只是把encoder換成了QRNN(quasi-RNN):

pQRNN模型結構

這裏的Projection就是得到三元的過程,Bottleneck就是將三元向量embedding。

雖然沒什麼太大創新,但比較激動的是pQRNN的效果接近了BERT(之前PRADO都是慘不忍睹)

pQRNN

不過這個結論只在一個數據集上驗證了,其他數據上的表現未可知。

總結

PRADO/pQRNN的主要改進點就在embedding部分,確實文本分類對於token的粒度要求不高,只用抓住句子裏最主要的一兩個詞就行了,所以max-pooling經常會比mean-pooling效果要好。

但這裏有個需要探討的點,就是如何遷移到中文任務上。單純的哈希是沒法將相似的詞映射到相似的三元向量的,這裏我認爲應該是進行字粒度的tokenization,這樣相似的「好贊」、「超讚」的表示就很接近了,再過CNN就可以捕獲到詞級別的信息。

去年PRADO就出來了,但20年8月底才放出源碼,同學們趕緊試用起來呀。

----------------------------------------

大家好我是rumor

一個熱愛技術,有一點點淡淡的幽默的妹子

歡迎關注我

一起在人工智能時代旋轉跳躍眨巴眼