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

注意力机制 — 它是什么以及它是如何工作的

一、说明

        注意力机制是深度学习领域的一个突破。它们帮助模型专注于数据的重要部分,并提高语言处理和计算机视觉等任务的理解和性能。这篇文章将深入探讨深度学习中注意力的基础知识,并展示其背后的主要思想。

二、注意力机制回顾

        在我们谈论注意力之前,让我们先回顾一下深度学习中序列模型(也称为递归神经网络或 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

该函数用于字符串拼接。 使用方法如下&#xff1a; #include<stdio.h> #include<string.h>int main() {char str[20] "abcd";char str1[] "1234";//strcat(str,str1);//不安全&#xff0c;所以用strcat_sstrcat_s(str, 20, str1);printf(&…...

haproxy总结与实验

一、负载均衡 1.1 简述负载均衡 在高并发的业务场景下&#xff0c;解决单个节点压力过大&#xff0c;导致Web服务响应过慢&#xff0c;特别是严重的情况下导致服务瘫痪&#xff0c;无法正常提供服务的问题&#xff0c;而负载均衡的目的就是为了维护系统稳定可靠。负载均衡&…...

VS实用调试技巧(程序员的必备技能)

调试的重要性 在我们写代码的时候&#xff0c;如果程序出现了bug&#xff0c;那么下一步就是找到bug并修复bug!而这个找问题的过程就被称为调试&#xff08;英文叫debug&#xff0c;消灭bug的意思&#xff09;。 调试能观察到程序内部执行的细节&#xff0c;可以增加程序员对…...

怎样卸载python

python卸载干净的具体操作步骤如下&#xff1a; 1、首先打开电脑左下角开始菜单&#xff0c;点击“运行”选项&#xff0c;输入“cmd”。 2、输入“python --version”&#xff0c;得到一个程序的版本&#xff0c;按回车键。 3、点击下图程序。 4、然后在该页面中点击“uninst…...

SQL注入靶场攻击——sqli-labs

一、概述 SQL注入&#xff08;SQL Injection&#xff09;是发生在web程序中数据库层的安全漏洞&#xff0c;是比较常用的网络攻击方式之一&#xff0c;它不是利用操作系统的BUG来实现攻击&#xff0c;而是针对程序员编写时的疏忽&#xff0c;通过SQL语句&#xff0c;实现无账号…...

Conda 环境打包与私有化部署指南

Conda 环境打包与私有化部署指南 本指南旨在帮助用户将已创建的 Conda 环境打包并在目标服务器上私有化部署&#xff0c;适用于环境不能直接访问外网或需要快速迁移的场景。 1. 环境打包 在源服务器上&#xff0c;使用 conda pack 工具将已创建的 Conda 环境打包成一个归档文…...

网页版IntelliJ IDEA部署

在服务器部署网页 IntelliJ IDEA 引言 大家好&#xff0c;我是小阳&#xff0c;今天要为大家带来一个黑科技——如何在云端部署和使用WEB版的IntelliJ IDEA&#xff0c;让你在任何地方都可以随心所欲地进行Java开发。这个方法特别适合那些用着老旧Windows电脑&#xff0c;部署…...

科创微应用平台小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;场地信息管理&#xff0c;场地类型管理&#xff0c;预约参观管理&#xff0c;场地预约管理&#xff0c;活动信息订单&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首…...

grom接入Prometheus,grafana

在同级目录下分别创建 docker-compose.yml&#xff0c;与prometheus.yml 配置文件 version: 3.8services:prometheus:image: prom/prometheuscontainer_name: prometheusports:- "9090:9090" # Prometheus Web UI 端口volumes:- ./prometheus.yml:/etc/prometheus…...

C++结构体指针强制转换以处理电力系统IEC103报文

前言 最近依旧是开发规约解析工具的103篇&#xff0c;已经完成了通用分类服务部分的解析&#xff0c;现在着手开始搞扰动数据传输&#xff0c;也就是故障录波的传输。 在103故障录波&#xff08;扰动数据&#xff09;的报文中&#xff0c;数据是一个数据集一个数据集地存放&a…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

多模态图像修复系统:基于深度学习的图片修复实现

多模态图像修复系统:基于深度学习的图片修复实现 1. 系统概述 本系统使用多模态大模型(Stable Diffusion Inpainting)实现图像修复功能,结合文本描述和图片输入,对指定区域进行内容修复。系统包含完整的数据处理、模型训练、推理部署流程。 import torch import numpy …...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...