1. 背景知识
BERT带来了新的NLP范式
? BERT 的出现使 NLP 领域进入了一个新的范式,这个范式有两个特点,1??模型的架构是趋同的,所有的模型架构都是基于transformer 的,2??所有的模型都是基于 预训练的。
BERT 网络结构
? 多层transformer 的网络叠加
? transformer 层的网络核心要素:
- Multi-head attention (多头注意力)
- FNN (全连接层)
- LayerNorm (层归一化)
- 残差连接
2. 注意力机制
2.1 Attention 在深度学习领域的发展历程
? 2017年之前,翻译领域仍以RNN 模型为基础组件,像LSTM ,GRU 等。
? BERT 之前的最好的分类模型是以 LSTM 为基础,在NER 领域里,使用最多的模型结构是Bi-LSTM-CRF 模型。谷歌在tansformer 之前推出的神经翻译模型GNMT 同样基于RNN 。
RNN模型缺点
我的名字叫李雷
- 需要
O(L) 的复杂度使句子中所有词都有交互:长距离的语义依赖很难学到(vanishing gradients); - 并行性不好:前向传播和后向传播都受到
O(L) 限制;
CNN模型缺点
CNN 模型很高效,但是长距离的文本之间的依赖很难由CNN 建模;需要非常多层CNN 叠加。
2.2 Attention in Seq2Seq model
Seq2Seq模型
? 左边编码器将语料编码后形成一个向量,这个向量运用到目标语言的预测当中,生成目标语言句子的模块叫解码器。
Attention机制引入
? 输入的句子无论多丰富,对于解码器只是形成了一个向量。会产生一个信息瓶颈。输出的句子在不同阶段需要关注输入句子的不同部分。
? Attention in machine translation
? 编码器对输入句子进行编码后,句中每个字会产生一个向量表示。假设目标句子的向量表征为
S
t
S_t
St?,
S
1
S_1
S1?表示第一个token ,作为目标句子的开始部分,会预测下一个词是什么,利用Attention去接收更多的信息。
? 首先,
S
1
S_1
S1?向量与原句每个字的向量表示做一个点积(dot product),点积公式:
e
t
=
[
s
t
T
h
1
,
?
?
,
s
t
T
h
N
,
]
∈
R
N
a
t
t
e
n
s
i
o
n
_
s
c
o
r
e
(1)
e^t=\left[s_t^Th_1,\cdots,s_t^Th_N,\right]\in \R^N \qquad\qquad attension\_score \tag{1}
et=[stT?h1?,?,stT?hN?,]∈RNattension_score(1)
点积之后会得到一系列的打分。之后将这些打分通过求softmax 形成一个分布。(这些打分加起来总和为1,且均是非负的,可以看成一个概率分布)
α
t
=
s
o
f
t
m
a
x
(
e
t
)
∈
R
N
a
t
t
e
n
s
i
o
n
_
d
i
s
t
r
i
b
u
t
i
o
n
(2)
\alpha^t=softmax\left(e^t\right)\in\R^N \qquad\qquad attension\_distribution \tag{2}
αt=softmax(et)∈RNattension_distribution(2)
? 上图中原句第一个字的分布打分最高, 表明原句的第一个字对于翻译句子的开头部分更加重要,更加受到关注。有了注意力分布之后形成一个注意力的输出Attention output 。注意力输出是基于注意力分数加权平均的一个向量。
? 用注意力分布计算输入句子的加权平均表征
α
t
\alpha_t
αt?。
α
t
=
∑
i
=
1
N
α
i
t
h
i
∈
R
h
(3)
\alpha_t = \sum_{i=1}^N \alpha_i^t h_i \in \R^h \tag{3}
αt?=i=1∑N?αit?hi?∈Rh(3)
? Attention output 能够帮助更好的翻译下一个词是什么,将
S
1
S_1
S1?的向量表示与Attension output 进行拼接,拼接之后经过一个解码层,得到下一个字的概率分布。
? 注意力输出与
s
t
s_t
st?拼接帮助解码:
[
α
t
;
s
t
]
∈
R
2
h
[\alpha_t; s_t]\in \R^{2h}
[αt?;st?]∈R2h
2.3 注意力的一般形式
? 注意力的一般定义:给定一组向量 (key, value)键值对,以及一个向量 query,注意力机制就是一种根据 query 与 keys 来计算 values 的加权平均的模块。
图片来源:https://zhuanlan.zhihu.com/p/35571412
注意力的多种写法
-
点积注意力(dot-product attension):
e
i
=
s
T
h
i
∈
R
e_i=s^Th_i\in\R
ei?=sThi?∈R -
乘法注意力(multiplicative attention):
e
i
=
s
T
W
h
i
∈
R
e_i=s^TWh_i\in\R
ei?=sTWhi?∈R -
加法注意力(additive attension)
e
i
=
v
T
t
a
n
h
(
W
1
h
i
+
W
2
s
)
∈
R
e_i=v^Ttanh(W_1h_i+W_2s)\in\R
ei?=vTtanh(W1?hi?+W2?s)∈R
2.4 自注意力机制
? 一个字到整个句子的注意力形成过程
? Attention 建模句子表征:从单个字角度,如it_ 的向量表征与句子中的所有词之间计算注意力,由此更新其向量表征:
-
q
i
,
k
i
,
v
i
q_i,k_i,v_i
qi?,ki?,vi? 分别乘以一个参数矩阵
W
Q
,
W
K
,
W
V
W_Q,W_K,W_V
WQ?,WK?,WV?
q
i
=
h
i
W
Q
,
k
i
=
h
i
W
K
,
v
i
=
h
i
W
V
(4)
q_i=h_iW_Q, \qquad k_i = h_iW_K, \qquad v_i=h_iW_V \tag{4}
qi?=hi?WQ?,ki?=hi?WK?,vi?=hi?WV?(4) -
假设it_ 在句子的第i 个位置,对第j 个位置的注意力打分,
e
i
,
j
=
q
i
T
k
j
(5)
e_{i,j}=q_i^Tk_j \tag{5}
ei,j?=qiT?kj?(5) -
注意力打分通过softmax 归一化得到一个概率分布
α
i
\alpha_i
αi?,
α
i
=
S
o
f
t
m
a
x
(
[
e
i
,
1
,
?
?
,
e
i
,
T
]
)
(6)
\alpha_i=Softmax([e_{i,1},\cdots,e_{i,T}]) \tag{6}
αi?=Softmax([ei,1?,?,ei,T?])(6) -
通过注意力打分的一个分布,对 value 进行一个 加权平均,之后经过一个线性层,乘以
W
O
W_O
WO?,得到
h
i
′
h_i^{'}
hi′?,
h
i
′
h_i^{'}
hi′?就相当于it_ 向量表征之后的结果。
h
i
′
=
(
a
i
,
j
v
j
)
W
O
(7)
h_i^{'}=\left(a_{i,j}v_j\right)W_O \tag{7}
hi′?=(ai,j?vj?)WO?(7)
?attention 操作完全并行的使句子中词语两两间有了交互。
3. BERT 网络结构
3.1 BERT中的位置编码
? 句子的顺序对自然语言处理的语义是很重要的一环,如蜂蜜 &蜜蜂 ,但是现在自注意力机制并没有反应句子的顺序,故引入位置编码(Position encoding)。
? 假设句子是从1到T,T表示句长,然后对每个位置分配一个向量
p
i
p_i
pi?,每个位置的向量
p
i
p_i
pi?不同,这样即可表示句子的位置信息。
p
i
∈
R
d
,
f
o
r
i
∈
{
1
,
2
,
?
?
,
T
}
p_i \in R^d, \quad for \quad i \in\{1,2,\cdots, T\}
pi?∈Rd,fori∈{1,2,?,T}
? 1??位置编码可加在Embedding层,与句子中词的Embedding 直接相加,最终输出的 Embedding层是含有位置信息的,然后模型一路往上通过自注意力机制进行编码。
? 2??位置编码也可每层都加,通过这样增加来使得每一层不会去忘记它的位置信息。
位置编码的具体形式
? 1?? 正余弦位置编码。基于正余弦位置编码的表示公式
p
i
p_i
pi? 如下所示,通过给正余弦不同的周期来达到区分位置的效果。
? 2?? 学习驱动的位置编码:
p
i
p_i
pi? 随机初始化,同模型一起学习。
3.2 BERT 中的全连接层与非线性激活函数
? 自注意力机制借助矩阵的公式来看,自注意力层主要是进行了一个加权平均。若用自注意力层形成一个编码器,则差了激活函数层
Q
=
H
W
Q
,
K
=
H
W
K
,
V
=
H
W
V
,
E
=
Q
K
T
A
t
t
n
=
Softmax
?
(
E
)
H
′
=
Attn
?
V
(8)
\begin{gathered} Q=H W_{Q}, K=H W_{K}, V=H W_{V}, \\ \mathrm{E}=Q K^{T} \\ A t t n=\operatorname{Softmax}(E) \\ H^{\prime}=\operatorname{Attn} V \tag{8} \end{gathered}
Q=HWQ?,K=HWK?,V=HWV?,E=QKTAttn=Softmax(E)H′=AttnV?(8)
? 自注意力机制主要是对句子中不同词之间的依赖建模,若使这个网络映射到更加高的维度,需增加一个全连接层,全连接层中含有非线性激活函数。
m
i
=
M
L
P
(
output
i
)
=
W
2
?
ReLU
?
(
W
1
×
output
i
+
b
1
)
+
b
2
\begin{aligned} m_{i} &=M L P\left(\text {output}_{i}\right) \\ &=W_{2} * \operatorname{ReLU}\left(W_{1} \times \text {output}_{i}+b_{1}\right)+b_{2} \end{aligned}
mi??=MLP(outputi?)=W2??ReLU(W1?×outputi?+b1?)+b2??
? 这里的操作是单点的(pointwise ),句子中第 i 个位置的向量,它的全连接层的输出
m
i
m_i
mi?,只由第i 个位置的输出
o
u
t
p
u
t
i
output_i
outputi?决定,而不接收句子中其他信息。
3.3 网络优化技巧
3.3.1 模型优化技巧 多头(multi-head )
? 多头注意力机制
? 1?? 不同的head 去关注不同上下文依赖。即对每一个
h
e
a
d
i
head_i
headi?,去分别使用不同的
Q
,
K
,
V
Q,K,V
Q,K,V 矩阵
W
i
,
Q
,
W
i
,
K
,
W
i
,
V
W_{i,Q},W_{i,K},W_{i,V}
Wi,Q?,Wi,K?,Wi,V?去生成不同的
Q
i
,
K
i
,
V
i
Q^i,K^i,V^i
Qi,Ki,Vi,最后经过拼接后形成自注意力层
H
′
H^{'}
H′的输出。
Q
i
=
H
W
i
,
Q
,
K
i
=
H
W
i
,
K
,
V
i
=
H
W
i
,
V
H
i
,
′
=
Softmax
?
(
Q
i
K
i
T
)
V
i
H
′
=
[
H
1
,
′
,
H
2
,
′
,
…
,
H
N
,
′
]
W
O
(9)
\begin{gathered} Q^{i}=H W_{\mathrm{i}, Q}, \quad K^{i}=H W_{i, K}, \quad V^{i}=H W_{i, V}\\ H^{\mathrm{i}, \prime}=\operatorname{Softmax}\left(Q^{i} K^{i^{T}}\right) V^{i} \\ H^{\prime}=\left[H^{1,^{\prime}}, H^{2,^{\prime}}, \ldots, H^{N,^{\prime}}\right] W_{O} \tag{9} \end{gathered}
Qi=HWi,Q?,Ki=HWi,K?,Vi=HWi,V?Hi,′=Softmax(QiKiT)ViH′=[H1,′,H2,′,…,HN,′]WO??(9)
? 2?? 模型集成的效应(类似于谷歌Inception 模型)。
Inception 模型
? Inception 模型:在每一层中不单单使用一个卷积层网络的操作,这里不知道使用怎样的卷积神经网络操作是最好的,那就堆上一堆卷积核,卷积核的输出都给下一层,这样提取的特征是多层次的。
3.3.2 模型优化技巧 scaling
? scaled dot-product attention
? 在计算attention 分数时除去一个因子
d
k
\sqrt{d_k}
dk?
? 。这样做是因为 模型维度较高时,向量点乘结果会比较大,这个时候由于经过了softmax ,梯度会变小,训练会不稳定。
Q
i
=
H
W
i
,
Q
,
K
i
=
H
W
i
,
K
,
V
i
=
H
W
i
,
V
H
i
,
′
=
Softmax
?
(
Q
i
K
i
T
d
k
)
V
i
H
′
=
[
H
1
,
′
,
H
2
,
′
,
…
,
H
N
,
′
]
W
O
(9)
\begin{gathered} Q^{i}=H W_{\mathrm{i}, Q}, \quad K^{i}=H W_{i, K}, \quad V^{i}=H W_{i, V}\\ H^{\mathrm{i}, \prime}=\operatorname{Softmax}\left(\frac{Q^{i} K^{i^{T}}}{\sqrt{d_k}}\right) V^{i} \\ H^{\prime}=\left[H^{1,^{\prime}}, H^{2,^{\prime}}, \ldots, H^{N,^{\prime}}\right] W_{O} \tag{9} \end{gathered}
Qi=HWi,Q?,Ki=HWi,K?,Vi=HWi,V?Hi,′=Softmax(dk?
?QiKiT?)ViH′=[H1,′,H2,′,…,HN,′]WO??(9)
3.3.3 模型优化技巧 残差连接
? 残差连接:
H
l
+
1
=
H
l
+
l
a
y
e
r
(
H
l
)
H^{l+1}=H^l+layer(H^l)
Hl+1=Hl+layer(Hl)
? 残差连接意义:① 解决深度网络的梯度消失问题(残差网络ResNet 原文); ② 改变损失函数的形态,使得损失函数更加平滑。
Visual the Loss Landscape of Neural Nets. NeurlPS (2018)
3.3.4 模型优化技巧 LayerNormalization
? 层归一化
- 对每个向量求其均值
μ
\mu
μ 和方差
σ
\sigma
σ,再将其进行归一化。
x
′
=
x
?
μ
σ
+
?
?
γ
+
β
\mathrm{x}^{\prime}=\frac{x-\mu}{\sqrt{\sigma}+\epsilon} * \gamma+\beta
x′=σ
?+?x?μ??γ+β
? 层归一化意义:① 改变损失函数的形态,使得损失函数更加平滑。② 梯度的方差变小了。
? 层归一化位置
? AutoTrans 提出采用自动机器学习的方法寻找layerNorm 的最优位置组合。
参考链接 - 深度之眼 - BERT模型精讲
|