首先我確定要改變Transformer的編解碼器結構,那麼我是否還可以使用Bert、MASS等預訓練模型?

如果使用預訓練, 1.使用單語語料預訓練的權重遷移到我的翻譯模型上 2.語料經過預訓練處理,可以獲取更多的語義特徵,然後用這些經過預訓練處理的語料來訓練我自己改變結構的Transformer模型的參數權重

1正確還是2正確?

我是不是可以使用ELMO來預訓練我的語料,然後把訓練好的詞嵌入輸入到我的transformer中?


nlp的機器翻譯任務,預訓練模型怎麼使用?

我覺得做一個任務之前,還是先明確一下目的:

  1. 搞研究:是想對transformer結構進行改進,證明其在翻譯任務上使效果變好,然後發一篇論文?
  2. 打比賽:有個翻譯比賽,沒有太多平行語料,想直接用預訓練模型,然後通過改進transformer結構提升效果?
  3. 做業務:公司有個翻譯業務,情況同2

無論是上述哪種目的,我覺得如果是普通語種的翻譯任務(英-法、英-德、英-中等),都可以去網上找到一些平行語料,然後實現那個任務上的SOTA(預訓練模型在翻譯任務上並沒有SOTA),之後在SOTA上做改進。如果是英-小語種,平行語料少,那確實可以選用預訓練模型。

首先我確定要改變Transformer的編解碼器結構,那麼我是否還可以使用Bert、MASS等預訓練模型?

是可以用的,載入時可以把BERT、MASS的參數拿過來,但如果自己加了新的層,建議再預訓練一段時間,否則直接精調效果不會很好。

如果使用預訓練, 1.使用單語語料預訓練的權重遷移到我的翻譯模型上 2.語料經過預訓練處理,可以獲取更多的語義特徵,然後用這些經過預訓練處理的語料來訓練我自己改變結構的Transformer模型的參數權重

1正確還是2正確?

我覺得1+2是一起的,增加transformer參數的話還需要再預訓練。

我是不是可以使用ELMO來預訓練我的語料,然後把訓練好的詞嵌入輸入到我的transformer中?

也是可以的,但為什麼要這麼複雜呢。。沒看到結果之前無法肯定地說好還是不好

另外,我覺得還有個問題,主要和另外一個語種有關。如果是英文字母可以表示的語言,詞表用英語的就可以了,GPT2和T5都是這樣做的,否則的話改變詞表還要從新預訓練encoder或者decoder。

最後,建議不要著急改transformer結構,先花幾天把領域內的SOTA熟悉了,BERT系模型熟悉了,就知道該怎麼做了



首先我確定要改變Transformer的編解碼器結構,那麼我是否還可以使用Bert、MASS等預訓練模型?

肯定是可以的呀,就是怎麼用的問題啦

可以用bert的參數來初始化encoder,然後finetune,這又牽扯到tune哪裡不tune哪裡的問題,還有decoder是否初始化的問題

也可以用elmo的方式來使用bert,還有adapter 知識蒸餾等

貌似預訓練在平行語料多的語言提升很小,但是小語種還是ok的,畢竟語料不足。


如果使用預訓練, 1.使用單語語料預訓練的權重遷移到我的翻譯模型上 2.語料經過預訓練處理,可以獲取更多的語義特徵,然後用這些經過預訓練處理的語料來訓練我自己改變結構的Transformer模型的參數權重

1肯定是可以的呀

2說的是feature base那種使用嘛?不懂題目意思

具體哪個結果好和語料大小有關,可以試一下


我是不是可以使用ELMO來預訓練我的語料,然後把訓練好的詞嵌入輸入到我的transformer中?

這個很多做過的,可以直接看結論,或者自己

推銷一波師兄論文,被AAAI2020錄用

Improving Neural Machine Translation with Pre-trained Representation

https://arxiv.org/abs/1908.07688


你要是改了結構,大概率是沒法直接套用參數的。

當然transformer這東西的玩法很多,根據你改的地方不同,沒改的地方你可以先把pretrain的參數freeze起來,讓新增的參數先訓練一段時間,然後在一起joint的訓練。


成熟的業界機器翻譯系統可能就不光指著end2end的模型了,核心的模型固然重要,但是如果有特別好的數據前處理,數據回填和校驗機制,最後整體的翻譯系統效果會好特別多。

當前來看,機器翻譯從專家系統、NMT到現在的Seq2seq架構,一路走來,確實是越來越成熟了,但是端到端的預測始終還有很多瑕疵,加入專業的知識領域知識(先驗知識)確實是可以改善翻譯質量,可以嘗試一下融入知識圖譜、大規模預訓練模型來試試。


目前預訓練模型的使用,在題主提的方向1:使用單語語料預訓練的權重遷移到翻譯模型上,有一些探索。只說結論,大概能帶來1Bleu左右的提升,具體可以看一下下列文章參考。

Clinchant, S., Jung, K. W., Nikoulina, V. (2019, September 27). On the use of BERT for Neural Machine Translation. http://arXiv.org.

至於題主提出的方向2,個人覺得其實有點奇怪。我先提煉一下題主的想法,看一下是否有理解偏差。

  1. 有足夠多的數據,比如500w中英句對
  2. 單獨使用英文句子去訓練一個Bert
  3. 將訓練出來的Bert用作Encoder的初始化
  4. 接著用這500w的數據繼續訓練翻譯模型

利用預訓練模型去做翻譯的一大動力就是數據不足。如果你有足夠的雙語語料,卻選擇用一些語料先訓一個Bert,再用同樣一批數據去訓練翻譯模型,形式上看起來很多餘,並不覺得會有額外的性能提升。實際經驗的話,使用Bert的一個點就是fine-tune時使用較小的學習率,避免finetune階段的梯度覆蓋掉已經學到的信息。

如果照我的理解,finetune與預訓練有同樣量級的數據,那無論如何都會出現finetune覆蓋掉已學習到信息的情況。那既然這樣,為什麼要預訓練?預訓練的優勢就無從談起了。

最後說一下改變模型架構的問題,利用已訓練好的模型做參數初始化是沒問題的,無非就是如果多一塊,隨機初始化;缺少,就啟發式的砍掉一部分東西。利用部分參數的工作也是有的,但問題是這麼做的有什麼好處或者壞處呢?在好壞都不知道的情況下隨機嘗試恐怕效率會比較低。


「首先我確定要改變Transformer的編解碼器結構,那麼我是否還可以使用Bert、MASS等預訓練模型?」

可以呀。以前word2vec時代,大家還不是把word2vec當作embedding層,怎麼bert時代就不能把bert當embedding層了?

兩個都是正確的

1.你可以把seq2seq翻譯模型看作有兩個功能: 學會將語言a與語言b對齊,學會結合上下文輸出合適的通順的語言b。你預訓練,本質是隻訓練decoder或者encoder,而不是用單語訓練整個模型,目的是讓encoder或decoder部分具備對該語種的上下文理解能力。

2.將bert作為embedding層唄。"語料經過預訓練處理",其實我沒太理解這句話的意思,是指同樣的語料,先訓練一個bert,然後用bert的輸出作為翻譯模型的輸入嗎?如果是,你可以做個實驗,對比一下自己訓練的bert和別人預訓練好的bert哪個能讓你的翻譯模型效果更好。但我個人看法是,直接用開源的,因為你的數據量應該遠遠比不上別人的吧?


看看你是做什麼任務的,做小語種還要考慮重新分詞,bpe,sentence peice 改進一下,畢竟原裝的有時候處理小語種有編碼問題還有些效率因素。模型感覺不那麼重要,對於有預訓練模型的直接套上去就行了,搞個損失,弄個錯位的mask就完事了,各種預訓練模型已經足夠了,下游加一個linear層轉為詞表大小即可直接使用


如果你的encoder結構和預訓練模型不一樣,就沒法用來初始化參數。

如果你用2,那你之後做inference也得用你的語言模型抽取embedding。如果可以的話,還是得試。

elmo沒必要。


推薦閱讀:
相關文章