LLM在Transformer上的改动
- 1.multi-head共享
- 1.1BERT的逻辑
- 1.2multi-head共享
- 2.attention的前后网络
- 2.1传统Transformer:
- 2.2GPTJ结构:
- 3.归一化层的位置(LayerNorm)
- 4.归一化层函数的选择
- 4.1LayerNorm
- 4.2RMSNorm
- 3.激活函数
- 4.LLama2结构
- 5.MoE架构
- 6.位置编码
- 6.1位置编码的用处
- 6.2长度外推性
- 6.3主流位置编码
- 6.4正余弦位置编码
- 6.4.1编码的逻辑
- 6.4.2正余弦编码值计算
- 6.5可学习位置编码
- 6.6ROPE相对位置编码
- 6.7Alibi位置编码
1.multi-head共享
简介: 即在计算时,共享一些注意力权重,即用同一份。现在普遍使用的是Grouped-query模式。
1.1BERT的逻辑
在Self-Attention时如下:
- 输入分布经过三个线性层,变为Q、K、V,其形状为:h_d* h_d,即768 * 768
- BERT的注意力头(n_h)是12,隐含层(h_d)为768
3.此时的进入注意力头后,Q、K都转换成:n_h个:L * h_d;这里的h_d就是64,因为总数是768,拆分了12个头得到的。- 通过K转置后与Q相乘,注意力计算成为: L * L
1.2multi-head共享
示意图:(下面只是示意图,实际数量以具体为准)
原理: 用Bert举例,在进行注意力计算时,是有12个注意力头;现在呢:Q保持不变;K、V,比如:只采用6个头;那么计算的时候,每两个Q和同一个K计算、与同一个V计算。这样就共享了K、V权重参数。
Grouped-query计算逻辑如下:
- 进行线性层计算,得到Q、K、V时,输入是L * h_d; Q的线性矩阵为h_d * h_d; K、V由于注意力头只有原来的一半;而在与Q的矩阵计算注意力时,h_d=64,没有变。所以这里的
K、V线性矩阵会变为:h_d * h_d/2;即768 * 384
- 进入注意力计算后,
每两个Q和相同的一个K相乘,结果还是12份,注意力矩阵还是:L * L,
接着每两个再与相同的V相乘,输出的结果矩阵形成不变:
好处:
减少线性层W的大小,并且结果表示,减少一些参数,效果没有太明显的损失。
Multi-query计算逻辑如下:
**释义:**在Grouped-query时,是多份Q,与同一份K、V计算;Multi-query就是极端情况,每一层,所有的Q在计算注意力时,都与同一份K、V计算。
计算逻辑简介
1.以Bert为例:则线性层的K、V矩阵就变成h_d* h_d/12;即真实结果就是768 * 64.
好处:
降低了较大的权重参数量,模型计算速度也加快了。
2.attention的前后网络
简介: 这种网络结构的调整,称为GPTJ结构,即平行放置attention layer和feed forward layer层。
使用的模型: moss, palm(谷歌)用的这种结构,目前不算太主流。
2.1传统Transformer:
示意图:
计算的公式:
2.2GPTJ结构:
示意图:
公式如下:
对比释义:
- GPTJ
将原来的Transformer的attention layer和feed forward layer层并行放置
,少了一个残差计算
、一个LayerNorm(归一化层
)- 这种结构的调整,会导致前馈网络的计算结果和原来的有区别,原来的输入是过了self-attention的参数;但是现在是直接hidden输入的。
- 公式中的MLP指的是FeedForward
结果:
在某些模型上表现还可以,但是主流还是传统的transformer结构。
3.归一化层的位置(LayerNorm)
- Post-LN:layer norm位于残差链接之后
a. 使用post-LN的深层transformer容易出现训练不稳定的问题 - Pre-LN(前归一化):layer norm位于残差链接之中
a. 相比于Post-LN,使用Pre-LN的深层transformer训练更稳定,可以缓解训练不稳定问题
b.相比于Post-LN,Pre-LN的模型效果略差 - Sandwich LN(三明治归一化):在pre-LN的基础上额外插入了一个layer norm
a. Cogview用来避免梯度爆炸的问题
b. 缺点:训练不稳定,可能导致训练崩溃
目前是Pre-LN方式,模型用的多一些。
4.归一化层函数的选择
4.1LayerNorm
公式如下:
释义: 先计算张量的均值,再计算方差
释义: 通过原始张量减去均值,除以方差,再乘可以训练的参数gi;一般还会加上bi。这两个g、b都是可以训练的参数。
4.2RMSNorm
公式如下:
释义: 先对张量的值求平方,求和,求平均开根号得到的值,作为分母,每一个值做分子相除,最后除以一个可以训练的参数gi。目前主流是使用RMSNorm。
3.激活函数
示意图:
释义:
- 在初始的Transformer中,FeedFoward层使用的激活函数是
relu
。- 在BERT中,做了一定的改进,FeedFoward层使用的是
gelu
- 现在的大语言模型中,在FeedFoward主要使用的是
swish
- 在swish公式中,可以
简略的看成是一个x与Sigmoid的相乘,其中beta是一个常数,常取1
。这是一种gate机制,门控。- 在这里使用swish会增大计算量,在前面的线性层现在的模型会降低参数,比如在Bert会映射到4倍的线性层上,现在大概会映射到1-2倍之间。
4.LLama2结构
示意图
释义:
- Transformer Block的改动,在前面的内容中有提到;在LLama2中一个叠加32层。
- 调整1:归一化层使用RMSNorm
- 调整2: self-attention采用了Grouped-query的形式
- 调整3: 位置编码有调整,RoPE
- 调整4:残差的方式连接有调整,为Pre-LN
- 调整5:FeedFoward的有调整,
两个线性层和激活函数SiLU整体看做swish机制
其中的激活函数采用SiLU,可以理解为Sigmoid,只是多了-beta
。
5.MoE架构
简介: MoE架构,又称为混合专家模型,即在一层transformer中,多个FeedFoward并行,通过一个线性网络层,去判断使用那个、或者那几个的FeedFoward层。
原理: 在FeedFoward中,考虑一个有可能并不能适用不同的任务或者是数据,所以用多个FeedFoward以图去适配不同的数据或者任务,即专家的概念。
示意图:
释义:
- 通过图中可以看到,FeedFoward由多个组成,通过一个线性层router去判断使用那些FeedFoward;可以是1个,也可以是多个。
- Mixtral是该架构,据传GPT4也是
- FeedFoward可以是传统的结构,也可以是LLama2的结构。
- router是一个分类的线性层,是在模型训练时,学习到的;
- 训练时,走某一个FeedFoward,反向传播时,也会训练走的FeedFoward。
6.位置编码
6.1位置编码的用处
简介: 由于transformer中除了激活层和归一化层外,使用的都是线性层,编码过程中没有明显的位置信息;
字词位置的交换,仅相当于矩阵中行位置的交换;这带来并行计算的优势,但是也弱化了语序信息;
因此需要引入位置编码来弥补。
示意图:
释义:
- 上面的两个张量相乘,交换张量中的向量位置后,计算得到的结果数值并没有变化,只是顺序改变了,这样的
变化不够明显,或者说经过pooling后,位置信息可能就遗失
了。 - Bert当中就设计了位置编码的向量,
使得位置的信息能够保存在向量中,不同的顺序结果差距较大
。Bert的位置编码是固定的512位,这也导致输入的内容有限。
6.2长度外推性
简介: 预测时序列长度比训练时候长,模型依然有好的表现
,称为有较好的长度外推性。
举例:
- 训练样本最大长度512
- 预测过程输入样本长度1024
长度外推性是一种理想的性质,并非是必要的。没有,模型也能用,只是有场景限制。
6.3主流位置编码
6.4正余弦位置编码
6.4.1编码的逻辑
编码逻辑: 位置编码向量
+ token向量
-->得到编码后的embedding
;即:Positional Encoding
示意图如下:
**释义:**其中红色圈住部分就是正余弦编码值。
6.4.2正余弦编码值计算
公式如下:
计算示意图:
详细释义:
- pos表示输入的
文本的字符位置
。- i代表一个字符的token维度的序号,由于是正弦余弦交替编码的,所以序号是两个为一组的。一
组先后进行sin计算和cos计算。
,这样2i;或者2i+1才能准确定位到具体的token维度位置。- 正弦余弦在同一个文本字符位置、和token维度位置时,
其位置编码是值是固定的。
优点: 不管输入多长的内容,都能得到位置编码。
缺点: 由于位置的编码值是固定的,效果相对会没有能够根据语料学习的好。
6.5可学习位置编码
简介: 一般称为position embedding,以Bert为代表;如同token embedding一样,随机初始化之后,靠梯度反传学习调整
;缺点在于无法外推,需要预设最大长度.
举例: 比如在Bert中,位置编码长度为512,超过这个长度就无法输入数据了。
示意图:
6.6ROPE相对位置编码
简介: 希望语料中词的相对位置作为位置编码,记录语序的信息
;比如:“我今天要去爬山!” 中“今”与“天”的相对位置就是1;这样的,预计就会有较好的外退性。根据这个逻辑,那位置编码是个矩形,因为每一个字都与其他所有字有个相对位置,加在注意力矩阵
,岂不完美。相对位置编码这里介绍的两种都是不用训练的。
示意图
思想释义: 上述矩阵是一个传统的self-attention计算的结果,在位置信息上,只需要在每一个格子中,加入到相对位置信息即可,
比如”错“和“不”即在值为0.11的格子中,加入位置相对为1的信息即可。
计算公式如下:
释义:
- 传统的Transformer中,Q、K是与对应矩阵W相乘;
上面公式中,加入了e的指数;其中指数值中,包含位置m、n
。- 通过三角函数变化得到最后的公式,
即Q、K相乘的结果与Xm、Xn、还与它们相对位置m-n有关。
即加入了相对位置信息。- 会造成远距离的相关性下降,即m-n之间的差距太远。
6.7Alibi位置编码
简单来说,也是相对位置编码,示意图如下
:
释义:
- 这种方法简单粗暴,即在原来的Q*K的矩阵上,加上相对位置信息矩阵。
- 相对位置信息矩阵,每个格子的值,直接就是位置序号的差,再乘于一个系数。
系数: 系数与注意力的多头数量有关,是相体现位置信息有些句子、有些情况下不重要的意思。情况如下: