transformers库
简单来说,generate就是封装好的自回归生成函数,其会调用指定次的model.forward,用来以自回归的方式生成输出;但是注意,generate只能用于推理,不能用于训练,在训练过程中应该使用forward。
·
model.generate和model.forward的区别 & generate函数里不同的解码方式
简单来说,generate就是封装好的自回归生成函数,其会调用指定次的model.forward,用来以自回归的方式生成输出;但是注意,generate只能用于推理,不能用于训练,在训练过程中应该使用forward(forward里会自动计算loss)
- generate和forward的区别
- 怎么利用forward函数模仿实现generate函数的功能
- 详细介绍generate函数的参数设置,如解码方式里的greedy search、beam search、top-k sample、top-p sample等的详细介绍
- greedy search 贪心搜索
- 每次选择概率最大的vacab id作为当前token的值
- beam search 波束搜索
- 每次储存beam个概率最大的vocab id,并在结束生成时选择所有路径中累积概率最大的路径作为最终生成
- top-k sample
- 把greedy search和beam search的确定性选取输出的操作转变为基于概率分布的采样操作,选出概率最高的k个vocab id,然后把它们的概率重新归一化,之后在这个概率分布中随机采样
- 这样模型输出的随机性和创造性会更好,能够产生一些让人感觉富有insight的输出
- top-p sample
- 把top-k里固定取k个概率最高的vocab id的操作变成从概率最高的vocab id开始取,直到取到当前vocab id时,累积概率超过预设值p
- 相比于top-k sample,top-p sample可以保证采样分布里的vocab id数量动态调整,只采样那些概率较大的vocab id
- greedy search 贪心搜索
- generate函数手册
使用kv cache时,cache_position变量的作用
- 参考
- cache_position 的核心作用是,在进行自回归生成时,精确地告诉模型新输入的 token 应该被放置在序列中的哪个绝对位置。这在使用 past_key_values (KV Cache) 时尤为重要,因为它解决了两个关键问题。
- 核心作用
- 指定KV缓存的写入位置 (Specifying Write Position) :当你使用一个已经填充好历史信息的KV缓存(past_key_values)并传入新的input_ids时,模型需要知道应该把新计算出的Key和Value向量存放到缓存张量的哪个位置。cache_position就提供了这个精确的索引。
- 保证位置编码的正确性 (Ensuring Correct Positional Encoding) :许多现代Transformer模型(如Llama)使用旋转位置编码(RoPE)。RoPE的计算强依赖于token在序列中的绝对位置。cache_position提供了这个绝对位置信息,确保新token能够获得正确的位置编码,从而被模型正确理解其在序列中的顺序。 - 关键特性
- 忽略填充 (Unaffected by Padding):cache_position 的索引递增逻辑,不受当前token是否为padding的影响。如果KV缓存中有10个token,那么无论其中有没有padding token,下一个新token的位置就是第11个,其索引为10。cache_position 是一个字面上的、物理的缓存位置索引器,它确保了数据在缓存中的连续存储。而语义上的、逻辑上的内容筛选(如忽略padding)则完全由 attention_mask 负责。两者协同工作,才实现了高效且正确的KV缓存机制。
- 连续递增 (Continuously Incremental):它的行为就像一个计数器。如果你的input_ids长度为 L,那么cache_position就会提供 [0, 1, 2, …, L-1] 这一组完整的索引,为这 L 个token在缓存中预留好 L 个连续的槽位。
- 为什么它很重要
- 简单来说,没有 cache_position,当模型拿到一个预填充的KV缓存和一些新token时,它会感到困惑,不知道:这些新token是序列的开头还是中间?我应该用什么位置信息去计算它们的位置编码?我应该把它们新的Key和Value存到缓存的哪里?
- cache_position 通过提供一个清晰、无歧义的绝对位置索引,解决了所有这些问题,是实现高效、正确的KV缓存续写(generation continuation)的关键机制。
- 核心作用
更多推荐
所有评论(0)