Transformer
先放一个jalammar博客
更详细的博客
大佬的notebook详解
transformer总体结构
- 为什么有多个encoder呢?:从下往上可以提取表层的词法信息 -> 抽象的语义信息
- encoder到decoder的部分就是attention部分,进行信息传递和交互
- encoder和decoder的数量是一样的
encoder结构
什么是attention?:
- 语言学角度:描述词与词的关联关系
- 机器学习角度:神经网络隐层之间的相似度表示
什么是self-attention?:
- self-attention 表示句子内部词与词之间的关联关系
- 可以解决指代消解等问题
什么是encoder-decoder-attention?:
- 编码序列与解码序列中词与词的关联关系
- 以机器翻译为例:表征翻译中源端到目标可能互译词之间的对应关系
详细的attention计算
Q表示为了编码当前词,需要去注意其它(其实也包括它自己)的词,我们需要有一个查询向量。而Key向量可以认为是每个词的关键的用于被检索的信息,而Value向量是真正的内容。
Self-Attention里的Query不是隐状态,并且来自当前输入向量本身,因此叫作Self-Attention。另外Key和Value都不是输入向量,而是输入向量做了一下线性变换。当然理论上这个线性变换矩阵可以是Identity矩阵,也就是使得Key=Value=输入向量。因此可以认为普通的Attention是这里的特例。这样做的好处是模型可以根据数据从输入向量中提取最适合作为Key(可以看成一种索引)和Value的部分。类似的,Query也是对输入向量做一下线性变换,它让系统可以根据任务学习出最适合的Query,从而可以注意到特定的内容。
为什么除以维度的
d
k
\sqrt{d_k}
dk?:因为Q与K做点积吧方差放大了
d
k
d_k
dk倍,所以我们要把注意力注意力矩阵缩回标准的正态分布,这样可以得到更好的梯度。
d
k
表
示
维
度
的
大
小
\sqrt{d_k}表示维度的大小
dk表示维度的大小
- 新的向量的尺度远小于词向量的尺度,维度为64,这种架构选择可以使(大部分)多头注意力计算不变
多头的attention的好处:
- 机器学习角度:参数变多了,拟合数据的能力变强,可以考虑到不同位置的attention
- 语言学角度:不同的子空间可以表示不同的关联关系(指代、依存、其他的句法信息)对于attention赋予了多个子空间
把 不 同 的 a t t e n t i o n 进 行 c o n c a t n a t e 然 后 乘 以 一 个 W 0 达 到 压 缩 的 目 的 , 避 免 后 面 进 行 矩 阵 计 算 的 开 销 比 较 大 把不同的attention进行concatnate然后乘以一个W^0达到压缩的目的,避免后面进行矩阵计算的 开销比较大 把不同的attention进行concatnate然后乘以一个W0达到压缩的目的,避免后面进行矩阵计算的开销比较大
以上可以并行的操作,但是丢失了位置信息,所以我们需要对位置建模
P
E
(
p
o
s
,
2
i
)
=
s
i
n
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE(pos,2i) = sin(pos/10000^{2i/d_{model}})
PE(pos,2i)=sin(pos/100002i/dmodel)
P
E
(
p
o
s
,
2
i
+
1
)
=
c
o
s
(
p
o
s
/
1000
0
2
i
/
d
m
o
d
e
l
)
PE(pos,2i+1) = cos(pos/10000^{2i/d_{model}})
PE(pos,2i+1)=cos(pos/100002i/dmodel)
Residual connection
Residul Connect 对比深层的神经网络有较好的作用:
- 直连层:减少信息的丢失
- Layer Norm 层防止weights过大或者过小的导致梯度消失或者梯度爆炸,保证训练的稳定性
这里需要注意的是:decoder的self-attention是masked的,拿机器翻译来说,我们在翻译的时候只可以看到以前已经翻译的信息,看不到即将翻译的信息
输出层的隐层
损失函数
交
叉
熵
或
者
相
对
熵
交叉熵或者相对熵
交叉熵或者相对熵