作者:KIONKIM机器之心编译参与:GeekAI,刘晓坤注意力机制模仿生物观察行为的内部过程,即一种将内部经验与外部感知对齐以增加某些区域观察精细度的机制.注意力机制可以快速提取稀疏数据的重要特征,因此被广泛应用于自然语言处理任务,尤其是机器翻译。自注意力机制是对注意力机制的改进,减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。本文通过文本情感分析案例,阐述了如何将self-attention机制应用于稀疏文本中词的权重表示,有效提升模型效率。目前有很多句子表示方法。本文作者在之前的博文中讨论了5种不同的基于词表示的句子表示方法。要了解更多相关信息,可以访问以下链接:https://kionkim.github.io/(虽然大部分资料都是韩文的)句子表示在文本分类问题中,只有句子中的词嵌入平均方法可以实现好的结果。而文本分类其实是一个比较容易和简单的工作,不需要从语义的角度去理解句子的意思,只需要统计单词就可以了。例如,对于情感分析,算法需要计算与正面或负面情感显着相关的词,而不管它们的位置和具体含义如何。当然,这样的算法应该学习单词本身的情感。递归神经网络为了更好地理解句子,我们应该更加注意单词的顺序。为此,循环神经网络可以从具有以下隐藏状态的输入词(标记)序列中提取相关信息。当我们使用这些信息时,我们通常只使用最后一个时间步的隐藏状态。然而,要表达存储在小规模向量中的句子中的所有信息并非易事。卷积神经网络借鉴了n-gram技术的思想,卷积神经网络(CNN)可以总结出我们感兴趣的词周围的局部信息。为此,我们可以应用一个1D卷积,如下图所示。当然,下面只是一个例子,我们也可以尝试其他不同的架构。大小为3的一维过滤器扫描我们想要概括信息的位置周围的单词。为此,我们必须使用大小为1的填充,以便过滤后的长度与原始长度T保持相同。除此之外,输出通道的数量为c_1。接下来,我们对特征图应用另一个过滤器,最终将输入转换为c_2*T的尺度。这一系列的过程其实是在模仿人类读句子的方式,先理解3个词的意思,然后把它们放在一起去理解更高层次的概念。作为衍生技术,我们可以利用深度学习框架中实现的优化卷积神经网络算法来实现更快的计算速度。关系网络词对可以为我们提供更清晰的句子信息。在实践中,一个词可能有不同的含义,这取决于它的用法。例如,“Ilike”中的“like”与“likethis”中的意思不同。如果我们一起考虑“我”和“喜欢”而不是“喜欢”和“这个”,我们可以更清楚地把握句子的情感。这绝对是一个积极的信号。Skipgram是一种从词对中检索信息的技术,不需要词对中的词紧邻。正如“跳过”一词所暗示的那样,它允许这些词之间有空格。正如您在上图中看到的,一对单词被输入函数f(?)以提取它们之间的关系。对于特定位置t,总结了T-1对单词,我们通过求和或平均或任何其他相关技术来表示句子。当我们具体实现这个算法时,我们对包括当前词本身在内的T对词进行这种计算。需要妥协。我们可以将这三种不同的方法写成下面的一般形式:当所有I_{t,?}都为1时,一般形式表明任何“skipbigram”对模型的贡献都是一致的。对于RNN,我们忽略了单词x_t之后的所有信息,所以上式可以简化为:对于双向RNN,我们可以考虑从x_T到x_t的后向关系。另一方面,CNN只浏览我们感兴趣的单词周围的信息。如果我们只关心单词x_t前后的k个单词,则一般公式可以重新排列为:我们要考虑所有词对关系。而且CNN的规模太小了,我们不能只考虑它们之间局部的关系。因此,我们需要在这两个极端之间找到折中的办法,也就是所谓的注意力机制。上面提到的self-attention机制的一般形式可以改写成下面更灵活的形式:这里,α(?,?)控制了每个单词组合可能产生的影响。例如,在“我喜欢你这样”这句话中,“我”和“你”这两个词可能对判断句子的情感没有帮助。然而,“我”和“喜欢”的组合让我们对句子的情感有了清晰的认识。在这种情况下,我们很少关注前者的组合,而更多地关注后者。通过引入一个权重向量α(?,?),我们可以让算法调整单词组合的重要性。假设第i个句子中的T个词被嵌入到H_{i1},…,H_{iT}中,每个词嵌入都会被赋予一个权重α_{it},它表示词的总和变成一个统一的相对重要性代表的时间。我们想要的最终结果是每个输入句子的权重矩阵。如果我们将10个句子输入网络,我们将得到10个注意力矩阵,如下所示。self-attention机制的实现self-attention机制最早是在论文《AstructuredSelf-AttentionSentenceEmbedding》中提出的。本文作者将self-attention机制应用于双向LSTM的隐藏层。模型结构如下图所示:论文地址:https://arxiv.org/pdf/1703.03130.pdf但是,我们不一定要用LSTM来做wordrepresentation(不一定是wordrepresentation,我指的是之前的阶段sentencerepresentation),我们将self-attention机制应用于基于关系网络的词表示。与原论文中的self-attention机制不同(如上图,数学细节可以参考我之前的博文),关系网络的attention机制可以定义为:见:https://kionkim.github.io/_posts/2018-07-12-sentiment_analysis_self_attention.md为了解释上图,假设我们想要获得第i个词的表示。对于包含第i个单词的单词组合,会产生两个输出:一个用于特征提取(绿色圆圈),一个用于注意力加权(红色圆圈)。这两个输出可能共享同一个网络,但在本文中,我们为每个输出使用单独的网络。attention的输出(红色圈出)需要经过sigmoid和softmax层的运算才能得到最好的attentionweights。这些注意力权重与提取的特征相乘以获得我们感兴趣的单词的表示。用Gluon实现self-attention机制在具体实现部分,我们假设网络结构很简单,有2个全连接层用于关系抽取,1个全连接层用于attention机制。接下来是两个级联的全连接层用于分类。在这里,关联提取和注意提取会用到下面的代码片段:classSentence_Representation(nn.Block):def__init__(self,**kwargs):super(Sentence_Representation,self).__init__()for(k,v)inkwargs.items():setattr(self,k,v)withself.name_scope():self.embed=nn.Embedding(self.vocab_size,self.emb_dim)self.g_fc1=nn.Dense(self.hidden_??dim,activation='relu')self.g_fc2=nn.Dense(self.hidden_??dim,activation='relu')self.attn=nn.Dense(1,activation='tanh')defforward(self,x):embeds=self.embed(x)#batch*timestep*embeddingx_i=embeds.expand_dims(1)x_i=nd.repeat(x_i,repeats=self.sentence_length,axis=1)#batch*timestep*timestep*embeddingx_j=embeds.expand_dims(2)x_j=nd.repeat(x_j,repeats=self.sentence_length,axis=2)#batch*timestep*timestep*embeddingx_full=nd.concat(x_i,x_j,dim=3)#batch*timestep*timestep*(2*embedding)#newinputdata_x=x_full.reshape((-1,2*self.emb_dim))#Networkforattention_attn=self.attn(_x)_att=_attn.reshape((-1,self.sentence_length,self.sentence_length))_att=nd.sigmoid(_att)att=nd.softmax(_att,axis=1)_x=self.g_fc1(_x)#(batch*timestep*timestep)*hidden_??dim_x=self.g_fc2(_x)#(batch*timestep*timestep)*hidden_??dim#addall(sentence_length*sentence_length)sizedresulttoproducesentencerepresentationx_g=_x。重塑((-1,self.sentence_length,self.sentence_length,self.hidden_??dim))_inflated_att=_att.expand_dims(axis=-1)_inflated_att=nd.repeat(_inflated_att,repeats=self.hidden_??dim,axis=3)x_q=而attention机制使用一个独立的网络,最终得到attention向量的大小为T*1,提取的特征向量的大小为T*d,其中d为超参数。要将两者相乘,我们只需要扩展注意力向量以匹配提取的特征向量的规模。我们这里提供的只是一个小例子,其他的实现可能会更好。完整的实现代码可以从以下链接获取:http://210.121.159.217:9090/kionkim/stat-analysis/blob/master/nlp_models/notebooks/text_classification_RN_SA_umich.ipynb。结果下方是9个随机选择的注意力矩阵:在对文本进行分类时,我们可以知道算法会关注哪些词。不出所料,在分类过程中,“爱”、“棒极了”、“愚蠢”和“糟透了”等表达情感的词受到了很多关注。参考链接:https://medium.com/@kion.kim/self-attention-a-clever-compromise-4d61c28b8235【本文为栏目组织《机器之心》原创文章,微信♂》机器之心(id:almosthuman2014)》】点此阅读作者更多好文
