Bahdanau 注意力
2021-12-5
| 2023-8-6
0  |  阅读时长 0 分钟
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
之前探讨了机器翻译问题: 通过设计一个基于两个循环神经网络的编码器-解码器架构, 用于序列到序列学习。 具体来说,循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量, 然后循环神经网络解码器根据生成的词元和上下文变量 按词元生成输出(目标)序列词元。 然而,即使并非所有输入(源)词元都对解码某个词元都有用, 在每个解码步骤中仍使用编码相同的上下文变量。 有什么方法能改变上下文变量呢?
在为给定文本序列生成手写的挑战中, Graves设计了一种可微注意力模型, 将文本字符与更长的笔迹对齐, 其中对齐方式仅向一个方向移动。 受学习对齐想法的启发,Bahdanau等人提出了一个没有严格单向对齐限制的可微注意力模型。 在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。这是通过将上下文变量视为注意力集中的输出来实现的。

模型

下面描述的Bahdanau注意力模型将遵循seq2seq中的相同符号表达。 这个新的基于注意力的模型与seq2seq中的模型相同, 只不过seq2seq中的上下文变量 在任何解码时间步 都会被 替换。 假设输入序列中有个词元, 解码时间步 的上下文变量是注意力集中的输出:
其中,时间步 时的解码器隐状态 是查询, 编码器隐状态 既是键,也是值, 注意力权重是使用加性注意力打分函数计算的。
seq2seq中的循环神经网络编码器-解码器架构略有不同,下图描述了Bahdanau注意力的架构。
notion image

定义注意力解码器

其实,只需重新定义解码器即可。 为了更方便地显示学习的注意力权重, 以下AttentionDecoder类定义了带有注意力机制解码器的基本接口
 
在接下来的Seq2SeqAttentionDecoder类中 实现带有Bahdanau注意力的循环神经网络解码器。 首先,初始化解码器的状态,需要下面的输入:
  1. 编码器在所有时间步的最终层隐状态,将作为注意力的键和值
  1. 上一时间步的编码器全层隐状态,将作为初始化解码器的隐状态
  1. 编码器有效长度(排除在注意力池中填充词元)
在每个解码时间步骤中,解码器上一个时间步的最终层隐状态将用作查询。 因此,注意力输出和输入嵌入都连结为循环神经网络解码器的输入。
 
接下来,使用包含7个时间步的4个序列输入的小批量测试Bahdanau注意力解码器
 

训练

这里指定超参数,实例化一个带有Bahdanau注意力的编码器和解码器, 并对这个模型进行机器翻译训练。 由于新增的注意力机制,训练要比没有注意力机制的慢得多
notion image
用它将几个英语句子翻译成法语并计算它们的BLEU分数
通过可视化注意力权重发现,每个查询都会在键值对上分配不同的权重,这说明 在每个解码步中,输入序列的不同部分被选择性地聚集在注意力池中
notion image
 

代码

小结

  • 在预测词元时,如果不是所有输入词元都是相关的,那么具有Bahdanau注意力的循环神经网络编码器-解码器会有选择地统计输入序列的不同部分。这是通过将上下文变量视为加性注意力池化的输出来实现的。
  • 在循环神经网络编码器-解码器中,Bahdanau注意力将上一时间步的解码器隐状态视为查询,在所有时间步的编码器隐状态同时视为键和值。
 
  • PyTorch
  • 注意力评分函数多头注意力
    目录