大语言模型生成模型的源码结构复习

modeling_gpt2.py:1099

if labels is not None:
            # move labels to correct device to enable model parallelism
            labels = labels.to(lm_logits.device)
            # Shift so that tokens < n predict n
            shift_logits = lm_logits[..., :-1, :].contiguous()
            shift_labels = labels[..., 1:].contiguous()
            # Flatten the tokens
            loss_fct = CrossEntropyLoss()
            loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))

这个是静电的生成模型. 看lm_logits[:,:-1,:], labels[:,1:]这个就是输入0,1,2,3,4
然后输出的特征shape 是 1, 5, 30000. 字典大小3w
labels也是0,1,2,3,4
所以网络输出的含义是: lm_logits[:,:-1,:]=1,2,3,4 所以跟labels[:,1:]=1,2,3,4 算交叉熵即可.
总结. 给gpt2或者所有的causallm模型喂入 序列1,2,3,4那么他输出的shape大小是1,4,3w. 其中4的维度上第一个值表示的是1的后续token预测值在3w上的概率分布. 第二个值表示2的后续token在....,
\(*\)表示估计值的语言来说就是 2,3,4,5.
所以你会经常看到代码 取lm_logits[:,-1,:]再softmax就预测了下一个token是什么. 也就是从1,2,3,4预测得到了5.

参考代码:
D:\Users\admin\miniconda3\Lib\site-packages\transformers\generation\utils.py:2531行

next_token_logits = outputs.logits[:, -1, :]
next_tokens = torch.argmax(next_tokens_scores, dim=-1)

            # finished sentences should have their next token be a padding token
            if eos_token_id is not None:
                if pad_token_id is None:
                    raise ValueError("If `eos_token_id` is defined, make sure that `pad_token_id` is defined.")
                next_tokens = next_tokens * unfinished_sequences + pad_token_id * (1 - unfinished_sequences)

            # update generated ids, model inputs, and length for next step
            input_ids = torch.cat([input_ids, next_tokens[:, None]], dim=-1)

从这里面代码我们也很清楚看到每生成一个token,他就torch.cat到之前的input_ids里面.再循环生成.

if stopping_criteria(input_ids, scores):
                this_peer_finished = True

一直到这个结尾判定成功就停止生成了.

以上就是gpt2的生成代码的全部分析了. 需要一定掌握.非常非常重要.

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
BERT模型是目前自然语言处理领域中最为了解的深度学习模型之一,其具备先进的预训练技术和模型结构,可以有效地处理各类自然语言处理任务。基于BERT模型自然语言处理实战源码包涵盖了众多自然语言处理任务,包括文本分类、命名实体识别、文本推荐、问答系统等。下面就基于其中的几个任务进行简要介绍。 首先是文本分类任务。该部分代码主要基于BERT模型的fine-tuning技术实现,使用了PyTorch框架。实现方式是,在预训练的BERT模型基础上,通过fine-tuning将其应用于文本分类任务中。在具体实现过程中,要进行预处理数据、定义模型结构和超参数、训练和测试模型等步骤。 其次是命名实体识别任务。该部分代码主要使用了PyTorch和AllenNLP库,实现了一个命名实体识别的模型。在具体实现过程中,首先要针对NER任务重新定义BERT模型,然后进行数据的预处理、训练和测试模型等步骤。 再者是文本推荐任务。该部分代码主要使用了PyTorch、transformers库和nltk库,实现了BERT模型在文本推荐任务中的应用。在实现过程中,主要要进行数据的预处理、定义推荐模型以及训练和测试模型等步骤。 最后是问答系统任务。该部分代码主要使用了PyTorch和transformers库,以阅读理解任务为基础,实现了一个简单的问答系统。在实现过程中,要进行数据的处理、定义模型结构模型的训练和测试等步骤。 总体而言,基于BERT模型自然语言处理实战源码涵盖了多种自然语言处理任务,其代码不仅提供了实现思路,也为实现自然语言处理任务提供了参考。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

15122306087

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值