Transformer
base
传统的word2vec虽然利用了上下文关系,但是在使用过程中,是直接采用词矩阵进行映射,没有考虑上下文关系,所以会导致同文歧义的情况。所以这里需要考虑在词向量基础上构建上下文的关系。
CNN
CNN是普通全连接神经网络的简化版。
CNN的独特结构是卷积和池化。卷积是类似滑动窗口的局部特征提取器,池化是采样。
卷积带来的好处就是稀疏权重和共享参数。稀疏权重很好理解,利用多层卷积替代全连接,即使不在一个卷积框里的数据也可以通过多层卷积联系到一起。共享参数是指卷积核上的参数。
RNN
RNN就是普通神经网络基础上引入记忆
考虑到上下文之间的关系
RNN的基本结构
如果链接起来看
问题:梯度消失
这里的W是参数共享的权重,也就是值是相同的,多次乘积后可能导致梯度消失。
当然也存在梯度爆炸的情况,不过可以通过梯度裁剪来解决。
拓展结构:双向RNN
实际上就是两个单向RNNconcat,训练任务仍然是单向的
拓展结构:多层RNN
因为RNN无法并行,所以最多三层
LSTM
RNN本质上只有短记忆的存储更新,但是LSTM可以存储长记忆。
一个感性的认知:三个门控制,三个输入(长记忆C,短记忆h和输入x),两个输出(长短记忆)
具体的操作如下,关键是这里的更新门,当f=1时候,历史信息无限保存,经验上训练过程中经常在
f
t
f_t
ft公式里给
b
f
b_f
bf一个很大的值,保证f=1。从而保存长期信息,避免梯度消失。
但是LSTM也有问题,就是计算量增大了,LSTM的计算量是RNN的4倍
GRU
GRU是LSTM的简化版,目的就是减少计算量。
这里的两个方法是:1)将遗忘门f和输入门i合成一个,让f+i=1,叫做更新门z,用于记忆更新;2)将输出门修改,计算信号的时候不用,只用在计算新的记忆,叫做重置门r
Attention
基本定义
CNN是获取局部关联信息,RNN是获取依次关联信息,Attention则是获取全局信息,这里Attention实际上和全连接很像,通过和全文词进行连接获得全局信息。
当然,这意味着Attention的计算量非常大,是
O
(
n
2
)
O(n^2)
O(n2),同时没有参数共享。这里CNN和RNN都可以通过参数共享来降低计算量,这里对于Attention,是基于Transformer层叠加来实现参数共享的。
Attention的操作如下图所示,本质上是一个加权和,这里K,V分别是数据的键值对,Q是访问的内容,这里的权重实际上就是Q和K的相似度。应用在语言中,实际上就是针对每一个词Q,获得基于上下文的Attention近似估计。
具体实战中,Attention分为三个阶段:
1) 相似度计算
s
i
m
(
k
,
q
)
sim(k, q)
sim(k,q)
2) softmax归一化
a
=
s
o
f
t
m
a
x
(
s
)
a = softmax(\bold s)
a=softmax(s)
3) 加权求和
∑
a
∗
v
\sum a*v
∑a∗v
常见相似度计算
这里相似度的常见计算方法如下
s
i
m
i
=
{
c
o
s
(
s
t
,
h
i
)
,
c
o
n
t
e
n
t
−
b
a
s
e
v
a
T
t
a
n
h
(
W
a
[
s
t
;
h
i
]
)
,
A
d
d
i
t
i
v
e
s
t
T
W
a
h
i
,
G
e
n
e
r
a
l
s
t
T
h
i
,
D
o
t
−
P
r
o
d
u
c
t
s
t
T
h
i
n
,
S
c
a
l
e
d
D
o
t
−
P
r
o
d
u
c
t
sim_i = \begin{cases} cos(s_t,hi), \quad & content-base\\ \textbf{v}_a^Ttanh(\textbf{W}_a[s_t;h_i]), \quad& Additive\\ s_t^T\textbf{W}_ah_i, \quad& General\\ s_t^Th_i, \quad & Dot-Product\\ \frac{s_t^Th_i}{\sqrt{n}}, \quad& Scaled Dot-Product \end{cases}
simi=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧cos(st,hi),vaTtanh(Wa[st;hi]),stTWahi,stThi,nstThi,content−baseAdditiveGeneralDot−ProductScaledDot−Product
在具体使用过程中,点积形式都采用scaled形式,加法形式因为有tanh钳制,不需要scaled。
因为点积过大导致softmax比例失调,最终导致梯度消失
下图推导来源:transformer中的attention为什么scaled?
关于计算方法,有论文《Massive Exploration of Neural Machine Translation Architectures》证明维度越大,ADD性能越好于MUL,当维度=1024,已经非常明显了,那么为什么Transformer还是使用MUL,可能是因为成熟的乘法加速计算算法。这里的说法是参考Transformer的细枝末节
应用
一个应用,attention in seq2seq
Transformer
Transformer是基于self-attention的,是超越CNN和RNN的新一代特征提取工具(特别是指文本处理)。它的主要结构是encoder-decoder的形式。
细致的结构图如下:
self-attention in Transformer
具体可以划分成如下几个部分来说:
positional encoding
Transformer的输入中有上下文无关的word embedding + 位置信息的positional encoding组成。上下文相关的结构在后续encoder-decoder部分展现。
这里的positional encoding采用三角函数的形式,形式如下:
{
P
E
p
o
s
,
2
i
=
s
i
n
(
p
o
s
100
0
2
i
d
)
P
E
p
o
s
,
2
i
+
1
=
c
o
s
(
p
o
s
100
0
2
i
d
)
\begin{cases} PE_{pos,2i} = & sin(\frac{pos}{1000^{\frac{2i}{d}}})\\ PE_{pos,2i+1} = & cos(\frac{pos}{1000^{\frac{2i}{d}}}) \end{cases}
⎩⎨⎧PEpos,2i=PEpos,2i+1=sin(1000d2ipos)cos(1000d2ipos)
这里反映的是positional encoding向量中每一个维度的值,
P
O
S
POS
POS是词在输入句子中的具体位置,
i
i
i是维度,
d
d
d是向量长度。
为什么用这种形式?参考如何理解Transformer论文中的positional encoding,和三角函数有什么关系?
1)三角函数可以表示相对位置关系,参见积化和差,和差化积公式:
{
P
E
p
o
s
+
k
,
2
i
=
P
E
p
o
s
,
2
i
∗
P
E
k
,
2
i
+
1
+
P
E
p
o
s
,
2
i
+
1
∗
P
E
k
,
2
i
P
E
p
o
s
+
k
,
2
i
+
1
=
P
E
p
o
s
,
2
i
+
1
∗
P
E
k
,
2
i
+
1
−
P
E
p
o
s
,
2
i
∗
P
E
k
,
2
i
\begin{cases} PE_{pos+k,2i} &=PE_{pos,2i}*PE_{k,2i+1}+PE_{pos,2i+1}*PE_{k,2i}\\ PE_{pos+k, 2i+1} &=PE_{pos,2i+1}*PE_{k,2i+1}-PE_{pos,2i}*PE_{k,2i} \end{cases}
{PEpos+k,2iPEpos+k,2i+1=PEpos,2i∗PEk,2i+1+PEpos,2i+1∗PEk,2i=PEpos,2i+1∗PEk,2i+1−PEpos,2i∗PEk,2i
2) 三角函数是有界的,避免出现极端值,盖住真正embedding的值
3) 高维空间有效性:避免不同值相同编码,向量含有d个维度,取值范围
[
−
1
,
1
]
d
[-1,1]^d
[−1,1]d,同时不同维度采用不同函数,利用sin/cos和分母的
i
i
i,波长范围为
[
2
π
,
2000
π
]
[2\pi, 2000\pi]
[2π,2000π]
注:在tensor2tensor源代码中,没有采用奇偶位置不同函数,而是前一半和后一半sin/cos不同,实际结构不影响。参考上面链接的回答,这里函数不同只是为了高维空间的有效性,和具体方法没有太大关系。
encoder Multi-head Attention
Multi-head Attention其实就是多个Self-Attention结构的结合,每个head学习到在不同表示空间中的特征,如下图所示,两个head学习到的Attention侧重点可能略有不同,这样给了模型更大的容量。
因为self-attention可以并行操作,所以可以进行矩阵化操作
Add&Norm
residual connection
为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分
- 简化了学习过程,增强了梯度传播,F(x)+x那么该层网络对x求偏导的时候,多了一个常数项,所以在反向传播过程中,梯度连乘,也不会造成梯度消失。
- 打破了网络的对称性,解决网络退化问题,提升了网络的表征能力 Skip Connections Eliminate Singularities
- 增强了网络的泛化能力 知乎解释
网络退化问题:如果在网络中每个层只有少量的隐藏单元对不同的输入改变它们的激活值,而大部分隐藏单元对不同的输入都是相同的反应,此时整个权重矩阵的秩不高。并且随着网络层数的增加,连乘后使得整个秩变的更低。
Layer Normal
背景
internal Covariate shift问题: 深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。
归一化的好处:
- 解决internal covariate shift问题,消除极端值,提升训练稳定性
- 通过对层的激活值的归一化,可以加速模型的训练过程,使其更快的收敛
归一化公式:
h
=
f
(
g
∥
σ
∥
⊙
(
a
−
μ
)
+
b
)
h = f(\frac{\textbf{g}}{\Vert \sigma \Vert}\odot (a - \mu)+b)
h=f(∥σ∥g⊙(a−μ)+b)
这里
μ
\mu
μ和
σ
\sigma
σ是基于样本数据统计的,而
g
\bold{g}
g和
b
b
b则是模型训练的。下面区分BN和LN就是看计算
μ
\mu
μ和
σ
\sigma
σ的样本选取。
摘录自Transformer的细枝末节(下同)
BN 和 LN 的差别就在这里,前者在某一个 Batch 内统计某特定神经元节点的输出分布(跨样本),后者在某一次迭代更新中统计同一层内的所有神经元节点的输出分布(同一样本下)。
下图橙色就是BN统计均值和方差为某层同一个特定神经元下batch所有样本的情况,LN统计同一个样本下同一层所有神经元的均值和方差。
朴素版的 BN 是为 CNN 任务提出的,需要较大的 BatchSize 来保证统计量的可靠性,并在训练阶段记录全局的 [公式] 和 [公式] 供预测任务使用。对于天然变长的 RNN 任务,需要对每个神经元进行在每个时序的状态进行统计。这不仅把原本非常简单的 BN 流程变复杂,更导致偏长的序列位置统计量不足。相比之下,LN 的使用限制就小很多,不需要在预测中使用训练阶段的统计量,即使 BatchSize = 1 也毫无影响。
为什么要选用LN,因为BN主要针对大batch下,可以同步输出每一层结果的结构,如CNN,统计不同样本在特定位置的输入是有意义的,毕竟卷积是局部特征提取器。而RNN类结构,需要依据上文推断下文,不同输入的绝对位置没有意义。
Masked Multi-head Attention
这里的Attention是self-attention,即,K,Q,V都是来自自身。而这里与编码器的self-attention的区别是,这里加入了Mask操作,即我们只能attend到前面已经翻译过的输出的词语,因为翻译过程我们当前还并不知道下一个输出词语,这是我们之后才会推测到的。所以,在未知的部分,采用’-inf’来遮盖住。
同时可以理解,解码过程中是不能并行的,而是像RNN一样一个一个来解码,每一次模型输出的outputs(可能与真实结果不一样),都会返回来作为这一层的输入。
具体过程如下图所示:
decoder Multi-head Attention
这个attention明显和self-attention是不一样的。self-attention是说Q和V是一样的,而这里呢,K和V来自编码器,而Q则来自上一层的解码器,所以不是self-attention。这使得decoder的每一个位置都可以attend到输入序列的每一个位置。所以虽然上一层的Masked Multi-head Attention只学习到了左边的信息(已经预测到),但实际上这里可以attend到全局的信息。
文章的思路和图片参考了jalammar的transformer图解。