自然语言处理之Attention机制
一说Attention,一些人就说seq2seq,self-attention,transformer,把attention比作nlp方向的核武器。但是实际上attention更早出现于CV领域,之后2016年在Relation Extraction(至少有这个)方向上有着较早的应用。直到2017年才被大规模应用于Seq2Seq model。因此,attention并非只应用于Seq2Seq model,也非nlp独有。本博文针对网络上介绍attention只介绍seq2seq的现象,结合RE领域的attention介绍模型中attention的应用,之后再介绍Seq2Seq model怎么结合attention。以免脱离了Seq2Seq model,就不知道怎么用attention了。
Attention机制的核心思想是,对于输入的数据,无论是文本序列还是图像数据,进行一系列加权,使重要特征更加突出。Self-attention (transformer)机制的核心思想是基于attention,使用attention模型代替RNN计算表示向量,从而解决平行运算、长句记忆的问题。
怎么在模型中加入注意力——以Relation Extraction为例
Relation Extraction是NLP方向的老任务了,在命名实体识别(Named Entity Recognition)的基础上,提取(分类)得到句子中命名实体之间的关系。我们通过三元组来表示关系,如<北京,是首都,中国>。Relation Extraction往往使用深度学习方法,需要大量的标注数据。但是为Relation Extraction任务标注数据并不是写个0-1那么简单,需要细粒度的标注。因此,人们发明了远程监督(Distant Supervision)的方法自动标注数据,远程监督利用现有知识库(knowledge base),通过知识库中两个实体的关系自动标注数据集中出现这两个实体的每一个句子的关系。尽管远程监督解决了数据标注的问题,但是也带来了大量噪声数据。
Relation Extraction有至少以下两个难点:1. 我们要抽取两个实体之间的关系,在分类关系时显然两个实体词应该更重要,例如“a和b在中国首都北京结婚了,婚礼邀请了n个宾客。”,当提取“中国”和“北京”的关系时,不希望提取出“结婚”;在提取a和b的关系时,不希望提取出“是首都”。2. 由于远程监督带来了大量噪声,我们希望看起来靠谱的句子权重大一些,不靠谱的句子权重小一些。于是,上述两个问题可以通过attention机制来解决。
单词级别attention
参考论文:Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification (ACL 2016)
BiLSTM-Att(ACL 2016)模型图如上所示,该模型利用BLSTM与注意力机制,它可以自动聚焦于对分类有决定性影响的词语,在不使用额外知识和NLP系统的情况下,捕捉句子中最重要的语义信息。
该模型在注意力层,计算每个词隐层状态h的attention,并进行加权来计算句子向量。注意力层的具体计算见下文Attention公式推导部分。
句子级别attention
参考论文:Neural Relation Extraction with Selective Attention over Instances (ACL 2016)
该模型对于每一个输入句子,通过cnn计算句子表示向量,之后对于每一个句子表示向量,计算器注意力权重。注意力层的具体计算见下文Attention公式推导部分。
seq2seq结合attention
从RNN到Seq2Seq model
在上一篇博文自然语言处理之经典神经网络的应用中,我描述了怎么使用RNN解决分类和标注问题,这两点都比较直观好理解。但是对于翻译、问答、阅读理解等问题,尽管可以使用原始RNN或LSTM去解决,但是效果往往不好,主要是模型太过简单,通过单隐层输出当前词的预测,没能考虑整个句子的信息。
于是提出seq2seq model,其核心思想是,通过第一个深度模型(注意不一定是RNN)作为Encoder,输入词向量序列,生成句子表示向量;通过第二个深度模型作为Decoder,输入句子表示向量,输出我们想要的(翻译、回答、描述)词向量序列。模型示意图如下所示(出自李宏毅课程课件):
由此可见,seq2seq,听着很高大上,但是实际上相比于之后所要说明的内容,实在是过于简单明了了。
seq2seq结合attention
seq2seq的基础上,在encoder和decoder之间加入attention,如上文中seq2seq模型图所示,decoder每一阶段的输入都为C。加入attention之后,对于decoder的时间段i,输入attention加权的特征向量
C
i
C_i
Ci。以下gif图出自知乎回答。
Attention is all you need
这一部分见本人transformer博文。