当前位置: 首页 > news >正文

Bahdanau注意力

9.7 节中探讨了机器翻译问题通过设计一个基于两个循环神经网络编码器-解码器架构用于序列序列学习具体来说循环神经网络编码器长度可变序列转换固定形状上下文变量然后循环神经网络解码器根据生成词元上下文变量词元生成输出序列词元然而即使并非所有输入词元解码某个词元有用在每个解码步骤使用编码相同上下文变量有什么方法能改变上下文变量

我们尝试参考文献找到灵感给定文本 序列生成手写挑战中Graves设计了一种可微注意力模型将文本字符笔记对齐其中对齐方式一个方向移动受学习对齐想法启发Bahdanau等人提出一个没有严格单向对齐限制可微注意力模型在预测词元如果不是所有输入词元都相关模型仅仅对齐输入序列与当前预测相关部分这是通过将上下文变量视为注意力集中输出实现

10.4.1 模型

下面描述Bahdanau注意力模型遵循9.7符号表示这个基于注意力模型9.7模型相同只不过9.20 上下文变量c任何解码时间t都会c替换假设输入序列中T词元解码时间步t上下文变量注意力集中输出

Ct = Sigma a(St-1, Ht)Ht

时间T -1解码器状态St-1查询解码器状态Ht既是也是注意力权重a使用(10.9)所定义加性注意力评分函数计算

9-13循环神经网络编码器-解码器架构略有不同10-5描述Bahdanau注意力架构

编码器 解码器

循环层 全连接

嵌入层 循环层

注意力 嵌入层

10-5 一个带有Bahdanau注意力循环神经网络编码器-解码器模型

import torch

from torch import nn

from d2l import torch as d2l

10.4.2 定义注意力解码器

下面看看如何定义Bahdanau注意力实现循环神经网络编码器-解码器其实我们只需要重新定义解码器位了更方便显示可学习注意力权重以下AttentionDecoder 定义带有注意力机制解码器基本接口

class AttentionDecoder(d2l.Decoder):

带有注意力机制解码器基本接口

def __init__(self, **kwargs):

super(AttentionDecoder, self).__init__(**kwargs)

def attention_weights(self):

raise NotImplementError

接下来我们在Seq2SeqAttentionDecoder实现带有Bahdanau 注意力循环神经网络解码器首先初始化解码器状态需要下面输入

1)解码器所有时间最终状态将作为注意力

2)上一个时间编码器状态将作为初始化解码器状态

3)编码器有效长度(剔除在注意力池中的填充词元)

在每个解码时间步解码器一个时间步基本状态用作查询因此注意力输出输入嵌入连接循环神经网络解码器输入

class Seq2SeqAttentionDecoder(AttentionDecdoer):

def __init__(self, vocab_size, embed_size, num_hiddens, num_layers, dropout=0, **kwargs):

super(Seq2SeqAttentionDecoder, self).__init__(**kwargs)

self.attention = d2l.AdditiveAttention(num_hiddens, num_hiddens, num_hiddens, dropout)

self.embedding = nn.Embedding(vocab_size, embed_size)

self.rnn = nn.GRU(embed_size + num_hiddens, num_hiddens, num_layers, dropout=dropout)

self.dense = nn.Linear(num_hiddens, vocab_size)

def init_state(self, enc_outputs, enc_valid_lens, *args):

outputs 形状batch_size, num_steps, num_hiddens

hiddens_state 形状num_layers, batch_size, num_hiddens

outputs, hidden_state = enc_outputs

return (outputs.permute(1, 0, 2), hidden_state, enc_valid_lens)

def forward(self, X, state):

enc_outputs形状batch_size, num_steps, num_hiddens

#hiddens_state 形状num_layers, batch_size, num_hiddens

enc_outputs, hidden_state, enc_valid_lens = state

#输出X形状num_steps, batch_size, embed_size

X = self.embedding(X).permute(1, 0, 2)

outputs, self._attention_weights = [], []

for x in X:

#query 形状batch_size, 1, num_hiddens

query = torch.unsqueeze(hiddens_state[-1], dim=1)

#context形状batch_size, 1, num_hiddens

context = self.attention(query, enc_outputs, enc_outputs, enc_valid_lens)

#特征维度连接

x = torch.cat((context, torch_unsqueeze(x, dim=1)), dim=-1)

#x变形(1, batch_size, embed_size + num_hiddens)

out, hidden_state = self.rnn(x.permute(1,0,2), hidden_state)

outputs.append(out)

self._attention_weights.append(self.attention.attention_weights)

#全连接变换后outputs 形状(num_steps, batch_size, vocab_size)

outputs = self.dense(torch.cat(outputs, hidden_state, enc_valid_lens))

def attention_weights(self):

return self._attention_weights

接下来使用包含7时间4序列输入小批量测试Bahdanau注意力解码器

encoder = d2l.Seq2SeqEncdoer(vocab_size=10, embed_size=8, num_hiddens=16, num_layers = 2)

encoder.eval()

decoder = Seq2SeqAttentionDecoder(vocab_size=10, embed_size=0, num_hiddens=16, num_layers=2)

decoder.eval()

X = torch.zeros(4,7), dtype = torch.long) #batch size num_steps

state = decoder.init_state(encoder(X), None)

output, state = decoder(X, state)

output.shape, len(state), state[0].shape, len(state[1]), state[1][0].shape

10.4.3 训练

我们在这里指定参数实例化一个带有Bahdanau注意力编码器解码器并对这个模型进行机器翻译训练由于新增注意力机制训练要比9.7.4节中没有注意力机制慢得多

embed_size, num_hiddens, num_layers, dropout = 32,32,2,0,1

batch_size, num_steps = 64, 10

lr, num_epochs, device = 0.005, 250, d2l.try_gpu()

train_iter, src_vocab, tgt_vocab = d2l.load_data_nmt(batch_size, num_steps)

encoder = d2l.Seq2SeqEncoder(len(src_vocab), embed_size, num_hiddens, num_layers, dropout)

decoder = Seq2SeqAttentionDecoder(len(tgt_vocab), embed_size, num_hiddens, num_layers, dropout)

net = d2l.EncoderDecdoer(encoder, decoder)

d2l.train_seq2seq(net, train_iter, lr, num_epochs, tgt_vocab, device)

训练模型我们用它几个英语句子翻译成法语并计算他们BLEU分数

for eng, fra in zip(engs, fras):

trainlation, dec_attention_weight_seq = d2l.predict_seq2seq(net, eng, src_vocab, tgt_vocab, num_steps, device, True)

训练结束下面通过可视化注意力权重会发现每个查询都会键值对上分配不同权重这说明在每个解码输入序列不同部分被选择性汇聚注意力

上一个包含序列结束词元

d2l.show_heatmaps(attention_weights[:,:,:,:len(engs[-1].split()) + 1].cpu())

小结

在预测词元时如果不是所有输入词元都是相关那么具有Bahdanau注意力循环神经网络编码器-解码器会有选择统计输入序列的不同部分这是通过上下文变量视为加性注意力汇聚输出实现

http://www.dtcms.com/a/490035.html

相关文章:

  • 重生之我在大学自学鸿蒙开发第七天-《AI语音朗读》
  • Spring AI 1.0 GA 深度解析:Java生态的AI革命已来
  • Linux网络之----TCP网络编程
  • 【零基础学习CAPL语法】——writeLineEx() 函数
  • 计算机网络数据链路层
  • 做网站选什么专业门户网站开发步骤博客
  • 论文写作 24: 全文保持同样的节奏
  • 洛谷 P1438 无聊的数列 题解
  • iOS混淆与IPA加固实战手记,如何构建苹果应用防反编译体系
  • 想抓PostgreSQL里的慢SQL?pg_stat_statements基础黑匣子和pg_stat_monitor时间窗,谁能帮你更准揪出性能小偷?
  • 把 iOS 26 的「Liquid Glass」带进 React Native
  • 基于物理信息的神经网络求解偏微分方程反问题的综合优化策略
  • 工地佩戴安全帽检测-目标检测数据集
  • 广东网站备案查询系统企业网站带后台
  • 知名的集团门户网站建设费用我要自学网网站建设
  • 2025 年 10 月科技前沿全景:从量子跃迁到生命重构的文明拐点
  • scene graph generation 用到的vg150数据集groundtruth数据预处理,展示和保存
  • 【Qt开发】多元素类控件(一)-> QListWidget
  • 【Mybatis从入门到入土】ResultMap映射、多表查询与缓存机制全解析
  • Springboot整合MinIO文件服务(windows版本)
  • HarmonyOS Next 项目完整学习指南
  • vscode离线下载依赖
  • Python 高效清理 Excel 空白行列:从原理到实战
  • 算法11.0
  • 工业级串口通信设计
  • 盐山网站建设广西网上办事大厅
  • 郑州高端网站制作团队大连本地网
  • Linux网络的应用层自定义协议
  • leetcode 2598 执行操作后的最大MEX
  • FFmpeg 基本API avio_read函数内部调用流程分析