注意力机制详解

一、引言

        注意力机制(Attention Mechanism)源于对人类视觉的研究,是一种在深度学习模型中模拟人类注意力的机制。它允许模型在处理信息时能够聚焦于当前任务最相关的部分,从而提高模型的性能和泛化能力。本文将从注意力机制的起源、类型、结构图、计算处理过程、主要公式、代码示例以及效果图等方面进行全面介绍。

二、注意力机制的起源

        在认知科学中,由于信息处理的瓶颈,人类会选择性地关注所有信息的一部分,同时忽略其他可见的信息。这种机制通常被称为注意力机制。人类视网膜不同的部位具有不同程度的信息处理能力,即敏锐度(Acuity),只有视网膜中央凹部位具有最强的敏锐度。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后集中关注它。例如,人们在阅读时,通常只有少量要被读取的词会被关注和处理。

        注意力机制主要有两个方面:决定需要关注输入的哪部分;分配有限的信息处理资源给重要的部分。注意力机制可以应用于任何类型的输入而不管其形状如何,是在计算能力有限情况下,解决信息超载问题的主要手段的一种资源分配方案。

三、注意力机制的类型

        注意力机制在深度学习中有多种类型,主要包括以下几种:

  1. 自注意力机制(Self-Attention Mechanism):自注意力机制在单个序列的不同位置之间建立联系,以计算同一序列的表示。这种机制在自然语言处理(NLP)和计算机视觉等领域有广泛的应用,特别是在Transformer模型中发挥了重要作用。
  2. 多头注意力机制(Multi-Head Attention Mechanism):多头注意力机制是自注意力的一个扩展,它将输入序列投影到多个不同的子空间中,并在每个子空间中独立地执行自注意力计算。这样做的目的是让模型能够从不同的表示子空间中捕捉信息,增强模型的表达能力。
  3. 通道注意力机制(Channel Attention Mechanism):通道注意力机制自适应地重新校准每个通道的权重,可以被视为对象选择过程,从而确定要注意什么。通道注意力机制的代表模型为压缩和激励网络(Squeeze-and-Excitation Networks, SENet)。
  4. 空间注意力机制(Spatial Attention Mechanism):空间注意力机制旨在提升关键区域的特征表达,本质上是将原始图片中的空间信息通过空间转换模块,变换到另一个空间中并保留关键信息,为每个位置生成权重掩膜(mask)并加权输出,从而增强感兴趣的特定目标区域同时弱化不相关的背景区域。空间注意力的代表模型为空间变换神经网络(Spatial Transformer Networks, STN)。

四、注意力机制的计算处理过程

        注意力机制的计算处理过程主要包括以下几个步骤:

  1. 计算注意力得分:利用打分函数计算当前输入在整个输入序列中的重要性。重要性越高,注意力得分就越高,那么在生成输出的预测值时,就需要给予当前输入更多的关注。
  2. 权重归一化:得到注意力得分后,用softmax函数进行归一化,得到注意力概率分布。用这个注意力分布作为每个输入受关注程度的权重。
  3. 加权:对每个输入进行加权,就得到了注意力后的值。

五、主要公式

        以下是注意力机制中的一些主要公式:

  1. 注意力得分计算

其中,q 是查询向量,ki​ 是第 i 个键向量,α(q,ki​) 是查询和键之间的相关性函数

        2. 加性注意力

        3. 缩放点积注意力

        4. 注意力输出计算

其中,s(kn​,q) 是注意力打分函数,vn​ 是第 n 个值向量。

        5. 多头注意力输出计算

其中,Q=[q1​,q2​,…,qM​] 是多个查询向量集合,⊕ 表示向量拼接。

六、代码示例

        下面基于PyTorch的自注意力机制和多头注意力机制给出示例:

  1. 自注意力机制代码示例

import torch

import torch.nn as nn

import torch.nn.functional as F

import math

class SelfAttention(nn.Module):

def __init__(self, embed_dim):

super(SelfAttention, self).__init__()

self.embed_dim = embed_dim

self.query_linear = nn.Linear(embed_dim, embed_dim)

self.key_linear = nn.Linear(embed_dim, embed_dim)

self.value_linear = nn.Linear(embed_dim, embed_dim)

self.final_linear = nn.Linear(embed_dim, embed_dim)

def forward(self, x):

batch_size, seq_len, embed_dim = x.size()

# Calculate queries, keys, and values

queries = self.query_linear(x) # (batch_size, seq_len, embed_dim)

keys = self.key_linear(x) # (batch_size, seq_len, embed_dim)

values = self.value_linear(x) # (batch_size, seq_len, embed_dim)

# Compute attention scores

attention_scores = torch.matmul(queries, keys.transpose(-2, -1)) / math.sqrt(self.embed_dim)

attention_weights = F.softmax(attention_scores, dim=-1)

# Compute attention output

attention_output = torch.matmul(attention_weights, values)

# Apply final linear layer

output = self.final_linear(attention_output)

return output

# Example usage

embed_dim = 64 # Embedding dimension

seq_len = 10 # Sequence length

batch_size = 1 # Batch size

# Dummy input tensor with shape (batch_size, seq_len, embed_dim)

x = torch.randn(batch_size, seq_len, embed_dim)

self_attention = SelfAttention(embed_dim)

attention_output = self_attention(x)

print(attention_output.shape) # Should be (batch_size, seq_len, embed_dim)

        2. 多头注意力机制代码示例

import torch

import torch.nn as nn

import torch.nn.functional as F

import math

class MultiHeadAttention(nn.Module):

def __init__(self, embed_dim, num_heads):

super(MultiHeadAttention, self).__init__()

self.embed_dim = embed_dim

self.num_heads = num_heads

self.head_dim = embed_dim // num_heads

assert self.head_dim * num_heads

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/494964.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

重温设计模式--单例模式

文章目录 单例模式(Singleton Pattern)概述单例模式的实现方式及代码示例1. 饿汉式单例(在程序启动时就创建实例)2. 懒汉式单例(在第一次使用时才创建实例) 单例模式的注意事项应用场景 C代码懒汉模式-经典…

金仓数据库安装-Kingbase v9-centos

在很多年前有个项目用的金仓数据库,上线稳定后就没在这个项目了,只有公司的开发环境还在维护,已经好多年没有安装过了,重温一下金仓数据库安装,体验一下最新版本,也做一个新版本的试验环境; 一、…

LabVIEW中什么和C 语言指针类似?

在LabVIEW中,与C语言指针类似的概念是 引用 (Reference)。 引用在LabVIEW中主要用于以下几个方面: 数据引用:LabVIEW通过引用传递数据,而不是复制数据。通过引用,多个VIs可以共享数据而不需要复制整个数据结构&#xf…

医疗大模型威胁攻击下的医院AI安全:挑战与应对策略

一、引言 1.1 研究背景与意义 随着人工智能技术的迅猛发展,医疗大模型作为一种新兴的技术手段,正逐渐渗透到医疗领域的各个环节,为医疗服务的数字化转型带来了前所未有的机遇。从辅助诊断到疾病预测,从个性化治疗方案的制定到医疗资源的优化配置,医疗大模型展现出了巨大…

在 Vue3 项目中安装和配置 Three.js

简介 Three.js 是一个轻量级的 WebGL 封装库,用于在浏览器中渲染复杂的 3D 图形。它提供了便捷的 API,可以快速构建 3D 场景、对象和动画。 Vue.js 是一个渐进式 JavaScript 框架,擅长构建用户界面。其响应式数据绑定和组件系统使得复杂的交…

编译原理复习---正则表达式+有穷自动机

适用于电子科技大学编译原理期末考试复习。 1. 正则表达式 正则表达式(Regular Expression,简称regex或regexp)是一种用于描述、匹配和操作文本模式的强大工具。它由一系列字符和特殊符号组成,这些字符和符号定义了一种搜索模式…

漏洞检测工具:HOST头部攻击

HOST头部攻击 漏洞定义 Host头部字段在HTTP协议中用于指定请求所针对的域名,以便服务器能够正确地将请求路由到相应的Web应用程序。攻击者通过篡改HTTP请求中的Host头部字段来执行恶意操作。 漏洞危害 Host头部攻击的危害在于它能导致敏感信息泄露、恶意内容执行…

ROS1入门教程6:复杂行为处理

一、新建项目 # 创建工作空间 mkdir -p demo6/src && cd demo6# 创建功能包 catkin_create_pkg demo roscpp rosmsg actionlib_msgs message_generation tf二、创建行为 # 创建行为文件夹 mkdir action && cd action# 创建行为文件 vim Move.action# 定义行为…

DL作业11 LSTM

习题6-4 推导LSTM网络中参数的梯度, 并分析其避免梯度消失的效果 LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),旨在解决普通 RNN 在处理长序列时遇到的梯度消失和梯度爆炸问题。它通过设计多个门…

WWW23-多行为级联|级联图卷积网络的多行为推荐

论文:https://arxiv.org/abs/2303.15720 代码:https://github.com/SS-00-SS/MBCGCN 这篇论文MB-CGCN和上一篇CRGCN是同一个团队的,都是级联的方式。一个用了残差,一个用了特征转换,文章最后有discussion讨论了两者的不…

JAVA开发入门学习七- 数组

数组的概念 概念 数组: 是多个相同类型数据按照一定排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理 数组中的概念 数组名: 数组的名称,命名 下标: 从0开始 元素:…

【编辑器扩展】打开持久化路径/缓存路径/DataPath/StreamingAssetsPath文件夹

代码 [MenuItem("Assets/Open Explorer/PersistentDataPath")]public static void OpenPersistentDataPath(){Application.OpenURL(Application.persistentDataPath);}[MenuItem("Assets/Open Explorer/DataPath")]public static void OpenDataPath(){Appl…

链路聚合与GVRP的混合构建(eNSP)

目录 拓扑图: 前置操作: GVRP全局开启: 查询: 实验背景:前面依次搭建了交换机的链路聚合实验手册以及动态vlan GVRP,为了模拟真实环境,本次实验将两者结合。 拓扑图: 前置操作&…

由于这些关键原因,我总是手边有一台虚拟机

概括 虚拟机提供了一个安全的环境来测试有风险的设置或软件,而不会影响您的主系统。设置和保存虚拟机非常简单,无需更改主要设备即可方便地访问多个操作系统。运行虚拟机可能会占用大量资源,但现代 PC 可以很好地处理它,为实验和工作流程优化提供无限的可能性。如果您喜欢使…

华为ensp--BGP路由反射器

学习新思想、争做新青年,今天学习的是BGP路由反射器。 实验目的 理解BGP路由反射器的应用场景 理解BGP路由反射器的工作原理 掌握BGP路由反射器的基本配置方法 实验内容 本实验网络包含了两个AS,两个Cluster。R1、R2、R3属于Cluster 1&#xff0c…

使用idea创建JDK8的SpringBoot项目

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 使用idea创建JDK8的SpringBoot项目 前言我们经常在创建新的springboot项目,默认使用的是spring.io进行创建,但是它总是只会提供高版本的创建方式&…

初学stm32 --- 定时器中断

目录 时钟选择: 内部时钟选择​编辑 时钟计算方法: 计数器模式 向下计数模式(时钟分频因子1,ARR36) 向上计数模式(时钟分频因子1,ARR36) 中央对齐计数模式(时钟分频因…

windows下安装配置anaconda及常用的conda命令

Anaconda极大的简化了Python环境和库的管理,其最大的作用就是可以创建、管理多个不同python版本的虚拟环境,起到不同环境相互隔离、互不干扰、避免环境冲突的目的。如果使用本地Python安装多个包,经常会遇到包冲突,导致整个python…

安装CPU版的torch(清华源)

1、安装指令: pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple2、验证torch是否安装成功 // 使用python验证 import torch print(torch.__version__)能正常打印版本即表示安装成功,如下图

ASP.NET Core Web API 控制器

文章目录 一、基类:ControllerBase二、API 控制器类属性三、使用 Get() 方法提供天气预报结果 在深入探讨如何编写自己的 PizzaController 类之前,让我们先看一下 WeatherController 示例中的代码,了解它的工作原理。 在本单元中&#xff0c…