注意力机制 — 它是什么以及它是如何工作的
一、说明
注意力机制是深度学习领域的一个突破。它们帮助模型专注于数据的重要部分,并提高语言处理和计算机视觉等任务的理解和性能。这篇文章将深入探讨深度学习中注意力的基础知识,并展示其背后的主要思想。
二、注意力机制回顾
在我们谈论注意力之前,让我们先回顾一下深度学习中序列模型(也称为递归神经网络或 RNN)背后的基本思想。我们不打算深入研究这个领域,但理解序列模型背后的概念将有助于我们理解注意力机制和它所解决的问题。
我们将使用的示例是一个用于将句子从英语翻译成意大利语的网络。该网络由两部分组成:编码器,对英语句子的含义进行编码,以及将编码信息解码为句子到意大利语的翻译的解码器。
我们可以用以下方式来看待编码器:

绿色矩形是输入。在图中所示的情况下,输入是一系列英语单词,这些单词组成了“I love dogs”这句话。蓝色矩形称为隐藏状态。隐藏状态应该包含有关当前输入的一些知识,即先前的隐藏状态,而先前的隐藏状态本身包含其输入和先前隐藏状态的知识。正式地,我们可以这样写:
![]()
通过这种方式,我们将句子的信息编码为隐藏状态,直到句子的结尾。在检查了所有输入之后,编码器将句子的所有内容(从最后一个隐藏状态开始)汇总到两个向量中。第一个应该是解码器(网络中应该进行实际转换的部分)的初始隐藏状态 s₀,第二个是上下文向量(通常是编码器的最终隐藏状态),c,解码器的任何步骤都将使用它来帮助它理解它所处理的句子。

现在,当我们在编码器部分完成句子信息的提炼后,我们就可以开始解码信息并使用解码器将句子翻译成意大利语了。解码器的第一个输入是一个开始令牌,它与初始隐藏状态和上下文向量一起构成了第一个隐藏状态。对于这种隐藏状态,我们可以得到新句子的第一个输出。我们将该输出与上一个隐藏状态和上下文向量一起用作下一步的输入,以构建新的隐藏状态和输出。正式地,我们可以这样写:
![]()
这个过程一直持续到我们得到一个停止令牌作为输出。

此过程适用于短句子,但当句子变长时,它可能会失败。原因是解码器对所有步骤都使用上下文向量,并且它需要它包含有关原始句子的所有信息。对于一个很长的句子,将整个信息保存在一个固定大小的向量中可能非常困难。该问题的解决方案可能是为解码器的每一步构建一个新的上下文向量。
三、注意力
我们将像以前一样保持编码器-解码器的架构,但这次我们向网络添加了另一种机制,为解码器的每一步构建一个新的上下文向量。
我们的编码器仍然会像以前一样检查输入序列并创建隐藏状态,最后为解码器创建初始隐藏状态。现在,我们不是使用编码器的最终隐藏状态来制作上下文向量,而是使用解码器的初始隐藏状态和所有其他隐藏状态来构造它。为此,我们将实现一个对齐函数,该函数是在编码器的隐藏状态和解码器的隐藏状态上运行的 MPL。此函数计算编码器的每个隐藏状态的对齐分数(即标量)。从形式上讲,第 i 个隐藏状态的步骤 t 的对齐分数为:
![]()
这些分数表示,鉴于解码器的当前隐藏状态,我们应该在多大程度上关注编码器的每个隐藏状态。

例如,对齐分数 e₁,₁ 表示第一个隐藏状态对于解码器中第一个单词的预测有多重要。由于对齐分数是任意实数,我们希望对它们应用 softmax 运算以获得概率分布。

这些概率是归一化对齐分数,它们将用作编码器隐藏状态的注意力权重。新的上下文向量将是编码器的隐藏状态的加权和,加上注意力权重的加权和。

从形式上讲,步骤 t 的上下文向量是:

现在,我们可以使用新的上下文向量来预测解码器中的第一个单词。

就直觉而言,在我们的示例中,“amo”的意思是“我爱”,因此我们可以预期 a₁,₁ 和 a₁,₂ 的分数很高,而 a₁,₃ 的分数很低。
好的部分是所有的操作都是差分的,所以我们不需要对注意力权重进行任何监督,我们可以在网络的常规训练中学习计算它们,因此网络可以自行学习哪些部分是重要的每一步。
对于句子的其他部分,解码器的预测以相同的方式继续进行。对于下一个单词,我们通过使用 s₁ 来计算注意力权重来构造 c₂ 上下文向量。

我们可以看到英语和法语之间翻译中单词之间注意力权重的可视化,下图取自 Bahdanau 等人。

由 RNNsearch-50 找到的比对。每个图的 x 轴和 y 轴分别对应于源句子(英语)和生成的翻译(法语)中的单词。每个像素以灰度(0:黑色,1:白色)显示第 i 个目标词的第 j 个源词注释的权重 αij。资料来源:图3。
您可以看到相关词的权重很高,而关系较弱的词的权重很小。例如,请参阅“Area”和“zone”一词的权重。这些词在句子中的不同位置,但网络成功地将它们联系起来。
四、图片说明的注意事项
如果你仔细看一下前面的例子,你会发现我们没有使用输入的顺序性质来表示注意力部分。这意味着我们可以将注意力用于其他不是序列的任务。使用注意力机制的另一个任务示例是图像标题。在图像描述中,我们有一个图像,我们希望我们的网络输出一个句子来描述我们在图像中看到的内容。

与翻译任务类似,我们可以通过 CNN 网络运行图像,并将最终输出作为特征向量网格,这些特征向量类似于我们之前使用的隐藏状态。然后,我们计算解码器的初始隐藏状态,并将其与网格特征向量一起使用来计算对齐分数。使用 softmax,我们得到注意力权重,然后我们计算特征向量与注意力权重的加权和,以构建上下文向量。最后,我们使用上下文向量来生成标题中的第一个单词。

正式:
![]()
和

在下面的可视化中可以看到网络对图像每个部分的关注。

随时间推移的注意力。当模型生成每个单词时,其注意力会发生变化以反映图像的相关部分。资料来源:Xu et al
例如,您可以看到“鸟”一词如何关注鸟的图像部分,而“水”一词如何关注背景中的水。
五、结论
在这篇文章中,我们介绍了注意力机制背后的基本思想。我们看到了它如何通过关注编码器最相关的部分,在每一步构建一个新的上下文向量,从而解决编码器-解码器架构中处理长句子的问题以进行翻译。我们还看到了如何利用注意力机制来完成图像标题的任务,其中注意力有助于将注意力集中在图像的相关部分,以预测标题中的下一个单词。
在以后的文章中,我们将回顾注意力的数学原理,并介绍自我注意力模块。
相关文章:
注意力机制 — 它是什么以及它是如何工作的
一、说明 注意力机制是深度学习领域的一个突破。它们帮助模型专注于数据的重要部分,并提高语言处理和计算机视觉等任务的理解和性能。这篇文章将深入探讨深度学习中注意力的基础知识,并展示其背后的主要思想。 二、注意力机制回顾 在我们谈论注意力之前&…...
学习嵌入式第二十六天
进程线程 1.进程的概念 2.进程 和 程序 硬盘中程序 ,加载到内存中,运行起来,就是进程 创建线程 pthread_create posix thread create 线程执行 ---体现在线程执行函数 (回调函数) 线程退出 ---pthread_exit() …...
speech语音audio音频
在信号处理和语言技术领域,speech 和 audio 是两个相关但不同的概念。它们有各自的定义和应用场景。以下是对这两个术语的详细解释: 1. Speech(语音) Speech 主要指的是人类说话时产生的声音。它是人类语言交流的一种主要形式&a…...
最常用的正则表达式规则和语法
正则表达式(Regular Expression,简称 regex)是一种用于匹配字符串的强大工具。它使用特定的语法规则来定义字符串模式,可以用来搜索、替换、验证字符串等。以下是一些常用的正则表达式规则和语法: 1. 基本字符匹配 . :匹配任意单个字符(除了换行符)。 示例:a.c 可以匹…...
Datawhale X 魔搭 AI夏令营第四期-魔搭生图task1学习笔记
根据教程提供的链接,进入相应文章了解魔搭生图的主要工作是通过对大量图片的训练,生成自己的模型,然后使用不同的正向、反向提示词使模型输出对应的图片 1.官方跑baseline教程链接:Task 1 从零入门AI生图原理&实践 2.简单列举一下赛事的…...
WPF中XAML相对路径表示方法
在WPF XAML中,相对路径是一种非常实用的方式来引用资源文件,如图像、样式表和其他XAML文件。相对路径可以帮助您构建更加灵活和可移植的应用程序,因为它允许资源文件的位置相对于XAML文件的位置进行定位。 相对路径的表示方法 在XAML中&…...
操作系统内存管理技术详解
操作系统内存管理技术详解:第一部分 引言 操作系统作为计算机系统的核心组件,负责管理硬件资源、提供用户接口和运行应用程序。在操作系统的众多功能中,内存管理无疑是最为关键的技术之一。本文将深入探讨操作系统内存管理的背后技术&…...
python之numpy(2 创建矩阵)
numpy创建矩阵 前面提到,numpy主要是针对数组和矩阵的操作。下面我们分别创建数组和矩阵。 import numpy as np x0np.array([1,2,3,4]) x1np.array([[1,2,3,4],[1,2,3,4]]) print(x0,x1,sep\n) 在numpy中,使用array创建数组和矩阵。其中,创…...
git stage 和 git unstage
无意间遇到 git stage 和 git unstage,感觉有点陌生,简单了解一下这两个概念。 在 Git 中,stage 和 unstage 是与暂存区操作相关的术语,它们用于管理文件的状态,决定哪些更改会在下次的提交中。 1. git stage git s…...
C#使用反射和特性的优缺点
使用反射(Reflection)和特性(Attributes)在C#中有其特定的应用场景,同时也带来了一些优缺点: 反射的优点: 动态性:反射允许程序在运行时查询和操作对象的类型信息,提供…...
C语言:字符串函数strcat
该函数用于字符串拼接。 使用方法如下: #include<stdio.h> #include<string.h>int main() {char str[20] "abcd";char str1[] "1234";//strcat(str,str1);//不安全,所以用strcat_sstrcat_s(str, 20, str1);printf(&…...
haproxy总结与实验
一、负载均衡 1.1 简述负载均衡 在高并发的业务场景下,解决单个节点压力过大,导致Web服务响应过慢,特别是严重的情况下导致服务瘫痪,无法正常提供服务的问题,而负载均衡的目的就是为了维护系统稳定可靠。负载均衡&…...
VS实用调试技巧(程序员的必备技能)
调试的重要性 在我们写代码的时候,如果程序出现了bug,那么下一步就是找到bug并修复bug!而这个找问题的过程就被称为调试(英文叫debug,消灭bug的意思)。 调试能观察到程序内部执行的细节,可以增加程序员对…...
怎样卸载python
python卸载干净的具体操作步骤如下: 1、首先打开电脑左下角开始菜单,点击“运行”选项,输入“cmd”。 2、输入“python --version”,得到一个程序的版本,按回车键。 3、点击下图程序。 4、然后在该页面中点击“uninst…...
SQL注入靶场攻击——sqli-labs
一、概述 SQL注入(SQL Injection)是发生在web程序中数据库层的安全漏洞,是比较常用的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号…...
Conda 环境打包与私有化部署指南
Conda 环境打包与私有化部署指南 本指南旨在帮助用户将已创建的 Conda 环境打包并在目标服务器上私有化部署,适用于环境不能直接访问外网或需要快速迁移的场景。 1. 环境打包 在源服务器上,使用 conda pack 工具将已创建的 Conda 环境打包成一个归档文…...
网页版IntelliJ IDEA部署
在服务器部署网页 IntelliJ IDEA 引言 大家好,我是小阳,今天要为大家带来一个黑科技——如何在云端部署和使用WEB版的IntelliJ IDEA,让你在任何地方都可以随心所欲地进行Java开发。这个方法特别适合那些用着老旧Windows电脑,部署…...
科创微应用平台小程序的设计
管理员账户功能包括:系统首页,个人中心,用户管理,场地信息管理,场地类型管理,预约参观管理,场地预约管理,活动信息订单,系统管理 微信端账号功能包括:系统首…...
grom接入Prometheus,grafana
在同级目录下分别创建 docker-compose.yml,与prometheus.yml 配置文件 version: 3.8services:prometheus:image: prom/prometheuscontainer_name: prometheusports:- "9090:9090" # Prometheus Web UI 端口volumes:- ./prometheus.yml:/etc/prometheus…...
C++结构体指针强制转换以处理电力系统IEC103报文
前言 最近依旧是开发规约解析工具的103篇,已经完成了通用分类服务部分的解析,现在着手开始搞扰动数据传输,也就是故障录波的传输。 在103故障录波(扰动数据)的报文中,数据是一个数据集一个数据集地存放&a…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
渲染学进阶内容——模型
最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
