【AI理论学习】语言模型:深入理解GPT-2计算掩码自注意力过程,了解GPT-3工作原理


从GPT-2到GPT-3的发展思路是逐渐提高模型规模、性能和通用性,同时解决先前版本的一些限制。以下是这一发展过程的主要思路和关键点:

  1. 逐步提高模型规模:
    • GPT-2: GPT-2是OpenAI首次推出的基于Transformer的语言模型。它采用了1.5亿个参数,是当时规模较大的模型之一。然而,由于担心滥用,OpenAI最初不公开发布了其最大规模版本。
    • GPT-3: 在GPT-2的基础上,OpenAI进一步提高了模型的规模。GPT-3的最大版本(GPT-3.5-turbo)拥有1750亿个参数,比GPT-2大约10倍,成为迄今为止最大规模的语言模型之一。这使得GPT-3具有更高的自然语言处理能力。
  2. 增加通用性:
    • 更广泛的应用: GPT-3的目标是成为通用的自然语言处理模型,可以应用于各种任务,而不仅仅是文本生成。这一目标使GPT-3在问答、对话、文本生成、翻译等多个任务上都能表现出色。
    • 零样本学习: GPT-3引入了零样本学习的能力,这意味着它可以在未经过特定任务训练的情况下执行各种任务。这一特性使GPT-3更具通用性,能够快速适应新任务。
  3. 解决滥用问题:
    • 加强安全性: 由于担心滥用,特别是在自动文本生成方面,OpenAI采取了一些安全措施。他们限制了模型的访问,并审查了使用API的应用程序,以减少不适当的内容生成。
    • 迭代改进: 随着发布和使用,OpenAI不断改进GPT-3的安全性,以减少可能的滥用风险。

总的来说,从GPT-2到GPT-3的发展思路是不断提高模型规模、性能和通用性,同时关注滥用问题,以确保该技术的道德和社会责任。这一发展过程代表了深度学习自然语言处理领域的快速发展和创新。

之前的文章已经介绍了GPT以及GPT2的总体情况,本文重点介绍GPT-2计算掩码自注意力的详细过程,了解GPT-3的工作原理,并对一些常见的语言模型应用进行介绍。

图解Self-Attention

之前的文章中,我们使用如下图片来展示如何在一个层中使用 Self-Attention,这个层正在处理单词it
Self-Attention层
在这一节,我们会详细介绍如何实现这一点。请注意,我们会讲解清楚每个单词都发生了什么。这就是为什么我们会展示大量的单个向量。而实际的代码实现,是通过巨大的矩阵相乘来完成的。但在这里,我们把重点放在词汇层面上。

图解 Self-Attention(without masking)

首先,我们介绍原始的Self-Attention,它被用在 Encoder 模块中进行计算。以一个简单的 Transformer为例,它一次只能处理 4个token。
Self-Attention 主要通过 3 个步骤来实现:

  1. 为每个路径(path)创建 Query、Key、Value 矩阵。
  2. 对于每个输入的token,使用它的Query 向量为所有其他的Key 向量进行打分。
  3. 将Value 向量乘以它们对应的分数后求和。
    Self-Attention

1. 创建Query、Key和Value向量

首先关注第一条路径。我们会使用它的Query 向量,并比较所有的Key 向量。这会为每个Key 向量产生一个分数。Self-Attention 的第一步是为每个 token 的路径计算 3 个向量。也就是说,对于每个输入单词,分别与权重矩阵 W Q W^Q WQ W K W^K WK W V W^V WV相乘,得到一个查询向量(query vector)、关键字向量(key vector)、数值向量(value vector),如下图所示:
calculate the three vectors for each token path

2. 计算分数

现在我们有了这些向量,我们只对步骤 2 使用Query 向量和Value 向量。因为我们关注的是第一个token 的向量,我们将第一个token 的 Query 向量和其他所有的token 的 Key 向量相乘,得到4 个token 的分数
Multiply (dot product)

3. 计算和

现在可以将这些分数和Value 向量相乘。在我们将它们相加后,一个具有高分数的Value 向量会占据结果向量的很大一部分。
sum up
分数越低,Value 向量就越透明。这是为了说明,乘以一个小的数值会稀释 Value 向量。

如果我们对每个路径都执行相同的操作,我们会得到一个向量,可以表示每个 token,其中包含每个 token 合适的上下文信息。这些向量会输入到 Transformer 模块的下一个子层(前馈神经网络)。
do same operation for each path

图解 Masked Self-Attention

现在,我们已经了解了 Transformer 的 Self-Attention 步骤,现在继续研究 masked self-attention。Masked self-attentionself-attention 是相同的,除了第 2 个步骤。假设模型只有 2 个 token 作为输入,我们正在观察(处理)第二个 token。在这种情况下,最后 2 个 token 是被屏蔽(masked)的。所以模型会干扰评分的步骤。它基本上总是把未来的 token 评分为 0,因此模型不能看到未来的词
Masked Self-Attention
这个屏蔽(masking)经常用一个矩阵来实现,称为 attention mask。想象一下有 4 个单词的序列(例如,机器人必须遵守命令)。在一个语言建模场景中,这个序列会分为 4 个步骤处理——每个步骤处理一个词(假设现在每个词是一个 token)。由于这些模型是以 batch size 的形式工作的,我们可以假设这个简单模型的 batch size 为 4,它会将整个序列作(包括 4 个步骤)为一个 batch 处理。
process the entire sequence (with its four steps) as one batch
在矩阵的形式中,我们把 Query 矩阵和 Key 矩阵相乘来计算分数。让我们将其可视化如下,不同的是,我们不使用单词,而是使用与格子中单词对应的 Query 矩阵(或者 Key 矩阵)。
multiplying a queries matrix by a keys matrix
在做完乘法之后,我们加上三角形的 attention mask。它将我们想要屏蔽的单元格设置为负无穷大或者一个非常大的负数(e.g. -1 billion in GPT2):
mask to -infinity
然后对每一行应用 softmax,会产生实际的分数,我们会将这些分数用于 Self-Attention。
Softmax on each row
这个分数表的含义如下:

  • 当模型处理数据集中的第1个数据(第 1 行),其中只包含着一个单词 (robot),它将 100% 的注意力集中在这个单词上。
  • 当模型处理数据集中的第2个数据(第 2 行),其中包含着单词(robot must)。当模型处理单词 must,它将 48% 的注意力集中在 robot,将 52% 的注意力集中在 must。
  • 诸如此类,继续处理后面的单词。

GPT-2 Masked Self-Attention

现在,我们可以更详细地了解 GPT-2 的 masked attention机制。

评价模型:每次处理一个 token

我们可以让 GPT-2 像masked self-attention 一样工作。但是在评价模型时,当我们的模型在每次迭代后只添加一个新词,那么对于已经处理过的 token 来说,沿着之前的路径重新计算 self-attention 是低效的

在这种情况下,我们处理第一个 token(现在暂时忽略 <s>)。
process the first token
GPT-2 保存 token a 的 Key 向量和 Value 向量。每个 self-attention 层都持有这个 token 对应的 Key 向量和 Value 向量
Every self-attention layer holds on to its respective key and value vectors for that token
现在在下一个迭代,当模型处理单词 robot,它不需要生成 token a 的 Query、Value 以及 Key 向量。它只需要重新使用第一次迭代中保存的对应向量
reuses the ones it saved from the first iteration

GPT-2 Self-attention

1. 创建 Query、Key 和 Value 矩阵

让我们假设模型正在处理单词 it。如果我们讨论最下面的模块(对于最下面的模块来说),这个 token 对应的输入就是 it 的 embedding 加上第 9 个位置的位置编码:
its input for that token would be the embedding of it + the positional encoding for slot #9
Transformer 中每个模块都有它自己的权重(在后文中会拆解展示)。我们首先遇到的权重矩阵是用于创建 Query、Key、和 Value 向量的。
The first we encounter is the weight matrix that we use to create the queries, keys, and values
Self-Attention 将它的输入乘以权重矩阵(并添加一个 bias 向量,此处没有画出),这个相乘会得到一个向量,这个向量基本上是 Query、Key 和 Value 向量的拼接
basically a concatenation of the query
将输入向量与 attention 权重向量相乘(并加上一个 bias 向量)得到这个 token 的 Key、Value 和 Query 向量拆分为 attention heads。

1.5 拆分为attention heads

在之前的例子中,我们只关注了 Self Attention,忽略了 multi-head 的部分。现在对这个概念做一些讲解是非常有帮助的。Self-attention 在 Q、K、V 向量的不同部分进行了多次计算。拆分 attention heads 只是把一个长向量变为矩阵。小的 GPT-2有 12 个 attention heads,因此这将是变换后的矩阵的第一个维度:
The small GPT2 has 12 attention heads, so that would be the first dimension of the reshaped matrix
在之前的例子中,我们研究了一个 attention head 的内部发生了什么。理解多个 attention-heads 的一种方法,是像下面这样(如果我们只可视化 12 个 attention heads 中的 3 个):
visualize three of the twelve attention heads

2. 评分

现在可以继续进行评分,这里我们只关注一个 attention head(其他的 attention head 也是在进行类似的操作)。
only looking at one attention head
现在,这个token 可以根据其他所有token 的Key 向量进行评分(这些Key 向量是在前面一个迭代中的第一个 attention head 计算得到的):
Now the token can get scored against all of keys of the other tokens

3. 求和

正如之前所看的那样,我们现在将每个Value 向量乘以对应的分数,然后加起来求和,得到第一个 attention head 的 Self-Attention 结果
Sum

3.5 合并attention heads

我们处理各种注意力的方法是首先把它们连接成一个向量:
Merge attention heads
但是,这个向量还没有准备好发送到下一个子层(向量的长度不对)。我们首先需要把这个隐层状态的巨大向量转换为同质的表示homogenous representation)。

4. 映射(投影)

我们将让模型学习如何将拼接好的 Self Attention 结果转换为前馈神经网络能够处理的形状。在这里,我们使用第二个巨大的权重矩阵,将 attention heads 的结果映射到 self-attention 子层的输出向量:
projecting
通过映射,得到了一个向量,我们可以把这个向量传给下一层:
send along to the next layer

GPT-2 全连接神经网络

第一层

全连接神经网络是用于处理 Self Attention 层的输出,这个输出的表示包含了合适的上下文。全连接神经网络由两层组成。第一层是模型大小的 4 倍(由于 GPT-2 small 是 768,因此这个网络会有 个神经元)。为什么是四倍?这只是因为这是原始 Transformer 的大小(如果模型的维度是 512,那么全连接神经网络中第一个层的维度是 2048)。这似乎给了 Transformer 足够的表达能力,来处理目前的任务。
GPT-2 Neural Network Layer 1

第二层:把向量映射到模型的维度

第 2 层把第 1 层得到的结果映射回模型的维度(在 GPT-2 small 中是 768)。这个相乘的结果是 Transformer 对这个 token 的输出。
Projecting to model dimension
以上就是我们讨论的 Transformer 的最详细的版本!现在已经了解了 Transformer 语言模型内部发生了什么。总结一下,我们的输入会遇到下面这些权重矩阵
weight matrices每个模块都有它自己的权重。另一方面,模型只有一个 token embedding 矩阵和一个位置编码矩阵
one token embedding matrix and one positional encoding matrix
查看模型的所有参数如下:
模型的所有参数

GPT-3

GPT-3延续GPT的单向语言模型训练方式,但是引入了 Sparse Transformer 中的 sparse attention 模块(稀疏注意力),并且把模型尺寸增大到了1750亿,使用45TB数据进行训练。同时GPT-3主要聚焦于更通用的NLP模型,在一系列基准测试和特定领域的自然语言处理任务中达到最新的SOTA结果。

sparse attention 与传统 self-attention(称为 dense attention) 的区别在于:

  • dense attention:每个 token 之间两两计算 attention,复杂度 O(n²)
  • sparse attention:每个 token 只与其他 token 的一个子集计算 attention,复杂度 O(n*logn)

与GPT-2相比,GPT-3的图像生成功能更成熟,不需要微调,就可以在不完整的图像样本基础上补全完整的图像。GPT-3实现了两个转变:
1)从语言到图像的转换
2)使用更少的领域数据,甚至不经过微调步骤去解决问题。

1. 预训练模型一般流程

预训练模型的一般流程如图所示,其中微调是一个重要环节。
预训练模型的一般流程

2. GPT-3与BERT的区别

GPT-3和BERT是两个不同的自然语言处理(NLP)模型,它们在多个方面有着显著的区别:

  1. 模型架构:
    • GPT-3(Generative Pre-trained Transformer 3)是一个基于Transformer的Decoder模块的自回归语言模型,使用Masked Self-Attention。它的设计目的是生成文本,可以用于生成各种自然语言文本,如文章、故事、对话等。
    • BERT(Bidirectional Encoder Representations from Transformers)是一个基于Transformer的Encoder模块的自编码语言模型,使用Self-Attention。BERT的目标是通过双向上下文建模,提取文本中的表示形式,通常用于各种NLP任务的预训练。
  2. 任务类型:
    • GPT-3: GPT-3主要用于生成文本,它是一个生成模型,可以生成与输入文本相关的自然语言输出。
    • BERT: BERT主要用于提取文本的表示形式,它是一个表示学习模型,可以用于各种NLP任务,如文本分类、命名实体识别、问答等。
  3. 训练方式:
    • GPT-3: GPT-3采用自回归方式进行预训练,即它通过生成文本来学习语言的概率分布。GPT-3的训练基于4990亿标识符的语料库。
    • BERT: BERT采用自编码方式进行预训练,即它通过预测输入文本中的遮蔽词汇来学习文本表示。其中的BERT Large训练数据基于25亿标识符的语料库
  4. 方向性:
    • GPT-3: GPT-3是一个自回归模型,通常用于生成文本。它生成一系列文本标记,其中每个标记都依赖于前面生成的标记。
    • BERT: BERT是一个双向模型,它可以同时考虑上下文中的词汇,因此可以更好地理解整个文本的上下文。
  5. 任务适应性:
    • GPT-3: GPT-3通常需要微调才能适应特定的任务。它的输出可以通过添加任务特定的头部(例如分类头部)来用于各种任务。
    • BERT: BERT通过在预训练后添加一个简单的任务特定层(例如分类层)来适应不同的NLP任务,因此更容易用于迁移学习
  6. 规模:
    • GPT-3: GPT-3是目前已知最大规模的语言模型之一,具有数千亿个参数,其中GPT-3 Large模型有1750亿个参数。
    • BERT: BERT的规模相对较小,通常有数亿或数千万个参数。其中BERT Large模型由3.4亿个参数。

需要注意的是,GPT-3和BERT都是在NLP领域取得了巨大成功的模型,它们各自具有不同的优势和应用领域。选择使用哪个模型取决于具体的任务和需求。

3. GPT-3与传统微调的区别

GPT-3与传统微调(Fine-Tuning)方法在自然语言处理(NLP)中有一些重要的区别,主要体现在以下几个方面:

  1. 规模和预训练
    • GPT-3:GPT-3是一个极其庞大的预训练语言模型,具有数十亿个参数,它在大规模的文本语料库上进行了自监督预训练。GPT-3的目标是在预训练阶段捕获尽可能多的自然语言知识,而不是为特定任务进行优化。
    • 传统微调:传统微调方法通常使用较小规模的预训练模型(如BERT或GPT-2),然后在特定任务的标记数据上进行有监督微调。微调的目标是根据任务特定的目标函数来优化模型,以便更好地适应特定任务。
  2. 任务适应性
    • GPT-3:由于其巨大的规模和预训练过程的广泛性,GPT-3在多种NLP任务上表现出色,而无需特定任务的微调。这使得GPT-3可以直接用于多种任务,而不需要重新训练模型。
    • 传统微调:传统微调方法需要为每个任务进行单独的微调,通常需要大量的标记数据。每个任务都需要一个特定的目标函数和微调过程
  3. 通用性
    • GPT-3:GPT-3被设计为一种通用的自然语言处理工具,可以用于生成文本、回答问题、翻译等多种任务。它可以用于多领域的应用,而不需要特定领域的定制。
    • 传统微调:传统微调通常需要为每个领域和任务创建定制的模型和训练流程,这可能需要大量的工程工作。
  4. 数据需求
    • GPT-3:由于其大规模的预训练和迁移学习能力,GPT-3通常需要更少的任务特定标记数据来在新任务上表现良好。
    • 传统微调:传统微调方法通常需要大量的标记数据来获得好的性能,尤其是在需要精确的任务中。
  5. 灵活性
    • GPT-3:GPT-3的预训练模型可以用于各种自然语言处理任务,而无需更改模型的体系结构。这提供了更大的灵活性。
    • 传统微调:传统微调可能需要修改模型体系结构以适应特定任务的需求,这可能需要更多的工程工作。

总的来说,GPT-3是一种通用的、预训练的自然语言处理模型,具有出色的泛化能力,可直接用于多种任务。传统微调方法更侧重于特定任务的优化,通常需要更多的工程和标记数据。选择哪种方法取决于任务的性质、数据可用性和资源等因素。

4. GPT-3的示例

GPT-3(Generative Pre-trained Transformer 3)是一个自然语言处理(NLP)模型,具有出色的自然语言理解和生成能力。以下是一些示例,展示了GPT-3可以执行的各种任务和应用场景:

  1. 文本生成
    • 文章写作:GPT-3可以生成文章、博客帖子、新闻稿等。
    • 创意写作:它可以生成诗歌、小说、故事等创意文本。
  2. 自动问答
    • 问答系统:GPT-3可以回答关于广泛主题的问题,包括科学、历史、技术等。
    • 法律咨询:它可以提供法律领域的问题答案和建议。
  3. 自然语言理解
    • 情感分析:GPT-3可以分析文本中的情感,如正面、负面或中性。
    • 意图识别:它可以识别用户的意图,用于聊天机器人和虚拟助手。
  4. 语言翻译
    • 翻译服务:GPT-3可以将文本从一种语言翻译成另一种语言。
  5. 代码生成
    • 代码编写:它可以生成程序代码,包括Python、JavaScript等。
  6. 虚拟助手
    • 个性化助手:GPT-3可以用于构建个性化虚拟助手,用于回答用户的问题和执行任务。
  7. 创作和艺术
    • 绘画和插画:它可以生成绘画描述或创作美术作品的说明。
    • 音乐创作:GPT-3可以生成音乐和歌词。
  8. 科学和研究
    • 数据分析:它可以帮助分析数据、生成图表和报告。
    • 科学研究:用于生成假设、探索科学领域的问题。
  9. 教育
    • 在线教育:GPT-3可用于生成教育材料、答案和练习题。
  10. 社交媒体和聊天
    • 社交媒体帖子:它可以为社交媒体平台生成帖子、评论和回复。

这些示例只是GPT-3的一小部分潜在用途。该模型可以根据提供的输入文本和任务执行多种自然语言处理任务,使其成为一个强大的自然语言处理工具。

更多关于GPT-3的资料请查看How GPT3 Works - Visualizations and Animations

语言模型应用案例

只有 Decoder 的 Transformer 在语言模型之外一直展现出不错的应用。它已经被成功应用在了许多应用中,可以用类似上面的图解方式来描述这些成功应用。

1. 机器翻译

进行机器翻译时,Encoder 不是必须的。我们可以用只有 Decoder 的 Transformer 来解决同样的任务
Machine Translation

2. 生成摘要

这是第一个只使用 Decoder 的 Transformer 来训练的任务。它被训练用于阅读一篇维基百科的文章(目录前面去掉了开头部分),然后生成摘要。文章的实际开头部分用作训练数据的标签:
Summarization
论文里针对维基百科的文章对模型进行了训练,因此这个模型能够总结文章,生成摘要:
summarize articles

3. 迁移学习

Sample Efficient Text Summarization Using a Single Pre-Trained Transformer 中,一个只有 Decoder 的 Transformer 首先在语言模型上进行预训练,然后微调进行生成摘要。结果表明,在数据量有限制时,它比预训练的 Encoder-Decoder Transformer 能够获得更好的结果。

GPT-2 的论文也展示了在语言模型进行预训练的生成摘要的结果。

4. 音乐生成

Music Transformer 论文使用了只有 Decoder 的 Transformer 来生成具有表现力的时序和动态性的音乐。音乐建模就像语言建模一样,只需要让模型以无监督的方式学习音乐,然后让它采样输出(前面我们称这个为 漫步)。

你可能会好奇在这个场景中,音乐是如何表现的。请记住,语言建模可以把字符、单词、或者单词的一部分(token),表示为向量。在音乐表演中(让我们考虑一下钢琴),我们不仅要表示音符,还要表示速度–衡量钢琴键被按下的力度。
Music Modeling
一场表演就是一系列的 one-hot 向量。一个 midi 文件可以转换为下面这种格式。论文里使用了下面这种输入序列作为例子:
A midi file can be converted into such a format
这个输入系列的 one-hot 向量表示如下:
Music Transformer
在这基础之上添加了一些注释:
annotation
这段音乐有一个反复出现的三角形轮廓。Query 矩阵位于后面的一个峰值,它注意到前面所有峰值的高音符,以知道音乐的开头。这幅图展示了一个 Query 向量(所有 attention 线的来源)和前面被关注的记忆(那些受到更大的softmax 概率的高亮音符)。attention 线的颜色对应不同的 attention heads,宽度对应于 softmax 概率的权重

GPT-2代码

  • Open AI的GPT-2代码仓库:https://github.com/openai/gpt-2
  • 查看Hugging Face的pytorch-transformers库。除了GPT2,它还实现了BERT、Transformer XL、XLNet和其他尖端transformers模型。

参考资料

  1. The Illustrated GPT-2
  2. How GPT3 Works - Visualizations and Animations
  3. GPT / GPT-2 / GPT-3 / InstructGPT 进化之路
  4. 语言模型:掌握BERT和GPT模型

猜你喜欢

转载自blog.csdn.net/ARPOSPF/article/details/132673892