Tokenizer
Norm
Batch Norm
好处
- 使得模型训练收敛的速度更快
- 每层的数据分布都不一样的话(解决Internal Covariance Shift),将会导致网络非常难收敛和训练,而如果把每层的数据都在转换在均值为零,方差为1的状态下,这样每层数据的分布都是一样的训练会比较容易收敛。
- 防止梯度消失
- 使得数据不落入饱和性激活函数(如sigmoid,tanh等)饱和区间,避免梯度消失的问题
- 防止过拟合
- 在网络的训练中,BN的使用使得一个minibatch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。
但其实MIT在2019年说好处不是解决了ICS, 而是能让loss曲线更平滑
BN为什么训练时用batch的mean, 而推理时用全局的mean
?
因为用全量训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定程度上减少过拟合。
也正是因此,BN一般要求将训练集完全打乱,并用一个较大的batch值,否则,一个batch的数据无法较好得代表训练集的分布,会影响模型训练的效果。
Layer Norm
为什么LLM用LN而不是BN
- 句子长短不同
- 没有道理, 在身高这个维度做normalization是有道理的, 这改变了分布之后并没有改变相对大小的意义, 比如高个子仍然是高个子. 但是如果在NLP中做这种归一化是没有道理的, 第一句话的"We", 第二句话的"I"之间是不存在这样的关系的
- 假设我们有一个向量是[身高, 体重], 做了BN之后, 身高和体重之间没有直接的关系了, 他们都有各自自己的分布, 但是如果在句子上用BN, 不同维度之间的信息丧失之后, 何谈用注意力机制呢
Instance Norm
对一个channel内进行归一化, 多见于CV中的迁移学习
Group Norm
将多个channel组合到一起, 所以也是在NLP没多大用
Activation Function
sigmoid
σ
(
x
)
=
1
1
+
e
−
x
σ(x) = \frac{1}{1 + e^{-x}}
σ(x)=1+e−x1
缺点: 1. 均值不为0
2.导数小, 梯度消失
3. 计算复杂
tanh
tanh
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}
tanh(x)=ex+e−xex−e−x, 导数为
d
d
x
tanh
(
x
)
=
1
−
tanh
2
(
x
)
\frac{d}{dx}\tanh(x) = 1 - \tanh^2(x)
dxdtanh(x)=1−tanh2(x)
解决了均值不为0, 但是仍然梯度小, 计算复杂
sigmoid和tanh这种bounded反而很适合概率门, 比如LSTM中各种门
ReLU
f ( x ) = { x if x > 0 0 if x ≤ 0 f(x) = \begin{cases} x &\text{if } x > 0 \\ 0 &\text{if } x \leq 0 \end{cases} f(x)={x0if x>0if x≤0
- 好处
- 计算简单
- 不会梯度消失
- 实验证明收敛更快
- 缓解过拟合: ReLu会使一部分神经元的输出为0,这样就造成了 网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。网络的稀疏性可以理解为让不同的神经元各司其职
- 缺点:
- “死亡ReLU"问题:如果学习率设置不当,可能导致某些神经元永远不会被激活,使得相应的参数无法得到更新。这种现象被称为"死亡ReLU”。
- 均值不为0
Leaky ReLU
解决坏死
PReLU
f ( x ) = { x if x > 0 α x if x ≤ 0 f(x) = \begin{cases} x &\text{if } x > 0 \\ αx &\text{if } x \leq 0 \end{cases} f(x)={xαxif x>0if x≤0
ELU
f ( x ) = { x if x > 0 α ( e x − 1 ) if x ≤ 0 f(x) = \begin{cases} x &\text{if } x > 0 \\ α(e^x - 1) &\text{if } x \leq 0 \end{cases} f(x)={xα(ex−1)if x>0if x≤0
α \alpha α是学习的参数,
- 缓解"死亡ReLU"问题:
ELU在负值区间有非零输出,这意味着即使对于负输入,梯度也能够流过。这有助于减少"死亡神经元"的问题,使得网络中的更多单元能够持续学习和更新。 - 输出均值更接近零:
由于ELU在负值区间的非线性特性,它能够将激活的平均值推向零。这有助于缓解Internal Covariate Shift问题,可能会加速学习过程。 - 平滑的梯度:
ELU在整个定义域内都是平滑的,包括在零点附近。这种平滑性可以带来更稳定的梯度流,有利于优化过程。 - 负值饱和:
与Leaky ReLU不同,ELU在负值区间会逐渐饱和到-α。这种特性可以增强对噪声和异常值的鲁棒性。
GeLU (Gaussian Error Linear Unit)
f
(
x
)
=
x
∗
Φ
(
x
)
f(x) = x * Φ(x)
f(x)=x∗Φ(x)
BERT, GPT2, Roberta都在用
motivation是对于较大x, 进行恒等映射, 对于很小的x, 直接map为0, 对于之间的得有梯度进行更新
Swish
f
(
x
)
=
x
∗
s
i
g
m
o
i
d
(
β
x
)
f(x) = x * sigmoid(βx)
f(x)=x∗sigmoid(βx)
LLM参数量计算
- seq_length:
L
— 序列中的token数量 - d_model:
D
— Transformer模型的隐藏层维度 - d_head:
d
— 每个注意力头处理的维度 - n_tokens:
V
— 词表数量
- embedding matrix
V * D
- 多头注意力的参数主要来源于四个矩阵:
W^Q
,W^K
,W^V
, 和W^O
。- 每个矩阵的维度为
[D, d]
。 - 因为有
H
个头,所以每个头有一组独立的参数。 - 总参数量为:
3 * D * d * H = 3 * D * D
。
- 每个矩阵的维度为
W^O
:- 输出矩阵的维度为
[D, D]
。 - 总参数量为:
D * D
。
- 输出矩阵的维度为
每个block总计4 * D* D
, 总计4 * D * D * n_layers
-
FFN参数量
FNN先投射到4 * D
, 再投射回来, 所以有两个矩阵:[D, 4 * D]
和[4 * D, D]
-
其他
LN: 一个 γ \gamma γ一个 β \beta β, 共计2 * D * n_layers
Bias:D * n_layers
positional_encoding: 固定, 可忽略
Attention Mechanism
Encoder, Decoder, Both
KV Cache
PEFT
Alignment
Loss(及代码)
link
正则化
link
为什么L1假设前验是拉普拉斯, L2是高斯 (to be done)