這篇文章大概就是類似於 THUNLP-MT/Document-Transformer 的用戶手冊吧。

跑一個英->中的模型。

目錄:

  1. 語料庫下載:data.statmt.org/wmt18/t
  2. BPE編碼
  3. 利用句子級平行語料及文檔級平行語料訓練得到了基本的transformer模型;這裡我使用的是之前訓練好的t2t裡面的transformer。
  4. 使用文檔級平行語料訓練一個虛擬的context_transformer模型;
  5. 將第一步得到的基本transformer模型merge到第二步的虛擬模型中,以初始化context模型;
  6. 訓練context模型。

2,BPE編碼

下載BPE工具包:github.com/rsennrich/su ,進入subword_nmt目錄,創建data文件夾,把語料庫放入data文件夾,執行以下命令

python learn_joint_bpe_and_vocab.py --input data/train.en data/train.zh -s 32000 -o bpe32k --write-vocabulary data/vocab.en data/vocab.zh
python subword-nmt/apply_bpe.py --vocabulary data/vocab.en --vocabulary-threshold 50 -c bpe32k < data/train.en > data/corpus.32k.en
python subword-nmt/apply_bpe.py --vocabulary data/vocab.zh --vocabulary-threshold 50 -c bpe32k < data/train.zh > corpus.32k.zh

最後data文件的目錄如圖所示

對驗證集同樣進行bpe編碼。

然後,將bpe產生的詞表、經過bpe編碼的訓練集和驗證集分別放到以下目錄,將重命名

數據集
詞表

3,訓練t2t中的transformer模型

首先去官網下載源碼:tensorflow/tensor2tensor

PROBLEM=translate_enzh_wmt32k
MODEL=transformer
HPARAMS=transformer_big #單塊GPU可以用transformer_base_single_gpu

DATA_DIR=./data
TMP_DIR=./datagen
TRAIN_DIR=./train/$PROBLEM/$MODEL-$HPARAMS

用戶自定義數據可以參考:blog.csdn.net/hpulfc/ar

接下來開始產生用於t2t中相應格式的數據:

t2t-datagen
--data_dir=./data
--tmp_dir=./datagen
--problem=translate_enzh_bpe32000
--t2t_usr_dir=./trans_enzh

接著就是訓練:

t2t-trainer
--data_dir=./data
--problem=translate_enzh_bpe32000
--t2t_usr_dir=./trans_enzh
--model=transformer
--hparams_set=transformer_big
--output_dir=./train
--train_steps=100000
--hparams=batch_size=5120


4,使用文檔級平行語料訓練一個虛擬的context_transformer模型。

這裡需要用到一個上下文文檔,具體參見 THUNLP-MT/Document-Transformer 。我簡單寫了個腳本。假定每兩句話分別為上下文(這麼做當然不好了)。

然後再手動添加一行空行,刪除第一行最前面的空格,以及最後一行。

f = open(train.en)
f1 = open(train.ctx.en, w+)
pre =
print(--start--)
for i, cur in enumerate(f.readlines()):
str = (pre + + cur).replace(
,)
print(str, file=f1)
pre = cur
f.close()
f1.close()
print(--finished--)

有了相應的語料之後,就可以訓練一下虛擬的context_transformer模型了

文件目錄

bpe產生的詞表

代碼如下:

python2 thumt/bin/trainer_ctx.py
--input corpus/train.en corpus/train.zh
--context corpus/train.ctx.en
--vocabulary vocab/vocab.en vocab/vocab.zh
--output models/dummy
--model contextual_transformer
--parameters train_steps=1

只能用python2去跑,並且會報兩個錯,一個是找不到thumt這個包。

windows下要修改相應的環境變數。mac或者linux要創建.bashrc這個目錄,添加

export PYTHONPATH=$PYTHONPATH:/container_data/zgk/DocumentTransformer/

再執行以下命令即可。

source .bashrc

另一個錯是python2的KeyEthumt/data/datasey.py 在 python2 中報了錯。

params.mapping["target"][params.unk]

報了一個KeyError的錯,我直接改成

default_value=0


5,將第一步得到的基本transformer模型merge到第二步的虛擬模型中,以初始化context模型;

python2 thumt/scripts/combine_add.py
--model models/dummy
--part models/transformer/model.ckpt-100000
--output models/train/

6,訓練context模型。

python2 thumt/bin/trainer_ctx.py
--input corpus/train.en corpus/train.zh
--context corpus/train.ctx.en
--output models/sentence_doc
--vocabulary vocab/vocab.en vocab/vocab.zh
--model contextual_transformer
--parameters start_steps=95000,num_context_layers=1,batch_size=6250,train_steps=100000,save_checkpoint_steps=5000,keep_checkpoint_max=50,beam_size=5


以上就可以訓練出一個基於上下文的transformer模型了。至於訓練出來的模型效果怎麼樣,該怎麼優化,是後續的工作,不在本文的討論範圍……

在跑t2t的時候,經常遇到內存爆了的情況。因為我將

--hparams=batch_size=5120

錯寫為

--batch_size=5120

另外也有可能是

--hparams_set=transformer_big 導致的……

本來還想著用8塊2080Ti爽一把……

推薦閱讀:

相關文章