基于上下文的transformer入门实战

这篇文章大概就是类似于 THUNLP-MT/Document-Transformer 的用户手册吧。

跑一个英->中的模型。

目录:

  1. 语料库下载:http://data.statmt.org/wmt18/translation-task/training-parallel-nc-v13.tgz
  2. BPE编码
  3. 利用句子级平行语料及文档级平行语料训练得到了基本的transformer模型;这里我使用的是之前训练好的t2t里面的transformer。
  4. 使用文档级平行语料训练一个虚拟的context_transformer模型;
  5. 将第一步得到的基本transformer模型merge到第二步的虚拟模型中,以初始化context模型;
  6. 训练context模型。

2,BPE编码

下载BPE工具包:https://github.com/rsennrich/subword-nmt.git ,进入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文件的目录如图所示

image

对验证集同样进行bpe编码。

然后,将bpe产生的词表、经过bpe编码的训练集和验证集分别放到以下目录,将重命名

image

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">数据集</figcaption>

image

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">词表</figcaption>


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

用户自定义数据可以参考:https://blog.csdn.net/hpulfc/article/details/82625217

image

接下来开始产生用于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('\n','')
    print(str, file=f1)
    pre = cur
f.close()
f1.close()
print('--finished--')

有了相应的语料之后,就可以训练一下虚拟的context_transformer模型了

image

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">文件目录</figcaption>

image

<figcaption style="margin-top: calc(0.666667em); padding: 0px 1em; font-size: 0.9em; line-height: 1.5; text-align: center; color: rgb(153, 153, 153);">bpe产生的词表</figcaption>

代码如下:

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爽一把……

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,099评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,473评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,229评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,570评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,427评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,335评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,737评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,392评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,693评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,730评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,512评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,349评论 3 314
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,750评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,017评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,290评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,706评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,904评论 2 335

推荐阅读更多精彩内容