基于注意力的神经机器翻译
注意机制最早是在视觉图像领域提出来的,应该是在90多年前就已经提出来了,但真正火起来的应该是google mind团队[14]的论文《视觉注意的递归模型》(Recurrent Models of Visual Attention),该论文利用注意机制在RNN模型上对图像进行分类。随后,Bahdanau等人在论文《联合学习对齐和翻译的神经机器翻译》[1]中使用了一种类似于注意的机制在机器翻译任务中同时进行翻译和对齐,他们的工作首次提出了注意机制在NLP领域的应用。然后类似的基于注意机制的RNN模型扩展开始应用于各种NLP任务。最近,如何在CNN中使用注意机制也成为一个热门的研究课题。
在介绍NLP中的注意力之前,我想先说说在图像中使用注意力的想法。关于视觉注意的代表性论文递归模型[14],他们的研究动机其实是受人类注意机制的启发。人们在观察一幅图像时,实际上并不是一下子看完整幅图像中的每一个像素,而大多是根据需要聚焦在图像的某一特定部分。而且,根据之前观察到的图像,人类会知道未来的注意力应该集中在哪里。下图是本文核心模型的示意图。
该模型在传统RNN的基础上增加了注意机制(红色圈出的部分),通过注意来学习图像的待处理部分。每次在当前状态下,它都会根据前一状态学习到的位置L和当前输入图像来处理关注部分的像素,而不是图像的所有像素。这具有需要处理的像素更少的优点,这降低了任务的复杂性。可以看出,注意力在图像中的应用与人类的注意机制非常相似。接下来,我们来看看NLP中使用的注意力。
本文首次将注意机制应用于自然语言处理。他们将注意力机制应用于神经网络机器翻译(NMT)。NMT实际上是一个典型的序列到序列模型,即编码器到解码器模型。传统的NMT使用两个RNN和一个RNN对源语言进行编码,然后将源语言编码成固定维的中间向量,再用一个RNN解码翻译成目标语言。传统模型如下:
本文提出了基于注意机制的NMT,其模型大致如下:
图中我没有把解码器里的所有连接都打出来,只画了前两个字,后面的字其实是一样的。可以看出,基于注意力的NMT是基于传统的,它将源语言中每个单词所学的表达方式(只有在最后一个单词之后才学的传统表达方式)与当前要预测翻译的单词联系起来。这种联系是通过他们设计的注意力实现的。模型训练完成后,根据注意力矩阵,我们可以得到源语言和目标语言的对齐矩阵。具体论文的注意力设计部分如下:
可以看到,他们用一个感知器公式把目标语言和源语言中的每个词连接起来,然后用软函数归一化,得到一个概率分布,这就是注意力矩阵。
从结果来看,与传统的NMT(RNNsearch是注意力NMT,RNNenc是传统NMT)相比,效果提升了不少,最大的特点是可以视觉对齐,在长句处理上更有优势。
这篇论文是继上一篇论文之后很有代表性的一篇论文。他们的工作告诉我们如何在RNN扩大关注。本文极大地促进了基于注意的各种模型在自然语言处理中的后续应用。在这篇论文中,他们提出了两种注意机制,一种是全局机制,另一种是局部机制。
首先,我们来看一下全球机制的关注度。其实这和上一篇论文提出的注意的思想是一样的。它处理源语言中的所有单词,但不同的是,在计算注意力矩阵的值时,他提出了几个简单的扩展版本。
在他们的最终实验中,general的计算方法是最好的。
我们来看看他们提出的本地版本。主要思想是降低注意力计算的成本。在计算关注度时,作者并不考虑源语言中的所有单词,而是根据一个预测函数预测当前解码时要对齐的源语言的位置Pt,然后通过上下文窗口只考虑窗口中的单词。
给出了local-m和local-p两种预测方法,然后在计算最终注意矩阵时,在原有基础上乘以一个pt位置相关的高斯分布。作者的实验结果表明,局部注意优于整体注意。
我认为这篇论文最大的贡献在于,它首先告诉我们如何扩展注意力的计算方法,然后就是局部注意力方法。
然后基于注意力的RNN模型开始在NLP中广泛应用,不仅是从序列到序列的模型,还可以用于各种分类问题。那么像深度学习领域的RNN一样受欢迎的卷积神经网络CNN是否也可以使用注意机制呢?论文ABC NN:基于注意力的卷积神经网络建模情感对[13]提出了在C NN中使用注意力的方法,这是注意力在CNN中较早的探索性工作。
传统的CNN在建立句子对模型时,是通过每个单通道处理一个句子,然后学习句子表达,最后输入到分类器中。该模型在输入分类器之前句子对之间没有相关性,因此作者希望通过设计注意机制来链接不同cnn通道的句子对。
第一种方法ABCNN0-1是卷积前先进行注意,通过注意矩阵计算出对应句子对的注意特征图,然后和原特征图一起输入卷积层。具体计算方法如下。
第二种方法,ABCNN-2,是通过注意力来关注卷积后的表达式,然后进行池化。原理如下。
第三种方法是在CNN中同时使用前两种方法,如下所示。
本文为我们提供了在CNN中使用注意力的思路。目前,许多人基于对工作的关注而使用CNN,并取得了良好的效果。
最后做个总结。其实我觉得NLP中的注意力可以看作是一种自动加权,可以通过加权把你想连接的两个不同的模块连接起来。目前主流的计算公式如下:
通过设计一个连接目标模块mt和源模块ms的函数,然后用一个软函数归一化,得到概率分布。
目前,注意力已经广泛应用于自然语言处理中。它有一个很大的优势,就是可以把注意力矩阵可视化,告诉你神经网络在执行任务的时候关注了哪些部分。
然而,NLP中的注意机制仍然不同于人类的注意机制。它基本上需要计算所有要处理的对象,并使用一个额外的矩阵来存储它们的权重,这实际上增加了开销。而不是忽略你不想关注的部分,只处理你关心的部分。