语言模型transformers调用部分 (To be continue...

什么?!!!原来自回归模型的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.generatemain.py的主函数中调用,然后转到transformers/generation/utils.py
这个文件的Class GenerationMixindef 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%

       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值