1. 程式人生 > 實用技巧 >谷歌最新模型pQRNN:效果接近BERT,引數量縮小300倍

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

摘要:文字分類是NLP最常見的應用之一,有了BERT之後更是可以通過小批量資料精調達到不錯的效果。但在對速度要求高、沒有錢買GPU、移動裝置部署的場景下,還是得用淺層網路。今天就跟大家介紹Google最近新出的一個模型—— ...

人工智慧學習離不開實踐的驗證,推薦大家可以多在FlyAI-AI競賽服務平臺多參加訓練和競賽,以此來提升自己的能力。FlyAI是為AI開發者提供資料競賽並支援GPU離線訓練的一站式服務平臺。每週免費提供專案開源演算法樣例,支援演算法能力變現以及快速的迭代演算法模型。

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

太細了就對模型要求很高,單獨的詞也不具有太大意義,而太粗了又沒法涵蓋所有詞彙。 這就需要我們在不同的任務上選取不同的粒度。PRADO的作者認為,對於文字分類這樣的簡單任務,很多詞彙是和任務無關的,比如 a, the等。另外,也不需要embedding可以準確的表示每個詞,只需要大概表示出詞所屬的類目就可以了。比如在情感分析任務中,只需要讓模型知道“超棒”和“太讚了”都是一個positive的詞彙,而不用知道這兩個詞的區別在哪裡,甚至用一個embedding去表示這兩個詞都是可以的。
下面是不同任務和細粒度詞表示的相關性,對於語言模型和翻譯任務,就需要準確地區分每個詞:

那PRADO是如何壓縮embedding的呢? 以往在拿到token之後,我們會有一個轉one-hot向量的操作,向量的大小是詞表維度V,然後再經過lookup table得到embedding。而PRADO則是將向量進行了壓縮,具體的操作是: 對token進行雜湊,得到 2B bits 的雜湊值,比如 011001010 用一個投影函式P,將每2個連續的bit對映到 {-1, 0, 1} 中 得到B維的三元向量,比如 [-1, -1, 1, 0, 1] 這樣 將 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月底才放出原始碼,同學們趕緊試用起來呀。

更多精彩內容請訪問FlyAI-AI競賽服務平臺;為AI開發者提供資料競賽並支援GPU離線訓練的一站式服務平臺;每週免費提供專案開源演算法樣例,支援演算法能力變現以及快速的迭代演算法模型。

挑戰者,都在FlyAI!!!