前言

###encoder-decoder框架

在nlp任务中,比如机器翻译,encoder-decoder是一种比较常用的学习框架,将原文x输入到encoder中,encoder输出context c作为decoder的部分输入,这里的c就包含了原文x的所有信息。

RNN

RNN由于擅长处理序列特征,因此常被用在nlp任务中,经典的encoder-decoder框架就是基于RNN搭建而成。RNN的缺点在于其无法很好地并行化,这是由其工作原理决定的,当前时刻的输入依赖于上一时刻的输出,因此,其只能串行地运行

RNN+Attention

在上图中可以看到,encoder只输出一个context,decoder中的所有单词都基于相同的context,但是在机器翻译中这一点不符合直觉,因为翻译和原文中的单词通常是有对应关系的,所以对于每个decoder中的输入的hidden state都需要找到其对encoder中最感兴趣的hidden state。RNN存在长程梯度消失问题,对于较长的句子,很难希望通过将输入的序列转化为定长的向量来保存所有信息,Attention机制也能克服这个问题。

具体算法:

假设encoder 的每个hidden state 是 key,同时hidden state也是value, 则encoder会产生一个键值对,decoder的hidden state是query,那么在attention机制中,计算query的attention的方法就是:先计算query与encoder中所有key的相似性,把这个相似性作为权重,得到 各个key-value对的加权和作为query的attention输出。

RNN+Attention+Self attention

Attention 是encoder和decoder之间的机制,而self attention 则是encoder或者decoder内部的机制。因为一句话是有上下文的,一句话中的单词可能依赖于这句话中的其他单词,比如:”我喜欢吃火锅,不喜欢吃醋“ 这句话中”喜欢“对“火锅“应该有比较高的关注度,”不喜欢“对“醋”有比较高的关注度。具体实现方式与attention类似,只需要在encoder或者decoder内部加一个或多个attention layer就可以实现self attention。

####Transformer

前面介绍的都是基于RNN的encoder-decoder模型,但是RNN本身的问题是无法并行化,Transformer 也有encoder和decoder两部分,它完全抛弃了RNN的结构,只用了Attention和self-attention,因此,Transformer相比之前基于RNN的模型更易并行化。

模型结构

Encoder 部分

输入一个sentence的embedding,先输入到一个self attention层,进行layer-norm之后进入到后面的 fully connected feed forward network中,encoder的output就是ffn 的输出加上layer norm之后的结果。

Decoder 部分

与encoder的区别在于decoder中会有来自encoder的cross-attention,并且decoder中attention信息的流动是单向的,decoder的input在self attention时只能“看到”其前部的信息,而“看不到”后面的信息,Transformer的这种结构使得其属于 language generation 模型。

Scaled-dot-product attention

attention 中最核心的是三个 数组:key,query和value, scaled-dot-product attention 就是用内积衡量query和key之间的相似性,并将其作为key对应value的权重。

Multi-head attention

论文提出了一种新的attention机制: Multi-head attention。它基于 Scaled-dot-product attention 而来, 它先将 key,query和value投影到n个指定大小的子空间中,然后在各个子空间分别做 scaled-dot-product attention,最后将n个子空间的attention的输出concat 在一起,然后最后经过一个线性变换将输出投影到指定大小的空间中。

Fully connected feed-forward network

全连接前馈神经网络,论文中用了文本领域常用的一维卷积来实现

Positional Encoding

由于encoder的input中的token会关注所有其他token,而且到现在为止整个模型并没有考虑输入的顺序,所以将输入随便排序都不会影响结果,为了考虑序列顺序信息,论文将每个位置的input都加上其对应的positional encoding,其计算公式如下:

实验

论文主要在machine translation数据集上进行了实验,包括了WMT 2014 English-to-German translation task 和 WMT 2014 English-to-French translation task 。结果当然也证明了该方法的有效性了。

https://zhuanlan.zhihu.com/p/47282410