一、背景信息:
LLaMA(Large Language Model Meta AI)模型是于2020 年由发布的一个大型基础语言模型。
LLaMA使用的数据集来源都是公开数据集,无任何定制数据集。
LLaMA性能的亮点充分地证明了高质量数据的重要性,而不是一股脑地叠加网络深度以及参数量。
二、整体结构:
和 GPT 系列一样,LLaMA 模型也是 Decoder-only 架构,但结合前人的工作做了一些改进,比如:
-
RMSNorm, 归一化函数的调整:为了提高训练稳定性,LLaMA使用 RMSNorm归一化函数(旧为LayerNorm)
-
SwiGLU, FFN层激活函数调整: LLaMA引入SwiGLU激活函数 用在FFN层以提高性能。
-
RoPE, 位置编码的调整: LLaMA不再位置向量合成输入向量,而是在每次Attention时进行RoPE的位置向量编码。
![](https://i-blog.csdnimg.cn/direct/60295ada70c04c1faa6e9e488ae0b37f.png)
三、SwiGLU
1、ReLU激活函数
最初的Transformer中在FFN层采用了ReLU激活函数,其中ReLU的定义为 R e L U ( x ) = m a x ( 0 , x ) ReLU(x) = max(0, x) ReLU(x)=max(0,x) 优点在于不存在饱和的非线性区域且计算快。
2、GELU激活函数
GELU将随机正则化(例如dropout)和ReLU激活函数结合在一起,GELU的定义为
G
E
L
U
(
x
)
=
x
P
(
X
≤
x
)
=
x
Φ
(
x
)
=
x
⋅
1
2
[
1
+
e
r
f
(
x
2
)
]
GELU(x) = xP(X\le x) = x\Phi (x) = x \cdot \frac{1}{2} [1 + erf(\frac{x}{\sqrt{2} } )]
GELU(x)=xP(X≤x)=xΦ(x)=x⋅21[1+erf(2x)]
其中标准正态分布的分布函数
Φ
(
x
)
\Phi (x)
Φ(x)的定义为
Φ
(
x
)
=
1
2
π
∫
−
∞
x
e
−
t
2
2
d
t
\Phi (x) = \frac{1}{\sqrt{2\pi } } \int_{-\infty}^{x} e^{- \frac{t^{2}}{2} } dt
Φ(x)=2π1∫−∞xe−2t2dt,误差函数erf(x)是正态函数的不定积分。
3、SwiGLU激活函数
SwiGLU是Gated Linear Units(GLU)激活函数的一种变体。结合了Swish 和 GLU 两者的特点。
1) GLU(Gated Linear Units)
GLU是一个线性变换后面接门控机制的结构。其中门控机制是一个sigmoid函数,用来控制信息能够通过多少。
G
L
U
(
x
)
=
s
i
g
m
o
i
d
(
x
W
+
b
)
⊗
(
x
V
+
c
)
GLU(x) = sigmoid(xW + b) \otimes (xV + c)
GLU(x)=sigmoid(xW+b)⊗(xV+c)
其中,
⊗
\otimes
⊗为逐元素乘;W、V、b、c为可训练的权重或参数。通过使用其他的激活函数可以得到GLU的各种变体。
2) Swish激活函数
Swish可以被视为一个平滑的非单调函数能够缓解梯度消失问题,在处理负输入时表现出了比ReLU更好的性能。 GELU的定义为
S
w
i
s
h
(
x
)
=
x
⋅
s
i
g
m
o
i
d
(
β
x
)
Swish(x) = x \cdot sigmoid(\beta x)
Swish(x)=x⋅sigmoid(βx)
其中,
β
\beta
β是一个可学习的参数。
3)SwiGLU激活函数
SwiGLU是采用Swish作为激活函数的GLU变体,SwiGLU的定义为:
S
w
i
G
L
U
(
x
)
=
S
w
i
s
h
(
x
W
+
b
)
⊗
(
x
V
+
c
)
SwiGLU(x) = Swish(xW + b) \otimes (xV + c)
SwiGLU(x)=Swish(xW+b)⊗(xV+c)
其中,Swish激活函数的 β \beta β=1;由于引入了更多的权重矩阵,通常会对隐藏层的大小做一个缩放,从而保证整体的参数量不变。
四、RMS Norm
对每一层的输出进行归一化LayerNorm是为了提高训练的稳定性。RMS Norm简化了Layer Norm 的计算,可以再减少约7%∼64%的计算时间。
RMS Norm去掉了Layer Norm中减去均值的操作,也就是没有去中心化的操作,只有缩放的操作。
Layer Normalization (
a
i
⟶
a
i
ˉ
a_{i} \longrightarrow \bar{a_{i}}
ai⟶aiˉ)
其中
a
i
a_{i}
ai是模型的输入,
a
i
ˉ
\bar{a_{i}}
aiˉ是经过归一化后的:
a
i
ˉ
=
a
i
−
μ
σ
\bar{ a_{i}} = \frac{a_{i}-\mu }{\sigma }
aiˉ=σai−μ
上式中
a
i
a_{i}
ai的均值
μ
=
1
n
∑
i
=
1
n
a
i
\mu = \frac{1}{n} \sum_{i=1}^{n}a_{i}
μ=n1∑i=1nai,
a
i
a_{i}
ai的标准差
σ
=
1
n
∑
i
=
1
n
(
a
i
−
μ
)
2
\sigma = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(a_{i}-\mu ) ^{2}}
σ=n1∑i=1n(ai−μ)2。
RMS Normalization的公式如下:
a
i
ˉ
=
a
i
R
M
S
(
a
)
\bar{ a_{i}} = \frac{a_{i} }{RMS(a)}
aiˉ=RMS(a)ai
其中,
R
M
S
(
a
)
=
1
n
∑
i
=
1
n
a
i
2
RMS(a) = \sqrt{\frac{1}{n}\sum_{i=1}^{n}a_{i} ^{2}}
RMS(a)=n1∑i=1nai2,从公式上看RMS Norm去掉了Layer Norm中每一步的减去均值的操作。
RMS(均方根、Root Mean Square) 是指一组数据的平方的平均数的算术平方根。
五、旋转位置编码(RoPE)
使用RopE旋转位置编码后不需要在输入向量中与位置向量相加
,而是在每个Attention层中分别对Q K 进行RoPE位置编码。
Attention公式如下:
A
t
t
e
n
t
i
o
n
(
Q
,
K
,
V
)
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
V
Attention(Q, K, V) = softmax( \frac{QK^{T} }{\sqrt{d_{k}} } )V
Attention(Q,K,V)=softmax(dkQKT)V
RoPE编码对Attention的输入参数Q、K进行下式的变换:
q
~
=
f
(
q
,
m
)
k
~
=
f
(
k
,
m
)
\begin{matrix} \tilde{q} = f(q, m) \\\tilde{k} = f(k, m) \end{matrix}
q~=f(q,m)k~=f(k,m)
其中计算RoPE的函数为:
f
(
q
,
m
)
=
R
f
(
q
,
m
)
e
i
Θ
f
(
q
,
m
)
=
∥
q
∥
e
i
(
Θ
(
q
)
+
m
θ
)
=
q
e
i
m
θ
\begin{matrix} f(q, m) & = R_{f}(q, m)e^{i\Theta_{f}(q, m) } \\ & = \left \| q \right \| e^{i(\Theta(q)+m\theta ) } \\ & = qe^{im\theta } \\ \end{matrix}
f(q,m)=Rf(q,m)eiΘf(q,m)=∥q∥ei(Θ(q)+mθ)=qeimθ
设
R
f
(
q
,
m
)
=
∥
q
∥
R_{f}(q, m)=\left \| q \right \|
Rf(q,m)=∥q∥;
Θ
(
q
)
\Theta(q)
Θ(q)是q本身的幅角;
Θ
f
(
q
,
m
)
=
Θ
(
q
)
+
m
θ
\Theta_{f}(q, m)=\Theta(q)+m\theta
Θf(q,m)=Θ(q)+mθ 。
θ
i
θ_{i}
θi的选择依然沿用Sinusoidal位置编码的方案,即
θ
i
=
1000
0
−
2
i
d
θ_{i} = 10000^{\frac{-2i}{d} }
θi=10000d−2i,它可以带来一定的远程衰减性。
RoPE的函数可以表示为矩阵形式:
f
(
q
,
m
)
=
[
cos
m
θ
−
sin
m
θ
sin
m
θ
cos
m
θ
]
[
q
0
q
1
]
f(q, m) = \begin{bmatrix} \cos m\theta & - \sin m\theta \\ \sin m\theta & \cos m\theta \end{bmatrix} \begin{bmatrix} q_{0}\\ q_{1} \end{bmatrix}
f(q,m)=[cosmθsinmθ−sinmθcosmθ][q0q1]
RoPE中还整理了更适于计算机进行计算的表述方式。
Reference
1、LLaMA: Open and Efficient Foundation Language Models
2、苏剑林-让研究人员绞尽脑汁的Transformer位置编码
3、苏剑林-Transformer升级之路:2、博采众长的旋转式位置编码
4、一文带你了解LLAMA(羊驼)系列
5、大模型基础|激活函数|从ReLU 到SwiGLU