Seq2Seq Attention模型详解


Seq2seq,顾名思义,一个序列到另一个序列的转换。它是一种Encoder-Decoder协同训练的端到端网络。传统Seq2seq的Encoder以RNN为基础单元,把输入序列整合为一个content向量;Decoder同样以RNN为基础单元,把content向量拆解为输出序列。显然,content向量决定了Decoder可知的信息量,进而决定了输出序列的质量。由于RNN的时序串行结构,Encoder更关注位于输入序列末尾的元素,使得content向量“遗忘”了位于输入序列前端的元素。反之,如果把RNN的所有隐层输出一同送入Decoder,又显得过于臃肿(计算量大)。如今我们常把Seq2seq和Attention联系在一起,也正是因为Attention帮助Seq2seq解决了上述问题。本文将对此进行讲解。

一、从传统Seq2Seq说起

Seq2seq机器翻译开篇之作 Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation[1] 发表前,机器翻译研究以统计方法为主。这篇文章仿照人在翻译时的思维方式"通读原句子(encode),大脑加工整合(content), 复述新句子(decode)",提出了一种Encoder-Decoder结构,如下图所示。简单来讲,先把任意长度的文本序列编码(encode)为固定长度的向量表示(context),再把固定长度的向量表示解码(decode)回任意长度的文本序列。

在这里插入图片描述

Seq2seq结构灵活。我们看到上图中3个content向量(C1==C2==C3)被用作Decoder各个时刻的输入,这里可以稍作改动,如下图,content向量只作为Decoder第一时刻的输入,再随Decoder的RNN依次向后传递。另一个改动的是,content向量取自Encoder各个时刻隐藏单元的拼接(或加和),或者像下图中(参考文献[1]和[2]),只取用Encoder最后一个时刻的隐藏单元。

在这里插入图片描述
依照Seq2seq展开图(上图),Decoder各个时刻的输入是

  • 初始时刻<EOS>标记的词向量,以及content向量;
  • 其他时刻:Decoder前一时刻的输出单词的词向量,以及Decoder前一时刻的隐层状态。

注:<EOS>标记被用作通知解码器开始生成文本的信号。也是结束生成文本的信号。
注:反向传播时,Decoder的梯度通过content向量传递给Encoder。
注:反转输入数据的顺序[2]是一种Seq2Seq优化方法,效果提升因具体任务而异,优点是梯度的传播更平滑,学习效率更高。例如“我是猫”和“I am a cat”,单词“我”和“I”有转换关系,反向传播时,梯度需从“I”经过“猫、是”才到达“我”;而反转句子后,“我”和“I”相邻,梯度可以直接传递。

二、在Seq2Seq中引入Attention

Decoder可获得的全部信息存储在这一个小小的content向量中,那么如何增加content向量的信息量呢?

Attention可以在每个时间步关注到Encoder的不同部分,以收集产生Decoder输出词所需的语义细节。Attention权重模拟了人脑注意力的分配机制,为更重要的部分分配较多的注意力。

具体的计算过程是,Seq2seq每解码一个字,就用前一个时刻的Decoder隐层状态,和Encoder所有隐层状态做soft Attention,计算公式如下,得到当前输出和所有输入元素的关联程度,即权重。进而采用加权平均的方式,计算出对当前输出更友好的context向量表示。
在这里插入图片描述
这里涉及到三个重要的细节(结合下图进行理解):

  • 加入Attention后,content向量在任意时刻是变化的。那么如何计算第 i 时刻content向量?

    1. 先计算Decoder的RNN隐层状态 H i − 1 H_{i-1} Hi1 和Encoder中所有RNN隐层状态 h 1 , h 2 , . . . , h j {h_1, h_2, ..., h_j} h1,h2,...,hj 的Attention得分;
    2. Attention得分是第 i i i 时刻的输出单词 y i y_i yi 与所有输入单词 x 1 , x 2 , . . . , x j {x_1, x_2, ..., x_j} x1,x2,...,xj 的对齐可能性(此处可以联想机器翻译任务中源词与译词一一对应,如下图中,输出“student”时,输入序列中的最后一个词的Attention权重一定是最高的);
    3. 再以Attention得分为权重,对所有 h 1 , h 2 , . . . , h j {h_1, h_2, ..., h_j} h1,h2,...,hj 加权平均,得到第 i i i 时刻的content向量。
  • 加入Attention后,Decoder各个时刻的输入包括

    • 初始时刻<EOS>标记的词向量,以及当前时刻的content向量;
    • 其他时刻:Decoder前一时刻的输出单词的词向量,以及Decoder前一时刻的隐层状态,以及当前时刻的content向量 。
  • 加入Attention后,Decoder各个时刻的输出包括:当前时刻的Decoder隐层状态,以及下一时刻的content向量。
    在这里插入图片描述
    注:送入FFN+Softmax分类层的是,Decoder隐层状态和content向量的拼接。

三、引入Attention后,与传统的Seq2Seq的不同之处

总结,加入Attention后与传统的Seq2Seq模型主要有以下三点不同

  • Decoder每个节点都能获得Encoder直接传来的信息,而不是只有第一个节点接收content向量。
  • Decoder并不是直接把Encoder提供的hidden state作为输入,而是采取一种选择机制,把最符合当前位置的hidden state的信息组合起来,具体的步骤如下:
    • 计算每一个hidden state的分数值,确定哪些hidden state与当前节点关系最为密切;
    • 对每个分数值做一个softmax的计算,这能让相关性高的hidden state的分数值更大,相关性低的hidden state的分数值更低。

题外话,Attention与Self-Attention的不同:

  • Attention: Source中各单词与Target各单词的对齐机制
  • Self-Attention: Source自身的各单词之间的依存关系建模机制(e.g.语法特征),它能将Source的任意两个单词的联系通过一个计算步骤直接得出。

四、Seq2Seq的损失计算和解码过程

Seq2Seq的损失计算:产生最优输出序列
seq2Seq 在生成输出序列的时候是一个时刻生成一个字/词,换句话说,在每个时间步解决的是一个分类问题(选择词表中的哪个字)。

用最大似然估计(MLE)来最大化输出序列基于输入序列的条件概率函数,实现时,选用交叉熵(CE)或均方误差(MSE)

log ⁡ P ( y 1 , … , y T ′ ∣ x 1 , … , x T ) = − ∑ t ′ = 1 T ′ log ⁡ P ( y t ′ ∣ y 1 , … , y t ′ − 1 , c ) \log\mathbb{P}(y_1, \ldots, y_{T'} \mid x_1, \ldots, x_T) = -\sum_{t'=1}^{T'} \log \mathbb{P}(y_{t'} \mid y_1, \ldots, y_{t'-1}, \boldsymbol{c}) logP(y1,,yTx1,,xT)=t=1TlogP(yty1,,yt1,c)

Beam search:调整最优输出序列的搜索空间
我们得到了每个时间步的输出字,而不是完整的输出序列。那么如何做呢?

最简单的是贪心法,即每个时刻,只取条件概率最高的1个词,加入候选输出句子中。贪心法的缺点是,得到了局部最优解,不一定是全局最优。

最复杂的是穷举搜索,把每一种可能的输出序列罗列出来,再选择最优解top-1。穷举搜索的缺点是复杂度非常高。

Beam search束搜索是最常见的解码方式。不同于穷举搜索,束搜索把搜索空间 ∣ V ∣ L |V|^{L} VL降低到 k L k^L kL。|V|是词典大小,L是输出句子长度,k是束大小。具体地,每个时刻,只保存概率最高的k个候选输出句子,其余的就删掉。k不能太小,否则检索空间太小,无法保证最优解。以8~12为佳。束搜索并不知道什么时候停下来,所以一般来说要定义一个最长的输出序列长度,或者遇到<eos>就停止检索。

注:注意处理长序列beam search得分过高的情况。例如,为结果值除以词数 T,更常见的是除以 T α T^\alpha Tα
在这里插入图片描述


  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Seq2Seq-Attention模型是一种结合了序列到序列(seq2seq模型和注意力机制的网络模型。它最早用于机器翻译任务,可以将一个可变长度的输入序列转换为一个固定长度的向量表示,然后再将这个向量表示转换为一个可变长度的输出序列。\[2\] 在传统的seq2seq模型中,当输入序列较长时,往往会丢失一些重要的信息。为了解决这个问题,Attention机制被引入。Attention机制可以使模型在生成输出序列的过程中,对输入序列的不同部分分配不同的注意力权重,从而更加关注输入序列中与当前输出相关的部分。这样,模型可以更好地捕捉到输入序列中的重要信息,提高翻译的准确性和流畅性。\[3\] 在Seq2Seq-Attention模型中,注意力机制的引入使得模型能够更好地处理时间序列数据。通过对输入序列中不同时间步的信息进行加权,模型可以更好地理解序列中的时序关系,并在生成输出序列时更准确地预测下一个时间步的值。这使得Seq2Seq-Attention模型在时间序列预测任务中表现出色。\[1\] 总结起来,Seq2Seq-Attention模型是一种结合了序列到序列模型和注意力机制的网络模型,它可以更好地处理时间序列数据,并在时间序列预测任务中取得较好的效果。 #### 引用[.reference_title] - *1* [keras seq2seq_在Keras中建立具有Luong注意的Seq2Seq LSTM以进行时间序列预测](https://blog.csdn.net/weixin_26752765/article/details/108132790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Seq2SeqAttention机制详解](https://blog.csdn.net/vivian_ll/article/details/89227812)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SunnyGJing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值