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兩組實驗

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

  • 實驗結果表明在訓練數據較少的情況下,使用attention 的nmt 的翻譯質量還是比不加attention的翻譯強不少的,這個結果是
    通過將二者的翻譯結果分別於參考翻譯進行粗略得到的,當然使用定量的bleu指標也可以得到一樣的結論,加入attention的nmt bleu
    score 要比普通的nmt 高不少。具體結果見下圖1,2:

圖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 沒有問題,但是因為訓練數據巨大,所以應該需要訓練很久(幾天吧)

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

其余的參數類似指定

  • 這部分的實驗,TODO

4. OTHERS

  • google nmt github repo 講的非常清楚,除了代碼部分,關於nmt,attention等基礎知識也講的很清楚,值得一看,
    而且它也給出了一些有價值的參考資料,可以好好閱讀一下。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM