文章目录
图解Attention
本文用来记录图解Attention的读后笔记,原文Github出处:https://github.com/datawhalechina/learn-nlp-with-transformers/tree/main
问题:Attention出现的原因是什么?
潜在的答案:基于循环神经网络(RNN)一类的seq2seq模型,在处理长文本时遇到了挑战,而对长文本中不同位置的信息进行attention有助于提升RNN的模型效果。
于是学习问题就是:
- 什么是seq2seq模型?
- 基于RNN的seq2seq模型怎么处理长文本?
- 基于RNN的seq2seq模型处理长文本序列有什么问题?
- 基于RNN的seq2seq模型如何结合Attention来改善模型?
seq2seq框架
seq2seq是一种常见的NLP模型结构,全称是:sequence to sequence,翻译为“序列到序列”。典型的任务有:机器翻译任务,文本摘要任务。
首先,seq2seq做了什么事情?
seq2seq模型的输入可以是一个(单词、字母或者图像特征)序列,输出是另外一个(单词、字母或者图像特征)序列。一个训练好的seq2seq模型如下图所示:
如下图所示,以机器翻译任务为例,输入序列是指一连串的单词,输出序列也是指一连串的单词。
seq2seq细节
将上图的蓝色模型拆解,如下图所示:seq2seq模型由 编码器(Encoder) 和 解码器(Decoder) 组成。
绿色编码器:
- 处理输入序列中 每一个元素 并获取输入信息,然后将信息转换为黄色的向量 (Context向量)
- 处理完整个输入序列后,编码器把 Context向量 发送给紫色的解码器
紫色解码器:
- 通过 Context向量 中的信息,逐个元素地输出新的序列。
seq2seq应用于机器翻译
由于seq2seq可以解决机器翻译任务,因此将机器翻译任务作为一个例子进行学习:
seq2seq模型中,编解码器一般都是采用循环神经网络RNN。
编码器将输入的法语单词序列编码成 context 向量,然后解码器根据 context 向量解码出英语单词序列。
存在两个问题:
- 循环神经网络RNN是什么?
- context向量是什么?
context向量
图:context向量对应上图中间浮点数向量。在下文中,我们会可视化这些数字向量,使用更明亮的色彩来表示更高的值,如上图右边所示
如图所示,黄色的context向量本质上是一个浮点数的集合,而这个context向量的长度是取决于RNN的隐藏层神经元数量,在实际应用中,context向量长度可以自定义。(这里给出长度为4)
循环神经网络RNN
RNN是一个循环的神经网络,可以处理序列信息。循环表现在 隐藏状态hidden state 的输出可以作为下一个神经元的输入。因此,每一个神经元就接收
x
i
x_{i}
xi 和
h
i
−
1
h_{i-1}
hi−1 两个向量,通过计算后输出 翻译结果
y
i
y_{i}
yi 和 隐藏状态
h
i
h_{i}
hi,隐藏状态就是上面所说的 context 变量。
RNN处理输入序列(编码器部分)
- 假设序列输入一个句子,句子可以用 n n n个词表示: s e n t e n c e = { w 1 , w 2 , . . . , w n } sentence=\{w_1,w_2,...,w_n\} sentence={w1,w2,...,wn}
- 首先将这个句子中每一个词映射成一个向量得到一个向量序列: X = { x 1 , x 2 , . . . , x n } X = \{x_1, x_2,...,x_n\} X={x1,x2,...,xn},每个单词映射得到的向量通常又叫做:word embedding
- 然后在处理第
t
∈
[
1
,
n
]
t \in [1,n]
t∈[1,n]个时间步的序列输入
x
t
x_t
xt时,RNN网络的输入和输出可以表示为:
h
t
=
R
N
N
(
x
t
,
h
t
−
1
)
h_{t} = RNN(x_t, h_{t-1})
ht=RNN(xt,ht−1)
- 输入:RNN在时间步 t t t的输入之一为单词 w t w_t wt经过映射得到的向量 x t x_t xt。
- 输入:RNN另一个输入为上一个时间步 t − 1 t-1 t−1得到的hidden state向量 h t − 1 h_{t-1} ht−1,同样是一个向量。(也就是上文提到的context向量)
- 输出:RNN在时间步 t t t的输出为 h t h_t ht (hidden state向量)
word embedding
我们在处理单词之前,需要把他们转换为向量。这个转换是使用 word embedding 算法 来完成的。
- 我们可以使用预训练好的 embeddings
- 或者在我们的数据集上训练自己的 embedding。
通常 embedding 向量大小是 200 或者 300,为了简单起见,我们这里展示的向量长度是4
RNN编码器处理序列的可视化
如图所示,RNN在第2个时间步,采用第1个时间步得到 hidden state#0(隐藏层状态) 和第2个时间步的 输入向量input#1,来得到 新的输出hidden state#1。
编码器逐步得到hidden state并传输最后一个hidden state给解码器。
最终,编码器交付一个隐藏层状态 hidden state 给解码器,该隐藏层状态是一个向量,包含输入序列的全部信息。
RNN解码器处理序列的可视化
在上面,编码器会传递一个 hidden state 到解码器端。类似的,解码器在每一个时间步
t
∈
[
1
,
n
]
t \in[1,n]
t∈[1,n]也会得到 hidden state(隐藏层状态),而且也需要把 hidden state 传递给下一个时间步。
动态图:编码器首先按照时间步依次编码每个法语单词,最终将最后一个hidden state也就是context向量传递给解码器,解码器根据context向量逐步解码得到英文输出。
编码器与解码器的异同:
- 编码器的输入是接受一个 隐藏层状态h 和 输入单词的嵌入x;解码器的输入是接受一个 隐藏层状态h 和 上一时间步输出的单词嵌入y
- 编码器只输出一个隐藏层状态h;解码器的输出不仅有 隐藏层状态h,还有 单词的翻译结果y
Attention
基于RNN的seq2seq模型,编码器的所有信息都编码到了一个 context向量 中,这就是这类模型的瓶颈。因为,在面对长文本序列,RNN的仅依靠单个context向量很难包含所有文本序列的信息。
面对这个问题,提出了Attention注意力机制,可以使得模型有区分度地、有重点地关注到输入序列的部分。
图:在第 7 个时间步,注意力机制使得 解码器 在产生英语翻译student英文翻译之前,可以将注意力集中在法语输入序列的:étudiant。这种有区分度的attention输入序列的重要信息,使得模型有更好的效果。
注意力机制本质上是通过计算当前向量与一组向量集合中的任一向量的相似度,然后将相似度归一化,得到这组向量中的每一个向量的得分,再对这一组向量进行加权。权重就代表了模型的重点关注与否。
用注意力机制改良基于RNN的seq2seq模型,注意力机制是加在 解码器端 的,且编码器每个阶段输出的 hidden state 要保存下来,以便注意力机制的关注。
RNN结合注意力机制的seq2seq模型
结合了attention后,这种模型与传统的seq2seq模型有两点不同:
-
编码器会把 所有时间步的 hidden state 传递给解码器。(而不是只传递最后一个 hidden state)
-
解码器在产生输出之前,会额外的做一个attention处理,如下图所示,具体为:
- 编码器每一个 hidden state 都对应输入的一个单词,解码器要查看编码器传递过来的所有的 hidden state
- 给每一个 hidden state 计算一个分数。(这里是attention实现重点关注的核心)
- 所有 hidden state 的分数经过softmax归一化
- 将每个 hidden state 乘以对应的分数,从而使得 高分的hidden state被放大,低分的hidden state被缩小 (实现重点关注)
- 将所有 hidden state 根据对应分数加权求和,得到对应时间步的 context 向量
动态图:在第4个时间步,解码器结合 attention 得到 context向量 的5个步骤。
整个解码器的全过程如下,展示第4个时间步:
- 注意力模型的解码器 RNN 的输入包括:一个word embedding 向量,和一个初始化好的解码器 hidden state,图中是 h i n i t h_{init} hinit。
- RNN 处理上述的 2 个输入,产生一个输出和一个新的 hidden state,图中为h4。
- 注意力的步骤:我们使用编码器的所有 hidden state 向量和 h4 向量来计算这个时间步的context向量(C4)。【编码器所有隐藏层向量的加权】
- 我们把 h4 和 C4 拼接起来,得到一个橙色向量。
- 我们把这个橙色向量输入一个前馈神经网络(这个网络是和整个模型一起训练的)。【简单N类分类器】
- 根据前馈神经网络的输出向量得到输出单词:假设输出序列可能的单词有N个,那么这个前馈神经网络的输出向量通常是N维的,每个维度的下标对应一个输出单词,每个维度的数值对应的是该单词的输出概率。
- 在下一个时间步重复1-6步骤。
动态图:解码器结合attention全过程
注意力机制可视化
最后,我们可视化一下注意力机制,看看在解码器在每个时间步关注了输入序列的哪些部分:
动态图:解码步骤时候attention关注的词
下图展示了注意力机制的准确程度:
图:可以看到模型在输出 “European Economic Area” 时,注意力分布情况。在法语中,这些单词的顺序,相对于英语是颠倒的(“européenne économique zone”)。而其他词的顺序是类似的。
总结
本文通过基于RNN的seq2seq模型,引出该类模型在处理长序列文本时所展示的不足(单向量难以保存整个序列的信息),进而引出结合注意力机制的解码器进行改造传统的RNN结构,注意力机制本质上是一个向量在一组向量集合中,通过某种计算规则算出该向量与该组向量内的所有向量的相似度,然后将相似度作为权重,对该组向量进行加权,实现有重点地关注输入序列。这种实现方式就保证了整个输入序列中所有的单词都有机会被关注到(因为都在这一组向量集合中),从而解决了单向量难以保存整个序列的信息。由于RNN的时序性,它的好处是保证了序列的顺序,在语言中顺序是很重要的;但它的不足是在训练的过程中只能串行执行,无法并行,效率较低。