有关于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的cross attention的时候,若存在past_key_values,就会直接把past_key_values作为最终的hidden(i.e., k_staes or v_states)
在这里插入图片描述
这个道理,其实和重用encoder_output是一样的。关键就在于,模型training的时候,decoder只用forward一次(因为有teacher forcing,提前有了答案);而testing / generate的时候,decoder会forward多次(因为需要auto-regressively生成tokens),这个时候encoding_output 和上述的 k、v在整个decoding过程中,数值都不会变化(输入没变,模型参数也没变),因此它们就可以直接重用。

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


具体参见文档
在这里插入图片描述

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值