Tips for Generation in Encoder-Decoder model

这里归纳一些在训练Encoder-Decoder模型时的小tip:

1.训练时,在Decoder中,RNN的当前输入应该使用上一次RNN的output还是ground truth ?

答:如果训练时都使用ground truth作为RNN的当前输入,那么会导致train 和 test的mismatch。因此test时我们没有sample,test的时候只能将上一时间的output作为当前input。    这种mismatch会导致一些很大的影响,专业术语叫:  eposure bias

exposure bias会有什么不好呢?

举个例子:


图中:上面代表train过程,下面代表test过程

图中可以看出,我们现在train的sample是ABB,那么再给model输入BOS后,model会被告知要向A走,然后在已知前一步是A的情况下,它要学习走向B,然后在已知前面2步是A B 的情况下,要去学习走向B。


最后路径是这样的:


OK,现在我们假设机器犯了一个错,如下图:



也就是现在机器在判断第一步的时候,它本来应该要去A,但是他选择了B,这样的话,如果你用的是sample,并不会影响到后面的判断,因为第二部的时候你的输入是ground truth,也就是虽然你第一步选择了B,但是第二步的输入还是A,机器仍然可以继续正确地预测下去,这样到最后,计算loss的时候就只有第一步的loss。  OK,那么让我们来看看同样的情况在test上会怎样:


同样假设机器在第一步的时候,选择了和sample相反的B。

那么,完了。因为,机器在train的时候并没有被告知第一步是B的情况下,后面要怎么走,train的时候input永远是ground truth,这样会导致:


爆炸,坏掉。。。。。。

也就是说,train使用sample的方法,使得在train中可能只是一步出现loss的情况,在test的时候会导致全盘炸裂,这就是mismatch的后果。

怎么解决呢?有人可能会说,那么我们将train也使用上一次的预测值不就match 了吗?

我们来看看:

上图给出了一个例子:也就是sample是ABB 。  现在我们假设机器刚刚开始训练,它现在可能会犯很多错,比如现在他的预测是BAA,完全错误的。我们现在让机器使用之前的预测作为当前输入。

那么现在通过BP,机器会尝试去将第一步的A概率提升,第二步的B概率提升,也就是如下图:


看起来好像没什么,但是当我们将这个概率提升到一定程度的时候,比如现在机器已经学会在第一步判断为A了,那么第二步的输入就会变成A,这时候,原来第二步我们训练的时候是以输入为B的前提下进行训练,机器可能马上学会在B的前提下要去判断B。现在前提换成了A,导致之前对第二步的训练都白练了。。。。。。


因此,这样的坏处就是,机器不容易学习,或者说学习的特别慢。会出现前面的学好了,后面的还得重新开始学的情况。

那么最好的方法是什么呢?

Scheduled Sampling

一幅图说明一切:


也就是通过一个随机判断来决定这次使用sample还是上一次的prediction作为输入。

实验结果表明,这样是最好的选择:


猜你喜欢

转载自blog.csdn.net/hx14301009/article/details/80459087
今日推荐