THUNLP-MT / THUMT

An open-source neural machine translation toolkit developed by Tsinghua Natural Language Processing Group
BSD 3-Clause "New" or "Revised" License
701 stars 197 forks source link

en2zh的实验,在decode阶段,出现空行 #70

Open wwy510553871 opened 5 years ago

wwy510553871 commented 5 years ago

我利用thumt的训练transformer模型和一个自己实现的改进模型,但在decode阶段,en翻译成zh会出现大量空行,暂时无法确定问题的原因,而在zh-en方向并没有出现这个问题,请问各位,有出现过类似的情况吗,或者有可能造成这种情况的原因呢 麻烦各位啦

GrittyChen commented 5 years ago

@wwy510553871 请问这种情况是出现在thumt训出来的模型中还是出现在您自己改进的模型中?

wwy510553871 commented 5 years ago

@GrittyChen 普通的transformer还是我自己的改进模型都出现了这种情况,在en-zh方向出现大量空输出

GrittyChen commented 5 years ago

@wwy510553871 我们自己用中英数据测试没有出现过这种情况,建议您打印一下模型输出的id,即未用词表解析之前的结果看一下。

wwy510553871 commented 5 years ago

@wwy510553871 我们自己用中英数据测试没有出现过这种情况,建议您打印一下模型输出的id,即未用词表解析之前的结果看一下。

我把那些输出空行的句子,组成了一个一个新的小测试集,并输出了一下输入id和输出id,发现输入id是正常的,但是模型输出的id都是一个UNK然后PAD,即[1,0,0,......] image

wwy510553871 commented 5 years ago

@GrittyChen 这种情况下,是由于模型的因素造成的吗,即模型就把这些句子翻译成了这个答案吗

GrittyChen commented 5 years ago

@wwy510553871 我看你这情况挺奇怪的,第一个就是EOS,一般来说只要训练数据正常不可能将模型训练成这个样子,你用的多大的数据训的模型?可以尝试一下增加数据重训模型或者将模型多训几轮,看看还有没有这个现象。

wwy510553871 commented 5 years ago

@GrittyChen 嗯嗯,谢谢你的回答,我考虑重新训练一下,我的数据量大概有3000万,这是训练了20万step后的结果。我还想咨询一下这个训练速度正常吗,大概用了一个星期时间,才训练了20万step

wwy510553871 commented 5 years ago

我的机器是单卡P40, 参数基本和UserManual.pdf中一致 image

Glaceon31 commented 5 years ago

请问你训练英中的时候,loss的变化正常么?你可以尝试就拿数据集的几十句话训练,再在相同的几十句话上进行解码看看是否正常,如果仍然不正常可能是数据处理的问题。另外可以把测试用的命令也给我们发一下。

GrittyChen commented 5 years ago

@wwy510553871 这个训练速度是正常的,而且你的训练数据量也够大,建议在重新训练之前检查一下数据,词表以及参数等等。

wwy510553871 commented 5 years ago

@Glaceon31 loss看起来是比较正常的,如下图 image 测试脚本如下 image 可以尝试一下您说的方法验证一下,谢谢

wwy510553871 commented 5 years ago

@GrittyChen 嗯嗯,我现在重新走一遍,检查一下,谢谢你们的帮助

Glaceon31 commented 5 years ago

训练脚本中--parameter这一行双引号嵌套了,双引号都可以去掉 --parameter train_steps=1000000,...,position_info_type=absolute,... 另外测试脚本中--checkpoint应使用${model_storage_path}\eval。eval里存的是在开发集上最好的几个模型点,不过这个应该不会导致完全翻不出东西。

wwy510553871 commented 5 years ago

@Glaceon31 双引号那个,我不太确定原因,我不加双引号,我这边会报错,无法识别--parameter这个参数,测试脚本那里,我原来用的是${model_storage_path}\eval,我想试试是不是这个checkpoint有问题,就换成${model_storage_path}中最新的checkpoint了,发现仍有空输出,但是空输出的行和之前eval里的checkpoint空输出的行不同

wwy510553871 commented 5 years ago

@Glaceon31 按照您说的方法验证了一下,用1000条训练集训练模型,测试集也采用这1000条进行测试,训练到2000step,loss已经非常低了,但测试集的输出中仍有少量空行

Glaceon31 commented 5 years ago

空行是随机出现的还是固定几句话就是空?如果是后者单独检查下那几句话。

wwy510553871 commented 5 years ago

@Glaceon31 不同的checkpoint会有不同的空行输出

Glaceon31 commented 5 years ago

可以试试看把训练数据的id打出来,问题应该是很多输入正常的时候输出的第一个token id是1,对应句尾符,可能训练数据里面存在一部分数据就是这样的。