Transformer
Transformer
先放一个jalammar博客
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,从而可以注意到特定的内容。
- 新的向量的尺度远小于词向量的尺度,维度为64,这种架构选择可以使(大部分)多头注意力计算不变
多头的attention的好处:
- 机器学习角度:参数变多了,拟合数据的能力变强,可以考虑到不同位置的attention
- 语言学角度:不同的子空间可以表示不同的关联关系(指代、依存、其他的句法信息)对于attention赋予了多个子空间
以上可以并行的操作,但是丢失了位置信息,所以我们需要对位置建模
Residual connection
Residul Connect 对比深层的神经网络有较好的作用:
- 直连层:减少信息的丢失
- Layer Norm 层防止weights过大或者过小的导致梯度消失或者梯度爆炸,保证训练的稳定性
这里需要注意的是:decoder的self-attention是masked的,拿机器翻译来说,我们在翻译的时候只可以看到以前已经翻译的信息,看不到即将翻译的信息