Bahdanau注意力笔记

从代码学习深度学习 - Bahdanau注意力 PyTorch版 完整代码:下载连接在深度学习领域,尤其是自然语言处理(NLP)任务中,序列到序列(Seq2Seq)模型是许多应用的核心,如机器翻译、文本摘要和对话系统等。传统的Seq2Seq模型依赖于编码器-解码器架构,通过编码器将输入序列压缩为固定长度的上下文向量,再由解码器生成输出序列。然而,这种方法在处理长序列时往往面临信息丢失的问题,上下文向量难以捕捉输入序列的全部细节。Bahdanau注意力机制(Bahdanau et al., 2014)通过引入动态的上下文选择机制,显著提升了模型对输入序列的利用效率。它允许解 阅读详情

传统编码器-解码器中的主要问题是:编码器需要将整个序列的信息压缩到单个固定长度的向量中,这导致两个问题:长序列的早期信息容易被稀释或丢失;处理长序列时效果明显变差。
Bahdanau在《NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO A LIGN AND TRANSLATE》中给出一种对齐的解决方案。其核心思想是:在编码器阶段不仅生成最后的隐状态,还生成整个序列中输入各单词的各个隐状态。在解码器端,根据输入的前一个时间步的隐状态和前一个时间步的的预测值,对整个输入序列的隐状态计算权重,也就是所谓的对齐,根据权重生成不同的上下文来做解码


1.编码器

1.1 编码器结构

  • 词嵌入 embedding
  • 双向门控网络 GRU(Bahdanau使用双向门控网路)
  • 一个Dropout
  • 一个线性网络-Linear,用来调整最终隐状态维度

1.2 功能介绍

  1. 输入:原始序列数据:[序列长度, 批量数]
  2. 使用词嵌入和Dropout对原始输入序列数据进行加工得到词嵌入后数据:[序列长度,批量数,词嵌入隐单元数量]
  3. 使用双向门控网络GRU对加工后词阿嵌入后数据进行计算得到两个输出:
    3.1. encoder_outputs:[序列长度, 批量数, 门控网络隐单元数量2]。该数序最后一个维度之所以为门控网络隐单元数2,是因为使用了双向网络,包含前向和后向计算的隐状态。
    3.2 encoder_hidden:[门控网络层数2, 批量数, 门控网络隐单元数]。之所以第一个维度为门控网络层数2.也是应为使用了双向网络
  4. 使用Linear对encoder_hidden,最后两个维度数据调整,最终隐状态为[批量数, 门控网络隐单元数量]
  5. 使用tanh对隐状态调整数据,将数据值压缩在[-1, 1]区间last_encoder_hidden
  6. 返回encoder_outputs 和last_encoder_hidden

2.注意力算法实现

主要实现eij=vT∗tanh(W∗si−1+U∗hj)e_ij = v^T * tanh(W * s_{i-1} + U * h_j)ei​j=vT∗tanh(W∗si−1​+U∗hj​)

2.1 注意力算法结构

Bahdanau论文中有三个参数:W, U, v。都使用线性网络来实现。

2.2 功能介绍

  1. 输入参数
    1.1. 解码器上一个时间步的隐状态[批量数, 门控网络隐单元数量]。在第一步这里输入的为编码器最终隐状态即last_encoder_hidden[批量数, 门控网络隐单元数量]。
    1.2. 编码器所有状态即encoder_outputs:[序列长度, 批量数, 门控网络隐单元数量*2]
    1.3 原始序列数据掩码mask[批量数, 序列长度]
  2. 重复解码器上一个时间步的隐状态以匹配编码器序列长度,变换后为:[批量数, 序列长度,门控网络隐单元数量]
  3. 对编码器所有状态即encoder_outputs,变换维度为:[批量数, 序列长度,门控网络隐藏单元数量*2]
  4. 使用W参数对解码器上一个时间步的隐状态进行计算[批量数, 序列长度,门控网络隐单元数量]
  5. 使用U参数对编码器所有状态进行计算[批量数, 序列长度,门控网络隐单元数量]
  6. 对4和5中的相加并通过tanh进行变换[批量数, 序列长度,门控网络隐单元数量]
  7. 使用v参数计算对齐分数,计算后只取前两个维度数据[批量数, 序列长度]
  8. 应用原始序列数据掩码mask
  9. 使用softmax计算注意力权重[批量数, 序列长度]
  10. 返回计算所得的注意力权重[批量数, 序列长度]

3.解码器

3.1 解码器结构

  • 词嵌入 embedding
  • 单向门控网络 GRU
  • 一个Dropout
  • 一个线性网络-Linear,简化输出层

3.2 功能介绍

  1. 输入参数
    1.1. 输入字符[批量数]
    1.2. 编码器前一个时间步的隐状态[批量数, 门控网络隐单元数量]
    1.3. 编码器所有状态即encoder_outputs:[序列长度, 批量数, 门控网络隐单元数量*2]
    1.4. 原始序列数据掩码mask[批量数, 序列长度]
  2. 对输入字符增加一个维度[1, 批量数]
  3. 使用词嵌入和Dropout对原始输入序列数据进行加工得到词嵌入后数据:[1,批量数,词嵌入隐单元数量]
  4. 获取解码器上一个时间步的最后一个隐状态
  5. 使用:解码器上一个时间步的最后一个隐状态、编码器所有状态即encoder_outputs、原始序列数据掩码mask调用注意力算法实现计算注意力权重[批量数, 序列长度]
  6. 对注意力权重扩展一个维度[批量数,1,序列长度]
  7. 对编码器所有状态即encoder_outputs交换维度[批量数, 序列长度, 门控网络隐单元数量*2]
  8. 使用bmm计算上下文向量[批量数, 1, 门控网络隐单元数量*2]
  9. 交换上下文向量的维度[1,批量数,门控网络隐单元数量*2]
  10. 词嵌入和山下文向量,组合为门控网络输入参数
  11. 输入门控网络,获得输出和隐状态
  12. 使用Linear简化输出数据
  13. 返回简化后的输出数据,隐状态和注意力权重[批量数, 序列长度]

4.seq-seq

4.1 seq-seq结构

一个编码器和一个解码器

4.2 功能介绍

  1. 输入参数
    1.1. 原始序列
    1.2. 目标序列
  2. 设置输出存储[目标序列长度, 批量数, 目标词表数]
  3. 设置注意力权重存储[目标序列长度, 批量数, 原始序列长度]
  4. 使用编码器对原始序列进行编码,获取encoder_outputs [序列长度, 批量数, 门控网络隐单元数量2]和last_encoder_hidden:[门控网络层数2, 批量数, 门控网络隐单元数]
  5. 定义第一个解码器输入参数:
  6. 对目标序列进行遍历
    6.1. 使用解码器输入参数、last_encoder_hidden、encoder_outputs、原始序列数据掩码mask调用门控网络,获取预测输出和更新解码器最后一个隐状态。循环执行
注意力机制从理论到实践:Bahdanau 注意力 比如输入有 3 个词,计算后可能得到权重 [0.1, 0.8, 0.1],说明第二个词(“吃”)和当前要生成的输出最相关。解码器会把 “上一步的输出词” 和 “上下文向量” 结合起来,更新自己的隐藏状态,然后生成当前步的输出词。(0.1ד他” 的隐藏状态) + (0.8ד吃” 的隐藏状态) + (0.1ד苹果” 的隐藏状态)比如翻译 “我喜欢吃苹果” 时,生成 “苹果” 这个词时,就主要关注输入里的 “苹果”。比如结合 “上下文向量”(主要包含 “吃” 的信息)和上一步的输出,生成 “eat”。 阅读详情

相关推荐

机器翻译:Bahdanau注意力和Luong注意力详解

摘要 注意力机制是深度学习中的关键技术,Bahdanau注意力和Luong注意力是两种经典模型。Bahdanau(加性注意力)通过神经网络计算查询与键的兼容性分数,使用解码器前一时刻状态作为Query,计算成本较高但对齐灵活。Luong(乘性注意力)采用点积或其变体计算分数,使用当前解码器状态作为Query,效率更高且参数更少,其Scaled General变体成为现代模型(如Transformer)的基础。对比而言,Luong注意力在大多数任务中表现更优,计算高效且结构简洁,而Bahdanau适用于特殊场

数据知道的博客 8825

注意力机制(三):Bahdanau注意力

Bahdanau 注意力是一种在神经机器翻译中使用的注意力机制,由Dzmitry Bahdanau等人于2015年首次提出。 在传统的神经机器翻译模型中,编码器将源语言句子编码为一个固定长度的向量,然后解码器使用这个向量生成目标语言句子。然而,这种固定长度向量的方法存在一些缺点,例如无法处理较长的句子,以及无法捕捉句子中不同单词之间的复杂依赖关系。 Bahdanau 注意力通过引入一种动态的对齐机制来解决这些问题。在每个时间步,解码器都会根据先前的输出和编码器的所有隐藏状态计算一个对齐分布,该分布指示编

qq_51957239的博客 4245

动手实现 Bahdanau 注意力模型

前一篇我们学习了 seq2seq 模型,从它的模型结构中我们可以看到存在两个瓶颈: 例如,当我们用 seq2seq 翻译一句话时,它的 Encoder 需要将原始句子中的主语,谓语,宾语,以及主谓宾之间的关系等信息都压缩到一个固定长度的上下文向量中,这个向量的长度通常只是 128 或者 256,如果输入数据很长时,就会有很多信息无法被压缩进这么短的向量中。 另一个瓶颈是,这个上下文向量在 Deco...

aliceyangxi1987的博客 1575

Bahdanau 注意力(具备注意力机制的Encoder-Decoder模型)

Seq2Seq机器翻译模型,具备加性注意力机制的Encoder-Decoder模型

西小庄村高伟 的博客 2236

手把手教你逆向京东搜索接口:H5ST 556位参数生成与V8补环境技巧

本文深入解析了京东搜索接口中关键的H5ST 556位参数生成机制,并提供了详细的逆向实战指南。针对其复杂的反爬虫环境检测,文章重点介绍了通过链式补环境技巧,在Node.js中完整模拟浏览器环境(包括原型链检测和指纹验证)的方法,帮助开发者成功绕过防护并生成有效参数。

weixin_29315091的博客 480

POWER SI仿真流程

一、打开软件Power SI二、加载PCB,可以直接使用brd文件,不用再进行格式转换三、check Stackup,与原来的PCB叠层对照一遍,检查数据加载后有没有出错。四、select Nets,加载brd文件后,可能所有的网络都处于使用状态,先在右侧net manager下面右键disable all nets,再使能需要仿真的电源网络(如果要仿真的网络没有归属到电源网络,在其上右键,选classfy as power \ground nets)

lx5213的博客 1316

10.4. Bahdanau 注意力

如何定义Bahdanau注意力,实现循环神经网络编码器-解码器。其实,我们只需重新定义解码器即可。为了更方便地显示学习的注意力权重, 以下AttentionDecoder类定义了带有注意力机制解码器的基本接口。#@save"""带有注意力机制解码器的基本接口"""@property接下来,让我们在接下来的Seq2SeqAttentionDecoder类中 实现带有Bahdanau注意力的循环神经网络解码器。

weixin_45063703的博客 923

SDR实战(四)-AD9361使用手册(三)

本节定义了并行数据端口和串行外设接口(SPI),它们使得AD9361与基带处理器(BBP)之间能够传输数据和控制/状态信息。图63展示了这些接口,并提供了AD9361和BBP在宽带无线系统中使用方式的高级概述。数据接口以两种模式之一运行:兼容标准CMOS模式或兼容低压差分信号(LVDS)模式。每个接口都具有以下部分描述的独特特性。使用CMOS模式时:保持了单端-CMOS逻辑兼容性。可以使用一个或两个数据端口。使用两个端口可以提高数据吞吐量。

hutx0924的博客 6243

Bahdanau 注意力

Bahdanau注意力,也被称为加性注意力(Additive Attention),是一种广泛用于序列到序列(Seq2Seq)模型中的注意力机制,由Dzmitry Bahdanau等人在2014年提出。它是处理序列对序列(seq2seq)任务(如机器翻译)的关键技术之一。在Bahdanau提出的模型中,注意力机制通过引入一个额外的上下文信息来动态地对输入序列中的各个部分进行加权,从而使模型可以更好地处理长距离依赖。

彬彬侠的博客 2567

深度解析NXP AMCLIB状态观测器:PMSM无感FOC控制实战指南

状态观测器是现代电机控制中的核心算法,它基于电机数学模型,通过测量定子电压和电流,实时估算出转子的位置和速度,从而替代了传统的物理传感器。其原理遵循“预测-校正”的闭环结构,通过比较模型预测值与实际采样值的误差,不断修正内部状态估计。这项技术的核心价值在于实现了无传感器控制,显著降低了系统成本、提升了可靠性与紧凑性,广泛应用于伺服驱动、变频器、电动汽车和家电等领域。本文聚焦于NXP AMCLIB库中的角度跟踪观测器和反电动势观测器,深入剖析其设计思路、固定点运算实现以及参数整定方法,为工程师在永磁同步电机无

cumi7754的博客 2829

控制台模拟前端请求实现快速刷网课时长

本教程仅用于学习前端技术和网页开发,旨在提供教育与技术指导。对于任何未经授权或违反规定的使用行为,本人不承担任何责任。注意到那个serive后面有timestamp时间戳,暗示它很可能就是每30秒汇报一次进度和播放时长的命令,我们右键——复制——复制为fetch。有的网站上的网课需要的不仅仅是进度,而是时长,所以倍速插件失效,但我们可以使用控制台命令来模拟请求实现快速刷网课时长。尝试修改即可,例如我修改time为800,然后复制粘贴到控制台执行。播放视频,等待前端请求出现,然后复制前端请求为fetch。

m0_74823408的博客 2065

深入理解深度学习——注意力机制(Attention Mechanism):Bahdanau注意力

在为给定文本序列生成手写的挑战中, Graves设计了一种可微注意力模型, 将文本字符与更长的笔迹对齐, 其中对齐方式仅向一个方向移动。在预测词元时,如果不是所有输入词元都相关,模型将仅对齐(或参与)输入序列中与当前预测相关的部分。具体来说,循环神经网络编码器将长度可变的序列转换为固定形状的上下文变量, 然后循环神经网络解码器根据生成的词元和上下文变量按词元生成输出(目标)序列词元。然而,即使并非所有输入(源)词元都对解码某个词元都有用, 在每个解码步骤中仍使用编码相同的上下文变量。

冯·诺依曼 1万+

【Unity 实用工具篇】 | Unity网格破碎插件 unity-fracture

前面写过一篇Unity中物体破碎效果的插件:【Unity 实用工具篇】 | Unity物体破碎效果 OpenFracture 本文介绍一个另外的工具unity-fracture,也可以实现网格破碎效果,且功能与OpenFracture略有差异。

努力前行,总会成为自己心中的那道光 1万+

《动手学深度学习》读书笔记—10.4 Bahdanau注意力

本文记录了自己在阅读《动手学深度学习》时的一些思考,仅用来作为作者本人的学习笔记,不存在商业用途。

m0_62917354的博客 375

搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础

定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。

zhubeibei168的博客 1246

基于STM32的DS1302电子时钟电路与程序设计

这个示例代码中,我们使用DS1302_GetTime函数从DS1302芯片获取当前时间,并使用DS1302_GetDate函数获取当前日期。在本文中,我们将介绍如何使用STM32微控制器和DS1302实时时钟芯片来构建一个基于STM32的DS1302电子时钟,并提供相应的程序设计。请注意,以上示例代码仅供参考,具体的实现细节可能会根据使用的开发环境和硬件组件有所差异。在实际应用中,你可能需要根据自己的需求进行适当的调整和修改。为了完整实现电子时钟的功能,你还可以添加其他功能,例如闹钟设置、温度显示等。

UbiSqlserver的博客 1323

笔记64:Bahdanau 注意力

本地笔记地址:D:\work_file\(4)DeepLearning_Learning\03_个人笔记\3.循环神经网络\第10章:动手学深度学习~注意力机制。

weixin_44063383的博客 217

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

动手学深度学习10.4. Bahdanau 注意力-笔记&练习(PyTorch)

李沐老师《动手学深度学习(PyTorch版)》10.4. Bahdanau 注意力-笔记&练习详解

scdifsn的博客 709

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

注意力机制

本文是笔者《动手学深度学习》的学习笔记,如有谬误,请随时指出。

W11H08Z的博客 1148

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

AUGUST的深度学习笔记(四,现代循环神经网络与注意力机制)

动手学深度学习的现代循环神经网络和注意力机制的学习笔记

weixin_74277223的博客 1143

Bahdanau注意力机制

这里实现一个接口,只需重新定义解码器即可。为了更方便地显示学习的注意力权重, 以下类定义了带有注意力机制解码器的基本接口。接下来,让我们在接下来的类中实现带有Bahdanau注意力的循环神经网络解码器。首先,初始化解码器的状态,需要下面的输入:编码器在所有时间步的最终层隐状态,将作为注意力的键和值;上一时间步的编码器全层隐状态,将作为初始化解码器的隐状态;编码器有效长度(排除在注意力池中填充词元)。在每个解码时间步骤中,解码器上一个时间步的最终层隐状态将用作查询。

2301_79335566的博客 1437

【现代深度学习技术】注意力机制04:Bahdanau注意力

本文讲解注意力机制中的Bahdanau注意力。Bahdanau注意力机制通过动态调整上下文变量,在解码时使用加性注意力聚焦编码器隐状态的相关部分,替代固定上下文,提升机器翻译的准确性和对齐效果。

Morse_Chen的博客 1716

【自然语言处理(NLP)】Bahdanau 注意力(Bahdanau Attention)原理及代码实现

Bahdanau注意力(Bahdanau Attention)是自然语言处理中一种经典的注意力机制。 在传统的编码器 - 解码器架构(如基于RNN的架构)中,编码器将整个输入序列编码为一个固定长度的向量,解码器依赖该向量生成输出。当输入序列较长时,这种固定长度向量难以存储所有重要信息,导致性能下降。Bahdanau注意力机制通过让解码器在生成每个输出时,动态关注输入序列不同部分,解决此问题。 ## 原理 允许解码器在生成输出时,根据当前状态,从编码器的隐藏状态序列中选择性聚焦,获取与当前生成任务最相关信

专注上位机开发、机器视觉、机器学习、嵌入式软硬件开发 1万+

Bahdanau注意力方式公式原理详解

Bahdanau注意力(又称)由Dzmitry Bahdanau等人在2015年提出,用于改进传统编码器-解码器模型在长序列任务(如机器翻译)中的性能。,使解码器能自适应地关注输入的关键部分。

weixin_55843921的博客 1405

机器翻译之Bahdanau注意力机制在Seq2Seq中的应用

将pred_seq, label_seq分别进行空格分隔#获取pred_seq, label_seq的长度for n in range(1, k+1): #n的取值范围, range()左闭右开。

Hiweir的博客 1553
上一篇: 梯度截断二维空间示例
下一篇: Bahdanau注意力Pytorch实现
natide
博客等级 码龄18年 8粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

natide

觉得有帮助就好

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

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

打赏作者

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

抵扣说明:

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

余额充值