一. 回顾transformer
1.Encoder
transformer中Encoder的过程可以解释为:低阶语义向量转换为高阶语义向量
->
2.Attention
Attention:把输入的向量分别乘一个可训练的矩阵并作相似度计算
3.Layer Norm
举个例子解释Layer Norm比Batch Norm好的原因: 假如一句话的Embeeding如下
-> X =
在NLP中不同batch中pad的数量是不一样的,如果沿着行做归一化没意义,应该对这一个batch中每一个token做归一化
4.参数量
一般的模型增加复杂度的方式:
a.增加深度,增加宽度
b.增加embedding的维度
c.增加词典的大小
transformer中参数分布: 这里假设Multi Head:12 Wq, Wk, Wv维度为64, embedding维度为768, 词典大小为E
12个头: 768x64x3x12
concat+线性变换(tanh(c, Key)·(w1)w1): 768x768
FeedForward(2层MLP,先升维再降维,一般是4倍): 2x768x768x4
Word Embedding: Ex768
二. 位置编码
1.直接加入位置编码
在
之前,直接加入位置的embedding
(可以学习的embedding)
2.自定义绝对位置编码
二位函数 f(position, dimension)
要求:
函数f随着position,dimension增长应该是有界的,足够的区分度,对每个position对应的行向量应该是不同的
偶数位
奇数位
3.旋转位置编码
(m是位置)
例子(假设Query中第m个,Key中第n个,embedding后是2维):
a.Attention计算:
b.Query偏移计算:
二维向量使用复数表示:
当使用复数表示二维向量,这里引入欧拉公式,即
推导出,
化简一下
再写成向量形式()
转换成矩阵相乘() (
)
c.Key偏移计算:
和Query一样的
() (
)
d.偏移后的Query和Key计算:
:
(
) (
) (记得转置~)
整理一下:
)(
)
e.理解
把上面的式子换一个形式 :
这里可以看出来所谓相似度就是有角度差 ,角度差越大相似度越小
base=10000, d=维度, i=位置ids
三. 问题
1.为什么旋转位置编码在投影之后做不在投影之前做
这里想到矩阵运算
假设在投影之前做
=? 无法矩阵合并
2.chatglm不同的点
chatglm中,初始化的是一半正一半负数,而不是公式中严格按照相邻两两组合旋转
原因:神经元是无序的(神经网络中没有顺序,乘前面的W矩阵),