距離上篇文章又一個月了。。。時光飛逝。。。再次立下一周一篇的flag

最近讀了一篇專欄文章BERT時代與後時代的NLP,收穫頗豐。算是作者的同行,最近也在做類似的東西,但是作者都給總結了起來,讓我又重新串了一遍那些思想,查漏補缺。另外最近沒怎麼追蹤前沿,看到作者又列舉了兩篇我一直關注的transformer系文章,趕緊打出來看了,順便寫篇文章記錄下收穫。

1. MASS模型

MASS的主要貢獻是提出一種新的Pre-train seq2seq任務的方法。

BERT的成功把nlp帶向了pretrain+finetune時代,而對於文本生成任務(機器翻譯、文本摘要、生成問答),由於語料對較少,更需要使用pretrain的模型來減少標註代價。

看到這裡的讀者可以先自己想一下如何pretrain seq2seq的任務。大家首先能想到的估計就是BERT+LM,因為BERT的編碼能力比其他BiLM的能力強一些。但這樣pretrain的問題就是,如果我們的語料是unsupervised,就要分開預訓練encoder和decoder,可能會導致兩者的分布不一致。

於是MASS的作者就借鑒了Masked LM的思想,只用一句話就讓encoder和decoder同時訓練。具體做法是mask掉句子的一部分x,再用decoder去預測x,如下圖:

注意,在經典的seq2seq結構中,decoder的輸入都是完整的,而這裡只輸入應該被預測的token,作者的解釋是這樣可以讓decoder依賴於encoder的編碼,讓兩者更好地共同訓練。

之後,作者更進一步,居然把BERT和GPT統一了起來:

圖a): 可能會有同學覺得decoder不是雙向的,沒法把encoder和decoder看成BERT,但其實只把encoder看成BERT就可以,decoder看作classifier層。

圖b): 單向LM(GPT),從左到右進行預測,encoder沒有給decoder任何信息。

2. 實驗細節

  1. 語言:因為要應用到機器翻譯任務,所以預訓練模型採用4種語言,作者把四種語言同時進行Byte-Pair Encoding,生成一個60k的詞表。在預訓練的時候也是同時用四種語言的語料,即一個batch是32*4個句子。
  2. Mask策略:從隨機一個位置開始,連續mask掉句子長度50%的tokens(經過實驗驗證較優)。且參考BERT的策略,80%的時間用[M],10%用隨機的token,10%保留原token。
  3. Decoder優化:因為預測的token都是連續的,在訓練decoder時可以直接把padding去掉,但要注意保留positional encoding,這樣可以節省50%的時間。
  4. 預訓練LR=1e-4,NMT的精調LR=1e-4。(感覺精調的LR應該小一些吧)

3. 結論

  1. MASS達到了機器翻譯的新SOTA
  2. MASS > BERT+LM式的預訓練
  3. mask掉連續的token,可以得到更好的語言建模能力(已實驗驗證)
  4. 只讓decoder從encoder側獲取信息,得到的模型效果更好(已實驗驗證)

總體來講,MASS還是給我開闊了新的思路(畢竟我沒什麼思路),其實仔細想這個想法也是不難想出來的,關鍵還是要動手去驗證,並且花心思去提升效果,細節見英雄。

推薦閱讀:

相关文章