大语言模型越来越火了,我觉得反而应该去复习一下 Transform,因为只有掌握大致原理,对后续的事情理解起来也更轻松
这篇笔记目前是参考 BV1xoJwzDESD,当然网上随便找一个也行,这论文讲解的太多了
以前
它是一个序列转导任务,我们假设后续的任务是翻译任务。(在 Transformer 以前,就已经有词嵌入了)
在 Transform 以前:
(1)用 CNN/RNN 来处理问题 ---> RNN 串行计算
(2)已经有 Encoder 和 Decoder 了
(3)已经有注意力机制了
Transformer 的创新:
(1)去掉了 CNN/RNN ---> 并行计算
(2)保留 Encoder 和 Decoder
(3)完全基于注意力机制
FNN Feedforward NN 前馈神经网络
其实就是最普通的那种,和乘一个矩阵也差不多了
问题:
输入的维度固定,而句子不等长。为了将句子压到某个长度,有做平均之类的办法(反正想想你之前做网络的时候,反正你自己有训一个层嘛),导致无法理解语义的先后性
RNN Recurrent NN 循环神经网络
解决了:
(1)不定长输入
(2)理解词序
它把 FNN 的“一次输入一句话”,改成了“一次输入一个词”。
最初的设计:
一个输入 + 一个待翻译的词 ---> 一个输出 + 翻译结果的一个词
其中下一次的输入,是上一次的输出
问题:
输入和输出不等长,或者遇到倒装句等等,不好处理
Encoder 和 Decoder 的引入
解决:支持输入输出不等长
它做了什么:将 RNN 的输入和输出拆开来做
Encoder 一般设计如下:
一个输入 + 一个待翻译的词 ---> 一个输出
将待翻译的词,一个个的喂进去后,最终得到一个输出(整体输出)
Decoder 一般设计如下:
一个输入 + 上一次翻译的词 + 整体输出 ---> 翻译后的词 + 一个输出
其中,整体输出可选,有的 Decoder 为了避免多次解码,忘掉上下文信息,就再输入一次。
问题:
(1)遗忘。一步步的往下走,对长距离建模能力减弱。
(2)没有重点。任何时刻的输入都是等同看待的(就是那个苹果问题,到底是手机还是水果,需要看它附近的词对他的影响,但是现在没有这个机制,其他所有词的影响力相同)
注意力机制
其实人们已经发现 RNN 注意力均等的问题了
人们当时的选择是:
一个输入 + 上一次翻译的词 + 整体输出(在这里,调整输入的词的权重) ---> 翻译后的词 + 一个输出
Transformer:并行计算的解决
并行计算是 RNN 结构导致的,即 token 一个个的输入进去,每一步,依赖于前一步的状态
它做了两个事情:
做词嵌入后:(1)+(2)就包含了整个上下文的信息
(1)让每一个词,去关注其他所有的词
(2)做位置编码,也编码进去
位置编码是和维度奇偶用 sin cos 的函数,而不是简单的 1,2,3
训练时,通过位置掩码:
既然训练时,已知答案。那么可以同时出多个遮挡程度不同的题,进行训练(只猜测下一个词)。
现在的词嵌入,是和整一个模型一起训练的,那样效果更好。
联想:做这两个事情的,是否就是我们现在常见的 Embedding 模型(比如 bge-m3)?
Transformer 的词嵌入层,单独拎出来,确实可以给词进行编码,但是没有位置信息。它是一个 token,输出一个向量。
用于向量数据库的嵌入模型,其实是一个完整的 Transformer 编码器,它是一句话,输出一个融合了整个语境的压缩向量。(之所以只需要 cpu 就能跑,是因为参数量很小,一般不到 1B)
联想:在你实际使用时,相当于是,一个个的生成结果。所以相当于是多次考试。也就是 Decode 阶段的事情了。
Q K V
查询 键 值
每一个 token,都会和 WQ WK WV 相乘(并行计算每一个 token)
语义(词嵌入) + 位置(位置编码) + 上下文(QKV)
QKV 就是为了解决那个苹果问题
QKV 由训练得到,而不是像 RNN 那样输入进去
按照经典解释:
Q 表示 这个 token 的查询意图,比如“华为”的注意力,应该放在和“电子产品”有关系的 token 上
用华为的 Q,去查询所有词(包括华为自己)的 K,K 表示一个 token,给自己定义的标签。比如小米就有一些“电子产品标签”,而“大豆”没有,查完每个词,都有一个 0-1 的得分。华为应该按照分数的排布,来分配自己的注意力。
V 表示,一个 token 的真正含义应该怎么阅读。
V 是永远不变的,比如“苹果”的 V,即包含了水果相关含义,也包含科技公司。
不同 token 的 Q 不一样,比如华为和西瓜,他们乘以 K 之后,也会得到不同的注意力分数,因此会注意到苹果语义的不同部分。即 Q 决定了看到什么,注意力机制,就是说 Q*K 之后,再去查 V,你能看到什么
多头注意力
它将 WQ WK WV 拆分为 8 个更小的矩阵,独立算,最后再合起来
降维:感觉就是多头,就是每个头负责一个领域
首先计算量不变,然后它多头的话,效果更好
联想:多头和混合专家模式
多头处于 Transformer 的“前半段”,负责词与词之间的关系建模
MOE 处于 Transformer 的“后半段”,即 FFN(前馈网络)层。
模型不再是一个巨大的神经网络,而是拆分成很多个小块(专家)。
有一个“路由器”(Router)会根据输入的词决定:这个词该给哪 1-2 个专家处理?
混合专家必须是非稠密
现代大模型只做 Decoder
人们发现只用 Decoder 效果更好,只预测,不编码。
KV-Cache
论文里,每个词,要关注所有的词
但是现实应用场景下,词是一个个往外吐,所以一个词其实只关心它前面的词。前面已经生成好的词,就不再动了,不去关注后面新生成的词。
所以 KV 是可以存起来的,前面的词的 Q 不存
只需要当前最后那个单词的 Q
MOE 提速
我们之前提到过 Decode 阶段,瓶颈在带宽
即便是 MOE,多头注意力也得完整的算一遍
但是现在的模型里,FNN 占据了参数的一半以上,所以将 FNN 拆分为专家,可以提速
既然专家能分工,为什么不让专家把注意力也分了?多头是“抓取情报”,专家是“分析情报”,没有多头,专家就是瞎子。
MOE 起源于一篇 1991 年的论文《Adaptive Mixture of Local Experts》
自检
1、Transformer 为什么要完全去掉 RNN / CNN?
2、Encoder 和 Decoder 的结构分别由哪些子层组成?Decoder 为什么多一个子层?
3、Transformer 里的残差连接和 LayerNorm 是怎么放的?先做子层,再加残差,再做 LayerNorm。
4、为什么 Decoder 里要用 masked self-attention?
5、Scaled Dot-Product Attention 公式
6、为什么 dot-product attention 要除以
7、Q、K、V 含义
8、MHA 为什么比单头注意力更强?
9、MHA 完整计算流程
10、多头后,每一个 head 的维度,总计算量有无变化?
11、sinusoidal positional encoding 公式
12、Position-wise FNN 是一个大 MLP 还是每个 token 单独 MLP?
13、FFN 公式
14、optimizer?
15、Learning Rate Schedule(Noam)公式
16、复杂度?