什么?!!!原来自回归模型的model.generate不能用于训练!!??
只能用法forward一次生成,但一次性只能得到一个tensor
就是在这里取最大值导致模型梯度断了,所以不能用model.generate来训练,要训练只能用model.forward
next_tokens = torch.argmax(next_tokens_scores, dim=-1)#返回指定维度最大值的序号
inverted_mask = 1.0 - attention_mask
attention_mask = inverted_mask.masked_fill( #用value填充tensor中与mask中值为1位置相对应的元素
inverted_mask.to(torch.bool), torch.finfo(inputs_embeds.dtype).min)
model.generate
在main.py
的主函数中调用,然后转到transformers/generation/utils.py
这个文件的Class GenerationMixin
中 def generate
函数–>然后进入def greedy_search
其中while True:
# 在这个while循环里实现自回归
其中还有一个self.prepare_inputs_for_generation(input_ids, **model_kwargs)
用于处理model运行的输入,# 有的在main.py
中重写这个函数。
Class GenerationMixin
:中用来得到每个预测token的得分函数 # 有的会重写或调用这个函数
def compute_transition_scores(
)# 用法示例
>>&