选自github.io
机器心脏编译
参与:郭,极客AI
在过去的一年里,BERT、Transformer XL、XLNet等大规模自然语言处理模型轮番创下了重大自然语言处理任务清单上的最佳记录,可以说你会唱我。其中,GPT-2以其稳定、优异的性能吸引了业界的关注
今年出现了很多机器学习的精彩应用,令人眼花缭乱,OpenAI的GPT-2就是其中之一。它在文本生成方面有着惊人的表现,其生成的文本在语境连贯和情感表达方面都超出了人们对当前语言模式的预期。就模型架构而言,GPT-2并不是特别新颖,它与只有解码器的变压器模型非常相似。
然而,GPT 2号具有巨大的规模,这是一个基于在海量数据集上训练的transformer的巨大模型。GPT 2号成功的秘密是什么?本文将带您探索性能卓越的GPT-2模型架构,重点讲解关键的自关注层,并看一看GPT-2除了语言建模之外,还采用的纯解码器转换器架构的应用。
笔者之前写过一篇相关的介绍性文章《图解变压器》。在这篇文章的基础上,我们将增加更多关于变压器模型内部工作原理的可视化解释,以及变压器模型在这一时期的新进展。基于transformer的模型在不断进化,我们希望本文使用的这套可视化表达方法能够让这类模型更容易解释。
这个模型工作得很好,因为每个新单词生成后,都会添加到之前生成的单词序列中,这个序列将成为下一步模型的新输入。这种机制被称为自回归,也是使RNN模型出类拔萃的重要思想。
GPT-2和随后的一些模型,如TransformerXL和XLNet,本质上都是自回归模型,但BERT不是。这是一个平衡的问题。虽然没有使用自回归机制,但BERT获得了组合单词前后上下文信息的能力,从而获得了更好的结果。XLNet使用自回归,并引入了一种既能兼顾上下文信息又能兼顾上下文信息的方法。
变压器模块的演变
原变压器论文介绍了两种类型的变压器模块,即编码器模块和解码器模块。
1.编码器模块
首先是编码器模块:
图中所有解码器模块都是一样的,所以本文只扩展了第一个解码器的内部结构。可以看出,它使用了一个屏蔽的自我关注层。请注意,该模型在某个片段中最多可以支持4000个单词的序列,与transformer原纸中最多512个单词的限制相比有了很大的提升。
与transformer原论文中的解码器模块相比,这些解码器模块除了第二个自关注层之外,没有太大的不同。类似的架构也在字符级语言建模中得到验证,它使用更深的自我关注层来构建语言模型,并一次预测一个字母/字符。
OpenAI的GPT-2型号使用了这个只包含编码器的模块。
GPT 2号的内部机制很快
在我心里,每一个字都像一把刀;雷电让我疯狂。
——虎皮鹦鹉
接下来,我们将深入分析GPT 2号的内部结构,看看它是如何工作的。
GPT-2可以处理多达1024个单词的序列。每个字将与其延续路径一起“流经”所有解码器模块。
运行训练好的GPT-2模型最简单的方法是让它随机工作。换句话说,我们也可以给它一个暗示,对某个特定的话题说些什么。在随机情况下,我们只需提供一个预定义的初始单词,然后让它生成自己的单词。
此时模型的输入只有一个字,所以只有这个字的路径是活动的。对单词进行逐层处理,最终得到一个向量。该向量可以计算词汇表中每个单词的概率。在这个例子中,我们选择概率最高的单词“The”作为下一个单词。
但有时候这样会产生问题——就像我们一直点击输入法推荐的第一个词,可能会陷入推荐同一个词的怪圈,只有点击第二个或第三个词,才能跳出这个怪圈。同样,GPT-2也有一个名为“top-k”的参数,模型将从概率前有k的单词中采样选择下一个单词。显然,在前面的例子中,top-k = 1。
接下来,我们将输出单词添加到输入序列的末尾,以构建新的输入序列,并让模型进行下一次预测:
请注意,第二个单词的路径是目前唯一的活动路径。GPT-2的每一层都保留了它对第一个词的解释,并将使用这些信息来处理第二个词。GPT-2不会根据第二个单词重新解释第一个单词。
深入了解内部原理
1.输入代码
让我们仔细看看模型的内部细节。首先,让我们从模型的输入开始。就像前面讨论的其他自然语言处理模型一样,GPT-2也从嵌入矩阵中寻找与单词对应的嵌入向量,这也是模型训练结果的一部分。
每一行都是一个单词嵌入向量:可以表示一个单词并捕捉其含义的数字列表。嵌入向量的长度与GPT-2模型的大小有关。最小的模型使用长度为768的嵌入向量来表示一个单词。
所以在开始的时候,我们需要在嵌入矩阵中找到初始单词对应的嵌入向量。但是在将其输入模型之前,我们还需要引入位置编码——一些向转换器模块指示序列中单词顺序的信号。1024个输入序列位置中的每一个对应一个位置码,这些码形成的矩阵也是训练模型的一部分。
此时,进入模型的第一个变压器模块之前的所有处理步骤都完成了。如上所述,训练的GPT-2模型包含两个权重矩阵:嵌入矩阵和位置编码矩阵。
在第一个transformer模块中输入一个单词之前,需要找到它对应的嵌入向量,并加上1号位置对应的位置向量。
3.堆叠跳闸
第一个transformer模块处理单词的步骤如下:首先由自关注层处理,然后传递给神经网络层。在第一个转换器模块完成处理后,结果向量将被传送到堆栈中的下一个转换器模块,以继续计算。每个变压器模块都以相同的方式处理,但每个模块将在自关注层和神经网络层保持其自身的权重。
4.回顾自我关注机制
语言的意义极其依赖语境,比如下面的机器人第二定律:
机器人的第二条规则
机器人必须服从人类给它的命令,除非这些命令违反了第一定律。
我在这句话中突出了三个地方,这三个词指的是其他词。除非我们知道这些词所指的上下文是相关的,否则不可能理解或处理它们的含义。当模型处理这句话时,它必须知道:
“它”指的是机器人
“命令”是指前半句中人类给机器人的命令,即“人类给它的命令”
“第一定律”是指机器人第一定律的完整内容
这就是自我关注机制的作用。在处理每个单词之前,它结合了模型对用于解释单词上下文的相关单词的理解。具体来说,给序列中的每个单词一个相关性分数,然后总结它们的向量表示。
比如顶层的变压器模块在处理“it”这个词的时候会关注“a robot”,所以将“a”、“robot”和“it”三个词乘以它们的得分和加权和得到的特征向量会发送到后面的神经网络层。
自我注意机制是沿着序列中每个单词的路径进行处理的,主要由三个向量组成:
查询向量:用当前词的查询向量乘以其他词的关键向量,得到其他词相对于当前词的关注度得分。我们只关心当前正在处理的单词的查询向量。
关键向量:关键向量就像是序列中每个单词的标签,让我们在搜索相关单词的时候能够搜索到匹配的对象。
值向量:值向量是单词的真实表示。在计算出关注度得分后,我们使用值向量进行加权求和,得到能够代表当前位置上下文的向量。
一个简单粗暴的比喻是在文件柜里找文件。查询向量就像一个便利贴,上面写着你正在研究的主题。关键向量就像是贴在文件柜文件夹上的标签。当你找到一个和便利贴上写的内容相匹配的文件夹,拿出来,文件夹的内容就是价值矢量。然而,我们最终寻找的不是一个单一的值向量,而是许多文件夹值向量的混合。
将单词的查询向量乘以每个文件夹的关键向量,得到每个文件夹对应的关注度得分。
我们将每个文件夹的值向量乘以其对应的关注度得分,然后求和得到关注层的最终输出。
这样,值向量加权混合的结果就是一个向量,它把50%的注意力集中在“robot”这个词上,30%集中在“a”上,19%集中在“it”上。我们将在后面更详细地解释自我注意机制。让我们继续探索转换器堆栈,并查看模型的输出。
5.模型输出
最后一个转换器模块产生输出后,模型将输出向量乘以嵌入矩阵。
我们知道,嵌入矩阵的每一行对应于模型词汇表中一个单词的嵌入向量。所以这个乘法运算的结果就是词汇中每个单词对应的注意力得分。
我们只需选择得分最高的单词作为输出结果。但事实上,如果模型考虑其他候选词,效果通常会更好。因此,一个更好的策略是从整个单词列表中抽取一些得分较高的单词,以它们的得分作为概率。通常,一个折中的办法是将top-k设置为40,这样模型就会考虑关注度评分中的前40个单词。
这样,模型完成一轮迭代并输出一个单词。该模型将继续迭代,直到生成一个完整的序列——该序列达到上限1024或在序列中生成一个终止符。
第一部分是结论:大家好,我是GPT 2号
本文是GPT-2模型的概述。如果你还对自我关注层里面的深层细节感到好奇,请继续关注机器之心系列文章。我们将引入更多的可视化语言来尝试解释自关注层的工作原理,并更好地描述基于transformer的模型。
这篇文章有些过于简单化了:
“字”和“字”两个概念是混合的。但事实上,GPT-2使用字节对编码来创建词汇中的单词,这意味着单词通常只是单词的一部分。
这个例子实际上是GPT-2在“推断/评估”模式下运行的过程,所以一次只处理一个单词。在训练过程中,该模型将在更长的文本序列上训练,并一次处理多个单词。训练过程中的批量也比较大,而评估中的批量只有1。
为了更好地组织空中的图像,作者在绘制时随意转置了矢量,但在实现时需要更加精确。
Transformer模块使用了很多归一化层,这在训练中非常重要。我们在《图说变形金刚》的翻译中提到了其中的一些,但本文更多关注的是自我关注层。
有时候文章需要用更多的小方块来表示一个向量。我把这些情况称为“放大”,如下图所示。
原地址:https://jalammar.github.io/illustrated-gpt2/
这篇文章是为机器的心脏编写的。请联系本微信官方账号进行授权。
-