文章目录
一. Attention
在文本情感分析中,我们对I hate this movie进行分析,如果采用RNN或者CNN,模型的学习机制导致无法关注于带有强烈情感的单词“hate”。因此就引入了Attention机制,然模型能够更加关注于重点信息。
self-attention
在Transformer模型中引入的self-attention机制使模型相较于传统模型在性能上有了很大的提升。
而self-attention的大体流程是:
- 词嵌入
- 位置编码
- 引入查询向量 Q Q Q、键向量 K K K、值向量 V V V
- “打分”(self-attention)
词嵌入
使用词嵌入技术,将输入的文本嵌入到
n
n
n维的向量空间,在Attention is all you need中,
n
=
512
n=512
n=512。
位置编码
为了表示文本中单词之间的位置关系,需要对嵌入后的向量进行位置编码,编码的规则大概是对偶数位置使用正弦编码,对奇数位置使用余弦编码:
{
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
d
m
o
d
e
l
)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
d
m
o
d
e
l
)
\begin{cases} PE(pos,2i)&=sin(pos/10000^{2i\over d_{model}}) \\PE(pos,2i+1)&=cos(pos/10000^{2i\over d_{model}}) \end{cases}
{PE(pos,2i)PE(pos,2i+1)=sin(pos/10000dmodel2i)=cos(pos/10000dmodel2i)
其中:
p
o
s
pos
pos表示词在句子中的位置,
i
i
i是向量中每个值的index,
d
m
o
d
e
l
d_{model}
dmodel表示向量的维度
n
n
n。
在得到单词的位置编码后,将位置编码结果与词嵌入结果相加,得到位置编码的词嵌入。如下图所示:
引入查询向量 Q Q Q、键向量 K K K、值向量 V V V
其中记位置编码后的词嵌入为
E
i
n
p
u
t
E_{input}
Einput,那么有:
Q
=
W
Q
E
i
n
p
u
t
K
=
W
K
E
i
n
p
u
t
V
=
W
K
E
i
n
p
u
t
\begin{aligned} Q=W_{Q}E_{input} \\K = W_KE_{input} \\V = W_KE_{input} \end{aligned}
Q=WQEinputK=WKEinputV=WKEinput
其中
W
Q
,
W
K
,
W
v
W_Q,W_K,W_v
WQ,WK,Wv是可学习的参数矩阵。
“打分”
- 将查询向量与键向量做内积,内积后的结果记为 S S S,即: S = Q T K S = Q^TK S=QTK。
- 将内积结果除以输入维度的根号,即 S = S n S = {S\over \sqrt n} S=nS
- s = s o f t m a x ( S ) s = softmax(S) s=softmax(S)
- softmax的结果乘值向量 V V V,即 s ∗ V s*V s∗V
- 求和
综上所述。self-attention的大体流程图如下:
引入Mult self-attention:
二. Normalization
一般而言,有:
- 对于卷积网络 (CNN):批量归一化 (BN)更好。
- 对于循环网络(RNN):层归一化(LN)更好。
BN 使用当前层的所有样本来规范化每个单个值,LN 使用单个样本的所有层来执行标准化。
批标准化(batch normalization)
1. 批标准化的数学计算
批标准化是对所有的样本进行标准化处理,其标准化的过程如下:
(
1
)
μ
=
1
n
∑
i
Z
(
i
)
(
2
)
δ
2
=
1
n
∑
i
(
Z
(
i
)
−
μ
)
2
(
3
)
Z
n
o
r
m
(
i
)
=
Z
(
i
)
−
μ
δ
2
−
ϵ
(
4
)
Z
^
=
γ
∗
Z
n
o
r
m
(
i
)
+
β
\begin{aligned} (1)&\mu={1\over n}\sum_i Z^{(i)} &(2)&\delta ^2={1\over n}\sum_i(Z^{(i)}-\mu)^2 \\(3)&Z_{norm}^{(i)}={Z^{(i)}-\mu\over \sqrt{\delta^2-\epsilon}} &(4)&\hat Z = \gamma*Z_{norm}^{(i)}+\beta \end{aligned}
(1)(3)μ=n1i∑Z(i)Znorm(i)=δ2−ϵZ(i)−μ(2)(4)δ2=n1i∑(Z(i)−μ)2Z^=γ∗Znorm(i)+β
- 其中 μ \mu μ为样本的均值, δ 2 \delta^2 δ2为样本的方差。
- (3)对激活向量 Z ( i ) Z^{(i)} Z(i)进行归一化。
- 𝛾允许调整标准偏差。
- 𝛽允许调整偏差,在右侧或左侧移动曲线。
调整结果如下图所示(让样本服从正态分布):
2. 批标准化的优点
- 添加 BN 层会导致更快更好的收敛(更好意味着更高的准确性),避免了梯度消失。
- 添加 BN 层允许我们使用更高的学习率(LR)而不影响收敛。更高的学习率有助于优化器避免局部最小值收敛。
3. 为什么标准化有效
- 假设一: BN 的有效性是由于他们所谓的内部协变量偏移(ICS)的减少。
- 假设二:BN在训练期间减轻了层之间的相互依赖性。
假设一:
内部协变量偏移(ICS):
- 首先,协变量偏移是在分布稳定性预期中描述了模型输入分布的偏移。通过扩展,内部协变量偏移描述了当它发生在深度神经网络的隐藏层中时的这种现象。
- 协变量偏移从模型的角度来看,训练图像在统计上与测试图像差别太大。
批量标准化使模型朝着减少内部协变量偏移迈出了一步,并由此显着加速了深度神经网络的训练。
假设二:
g
r
a
d
(
a
)
=
g
r
a
d
(
b
)
∗
g
r
a
d
(
c
)
∗
g
r
a
d
(
d
)
∗
g
r
a
d
(
e
)
grad(a) = grad(b)*grad(c)*grad(d)*grad(e)
grad(a)=grad(b)∗grad(c)∗grad(d)∗grad(e)
- 我们首先考虑一个没有 BN 层的网络。从上面的等式中,我们得出结论,如果所有梯度都很大,那么 grad(a) 将非常大。相反,如果所有梯度都很小,则 grad(a) 几乎可以忽略不计。通过查看隐藏单元的输入分布,很容易看出层之间的依赖程度:(a)权重的修改将修改(b)权重的输入分布,最终将修改( d) 和 (e)。这种相互依赖可能会给训练稳定性带来问题:如果我们想调整特定隐藏单元的输入分布,我们需要考虑整个层序列。
- 添加 BN 层显着降低了训练期间各层之间的相互依赖关系(从分布稳定性的角度来看)。批量标准化就像一个阻止流动的阀门,并允许使用𝛽、𝛾对其进行调节。然后不再需要考虑所有参数来获得关于隐藏单元内部分布的线索。
4. 使用批标准化的注意
- 受制于硬件限制,每个Batch的尺寸比较小,这时候谨慎使用BN;
- 在类似于RNN的动态网络中谨慎使用BN;
- 训练数据集和测试数据集方差较大的时候。
层归一化(layer normalization)
1.层标准化的数学计算
对于单个RNN模块:
h
t
=
W
a
a
a
t
−
1
+
W
x
a
X
t
h^t=W_{aa}a^{t-1}+W_{xa}X^t
ht=Waaat−1+WxaXt
我们标准化处理是:
(
1
)
μ
t
=
1
n
∑
i
=
1
n
h
i
T
(
2
)
δ
t
=
1
n
∑
i
=
1
n
(
h
i
t
−
μ
t
)
2
(
3
)
a
t
=
f
(
γ
(
δ
t
)
2
+
ϵ
⊙
(
h
t
−
u
t
)
+
β
)
\begin{aligned} (1) &\mu^t= {1\over n}\sum_{i=1}^n{h_i^T} \\(2)&\delta^t=\sqrt{{1\over n}\sum_{i=1}^n(h_i^t-\mu^t)^2} \\(3)&a^t=f({\gamma\over \sqrt{(\delta^t)^2+\epsilon}}⊙(h^t-u^t)+\beta) \end{aligned}
(1)(2)(3)μt=n1i=1∑nhiTδt=n1i=1∑n(hit−μt)2at=f((δt)2+ϵγ⊙(ht−ut)+β)
其中
n
n
n为一层中隐层节点的数量。
2.层标准化与批标准化
- LN是和BN非常近似的一种归一化方法,不同的是BN取的是不同样本的同一个特征,而LN取的是同一个样本的不同特征。在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。
- 但是有些场景是不能使用BN的,例如batchsize较小或者在RNN中,这时候可以选择使用LN,LN得到的模型更稳定且起到正则化的作用。RNN能应用到小批量和RNN中是因为LN的归一化统计量的计算是和batchsize没有关系的
权重归一化(weight normalization)
权重归一化是对神经网络的连接权重进行归一化,其归一化的方式为:
W
i
,
:
=
g
i
∣
∣
v
i
∣
∣
v
i
W_{i,:}={g_i\over ||v_i||}v_i
Wi,:=∣∣vi∣∣givi
其中,
- W i , : W_{i,:} Wi,:表示权重 W W W的第 i i i行;
- g i g_i gi为新引入的参数,为标量;