【NLP】You May Not Need Attention详解

废话:git

以前蹭上了BERT的热度,粉以个位数天天的速度增加,感谢同窗们的厚爱!弄得我上周原本打算写文本分类,写了两笔又放下了,毕竟文本分类有不少SOTA模型,而个人研究还不够深刻。。慢慢完善吧,今天看到一篇You may not need attention,写attention起家的我怎么能放过,马上打印出来读了读,下面详细说一下。其实每次在写的过程当中我也在思考,但愿一下子能够给本身和你们带来不一样的东西。github


正文:web

1. 背景

其实no attention只是个噱头,这篇文章的本质是去除encoder-decoder的架构,用简单的LSTM去实现seq2seq任务。我当时看到这个网络结构的第一想法,就是好奇以前的seq2seq任务是如何作的,因而此次咱们先来看一下seq2seq模型的发展脉络。算法

Seq2seq模型的出现主要是为了解决翻译任务。最初的机器翻译是词典规则匹配,以后是统计机器学习方法,主要是基于几率的思想。12年深度神经网络开始兴起后,图像、语音识别都取得了很好的进展,其中有一位Schwenk在文章Continuous Space Translation Models for Phrase-Based Statistical Machine Translation中提出了基于神经网络的翻译模型,如图:网络

Schwenk在文章中介绍了三个模型结构,具体内容我没有细读,可是从左往右咱们能够看到两种思想:hidden layer的加入和time step上的依赖。架构

在这篇文章的奠定下,Bengio在13年发表了文章Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation,提出了沿用到如今的encoder-decoder框架。后来的seq2seq任务,默认表明机器翻译、文本摘要等输入输出不等长的任务,而对于这种任务默认使用encoder-decoder架构。框架

故事的以后,就有了facebook的convolutional seq2seq模型和RNN encoder-decoder + Attention和Transformer。机器学习

相信大多数在最近一两年接触NLP的同窗们都同样,学到seq2seq任务的经典模型们,也没想太多就直接用了。直到今天读这篇论文时我才发现,在以前竟没有想过为何不能用LSTM去解决seq2seq问题,即便想到了,也会由于输入输出长度不一致而让本身忘记这个疑问。学习

之因此要写这篇论文详解,不是他文章难懂须要我来翻译,而是想写下来告诉本身:不要让本身的思惟限定在别人的框架里,遵照规则不牛b,定义规则才是ui

上面说了太多废话,也可能有不对的地方,但愿有经验的老玩家指教。

接下来咱们一块儿好好看一下做者如何用LSTM去解决不等长输入输出的问题。


2. 模型

2.1 预处理

翻译的一个难点在于两种语言的语序可能不同,面对这样的问题,做者对训练数据都进行了对齐处理,图示比较直观:

红色是target句子,蓝色是source,做者用了两种预处理方法:

  1. 遍历target句子,一旦碰到target word在对应source word以前的,就添加占位符 \varepsilon 直到二者位置同样或者target word位置偏后。这个算法很直观,看图就懂了。
  2. 直接在target句子前插入0-5个占位符,这样的话以后的占位符就会少一些。

注:处理完target句子以后,做者直接在source句子结尾补齐占位符

2.2 Aligned Batching

通过预处理步骤以后,target句子和source句子的长度就同样了,做者直接把一个batch的句子收尾拼接程一个长字符串,而后像训练语言模型同样去训练。(这一节没什么创新点)

2.3 Model

模型结构很好理解,如图:

每一个time step(好比输入white时),将El和white分别进行embedding,一个词的维度为E,两个的拼起来变成2E,而后通过两层LSTM,以后经过FC层把维度变成E维,就能够在target语言的词向量矩阵里找到几率最大的词了。

以上模型中包含着三个embedding matrix:source language的input(用来embed 单词white),target language的input(用来embed单词El),target language的output(用来embed单词perro)。值得注意的是,做者使这三个词向量矩阵保持相等。也就是西语和英语中相同词根的词向量是相同的。(具体请看评论区大佬留言)至于为何这么作,是由于参考了其余研究,说这样作的效果会更好。说不定这就是模型有效的缘由,由于它实际上是预测以前出现的word。那么问题来了,若是目标语言或者源语言有各类近义词,那预处理阶段作这个词典的代价就比较大了。

2.4 Decoding

解码阶段,做者对beam search作了两个改进,能够看到做者碰到问题和解决的思路:

  1. Padding limit:若是后面一直解码成占位符怎么办?那就限制占位符的个数,超了以后几率就置为0。可是最早开始的占位符不能限制,模型可能一直在酝酿以后的大招。
  2. Source padding injection(SPI):做者在模型训练时发现,若是碰到了source句子的结束标志<EOS>,那大几率也会输出<EOS>。因此做者的解决方法是拖延,在输出句子的<EOS>以前找位置插入一些占位符,这样输出的句子就会更长。

3. 优缺点

3.1 优势

  1. 跳出encoder-decoder框架,解决了如何用RNN语言模型的架构作seq2seq任务
  2. 训练消耗的资源更少了,每一步预测只须要上一步的结果
  3. 预测更加快速,输入一个词就能马上给出输出,不像encoder要都过完一遍才能够
  4. 在预测长句子的任务上表现更好

3.2 缺点

  1. 效果其实没有那么好。。。
  2. 比起经得起考验的SOTA模型,这个模型还须要多多改进,经得住其余seq2seq任务的考验

4. 总结

这篇文章没什么难理解的东西,可是却让读论文不多的我陷入了思考。其实encoder-decoder的intuition很简单,就是读完一句英文,理解了,再用中文说出来。加attention也好,就是我虽然理解了,但翻译的时候还要回去看一眼斟酌一下。那这篇文章,其实就是我读一个词看看能翻译就先翻译了,不能翻译我先差很少理解意思留到后面翻译。都是符合咱们日常翻译的逻辑,直觉上讲得通的东西。

不少时候可能跳出原有的框架,去思考解决遇到的问题,就会有独特的contribution,但愿你们在学习工做生活中多多思考,以上。


【参考资料】:

  1. You May Not Need Attention
  2. 你可能再也不须要Attention:这是一个贼简单的神经机器翻译架构
  3. GitHub: YouMayNotNeedAttention
相关文章
相关标签/搜索