深度学习·神经网络·计算机视觉

【深度学习】从seq2seq到Transformer学习记录

2019-06-23  本文已影响15人  小透明苞谷

背景

Encoder-Decoder是个非常通用的计算框架,至于Encoder和Decoder具体使用什么模型都是由研究者自己定的,常见的比如 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,这里的变化组合非常多。

seq2seq(14年)

Encoder 对输入语句 X 进行编码,经过函数变换为中间语义向量 C,得到中间语义向量 C 后,使用 Decoder 进行解码。Decoder根据中间状态向量 C 和已经生成的历史信息 yi-1 去生成 t 时刻的单词 yi

两种模型

如果将 c 直接输入到Decoder中,则是 Seq2Seq 模型的第二种模型:

c直接作为Decoder阶段RNN的初始化state,而不是在每次decode时都作为RNN cell的输入。

h'_0=c
h'_t=f(h'_{t-1},y_{t-1})
y_t=g(h'_t,y_{t-1})

如果将 c 当作 Decoder 的每一时刻输入,则是 Seq2Seq 模型的第一种模型:

h'_t=f(c, h'_{t-1}, y_{t-1})
y_t=g(h'_t,y_{t-1},c)

tip:g函数往往是一个softmax函数

Seq-to-Seq with Attention(14年)

Encoder-Decoder 模型的局限性:

引入Attention机制优点:

Attention 模型的特点是 Decoder 不再将整个输入序列编码为固定长度的中间语义向量 ,而是根据当前生成的新单词计算新的 C_{i}使得每个时刻输入不同的 ,这样就解决了单词信息丢失的问题。引入了 AttentionEncoder-Decoder 模型如下图:


原来:

现在:
h'_t=f(c_t, h'_{t-1}, y_{t-1})
y_t=g(h'_t,y_{t-1},c_t)

attention 权重矩阵的计算

这里关键的操作是计算encoder与decoder state之间的关联性的权重,得到Attention分布,从而对于当前输出位置得到比较重要的输入位置的权重,在预测输出时相应的会占较大的比重。

Attention(17年)

背景:attention mechanism通常和RNN结合使用,每个时间步的输出需要依赖于前面时间步的输出,这使得模型没有办法并行,效率低;

应用:机器翻译,图片描述,语音转文字

注意力模型优势:

  1. 提高任务性能
  2. 提高模型的可解释性
  3. 并行计算减少模型训练时间。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。但是CNN也只是每次捕捉局部信息,通过层叠来获取全局的联系增强视野。
  4. 可以灵活的捕捉长期和local依赖,而且是一步到位的。AM解决了RNN模型的很多问题,例如在面对长文本时的性能衰减,以及计算序列数据对任务的权重影响等。

可以从两个角度来分类Attention:

通用理解

Attention is all you need
本文的创新点在于抛弃了之前传统的encoder-decoder模型必须结合cnn或者rnn的固有模式,只用attention。文章的主要目的是在减少计算量和提高并行效率的同时不损害最终的实验结果,创新之处在于提出了两个新的Attention机制,分别叫做 Scaled Dot-Product AttentionMulti-Head Attention。提出了transformer。

将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。其实就是一个查询(query)到一系列键值(key-value)对的映射。

从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少量重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体现在权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。

scaled dot-product attention

attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V

attention函数共有三步完成得到attention value。

  1. Q与K进行相似度计算得到权值
    计算Query和每个Key之间的相似性或相关性一般有三种方式:
  1. 对上部权值归一化

    a_i = softmax(f(Q,K_i)) = \frac{exp(f(Q,K_I))}{\sum_j(f(Q,K_i))}

  2. 用归一化的权值与V加权求和

    Attention(query,source) = \sum_ia_iV_i

其意义为:为了用 value求出 query的结果, 根据 query和 key 来决定注意力应该放在value的哪部分。以前的 attention是用 LSTM 做 encoder,也就是用它来生成key 和 value,然后由 decoder来生成 query。(论文 Neural machine translation by jointly learning to align and translate,key 和 value是一样的,都是文中的h ,而 query是文中的 s。)

有两种常用的注意力函数,一种是加法注意力(additive attention),另外一种是点乘注意力(dot-productattention),论文所采用的就是点乘注意力,这种注意力机制对于加法注意力而言,更快,同时更节省空间。

为什么scaling:

  1. 如果​太大,点乘的值太大,如果不做scaling,结果就没有加法注意力好。(d_k是key和query的维度)

  2. 点乘的结果过大,这使得经过softmax之后的梯度很小,不利于反向传播的进行,所以我们通过对点乘的结果进行尺度化。

Multi-head Attention

这里面Multi-head Attention其实就是多个Self-Attention结构的结合,每个head学习到在不同表示空间中的特征,如下图所示,两个head学习到的Attention侧重点可能略有不同,这样给了模型更大的容量。

self attention

Google最新的机器翻译模型内部大量采用了Self Attention模型。

在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的,比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素和Source中的所有元素之间而Self Attention顾名思义,可以理解为Target=Source这种特殊情况下的注意力计算机制,指的不是Target和Source之间的Attention机制。

优点:

  1. 引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小。
  2. Self Attention对于增加计算的并行性也有直接帮助作用。

Transformer

key, query, value

因此,Transformer会在三个不同的方面使用multi-head attention:

  1. encoder-decoder attention:使用multi-head attention,输入为encoder的输出和decoder的self-attention输出,其中encoder的self-attention作为 key and value,decoder的self-attention作为query
  2. encoder self-attention:使用 multi-head attention,输入的Q、K、V都是一样的(input embedding and positional embedding)
  3. decoder self-attention:在decoder的self-attention层中,deocder 都能够访问当前位置前面的位置
position encoding

注意由于该模型没有recurrence或convolution操作,所以没有明确的关于单词在源句子中位置的相对或绝对的信息,为了更好的让模型学习位置信息,所以添加了position encoding并将其叠加在word embedding上。该论文中选取了三角函数的encoding方式,其他方式也可以。

Add+Norm

其中Add代表了Residual Connection,是为了解决多层神经网络训练困难的问题,通过将前一层的信息无差的传递到下一层,可以有效的仅关注差异部分,这一方法之前在图像处理结构如ResNet等中常常用到。F(x)+x

而Norm则代表了Layer Normalization,通过对层的激活值的归一化,可以加速模型的训练过程,使其更快的收敛,

参考文献:

上一篇下一篇

猜你喜欢

热点阅读