当前位置:   article > 正文

《深度学习进阶:自然语言处理》第8章 Attention

《深度学习进阶:自然语言处理》第8章 Attention

《深度学习进阶:自然语言处理》啃书系列

  第2章 自然语言和单词的分布式表示
  第3章 word2vec
  第4章 word2vec的高速化
  第5章 RNN
  第6章 Gated RNN
  第7章 基于RNN生成文本
  第8章 Attention

第8章 Attention

上一章介绍了使用LSTM的seq2seq,但是这个结构存在一定的弊端:它将整个输入序列压缩成一个固定长度的隐藏状态向量,这个上下文向量包含了整个输入序列的信息,但是它的表示能力有限,意味着这种模型可能无法有效地处理长序列或复杂的语言结构。所以上一章也针对性地使用了“偷窥”的方法,将隐藏状态输入给解码器的每个时刻。这种做法是有效的,但效果有限。

为了克服这些限制,attention机制应运而生。attention机制允许模型在生成每个输出时,仅关注输入序列中与该输出相关的那些部分。这使得模型能够更好地处理长序列和复杂语言结构,并且能够自适应地处理输入序列中的变化。在attention机制下,每个输出都与输入序列的不同部分相关,因此模型可以在每个时间步上选择性地关注不同的输入信息。现在的seq2seq模型都采用了attention机制来提高其性能。

8.1 Attention的结构

注意力机制(attention mechanism,简称Attention)。基于Attention机制,seq2seq可以像我们人类一样,将“注意力”集中在必要的信息上。

8.1.1 seq2seq存在的问题

seq2seq中使用编码器对时序数据进行编码,然后将编码信息传递给解码器。此时,编码器的输出 h h h是固定长度的向量。实际上,这个“固定长度”存在很大问题。因为固定长度的向量意味着,无论输入语句的长度如何(无论多长),都会被转换为长度相同的向量。
在这里插入图片描述

图7-9

无论多长的文本,当前的编码器都会强行把信息转换为固定长度的向量,这样做早晚会遇到瓶颈。

8.1.2 编码器的改进

编码器将输入信息处理成隐藏状态向量 h h h,每个时刻都有对应的隐藏状态,可以拼接形成隐藏状态矩阵 h s hs hs,隐藏向量的个数与输入个数相同。如果我们将整个隐藏状态矩阵作为编码器的输出,这样就摆脱了编码器输出“只是一个固定长度的向量”的约束。

在这里插入图片描述

图8-2

上图结构可以抽象成下图,让我们关注编码器的输入和输出的对应关系。
在这里插入图片描述

图8-3

各个时刻的隐藏状态中包含了大量当前时刻的输入单词的信息。输入“猫”时的LSTM层的输出(隐藏状态)受此时输入的单词“猫”的影响最大。因此,可以认为这个隐藏状态向量蕴含许多“猫的成分”。按照这样的理解,编码器输出的 hs 矩阵就可以视为各个单词对应的向量集合。

因为编码器是从左向右处理的,所以严格来说,刚才的“猫”向量中含有“吾輩”“は”“猫”这3个单词的信息。考虑整体的平衡性,最好均衡地含有单词“猫”周围的信息。在这种情况下,从两个方向处理时序数据的双向RNN(或者双向LSTM)比较有效。

8.1.3 解码器的改进①

上一章的解码器只用了编码器的LSTM层的最后的隐藏状态。如果使用 h s hs hs,则只提取最后一行,再将其传递给解码器。下面我们改进解码器,以便能够使用全部 h s hs hs

上一章提到的“偷窥”技巧是将隐藏状态的最后一行输入给编码器的每个时刻,虽然有效,但是我们仔细想一想,解码器的每个时刻需要的信息肯定是不一样的。对于翻译来说,在将“吾輩は猫である”这句话翻译为英文时,肯定要用到诸如“吾輩 = I”“猫 = cat”这样的知识。也就是说,可以认为我们是专注于某个单词(或者单词集合),随时对这个单词进行转换的。但是偷窥技巧就做不到将输入单词与解码器的每个时刻对应。

在机器翻译的历史中,很多研究都利用“猫=cat”这样的单词对应关系的知识。这样的表示单词(或者词组)对应关系的信息称为对齐(alignment)。到目前为止,对齐主要是手工完成的,而我们将要介绍的Attention技术则成功地将对齐思想自动引入到了seq2seq中。这也是从“手工操作”到“机械自动化”的演变。

Attention机制能实现将编码器每个时刻关注的输入信息送到对应的编码器时刻中,完成输入和输出的对齐。
在这里插入图片描述

图8-6

我们在解码器中通过“某种计算”从隐藏状态矩阵 h s hs hs中提取每个时刻关注的信息。例如解码器的时刻1输出“I”,关注输入“吾輩”这个单词对于的隐藏状态,也就是 h s hs hs的第一行。所以“某种计算”在编码器的第一个时刻可以将 h s hs hs的第一行提取出来。

但是我们不能直接使用从隐藏状态矩阵选择目标单词向量的方式,这种方式是不能微分的。(插个眼,不是很理解原书中这个解释,理解了之后来补充。欢迎大家来答疑解惑,谢谢

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/739713
推荐阅读
相关标签