Scheduled Sampling for Sequence Prediction with recurrent neural networks
递归神经网络可以被训练以在给定一些输入的情况下产生标记序列,当前训练它们的方法包括给定当前(循环)状态和前一个token,最大化序列中每个token的可能性,注意在有监督的训练过程中,每一时刻的输入的前一个token是ground truth word,。在推断时,未知的先前token被模型本身生成的token替换。训练和推理之间的这种差异会产生误差,这些误差会沿着生成的序列快速累积。意思就是:如果在推理阶段某一时刻的token计算错误,那么这个错误就会顺着当前生成的序列延续下去。
本文提出了一个课程学习策略,将培训过程从使用真实的先前令牌的完全指导的方案逐渐改变为一个更少指导的方案,该方案最常用的是生成的令牌。
Bridging the Gap with Scheduled Sampling
预测token yt时,序列预测任务的训练和推理之间的主要区别在于我们是使用真实的前一个token yt-1还是从模型本身得出的估计y^t-1。
本文提出了一个采样机制,它将在训练期间随机决定我们是使用yt-1还是y^ t-1。假设我们使用基于小批量的随机梯度下降方法,对于每一个token来预测训练算法的小批量的yt∈ Y,我们建议抛硬币并以一定概率使用真实的前一个token的概率,或使用来自模型本身的估计值,概率为(1-εi)^2模型的估计值可以通过根据概率分布对token进行采样来获得,该概率分布由P(yt-1 | ht-1)建模,或者可以作为参数argMaxs P(yt-1 = s | ht-1)。这个过程如图1所示。
当εi= 1,模型像以前一样训练,而当εi= 0模型在与推理相同的设置中训练。我们在这里提出了一个从一个到另一个的课程学习策略:直觉上,在训练开始时,从模型中取样会产生一个随机标记,因为模型没有得到很好的训练,这可能会导致非常缓慢的收敛,因此更经常地选择真实的先前标记应该会有所帮助;另一方面,在训练结束时,εi更倾向于从模型中采样,因为这对应于真实的推理情况,并且人们期望模型已经足够好来处理它并采样合理的token。
建议使用时间表这种函数的形式来降低εi,以类似的方式用于降低大多数现代随机梯度下降方法中的学习率。如图2:
代码也是简单几行就能实现:
teacher_forcing_ratio = 0.5 # 预定义
is_teacher = random.random() < teacher_forcing_ratio # 是否使用真实的token
top1 = output.data.max(1)[1] # 模型生成的token
output = (trg.data[:, t] if is_teacher else top1).cuda() # 选择真实token或者模型生成的token