NLP - Transformer模型

1. 简介

Transformer模型由Google提出,发表在NIPS 2017会议上。是一种完全基于注意力机制的模型,摒弃了RNN和CNN结构。并且很容易并行,训练速度较快,在WMT14 英语- 德语、英语 - 法语翻译任务上获得了SOTA的效果。

  • RNN缺点: 很难并行化,每一个时刻的输出,需要依赖上一个时刻的结果;
  • CNN优缺点: 很容易实现并行化;想要获取更多的上下文信息,需要叠多层卷积网络;
image.png

2. 模型结构

  • Transformer模型由 Encoder 和 Decoder 组成,并且分别堆叠了N层;注意:输入经过N层 Encoder 之后输入到每一层 Decoder 计算Attention;
  • Encoder 包括两个子层:(1)Self-Attention子层;(2)FNN子层;
  • Decoder 包括三个子层:(1)Mask Self-Attention子层;(2)Self-Attention子层;(3)FNN子层;
  • 每个子层后面,都加上了 残差连接(residual connection)层正则化(layer normalization),则最终的输出为:LayerNorm(x + Sublayer(x))
transformer模型结构.png

2.1 Self Attention

  • Transformer在RNN模型的基础上进行改进,使得计算每一个输出,可以并行;


    使用Self-Attention优势.png

2.1.1 Scaled dot-product attention

  • Attention机制的本质是:给定一个query,和一系列对,需要计算得到一个输出得分;注意:query, key, value都是向量;query, key维数为,value的维数为;
  • Scaled dot-product attention计算公式如下:

    上式中是矩阵;

注意:除以,是为了防止变化很大的时候,最终的计算结果变化较大;

例子:计算和其他词的Attention,得到输出
1. 每个输入,计算得到
image.png
2. 做内积
image.png
3. 计算softmax值,得到注意力权重
image.png
4. 注意力权重和,加权平均得到Attention输出
image.png

得到输出,可并行计算:

image.png

2.1.2 Mask说明

  • Decoder第一个子层使用了Mask self-attention子层:主要是为了防止标签泄露,即在 时刻不能看到 时刻之后的信息;因为在infer阶段,只能看到已经生成的序列;
  • 一般使用一个上三角矩阵实现:即在计算softmax之前,将的计算结果赋值为,这样经过softmax之后计算得到的注意力权重趋于0;
    image.png

    image.png

2.2 Multi-Head Attention

  • 每一个头都是一个Scaled dot-product attention的计算;
  • 最终多个头的输出concat在一起,再经过一个linear层得到 Multi-Head Attention 输出;
image.png

2.3 Positional Encoding

  • transformer模型完全基于注意力机制,没有考虑序列顺序信息,因此引入的positional encoding;
  • 在得到每个词的Embedding之后,与位置编码向量相加;并且每个词的位置编码向量是固定的;
  • 位置编码向量,具体计算公式如下:

    上式中,代表词向量维度;代表单词的位置,代表第几维;
image.png

参考资料

  • Transformer 原始论文《Attention is all you need》
    https://arxiv.org/abs/1706.03762
  • Transformer,台湾大学 - 李宏毅
    视频:https://www.youtube.com/watch?v=ugWDIIOHtPA&list=PLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4&index=58
    PPT:http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2019/Lecture/Transformer%20(v5).pdf
  • NLP中的Mask全解
    https://mp.weixin.qq.com/s/0hUNG6tC-hlfyTJtuzwU5w
  • The Illustrated Transformer
    http://jalammar.github.io/illustrated-transformer/
  • 代码实现:https://github.com/harvardnlp/annotated-transformer

你可能感兴趣的:(NLP - Transformer模型)