你有没有好奇过,GPT 这样的 AI 大模型,到底是如何理解我们的提示词,然后一个字一个字蹦出来回答问题的?

上一期,我们介绍了在Transformer诞生之前的技术发展路线。

如果你没有看过上一期也没关系,我们先来快速回顾一下 。

最开始是 N-gram,它的思路非常简单,就是统计前面几个词出现以后,下一个词通常是什么。

但 N-gram 只会统计,它并不知道不同词语之间有什么语义关系。

于是后来有了词向量,也就是 word Embedding。

词向量把每一个词变成一组高维数字,词语的含义被映射到了这组数字中,含义相近的词在向量空间里的位置也比较接近。

有了词向量以后,我们又把这些向量交给前馈神经网络,让神经网络学习更加复杂的语言规律,然后预测下一个 词。

但是前馈神经网络一次只能接收固定数量的 Token,前面的内容距离太远以后,它就看不到了。

所以后来又有了 RNN,也就是循环神经网络。

RNN 增加了一份不断向后传递的隐藏状态,相当于给模型增加了一份记忆,让前面出现的信息可以一直往后传。

但是 RNN 的长期记忆能力又不太行,距离一长,前面的重要信息就很容易逐渐丢失。

于是后来又有了 LSTM。

LSTM 增加了一条长期记忆通道和几个门,让模型自己学习什么应该记住,什么可以忘掉,以及什么时候再把这些信息拿出来使用。

一路发展到这里,看上去已经挺不错了。

但是 LSTM 依然有两个非常麻烦的问题。

第一个问题是,它必须一个 Token 一个 Token 顺序计算。

前面的 Token 没算完,后面的 Token 就没有办法开始,如果输入的内容比较长的话,效率就会特别低。

第二个问题是,两个距离很远的 Token 想要交换信息,依然需要经过中间很多 Token,一步一步把信息传过去。

比如上一期我们举过这样一个例子:

轩辕小时候养过一只虎皮鹦鹉。

它有绿色的羽毛,还会模仿人说话。

后来轩辕去了外地上学,很多年没有再见到它。

但他始终记得小时候养过的那只____。

最后这个“那只”,明明和前面很远的“虎皮鹦鹉”直接相关。

那我们为什么一定要让“虎皮鹦鹉”这条信息经过中间几十个 Token,一步一步传到“那只”这里呢?

能不能干脆一点,让“那只”这个词和前面“虎皮鹦鹉”这个词直接建立联系呢?

有的兄弟,有的。

Transformer 的故事就从这里正式开始了。

Transformer来自于2017年那篇非常知名的论文《Attention is all you need》,今天这期视频,我们就来彻底搞懂这个当今AI大模型的祖师爷Transformer到底是个什么玩意儿。

欢迎一键三连不迷路,咱们开始今天的旅程。

一、别再传话了,让 Token 自己去找。

让我们先暂时忘掉 Transformer 这个名字,还是回到我们的猜词游戏。

当我们人类读到“但他始终记得小时候养过的那只”时,大脑会很自然地回头寻找前文里面和“那只”有关的信息。

但是我们不会把前面的内容从头到尾一个一个再分析一遍。

我们更像是在一瞬间把前面的内容扫了一遍,然后迅速注意到了“虎皮鹦鹉”和“那只”的关系最强。

那能不能让神经网络也这么干?

我们可以让一句话里面的每一个 Token,都有机会直接查看其他所有 Token。

然后每一个 Token 都问一句:“这些词里面,哪些和我最相关?”

为了方便理解,我们换一个短一点的例子。

假设现在有这样一句话:“轩辕养了一只虎皮鹦鹉,它有绿色的羽毛。”

现在我们正在处理“它”这个 Token。

人类当然知道,这里的“它”大概率指的就是前面的“虎皮鹦鹉”,肯定不是轩辕。

那我们也让模型把句子里面的几个 Token 全部看一遍,具体怎么看一会儿你就知道了。

模型可能会算出来,“轩辕”和“它”的关系比较弱,“养了”和“它”的关系也比较弱,而“虎皮鹦鹉”和“它”的关系非常密切。

假设最终得到这样一组权重。

“轩辕”的权重是百分之十,“养了”的权重是百分之五,“虎皮鹦鹉”的权重是百分之七十,而其他 Token 再分掉剩下的百分之十五。

接下来,我们就按照这些权重,把不同 Token 携带的信息混合起来。

“虎皮鹦鹉”的权重最高,那就多拿一点它的信息。

“养了”的权重很低,那就少拿一点它的信息。

所有信息按照不同权重加在一起以后,“它”就会得到一份新的向量。

注意,这个新的向量已经不再是最开始那个孤零零的“它”的词向量了。

原来的词向量主要表达的是“它”这个词本身大概是什么意思。

而经过刚才这番操作以后,新向量里面就融合了当前这句话的上下文。

尤其是“虎皮鹦鹉”的信息,会大量进入“它”的新向量。

这样一来,模型后面继续处理“它有绿色的羽毛”时,就能够知道这个“它”和虎皮鹦鹉有非常强的关系。

同样的方法可以运用到句子里的每一个token。

句子里面的每一个 Token,都可以直接查看其他 Token,然后把和自己有关的信息拿回来。

“绿色”可以去寻找和自己关系最强的“羽毛”。

“养了”可以去寻找和自己关系很强的“轩辕”和“虎皮鹦鹉”。

一句话里的 Token 就这样互相查看,互相交换信息。

中间隔了一个 Token 还是一百个 Token,都不需要像 RNN 那样一路传话。

刚才我们设计出来的这种机制,就是 Attention,也就是注意力机制最核心的思想。

所谓“注意力”,说白了就是让当前 Token 判断其他 Token 对自己到底有多重要,然后重点读取重要的信息。

上面描述的很美好,但问题来了,该如何实现这套方法呢?

每个token去看其他token,这个看具体要怎么看呢?

看的时候要关心哪些token,这些token的权重值又是怎么计算出来的呢?

接下来就是理解注意力机制的关键了。

二、注意力机制:模型到底怎么知道应该关注谁?

我们继续看刚刚的例子。

模型在处理到“它”这个token的时候,为了完成接下里的预测工作,需要在前面的句子里面寻找这个“它”到底指代谁。

那在寻找之前,它需要先表达一件事情:“我现在想寻找什么?”

这就像我们上网搜索东西一样,我们得输入搜索关键词啊。

所以我们需要给每个 Token 准备一份专门用于“查询”的“搜索关键词”。

比如“它”在当前上下文中,可能想寻找一个前面出现过的对象,一般来说这可能是一个物品、一个东西,大概率是个名词,不太可能是个形容词或者副词。

和之前token的词向量类似,这份“搜索关键词”也不是文本字符串,它还是一组数字组成的高维向量,而搜索的意图就蕴含其中。

这份用来表达“我现在想找什么”的向量,就是 Query,简称 Q。

但是只有查询还不够。

每个token也得声明一下:“我这里提供了什么信息可供查询。”

比如“虎皮鹦鹉”这个 Token 可以提供一份适合被查询的信息。

“轩辕”也提供一份自己的信息。

“绿色”也提供一份自己的信息。

这份专门拿来和 Query 做匹配的向量,就是 Key,简称 K。

现在“它”这个token手里有自己的 Q,而前面每个 Token 都有自己的 K。

接下来,“它”就可以拿着自己的 Q,挨个去和别人的 K 做比较。

如果“它”的 Q 和“虎皮鹦鹉”的 K 非常匹配,那模型就知道“虎皮鹦鹉”很值得关注。

如果它和“绿色”的 K 不太匹配,那这个“绿色”就少关注一点。

那么问题来了,这个Q和K到底怎么匹配呢?

我们可以让这两个向量做点积。

点积以后会得到一个数字。

这个数字越大,就认为这两个向量越匹配。

比如“它”的 Q 和“轩辕”的 K 算出来是 1.2。

“它”的 Q 和“绿色”的 K 算出来是 0.8。

“它”的 Q 和“虎皮鹦鹉”的 K 算出来是 6.8。

那很明显,“虎皮鹦鹉”这个位置更加值得关注。

再通过Softmax,把这些分数转换成对应的权重。

于是模型就知道每个Token应该关注谁,以及应该关注多少了。

看到这里,估计大家会有一个疑问:怎么就能保证“它”的Q和“虎皮鹦鹉”的K刚好匹配的上呢?

答案还是靠训练。

一开始的时候肯定是胡乱匹配的,随着训练的进行,相关的参数不断调整,Q和K的计算匹配就越来越接近语言中的规律了。

那么接下来呢,知道了该关注谁之后又怎么办呢?

真正有用的是“虎皮鹦鹉”这个token携带的具体信息,既不是这个Token的Q,也不是它的K,这俩是用来做查询和被查询的。

所以每个 Token 还需要再准备第三份向量。

这份向量不负责搜索,也不负责匹配,它负责保存真正需要被别人读取的信息。

这份向量就是 Value,简称 V。

至此,我们凑齐了注意力机制中关键的Q、K、V三剑客。

Q 表示“我想找什么”。

K 表示“我这里大概有什么”。

V 表示“我真正携带了什么信息”。

还是要强调一下,这只是为了帮助理解的类比。

真实模型并不会真的把“宠物”“颜色”“人物”这些文本标签写进 Q、K、V 里面。

它们的本质依然是一组高维数字,上面这些信息都藏在这组高维向量中。

那新的问题又来了。

每个token不是只有一个词向量吗?

怎么现在每个 Token 突然冒出来三个向量了?

这个问题其实很好解决。

假设“虎皮鹦鹉”现在有一个几百维的向量。

我们把这组向量交给一个线性变换,得到第一组新的数字Q。

再交给另外一个线性变换,得到第二组数字K。

然后再经过第三个线性变换,得到第三组数字V。

每一个 Token 都会做同样的事情。

“轩辕”有自己的 Q、K、V,“养了”有自己的 Q、K、V,“虎皮鹦鹉”也有自己的 Q、K、V。

至于这三次线性变换到底怎么进行变换的,变换所采用的参数是什么,同样不需要程序员手工设计。

模型会在训练过程中,通过一次又一次预测错误和反向传播,慢慢把它们学出来。

有了Q、K、V,接下来就简单了。

用这些注意力权重乘上每个 Token 对应的 V,然后把它们全部加起来。

权重高的 Token 多贡献一点信息,权重低的 Token 少贡献一点信息。

最后得到的,就是当前 Token 融合上下文之后的新向量。

在《Attention is all you need》那篇论文中的注意力公式,它干的核心事情就是这些。

在这篇论文的公式里面,Q 和 K 点积以后还会除以一个根号下d。

这样做主要是因为向量维度很高以后,点积结果容易变得很大,经过 Softmax 以后可能变得过于极端。

所以先把它适当缩小一点,可以让训练更加稳定。

另外还有一个细节。

我们的 Q、K、V 全部来自同一句话里的 Token。

一句话里面的 Token 自己查看自己。

这种情况就叫 Self-Attention,也就是自注意力。

那与之对应的一句话跟别的话做注意力计算,那就不是自注意力,它有别的叫法,我们等会儿就会看到。

不过只有一套Q、K、V还是不够。

我们来看这样一句话。

“轩辕小时候养过一只虎皮鹦鹉,它有绿色的羽毛。”

这里面 Token 和 Token 之间的关系非常复杂。

“它”和“虎皮鹦鹉”之间是明显的指代关系。

“绿色”和“羽毛”之间存在修饰关系。

“轩辕”和“养过”之间又存在动作关系。

“养过”和“虎皮鹦鹉”之间还有另外一种关系。

也就是说,同一句话里面可能同时存在语法关系、语义关系、指代关系、远距离关系等等。

可我们刚才只有一套 Q、K、V,很难同时兼顾多种关系。

既然一套不够,那就多整几套。

同一句话,同时进行多组 Attention 计算。

第一组 可能关注指代关系。

第二组 可能关注附近的词。

第三组 可能学会了一些长距离关系。

第四组 又可能学到其他完全不同的模式。

当然,这些“谁负责指代,谁负责语法”依然不是程序员提前安排好的。

每一组 Attention 最后到底学到了什么,都是训练自己决定的。

我们只负责给它多个不同的观察空间。

最后,再把这些不同 Attention 得到的结果拼起来,形成更丰富的表示。

刚才这个“一次从多个角度同时做 Attention”的办法,就是多头注意力。

所谓一个“头”,可以暂时理解成一套独立的注意力计算。

一个角度看不明白,那就多个角度一起看,这样看到的才是相对比较全面的。

在《Attention is all your need》这篇论文中,原始的Transformer采用的是8个头。

注意力的这种计算方式,把LSTM 的两个问题都解决了。

距离很远的两个 Token,不需要再经过中间一大串 Token 传递信息,它们可以直接建立联系。

而且一句话里的 Token 不需要像 RNN、LSTM 那样一个处理完再处理下一个。

所有 Token 的 Q、K、V 都可以一起算。

所有 Q 和 K 之间的匹配,也可以通过大规模矩阵运算一起完成。

所以 Transformer 相比 RNN 和 LSTM,更容易利用 GPU 进行大规模并行训练。

这也是后来模型能够越做越大的一个非常重要的前提。

三、位置编码:并行计算如何知道token的先后顺序

然而这样并行计算,引出了一个非常关键的问题:token之间的先后顺序信息丢失了。

原来的RNN、LSTM因为是串行处理的,它天然就是有序的计算。

但并行是把所有token一起进行计算,模型怎么知道谁在前,谁在后?

比如下面两句话。

“轩辕养了鹦鹉。”

“鹦鹉养了轩辕。”

两句话里面出现的词都是三个一样的token。

但是因为顺序变了,意思完全不同。

注意力机制只是计算Token之间的相关性,它并没有去处理词语的顺序。

那怎么办?

我们可以在每一个 Token 原来的词向量上,再加上一份专门表示位置的信息。

第一个 Token 加一份代表位置 1 的信息。

第二个 Token 加一份代表位置 2 的信息。

以此类推。

这样模型收到的就不只是“这个词是谁”。

它同时还知道“这个词在什么位置”。

刚才这份额外加入的位置数据,就是 Positional Encoding,位置编码。

原始 Transformer 使用正弦和余弦函数来生成位置编码。

现在的大语言模型又发展出了一些其他方案。

这一期我们先不展开这些细节。

你现在只需要记住一句话。

Embedding 告诉模型Token的语义,位置编码则告诉模型Token的顺序。

到这里,每个 Token 已经可以带着自己的语义和位置信息,通过多头注意力和其他 Token 大规模交换信息了。

看起来好像很不错的样子。

但这距离我们的目标还差得远,我们是要完成猜词游戏:根据一句话前面的内容猜出后面的内容。

Attention 很擅长帮 Token 到处寻找信息。

可信息找回来以后,接下来怎么做,我们的猜词游戏怎么继续下去?

接着往下看。

四、前馈神经网络:信息找回来以后,还得自己消化一下。

我们来看下面这句话:

“轩辕新买了个黑色的苹果,花了一万多块钱。”

这里的“苹果”,到底是水果,还是苹果公司的产品?

聪明的你几乎一瞬间就能觉察到,这世界上哪有可以吃的苹果卖一万多块钱啊,而且还是黑色的。

所以这里一定指的是苹果公司的产品。

那我们来看计算机又是如何来把这一点给分析出来。

为了方便理解,我们假设从“苹果”原本几百维的向量里面,只挑四个特征出来观察。

分别是:

高价、黑色外观、水果属性、科技属性。

需要说明下啊,实际上的向量语义是很复杂的,几乎不会单独存在某些维度刚好就对应这四个方面,这里是为了方便理解简化了词向量的维度设定。

刚开始只看到“苹果”这个词的时候,它可能是:

0.1,0.1,0.6,0.6。

也就是说,现在还没有什么高价、黑色的信息。

而水果和科技这两种含义,都有可能。

接下来经过注意力的计算。

“苹果”开始去看周围其他 Token。

它从“黑色”那里拿回了外观信息。

又从“一万多块钱”那里拿回了很强的高价信息。

于是它的向量可能变成:

0.9,0.9,0.6,0.6。

大家注意。

到这里,Attention 主要完成的是一件事:

把原本散落在其他 Token 里的线索,拿到了“苹果”这里。

现在模型知道了这个“苹果”:

它很贵。

它还是黑色的。

但“水果”和“科技产品”这两种可能性,还没有真正拉开差距。

那接下来怎么办?

我们需要一个新的组件来对这些线索进行进一步的分析计算。

这时候,上个视频中的老朋友:前馈神经网络,也就是 FFN,登场了。

FFN 不再去看其他 Token。

它只看“苹果”现在手里已经拥有的这些信息。

然后去学习这些特征之间的组合关系。

比如:这里这个“苹果”。

价格又非常高。

还是黑色的。

这两个特征组合在一起,就非常不像一颗水果。

反而非常像苹果公司的某种电子产品。

于是经过 FFN 以后,这组向量可能进一步变成:

0.9,0.9,0.1,0.95。

高价和黑色这些已经拿回来的线索还在。

但水果属性被明显压低了。

科技属性则被大幅增强。

所以 Attention 和 FFN 做的事情其实并不一样。

注意力机制负责让 Token 之间交换信息,前馈神经网络则负责把每个Token的这些信息组合起来,进行分析研判。

一个管交流,一个管思考。

到这里,这两个零件就能拼成一个小单元了。

先经过多头注意力交换信息,再经过前馈网络消化加工。

这就是 Transformer 的基本单元。

不过一个单元的处理还不够,实际上的Transformer会多摞几层,一层比一层理解得更深。

原始论文摞了六层,现在的大语言模型动辄几十层、上百层。

大语言模型的知识和能力都蕴藏在这些网络参数里了。

但是,网络一深,新的问题又又又来了。

五、残差连接:让训练得以进行下去

我们刚刚说了,为了理解复杂的语言,Transformer会把注意力和FFN模块叠很多层,让模型逐渐提取出更加抽象的特征。

但网络一深,训练就容易出问题。

模型训练靠的是反向传播,预测产生误差以后,梯度会从最后一层一路往前传,告诉前面的参数应该怎么调整。

这个过程本质上依赖链式求导。

如果梯度在经过一层又一层计算时不断变小,传到最前面的时候就可能已经微弱到几乎不起作用。

前面的层收不到有效的调整信号,也就越来越难训练。

这就是深度神经网络里面非常经典的梯度消失问题。

那怎么办呢?

研究者们想了一个乍一看很奇怪的办法:把这一层原来的输入,直接加到输出上。

假设这一层的输入是x,经过某个模块计算以后得到f(x)。

正常情况下:

y=f(x)。

现在额外把原来的x加回来:

y=f(x)+x。

等一下,把x直接加上去,结果不就被改了吗?

我当初看到这里的时候也是满脸问号。

这里的关键就在于函数f并不是固定的,它本身就是训练出来的。

假设我们真正想得到的结果是F(x)。

原来需要f自己完整学出:

f(x)=F(x)。

但现在最后会自动加上一个x,所以f只需要学习:

f(x)=F(x)-x。

最后再把x加回来,刚好还是F(x)。

所以可以把f理解成只负责学习:“在原来的x基础上,还差多少。”

这个“还差多少”,就是残差。

所以这种结构就叫残差连接。

这玩意儿真正厉害的地方,还在反向传播。

对:y=f(x)+x 求导以后:

y’=f’(x)+1。

关键就是后面这个“+1”。

原来梯度只能经过f这条复杂路径往前传。

现在旁边多出了一条直接连接输入和输出的捷径,而这条捷径的导数就是1。

所以即使f这条路上的梯度被削弱了,梯度依然还有一条更加直接的路径可以继续往前传。

这不能保证梯度永远不会变小,但会大大缓解深层网络里的梯度消失问题。

而且在前向传播的时候,原来的信息也可以通过这条捷径直接往后传,不必每一层都被彻底重新加工一遍。

所以残差连接可以理解成给网络修了一条高速公路。

前向传播时,信息可以沿着它往深处走。

反向传播时,梯度又可以沿着它传回来。

这样一来,Transformer才能比较稳定地堆到几十层甚至上百层。

实际的Transformer里,残差连接通常还会搭配归一化模块,让训练更加稳定。

所以经典结构图里面经常会看到“Add & Norm”。

OK,现在Token之间可以通过注意力交换信息,FFN可以进一步加工信息,残差连接又让这些模块可以不断往上堆。

但我们是不是忘了一件事?

我们忙活了这么久,只是在不断处理每个Token的向量。

可我们最开始的终极目标,是根据前面的内容,真正预测出下一个Token。

Transformer最后到底怎么把这些高维向量变成一个具体的词?

今天的最后一部分,我们就来补上最后这块拼图。

六、编码器与解码器:读懂一句话和写出一句话,其实是两件事。

《Attention Is All You Need》这篇论文最开始解决的是机器翻译。

比如把:

轩辕养了一只虎皮鹦鹉。

翻译成:

Xuanyuan has a budgie.

翻译工作可以拆成两步。

先读懂原文,再把译文写出来。

所以Transformer也被拆成了两部分。

负责“读”的叫Encoder,也就是编码器。

负责“写”的叫Decoder,也就是解码器。

编码器就是我们前面搭好的那套结构。

输入先变成Embedding,加上位置信息,再经过一层层自注意力和FFN。

这里每个Token都可以查看整句话里的其他Token,包括后面的内容。

这没有问题,因为编码器的任务就是理解一整句已经存在的原文。

最后,每个Token都会变成一组融合了整句话信息的向量。

编码器不负责生成新的Token,它只是把“原文是什么意思”编码进这些向量里。

接下来轮到解码器开始写译文。

它不会一口气把整句话写出来,而是一个Token一个Token往外生成。

比如已经生成:

Xuanyuan has a

接下来要预测:

budgie。

已经生成的这些Token同样需要做自注意力。

但这里马上会遇到一个问题。

训练的时候,正确答案整句话其实都已经存在。

如果模型在预测budgie的时候,可以提前看到后面的budgie,那就等于直接抄答案了。

所以解码器必须遵守一条规则:

只能看自己和前面的Token,不能看后面的。

怎么做到呢?

在计算注意力分数时,直接把后面位置的分数改成一个极小的数。

经过Softmax以后,这些位置的权重就几乎变成0,相当于被遮住了。

这种遮挡操作叫Mask。

加了Mask的自注意力,就是掩码自注意力。

不过新的问题又来了。

解码器如果只看自己已经写出来的英文,它怎么知道原文到底说了什么?

比如Xuanyuan has a后面,到底应该是cat、dog还是budgie?

真正的答案其实在原文里。

所以解码器还需要一边写,一边回头看编码器。

它拿自己的Q去查询编码器输出的K和V。

如果当前要生成budgie,那么这个Q就可能和原文“虎皮鹦鹉”对应的K高度匹配,然后把那里的V大量拿过来。

注意,这一次Q来自Decoder,而K和V来自Encoder。

这种跨两边进行的注意力,就叫交叉注意力。

所以解码器每一层可以简单理解成三步。

先用Masked Self-Attention看看自己前面写了什么。

再用Cross-Attention回头查看原文。

接着交给FFN继续处理。

最后,Decoder得到的依然是一组向量。

那它怎么真的“蹦”出一个词呢?

还是上一期那套流程。

把最后一个位置的向量接到输出层,给整个词表里的Token打分。

再经过Softmax变成概率。

概率最高的,通常就是下一个Token。

然后把这个新Token接到末尾,再继续预测下一个。

就这样一个Token一个Token往外蹦,直到生成结束符。

这就是原始Transformer大致的工作过程。

不过现在以GPT为代表的大模型,和最早的Transformer又不太一样。

这个我们后面再慢慢讲。

七、回顾总结

现在让我们整体回顾一下今天的内容。

最开始,LSTM 最大的问题是信息必须一个 Token 一个 Token 往后传,而且计算也只能顺序进行。

于是我们想了一个办法,让每个 Token 都能直接查看其他 Token。

这个办法叫 Self-Attention。

但 Token 到底应该查看谁?

所以每个 Token 又产生了 Q、K、V。

Q 用来发起查询,K 用来和查询匹配,V 用来真正传递信息。

一种关系看不够怎么办?

那就同时做多组 Attention。

于是有了 Multi-Head Attention,也就是多头注意力。

所有 Token 并行计算以后,先后顺序不见了怎么办?

那就额外把位置信息加进去。

于是有了 Positional Encoding,也就是位置编码。

Attention 只负责找信息,信息拿回来以后还需要进一步处理怎么办?

那就接上前馈神经网络。

网络越堆越深以后,原始信息容易丢,训练也越来越难怎么办?

那就给信息增加一条可以直接往后走的捷径。

于是有了残差连接。

生成文本的时候不能偷看未来怎么办?

那就把后面的 Token 遮住。

于是有了掩码自注意力。

经典翻译模型里面,Decoder 还要读取 Encoder 的内容怎么办?

那就让 Decoder 的 Q 去匹配 Encoder 的 K 和 V。

于是又有了 Cross-Attention,也就是交叉注意力。

你看,看Transformer 结构图的时候,里面有一大堆让人头疼的名词。

但如果我们不直接背这些名词,而是从前面一个问题一个问题往下推,你会发现它们其实都不是凭空出现的。

每增加一个东西,都是因为前面的结构又暴露出了一个新的问题。

而这些一个又一个小改造,最后组合到一起,就形成了今天几乎所有大语言模型背后的基础架构。

最后跟大家留一个思考题:

现在的大模型,上下文动不动就是100万token,这样庞大的输入量,两两计算注意力,这将是一笔非常庞大的计算量,有没有什么办法优化呢?