目录
1 GPT中的Transformer架构
2 transformer中的注意力机制
参考文献:
看了两个比较好的视频,简单做了下笔记。
1 GPT中的Transformer架构
GPT是Generative Pre-trained Transformer单词的缩写,其中transformer是一种特定的神经网络,这里的单词是transformer不是transform.
当聊天机器人生成某个特定词汇时,首先输入内容会被拆分成许多小片段,
如果把这些向量看作是在一个高维空间中的坐标,那么含义相似的词汇倾向于彼此接近的向量上,
这些向量接下来会经过一个称为注意力块的处理过程,使得向量能够相互交流,
注意力模块的作用就是要确定上下文中哪些词对更新其他词的意义有关,以及应该如何准确地更新这些含义。
词语的所谓含义完全通过向量中的数字来表达。然后这些向量会经过另一种处理,这个过程根据资料的不同,可能被称作多层感知机或者前馈层,这个阶段向量不在互相交流,而是并行地经历同一处理。
然后对这最后一个向量进行特定操作,产生一个覆盖所有可能token的概率分布,
然后它就可以根据一小段文本预测下一步,给他一段初始文本,然后让他不断地进行预测下一步, 从概率分布中抽样,添加到现有文本, 然后不断地重复这个过程,就能生成一段文本。
将上面的工具转化为聊天机器人的一个简单方法就是准备一段文本,设定出用户与一个有帮助的AI助手交互的场景,这就是所谓的系统提示。
文本处理示例第一步:将输入分割成小片段,并将这些片段转换成向量。
模型拥有一个预设的词汇库,包含所有可能的单词,输入首先遇到一个矩阵叫做embedding嵌入矩阵,他为每个单词都分配了一个独立的列
这些列定义了第一部中每个单词转换成的向量。
这些嵌入空间中的向量,不仅仅代表着单个单词,他们还携带了词汇位置的信息,这些词汇能吸纳并反映语境。
2 transformer中的注意力机制
前面说过每个tokens都是一个嵌入向量,在所有可能得嵌入向量所构成的高维空间中, 不同的方向能够代表不同的语义含义 (比如有的方向对应着性别,即在这个空间中添加一定的变化可以从一个男性名词的嵌入转到对应的女性名词的嵌入)
在这样一个复杂的空间中,有无数的方向, 每一个都可能代表词义的不同方面。
transformer的目标就是逐步调整这些嵌入,使他不仅仅编码单词本身,而是包含更丰富、更深层次的上下文含义。
但是,在transformer的第一步中,文本被拆分,每个token都被关联到一个向量,
因为初始的token嵌入向量,本质上是一个不参考上下文的查找表,直到transformer的下一步,周围的嵌入向量才有机会向这个token传递信息,
注意力模块不仅可以精确一个词的含义,还能将一个嵌入向量中的信息传递到另一个嵌入向量中,
例如,你输入的文字是一整部悬疑小说,到了接近尾声的部分,写着“所以,凶手是”,如果模型要准确地预测下一个词语,那么这个序列中的最后一个向量,他最初只是嵌入了单词“是”,它必须经过所有的注意力模块的更新,以包含远超过任何单个单词的信息,通过某种方式编码了所有来自完整的上下文窗口中与预测下一个词相关的信息。
举一个简单的例子,假设输入一个句子
假设我们现在关注的只是让形容词调整其对应名词的含义这种更新方式。
每个词的初始嵌入向量是一个高维向量,只编码了该特定词的含义以及词的位置,不包含任何上下文,
我们用字母E来表示这些嵌入向量,我们的目标是,通过一系列计算,产生一组新的、更为精细的嵌入向量,这样做可以让名词的嵌入向量捕捉并融合了与他们相对应的形容词的含义。
其中的矩阵充满了可调节的权重,模型将根据数据来学习这些权重,
在这个过程的第一步,你可以想象每个名词,比如“生物”,都在问,有没有形容词在我前面,对于“毛茸茸的”和“蓝色的”这两个词,都会回答,我是一个形容词,我就在那个位置,这个问题会被编码成另一个向量,也就是一组数字,我们称之为这个词的查询向量,
计算这个查询就是取一个特定的矩阵,也就是WQ,并将其与嵌入向量相乘,简化一下,我们把查询向量记作Q,
这里E和WQ相乘得到查询向量Q,在这种情况下,你将这个矩阵WQ和上下文中的所有嵌入向量相乘,得到的是每个token对应的一个查询向量,这个矩阵WQ由模型的参数组成,意味着它能从数据中学习到真实的行为模式。 在实际应用中,这个矩阵在特定注意力机制中的具体作用是相当复杂的, 理想的情况是,我们希望这个查询矩阵能将名词的嵌入信息映射到一个较小空间的特定方向上,
这种映射方式能够捕捉到一种特殊的寻找前置形容词的规律,
然后还有另一个被称之为键矩阵的矩阵,同时需要与所有嵌入向量相乘,这会生成一个我们称之为键的向量序列,从概念上讲,可以把键想象成是潜在的查询回答者,
这个键矩阵也冲忙了可调整的参数,同查询矩阵一样,将嵌入向量映射到同一个较小的维度空间中,当键与查询密切对齐时,你可以将键视为与查询相匹配,
为了衡量每个键和每个查询的匹配程度,你需要计算每一对可能的键-查询组合之间的点积,我们可以将其想象为一个充满各种点的网络,其中较大的点对应着较大的点积, 即键与查询对齐的地方,就我们讨论的形容词与名词的例子而言,如果毛茸茸的和蓝色的生成的键确实与生物产生的查询非常吻合,那么这两个点的点积会是一些较大的正数,
相比之下,像the这样的词语的键,与生物的查询之间的点积会是一些较小或者负数,这反映出他们之间没有关联,
这个网格赋予了我们评估每个单词在更新其他单词含义上的相关性得分的能力,接下来我们将利用这些分数,执行一种操作:按照每个词的相关重要性,沿着每一列计算加权平均值,因此我们的目标不是让这些数据列的数值范围无线扩展,从负无穷到正无穷,相反,我们希望这些数据列中的每个数值都介于0和1之间。并且每列的数值总和为1,正如他们构成一个概率分布那样,这就需要做softmax操作,softmax之后如下
我们将这种网格称为 注意力模式。
在transformer的原始论文里面,
在这个公式中,还有个dk,为了数值稳定性,这里将所有这些值除以键-查询空间维度的平方根,
然后包含所有算式的softmax函数我们应理解为是按列应用的,然后公式中还有大写V,后面再讲。
之前没有提到一个技术细节,在训练过程中,对给定样本进行处理时,模型会通过调整权重来奖励或惩罚预测的准确性,即根据模型对文中下一个词的预测概率的高低,有种做法能显著提高整个训练过程的效率,那就是同时让模型预测, 该段落中每个初始token子序列之后所有可能出现得下一个token,
这样一来,一个训练样本就能提供更多的学习机会,在设计注意力模式时,一个基本原则是不允许后出现得词汇影响先出现得词汇,如果不这么做,后面出现得词汇可能会提前泄露接下来内容的线索,这就要求我们在模型中设置一种机制,确保代表后续token对前面token的影响力能够被有效削弱到0,直觉上我们可能会考虑直接将这些影响力设置为0,但这样做会导致一个问题,那些影响力值的列加和不再是1,也就失去了标准化的效果,为了解决这个问题,一个常见的做法是在进行softmax归一化操作之前将这些影响力值设置为负无穷大。这样,干净过softmax处理后,这些位置的数值会变成0,同时保证了整体的归一化条件不被破坏,这就是所谓的掩蔽过程,
注意力模式的大小等于上下文大小的平方,这就解释了上下文大小可能会对大语言模型构成巨大瓶颈,
通过前面的计算,模型能够推断哪些词与其他词相关,然后就需要实际更新嵌入向量,让词语可以将信息传递给他们相关的其他词,比如说,你希望毛茸茸的嵌入向量能够使得生物发生改变,从而将它移动到这个12000维嵌入空间的另一部分,以更具体地表达一个毛茸茸的生物,
我首先向你展示的事执行这个操作的最简单方法,这个方法的核心是使用一个第三个矩阵,也就是我们所说的值矩阵Wv,你需要将它与某个单词的嵌入相乘,得到的结果我们称为值向量,
是你要就加入到第二个单词的嵌入向量中的元素,例如在这个情境下,就是要加入到“生物”的嵌入向量中,因此这个值向量就存在于和嵌入向量一样的,给常高维的空间中,当你用这个值矩阵乘以某个单词的嵌入向量时,可以理解为你在询问:如果这个单词对于调整其他内容的含义具有相关性,那么为了反应这一点,我们需要向那个内容的嵌入中添加什么呢,
回到之前的注意力模式的图表,我们先不考虑所有的键和查询,因为一旦计算出注意力模式,这些就不再需要了,接下来,我们将使用这个值矩阵,将其与每一个嵌入向量相乘,从而生成一系列的值向量,这些值向量视作在某种程度上与他们对应的键有关。对于图表中的每一列来说,你需要将每个值向量与该列中相应的权重相乘,比如,对于代表生物的嵌入向量,你会主要假如毛茸茸的和蓝色的这两个值向量的较大比例,而其他的只向量则被减少为零,或者至少接近零,最后,为了更新这一列与之相关联的嵌入向量,原本这个向量编码了生物这一概念的某种基本含义(不考虑具体上下文),你需要将列中所有这些经过重新调整比例的值加总起来,这一步骤产生了一个我们想要引入的变化量,我将其称为delta-e。接着将这个变化量叠加到原有的嵌入向量上,希望最终得到的事一个更精细的向量,是一个更加细致和含有丰富上下文信息的向量,比如描绘了一个毛茸茸、蓝色的奇妙生物。
上面讨论的整个过程,构成了所谓的单头注意力机制。这一机制是通过三种不同的、充满可调整参数的矩阵来实现的。也就是键 查询 和 值。
另外,值矩阵,有12288行和12288列,
参考文献:
图形化的理解GPT中的Transformer架构_哔哩哔哩_bilibili
什么是GPT?通过图形化的方式来理解 Transformer 中的注意力机制_哔哩哔哩_bilibili