google nmt 實驗踩坑記錄

   最近由於要作一個title壓縮的任務,因此調研了一些text summary的方法。

   text summary 通常分爲抽取式和生成式兩種。前者通常是從原始的文本中抽取出重要的word or sentence,而後按照必定的語法或者句法進行組合,從而對原始的文本進行壓縮。再文本摘要的早期,基本都是這個思路,表明性的方法是textrank。所謂生成式的方法,就是試圖讓機器理解原始的文本,從而本身概括出原始文本的摘要,給出的結果(詞語或者句子)多是原始文本中沒有出現過的,這也是其與抽取式的方法最大的不一樣之處。

   隨着最近幾年深度學習的大行其道,生成式的方法的研究也逐漸多了起來。其實最主流的思路就是使用基於深度學習的seq2seq框架。提及seq2seq就不得不提著名的nmt(nerual machine translation,神經機器翻譯),其基本也是基於seq2seq框架的,通常分爲encoder和decoder,最近幾年流行在基本的seq2seq框架上加上attention機制(注意力機制),通常能夠顯著提升translation的質量。

    廢話了這麼多,本文是對於google nmt 官方github repo 實驗的一個踩坑記錄。基本不作理論方面的討論,主要討論記錄一些實驗結果。

1. google nmt 官方 github 地址:nmt

2. clone repo to local,這個按照教程作就能夠了,不表。

3. first experiment

  • 教程中給出的第一個實例是越南語到英語的翻譯(Vietnamese to English),
    具體如何下載數據,訓練(train)以及在測試集上推斷(infer)的腳本github上面都說的很清楚了,不表。
  • 注意第一個實驗只是做爲一個demo,其訓練數據只有13w+,這個對於大規模的機器翻譯真的能夠說是very small
    了。
  • 數據的準備通常有如下部分:
    1. source language & target language,格式是每行一句話,source & target兩個文件每行是一一對應的,
    2. 還有就是須要source & target 的vocabulary(詞彙表),其中包括了該種語言儘量多的詞彙,每行一個word(還
      包括特殊的開始,結束token,unknow token)
    3. 數據集分爲三個部分,訓練集,驗證集,測試集,特別地,.vi結尾的是越南語文件,.en結尾的是英語文件
  • 做者進行了普通的nmt 以及加入了attention 機制的nmt兩組實驗git

  • 我使用了公司四核(4*24G) RAM 的 Tesla M40 顯卡 進行train & infer(使用 nvidia-smi 查看nvidia 顯卡信息)github

  • 實驗結果代表在訓練數據較少的狀況下,使用attention 的nmt 的翻譯質量仍是比不加attention的翻譯強很多的,這個結果是
    經過將兩者的翻譯結果分別於參考翻譯進行粗略獲得的,固然使用定量的bleu指標也能夠獲得同樣的結論,加入attention的nmt bleu
    score 要比普通的nmt 高很多。具體結果見下圖1,2:
    bash


    圖1:普通nmt翻譯結果(右)與參考翻譯(左)





    圖2:nmt with attention 翻譯結果(右)與參考翻譯(左)

直觀看上去,確實是attention nmt 的翻譯質量更勝一籌。框架

2. second experiment

  • 教程中給出的第二個實驗是德語到英語的翻譯(WMT German-English)學習

  • 這個部分的訓練數據就比較大了,400w+行,教程中提供了train 和 infer 兩個腳本,
    在下載完數據以後,我又下載了幾個pretrained de-en(德語到英語) model,可是發現
    infer老是會報錯以下:
FailedPreconditionError (see above for traceback): 
Attempting to use uninitialized value dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel
     [[Node: dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel/read = Identity[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"]
     (dynamic_seq2seq/decoder/multi_rnn_cell/cell_1/basic_lstm_cell/kernel)]]
  • de-en infer fail 這個問題暫時沒有找到緣由。測試

  • de-en train from stratch 沒有問題,可是由於訓練數據巨大,因此應該須要訓練好久(幾天吧)google

3. 使用nmt 作 text summary

  • text summary 在nmt的框架下,能夠看作是單語言的簡化(通常的翻譯是兩個語言之間),原文是source,
    summary 是target翻譯

  • 須要準備的訓練數據有:
    1. text.ori:原始的文本,每行一個文本,越多越好,須要去除一些無關詞彙
    2. text.sum:原始文本對應的summary文本,每行一個summary
    3. vocab.txt:所有的word組成的文本,包括token_start,token_end,以及unknow_token等
  • train & infer 的腳本仿照 vi-en 或者de-en來寫就行,須要顯示指定source 以及target,能夠這樣寫:
--src=ori --tgt=sum

其他的參數相似指定code

  • 這部分的實驗,TODO

4. OTHERS

  • google nmt github repo 講的很是清楚,除了代碼部分,關於nmt,attention等基礎知識也講的很清楚,值得一看, 並且它也給出了一些有價值的參考資料,能夠好好閱讀一下。
相關文章
相關標籤/搜索