Attention,BiLSTM以及Transform

  • 2019 年 12 月 18 日
  • 筆記

Attention

(function(){var player = new DPlayer({"container":document.getElementById("dplayer0"),"theme":"#FADFA3","loop":true,"video":{"url":"https://jalammar.github.io/images/attention_process.mp4"},"danmaku":{"api":"https://api.prprpr.me/dplayer/","token":"tokendemo"}});window.dplayers||(window.dplayers=[]);window.dplayers.push(player);})()

上面这个视频很好的总结了Attention的各个步骤:

  1. 首先收集(储存)Encoder的每一步的隐藏状态的输出向量。
  2. 对每个隐藏状态进行评分(先不考虑如何评分)。
  3. 对评分进行Softmax概率化。
  4. 把得到的概率与对应的输出向量相乘,放大具有高分数的隐藏状态,淹没低分数的隐藏状态。
  5. 对加权后的向量求和,得到输出。

(function(){var player = new DPlayer({"container":document.getElementById("dplayer1"),"theme":"#FADFA3","loop":true,"video":{"url":"https://jalammar.github.io/images/attention_tensor_dance.mp4"},"danmaku":{"api":"https://api.prprpr.me/dplayer/","token":"tokendemo"}});window.dplayers||(window.dplayers=[]);window.dplayers.push(player);})()

在具体的每一个时间单元步里面执行过程如下:

  1. Decoder RNN接受’‘的词向量和Decoder的初始向量。
  2. 经过RNN处理,产生输出和隐藏向量(h4),丢掉输出。
  3. Attention:使用储存的Encoder词向量和h4向量来计算时间步的上下文向量(C4)。
  4. h4和C4进行拼接得到这一个RNN的输出。
  5. 通过Dense+softmax来得到字典中每个字的概率,从而最大化输出字标签。
  6. 这一时间步执行完毕,把h4传递到下一个RNN,下一个RNN的输入为上一个RNN的输出。

把每一个时间步骤汇总起来就得到了最后的输入输出的Attention矩阵:

上面的过程搞明白后,现在的问题就是怎么对几个向量进行评分。

Transformer (Attention Is All You Need)

正如论文的题目所说的,Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。

作者采用Attention机制的原因是考虑到RNN(或者LSTM,GRU等)的计算限制为是顺序的,也就是说RNN相关算法只能从左向右依次计算或者从右向左依次计算,这种机制带来了两个问题:

  1. 时间片 t 的计算依赖 t-1 时刻的计算结果,这样限制了模型的并行能力;
  2. 顺序计算的过程中信息会丢失,尽管LSTM等门机制的结构一定程度上缓解了长期依赖的问题,但是对于特别长期的依赖现象,LSTM依旧无能为力。