语言模型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%

       
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
runtimeerror: failed to import transformers.models.bert.modeling_bert错误是由于在导入transformers中的BERT模型时出现了问题。该错误可能有多种可能的原因。 首先,可能是因为您没有正确安装transformers库或该库的某些依赖项。请确保已正确安装transformers库,并且您的环境中已安装了所有必需的依赖项。您可以使用pip或conda来安装该库,具体取决于您使用的是哪个Python包管理器。 其次,可能是因为您尝试导入的BERT模型的路径或名称不正确。请检查您的导入语句,并确保正确指定了BERT模型所在的路径和名称。您可以查看transformers文档来获取正确的模型导入语句示例。 另外,可能是因为您的系统缺少必需的依赖项。某些模型可能需要特定的依赖项才能正确导入。请查看transformers文档,了解与所使用的BERT模型相关的所有必备系统依赖项,并确保您的系统已正确安装它们。 最后,如果以上方法仍无法解决问题,可能是因为您的transformers库版本过旧或过新,导致与BERT模型的兼容性问题。请尝试更新或回滚transformers库的版本,以确保与您使用的BERT模型兼容的transformers版本。 综上所述,runtimeerror: failed to import transformers.models.bert.modeling_bert错误可能是由于transformers库安装问题、路径或名称错误、缺少系统依赖项或与BERT模型不兼容的库版本等问题引起的。您可以通过检查和解决以上问题来解决此错误。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值