什么?!!!原来自回归模型的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(
)# 用法示例
>>> from transformers import GPT2Tokenizer, AutoModelForCausalLM
>>> import numpy as np
>>> tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
>>> model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
>>> tokenizer.pad_token_id = tokenizer.eos_token_id
>>> inputs = tokenizer(["Today is"], return_tensors="pt")
>>> # Example 1: 打印每个token的得分 with Greedy Search
>>> outputs = model.generate(**inputs, max_new_tokens=5, return_dict_in_generate=True, output_scores=True)
>>> transition_scores = model.compute_transition_scores(# 有时候会在外面重写这个函数
... outputs.sequences, outputs.scores, normalize_logits=True
... )
>>> # decoder-only models, like the GPT family, and 1;
>>> # encoder-decoder models, like BART or T5.
# 也就是说encoder-decoder就是答案从头开始; decoder-only是答案在输入后边接着
>>> input_length = 1 if model.config.is_encoder_decoder else inputs.input_ids.shape[1]
>>> generated_tokens = outputs.sequences[:, input_length:]
>>> for tok, score in zip(generated_tokens[0], transition_scores[0]):
... # | token | token string | log probability | probability
... print(f"| {tok:5d} | {tokenizer.decode(tok):8s} | {score.numpy():.3f} | {np.exp(score.numpy()):.2%}")
| 262 | the | -1.414 | 24.33%
| 1110 | day | -2.609 | 7.36%
| 618 | when | -2.010 | 13.40%
| 356 | we | -1.859 | 15.58%
| 460 | can | -2.508 | 8.14%