想象一下,在一个喧闹的派对上,你正试图听清楚一位朋友在说什么。尽管周围噪声不断,但你的大脑有一种神奇的能力,能让你“聚焦”在这位朋友的声音上,忽略其他干扰——这就是注意力机制的精髓所在。
上面这个小例子,给大家直观的感受一下什么是注意力,下面本文会以简单的Seq2Seq模型加上Attention机制来举例。本文不涉及transformer,后续写文章单独介绍。
一、什么是注意力机制?
(1)简单初步了解
注意力机制是一种通过模仿人类的注意力过程来增强神经网络模型性能的机制。在机器学习中,注意力机制借鉴了人类注意力的这一特性,允许模型在处理数据时能够“聚焦”于当前输入序列的某些部分,而不是将全部输入数据视为等同重要。
(2)Seq2Seq模型局限
在没有注意力机制的序列处理模型中,网络需要处理整个输入序列来生成输出,这可以通过全序列的信息压缩与提取来完成。然而,这种方法在序列较长或相关信息分布不均时,会导致信息丢失、梯度消失或爆炸等问题。
① 长距离依赖
由于梯度消失问题,标准的Seq2Seq模型难以捕捉长序列数据中的长距离依赖关系。虽然LSTM和GRU等变体在一定程度上缓解了这个问题,但在非常长的序列上依然存在挑战。
② 固定大小的上下文向量
在标准的Seq2Seq模型中,任意长度的输入序列都被编码到一个固定大小的编码向量中。这使得模型需要将所有的信息压缩到这个向量中,而且无法保证足够的信息不丢失。
(3)注意力机制的引入
为了解决上述限制,研究者们引入了注意力机制,注意力机制的关键是让上下文向量能访问每一个输入。它引入了一种权重分配的手段,使得模型可以为输入序列中的每个元素分配一个权重,表明了每个元素对当前任务的重要性程度。
例如,在机器翻译任务中,当模型在翻译一个词时,它可以分配更高的权重给源文本中与该词语义最为相关的部分。这样,模型不需要一次性处理整个输入序列,而是可以专注于当前任务最为关键的信息,从而提高模型的性能和准确率。
二、注意力怎么计算?
这里还是用机器翻译任务,简单的Seq2Seq模型加上简单的注意力/加权求和为例。
(1)输入序列编码
首先,Seq2Seq模型逐个时间步读入输入序列,在每个时间步生成隐藏状态。这里的是对之前所有输入信息的编码。
(2)注意力权重计算
当解码器准备生成输出序列时,对于每个输出时间步,计算当前解码器状态 与每个编码器隐藏状态的相似度(通常是使用点积或其他可学习的方式进行计算)。
用softmax函数将 归一化,得到注意力权重,这表示在生成当前输出时,输入序列中的每个元素的重要程度。
(3)上下文向量计算
使用注意力权重作为加权系数,将编码器隐藏状态序列加权求和,计算得到当前时间步 的上下文向量
上下文向量包含了输入序列中与当前解码器状态最相关部分的信息。
(4)解码与输出序列生成
结合解码器当前的隐藏状态和上下文向量以及有时的输入,通过一些转换(如非线性变换、线性变换或其他)生成当前输出。这可以是一个词的概率分布,用于序列生成任务,如机器翻译或文本摘要。
三、总结
在每个时间步中,注意力机制允许模型动态地决定在生成输出时应该“注意”输入序列的哪些部分,使得模型可以更加聚焦于相关信息,提高了序列处理任务的性能。
在实践中,通常会使用更复杂和高效的变种,如长短期记忆网络(LSTM)和门控循环单元(GRU)来代替简单RNN,它们都可以集成注意力机制来提升模型的能力。除此之外注意力机制还衍生出了多头注意力、自注意力等。