有关于decoder中的past_key_values参数

我们都知道,encoder-decoder模型在进行generate的时候,会重复地调用decoder (i.e., auto-regressive)。

也就是,上一个step decoder的预测结果,作为下一个step decoder的输入。

这个时候,由于encoder_output是一模一样的,只不过就是decoder_inputs发生了变化。在进行decoding的时候,K、V就不会有任何数值上的差异,我们就可以直接使用上一个step已经计算好的K、V,而不用再进行重复的encoder_output ==> k_v_states的计算。

所以huggingface decoder的代码,就会传入一个past_key_values参数。在进行第一次decoding的时候(i.e., first pass),会利用k_projector和v_projector把encoder_outputs进行投射,成为k,v向量;之后这两个向量就会在随后的step,作为past_key_values,被重复地利用。
有关于decoder中的past_key_values参数_第1张图片
如下所示,在计算decoder的cross attention的时候,若存在past_key_values,就会直接把past_key_values作为最终的hidden(i.e., k_staes or v_states)
有关于decoder中的past_key_values参数_第2张图片
这个道理,其实和重用encoder_output是一样的。关键就在于,模型training的时候,decoder只用forward一次(因为有teacher forcing,提前有了答案);而testing / generate的时候,decoder会forward多次(因为需要auto-regressively生成tokens),这个时候encoding_output 和上述的 k、v在整个decoding过程中,数值都不会变化(输入没变,模型参数也没变),因此它们就可以直接重用。

不然的话会显著增加testing的时间开销。


具体参见文档:
有关于decoder中的past_key_values参数_第3张图片

你可能感兴趣的:(深度学习,人工智能,python,深度学习,pytorch)