ChatGPT的骨干是GPT模型,它是使用Transformer架构构建的。Transformer的骨干是Attention机制。对于很多人来说,最难理解的是Attention中的Key,Value和Query。在本文中,我将使用药水的比喻来内化这些概念。即使您已经机械地理解了Transformer的数学,我希望到本文结束时,您可以从始至终地开发出对GPT内部运作的更直观的理解。
这个解释不需要数学背景。对于技术倾向的人,我在……中添加了更多的技术解释。您也可以放心地跳过[方括号]中的注释和类似于这个的引用块中的侧面注释。在我的写作过程中,我构思了一些人类可读的中间状态的解释,以帮助解释,但GPT并不完全像那样思考。
【当我谈论“注意力”时,我专门指的是“自我注意力”,因为这就是GPT背后的原理。但是同样的比喻同样可以很好地解释“注意力”的一般概念。】
设置
GPT可以输出连贯内容的段落,因为它做得非常好:“给定一段文本,下一个单词是什么?” 让我们扮演GPT:“Sarah静静地躺在床上,感觉____”。你能填空吗?
一个合理的答案是“累了”。在本文的其余部分中,我将解释GPT如何得出这个答案。 (为了好玩,我在ChatGPT中加入了这个提示,它写了一个短篇小说。)
比喻:(Key,Value,Query),或(Tag,Potion,Recipe)
您将上述提示提供给GPT。在GPT中,每个单词都配备了三个东西:Key,Value,Query,其值是从训练GPT模型期间吞噬整个文本互联网中学习的。正是这三个成分之间的相互作用,使GPT能够理解文本上的单词。那么它们真正做了什么呢?
让我们设定我们的炼金术比喻。对于每个单词,我们有:
- 一种药水(也称为“value”):药水包含有关单词的丰富信息。为了说明目的,想象一下单词“lies”的药水包含诸如“tired; dishonesty; can have a positive connotation if it’s a white lie; …” 等信息。单词“lies”可以具有多个含义,例如“tell lies”(与不诚实有关)或“lies down”(与疲劳有关)。您只能在文本的上下文中确定真正的含义。现在,药水包含了两种含义的信息,因为它没有文本的上下文。
- 炼金术士的配方(也称为“query”):给定单词的炼金术士,例如“lies”,会检查所有附近的单词。他找到一些与自己的单词“lies”相关的单词,并被委托用这些单词的药水来填充空瓶子。炼金术士有一个配方,列出特定的标准,用于识别他应该关注哪些药水。
- 一个标签(也称为“key”):每个药水(value)都带有一个标签(key)。如果标签(key)与炼金术士的配方(query)匹配得很好,炼金术士将注意这个药水。
注意力:炼金术士的药水调制
在第一步(注意力)中,所有单词的炼金术士各自出发进行任务,从相关单词中获取药水来填充他们的烧瓶。
让我们以“谎言”的炼金术士为例。他从以前的经验中知道——在对整个互联网文本进行预先训练后——帮助解释“谎言”的单词通常采用以下形式:“一些平面,与不诚实相关的词,与休息相关的词”。他在他的配方(查询)中写下这些标准,并在其他单词的药水上寻找标签(关键字)。如果标签与标准非常相似,他将把那种药水倒入他的烧瓶中;如果标签不相似,他将不倒入或只倒入一点点。
于是他找到了“床”的标签,说“一件平面家具”。这与他的配方中的“一些平面”相似!他把“床”的药水倒入了他的烧瓶。 “床”药水(值)包含的信息如“疲倦,想休息,困,生病”。
“谎言”炼金术士继续搜索。他发现单词“还是”的标签说“与休息有关”(除了单词“还是”的其他内涵)。这与他的标准“想休息”相关,所以他从“还是”的药水中倒入部分药水,其中包含的信息如“安静,不动,休息的”。
他查看了“在”,“萨拉”,“这个”,“感觉”的标记,并发现它们不相关。所以他没有把它们的药水倒入他的烧瓶中。
记住,他需要检查自己的药水。他自己药水的标签“谎言”说“与休息相关的动词”,这与他的配方匹配。所以他也倒入了自己的一些药水,其中包含的信息如“疲倦;不诚实;如果是善意的谎言,可能会有积极的内涵……”。
在检查文本中的单词之后,他的烧瓶就满了。
与“谎言”的原始药水不同,这种混合药水现在考虑了这个非常特定的句子的上下文。换句话说,它有很多“疲倦,筋疲力尽”的元素,只有一点点“不诚实”。
在这个任务中,炼金术士知道需要注意正确的单词,并结合那些相关单词的价值。 这是“注意力”的一个隐喻步骤。 我们刚刚解释了Transformer的最重要的方程式,它是GPT的底层架构:
高级注释:
1. 每个炼金术士都会查看每个药瓶,包括他们自己的[Q·K.transpose()]。
2. 炼金术士可以快速地将他的配方(query)与标签(key)匹配并做出快速决策。[查询和关键字之间的相似性由点积确定,这是一种快速操作。]此外,所有炼金术士都在并行地进行任务,这也有助于加快速度。[Q·K.transpose()是一种矩阵乘法,可以并行计算。与顺序计算的前任递归神经网络相比,速度是Transformer的一个优势。]
3. 炼金术士很挑剔。他只选择前几种药水,而不是混合一点点所有药水。[我们使用softmax来折叠Q·K.transpose()。softmax会将输入拉到更极端的值,并将许多输入折叠到接近零。]
4. 在这个阶段,炼金术士不考虑单词的排序。无论是“萨拉静静地躺在床上,感觉”还是“还是床上的萨拉感觉静静地躺着”,填满的烧瓶(注意力的输出)都是相同的。[在没有“位置编码”的情况下,Attention(Q,K,V)与单词位置无关。]
5. 烧瓶总是返回100%的填充量,不多不少。[softmax被归一化为1。]
6. 炼金术士的配方和药水的标签必须使用相同的语言。[查询和关键字必须具有相同的维度,才能进行点积通信。如果你愿意,值可以采用不同的维度。]
7. 技术上卓越的读者可能会指出我们没有进行掩码。我不想在这个比喻中加入过多的细节,但我会在这里解释一下。在自我关注中,每个单词只能看到前面的单词。因此,在句子“萨拉静静地躺在床上,感觉”中,“谎言”只看到“萨拉”;“还是”只看到“萨拉”,“谎言”。 “还是”的炼金术士无法触及“在”,“这个”,“床”和“感觉”的药水。
前馈:混合药水的化学
到目前为止,炼金术士只是从其他瓶子中倒出药水。换句话说,他将“谎言”——“疲倦;不诚实;……”的药水作为均匀混合物倒入烧瓶中;他还不能蒸馏出“疲倦”部分并丢弃“不诚实”部分。[注意力简单地将不同的V加在一起,以softmax加权。]
现在是真正的化学(前馈)时间了。炼金术士混合所有东西并进行一些合成。他注意到像“困倦”和“宁静”这样的词之间的相互作用等。他还注意到“不诚实”只在一个药水中提到。他根据过去的经验知道如何使某些成分相互作用,并丢弃一次性的成分。[前馈层是价值的线性(然后是非线性)转换。前馈层是神经网络的构建块。您可以将其视为变压器中的“思考”步骤,而早期的混合步骤只是“收集”。]
在他处理过后,得到的药水对于预测下一个单词的任务变得更加有用。直观地,它代表了这个单词在句子上下文中的一些更丰富的属性,与起始药水(价值)相比,后者缺乏上下文。
最终的线性和softmax层:炼金术士的组装
我们如何从这里到达最终输出,即预测“Sarah lies still on the bed, feeling___”后面的下一个单词是“tired”?
到目前为止,每个炼金术士都在独立地工作,只关注他自己的单词。现在,不同单词的所有炼金术士将他们的烧瓶按照原始单词顺序组装并堆叠,将它们呈现给Transformer的最终线性和softmax层。我这里的意思是什么?在这里,我们必须离开这个隐喻。
这个最终的线性层综合了不同单词之间的信息。基于预训练数据,其中一个可行的学习是,即前一个单词对于预测下一个单词很重要。例如,线性层可能会重点关注最后一个烧瓶(即“感觉”烧瓶)。
然后与softmax层相结合,这个步骤为我们词汇表中的每个单词分配一个概率,用于预测“Sarah lies still on the bed, feeling…”后面的下一个单词很可能是什么。例如,非英语单词将接近于0的概率。像“tired”、“sleepy”、“exhausted”这样的单词将获得高概率。然后我们选择获胜者作为最终答案。
复盘
现在,您已经建立了一个极简的GPT!
回顾一下,在关注步骤中,对于每个单词,您确定该单词应该注意哪些单词(包括自身),基于该单词的查询(配方)与其他单词的键(标记)的匹配程度。您将这些单词的价值(药水)按照它们所关注的注意力比例混合在一起。您处理这个混合物来进行一些“思考”(前馈)。一旦处理了每个单词,您就将来自其他单词的混合物组合在一起以进行更多的“思考”(线性层),并对下一个单词进行最终预测。
旁注:语言“解码器”是原始论文中的遗物,因为Transformer最初用于机器翻译任务。您将源语言编码为嵌入式,然后从嵌入式解码到目标语言。
这是一个不错的停止点。
如果你渴望学习更多,我们将在上述极简架构的基础上再介绍两个变种:多头注意力和重复块。
多头注意力:多个炼金术士的配方
到目前为止,每个单词只有一个炼金术士的配方、一个标签和一个药剂。[对于每个单词,每个查询、值、键都是一个单一的向量,而不是矩阵。]但是,如果我们为每个单词配备几组配方、标签和药剂,就可以获得更好的结果。参考GPT,每个单词使用12组(也称为12个“注意力头”)。也许对于每个单词,第一组炼金术士专门分析情感,第二组炼金术士专门解决参考(“it”指的是什么)等。
进阶笔记:情感炼金术士组只研究情感药剂;他们不知道如何处理来自其他组的药剂,也永远不会接触那些药剂。[来自同一注意力头的V、K、Q是联合训练的。来自不同注意力头的V、K、Q在多头注意力步骤中不会相互作用。]
每个单词的12个炼金术士一起呈现他们的专业、填充的烧瓶[连接不同注意力头的输出]。作为一个组,他们使用所有这些烧瓶进行巨大的化学反应,并呈现一个结果药剂[前馈,也称为线性层]。
进阶笔记:与之前一样,在解码器块中,不同单词的烧瓶不会混合在一起。[前馈步骤是位置级别的,这意味着它独立地应用于每个单词。]
这个比喻解释了原始论文中的以下方程式和图表。
叠加块:再来一遍!
为了获得更好的结果,我们将解码器块重复N次。参考GPT,重复12次。直观地,你想要交替收集其他相关词汇的药剂(注意力),并自己合成这些药剂以获得意义(前馈):收集、合成;收集、合成……
现在你可以了解炼金术了……我是说……GPT!