GPT2原理

1. 概要

GPT-2 是使用 transformer 的解码块构建的,而 BERT 用的是编码块,但一个关键不同在于 GPT-2 是和传统语言模型一样,每次只输出一个token;模型实际运作方式是将已经输出的token作为下一轮输入的一部分,这也叫“自回归”

在这里插入图片描述

图1. time step = 1 输入[recite the first law $ A] 输出robot

在这里插入图片描述

图2. 输入[recite the first law $ A robot] 输出may

GPT-2 和后来的模型比如 TransformerXL 与 XLNet 都是天然自回归的。BERT 并没这样做。放弃自回归使 BERT 可以结合单词上下文(左右两侧的单词)获取更好的效果。XLNet 找到了某种整合上下文的新方式,所以自回归和上下文关联的特点它都有。

自关注层(self-attention layer)中 mask future token 并不是像 BERT 显式的用 [mask] 将其替换掉,而是阻碍其从右边token里提取信息。比如我们执行到了第四步,可以看到只有当前和之前出现了的token能参与计算
在这里插入图片描述

图3. GPT2 self-attention中mask

在这里插入图片描述

图4. BERT中self-attention 和 GPT2中self-attention区别,左边为BERT,右边为GPT2

2. GPT2 流程

GPT2 的总体结构如图5所示,总的来说就是transformer的decoder部分,与transfomer的区别在于:(1)去除了encoder-decoder子层 (2)模型能处理的序列长度达到了 4000(transfomer 是512)
在这里插入图片描述

图5. GPT2结构

2.1 输入

输入由两部分组成:token embedding 和 position embedding
第一个解码块开始接手,先经 mask self-attention 处理,然后送入前馈神经网络。转换块处理完成后将解析token得到的向量发给上层解码器。这一过程在每一块中都是一样的,但每一块的mask self-attention和前馈神经网络参数各不相同
在这里插入图片描述

图6. GPT2 输入

之后,将第一步的输出添加到输入序列中,进行下一步的预测

在这里插入图片描述

2.2 mask self-attention

self-attention流程和transformer一样,通过q , k 向量获得权重,最后将v 向量加权和,区别在于每次进行self-attention时只能与当前词的前面词做attention, 如图7所示,在输入为it时, 只能同it<s> a robot must obey the orders given这8个词做attention, 不能同it后面的词做attention
在这里插入图片描述

图7. GPT2 中 mask self-attention

mask self-attention的实现如图8所示,遮罩型和原始自注意直到第二步前都是一致的(求 q, k, v, 并用q, v 打分)。我们来看第二个token,这里,最后两个标识被盖住了,模型在打分这一步遇到了阻碍。基本上后续token的相关系数(权重)都是 0 ,所以模型也就不能”偷看“了。
在这里插入图片描述

图8. Mask self-attention

遮挡效果通常是借助 attention mask 的矩阵实现的。试想现在有一个 4 个词构成的序列(”robot must obey orders”)。对一个语言模型来讲,这个序列会被拆成 4 步处理——每次一词(假定每个词就是一个token)。同时这些模型都是批处理的工作模式,不妨假设一批 4 个,这样整个序列都会在同一批内接受处理。
在这里插入图片描述

在这里插入图片描述
相乘后,为 score 带上attention mask。这样想要遮挡的单元格的值就会是负无穷或是一个非常小的负数,如下图所示, attention mask其实就是一个上三角矩阵,上三角元素都是一个负无穷的数
在这里插入图片描述
接着执行 softmax 变换就得到了参与 self-attention 运算的相关系数值(权重)
在这里插入图片描述

  • 模型处理第一行的时候,因为只有一个词(robot),所有精力都给它
  • 到了第二行,就有两个词了,对must进行处理,分配 48% 的注意力给 robot,52% 留在must

2.3 输出

当顶层解码块处理完成,模型会将其输出的向量与嵌入矩阵相乘, 结果就是词表中各个词的得分。

在这里插入图片描述

在这里插入图片描述
当然我们可以直接选择最高分的单词(top-k = 1)。但最好还是考虑一下其他的词。所以更好的做法是将得分视为概率对词表进行采样(得分更高的词更有可能被选出来)。折中办法是将 top-k 设置为 40,让模型从 40 个得分最高的词里选。

这样,模型就完成了一次迭代得到了一个单词输出。模型会持续迭代直到得到整个序列(1024 个标识)的输出或者解析出序列截止标识。

2.4 注意事项

  • 上文中提到的token,实际上 GPT-2 使用字节对编码(Byte Pair Encoding)来对词表创建token,这意味着token通常只是单词的一部分。
  • 上文中的 GPT-2 运行模式为 eval 模式,所以才会每次只处理一个词。训练时模型会面对更长的文本并同时处理多个标识,训练期间模型处理的批大小(512)也超过了评估模式的
  • tranformer中使用了ResNet 和 LN ,在GPT中也使用了,上文并未提出
  • 每个块都有一个权重矩阵 W Q W^Q WQ W K W^K WK W V W^V WV 来计算 q , k , v q ,k, v qkv向量,而整个模型只有一个token embedding和一个position embedding 矩阵,如下图所示
    在这里插入图片描述

关注微信公众号 funNLPer 了解更多AI算法

reference

### GPT 模型的工作原理及架构详解 #### 1. 核心概念与目标 GPT(Generative Pre-trained Transformer)系列模型是一种基于Transformer架构的语言生成模型,主要采用自回归的方式生成自然语言文本。该模型通过大规模无监督预训练和下游任务微调相结合的方法,在多种自然语言处理任务中表现出卓越性能[^1]。 #### 2. 基于 Transformer 的架构设计 GPT 模型的核心在于利用了 Transformer 架构的优势。具体来说,它采用了 Transformer 中的编码器部分作为基础结构,并在此之上构建了一个单向注意力机制(Masked Attention)。这种设计使得模型能够在生成过程中仅关注先前已生成的内容,从而实现高效的序列建模能力。 以下是 GPT 模型的主要组成部分: - **输入表示**:将输入文本转换为词嵌入形式,并加入位置编码以保留顺序信息。 - **多头自注意力层**:用于捕捉上下文中不同词语之间的关系,增强对全局依赖性的理解。 - **前馈神经网络**:进一步提取特征并增加非线性表达力。 - **输出分布预测**:通过对最后一个隐藏状态应用全连接层和 Softmax 函数来计算下一个 token 的概率分布。 #### 3. 自回归生成方式 作为一种典型的自回归模型,GPT 在生成新单词时会依次考虑之前已经产生的所有内容。这意味着每次只生成一个token,并将其附加到现有序列之后再继续下一步操作直到达到指定长度为止。 #### 4. 功能扩展——Function Call 能力引入 除了传统的文本生成功能外,最新版本还增加了 function call 支持。这一特性允许模型不仅限于提供计划指导而是具备实际行动能力。例如当面对复杂任务分解场景下不再单纯依靠人类介入完成后续步骤;相反它可以自主调用外部API或者工具接口自动执行相应动作[^2]。 #### 5. 微调过程概述 为了使通用的大规模预训练模型更好地服务于特定应用场景下的需求,则需对其进行针对性调整即所谓“fine-tuning”。对于像GPT这样的大型语言模型而言,通常做法是从官方开源项目获取预先经过海量语料库训练好的权重参数文件作为起点;接着针对自己关心领域内的专用数据集重新开展新一轮迭代优化直至满足预期效果为止[^3]。 ```python import torch from transformers import GPT2LMHeadModel, GPT2Tokenizer # 加载预训练模型及其分词器 model_name_or_path = 'gpt2' tokenizer = GPT2Tokenizer.from_pretrained(model_name_or_path) model = GPT2LMHeadModel.from_pretrained(model_name_or_path) # 输入提示文本 input_text = "Once upon a time" inputs = tokenizer(input_text, return_tensors="pt") # 使用模型生成续写内容 outputs = model.generate(**inputs, max_length=50, num_return_sequences=1) generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True) print(generated_text) ``` 上述代码片段展示了如何加载 GPT-2 预训练模型并通过给定起始句生成一段连续的故事叙述。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值