史上最直白之Attention详解(原理+代码)

article/2025/10/15 0:58:02

目录

  • 为什么要了解Attention机制
  • Attention 的直观理解
  • 图解深度学习中的Attention机制
  • 总结

为什么要了解Attention机制

  在自然语言处理领域,近几年最火的是什么?是BERT!谷歌团队2018提出的用于生成词向量的BERT算法在NLP的11项任务中取得了非常出色的效果,堪称2018年深度学习领域最振奋人心的消息。而Transformer的Encoder部分是 BERT 模型的核心组成部分,Transformer中最为巧妙的结构又是attention机制,这次咱们从Attention机制的原理写这篇博客既是对我自己学习的一个总结,也希望或许能对你有所帮助!!!

Attention 的直观理解

  Attention 机制直观理解很像人类看图片的逻辑,当我们看一张图片的时候,我们并没有看清图片的全部内容,而是将注意力集中在了图片的焦点上。大家看一下下面这张图:
在这里插入图片描述
  我们一定会看清「锦江饭店」4个字,如下图:
在这里插入图片描述
  但是我相信没人会第一时间去关注「路上的行人」也不会意识到路的尽头还有一个「優の良品」,所以,当我们看一张图片的时候,其实是这样的:
在这里插入图片描述
  而我们上面所说的,通过引入我们的视觉系统这种关注图片中的突出信息的例子,就是我们深度学习中Attention机制的最直观的理解,在深度学习中Attention机制就是通过矩阵运算的方式将模型的注意力集中在输入信息重点特征上,从而节省资源,快速获得最有效的信息。

图解深度学习中的Attention机制

  来拿seq2seq的模型来举例子,一般的基于seq2seq的翻译模型模型如下图:
在这里插入图片描述  机器翻译场景中,输入的中文句子为:我是一个学生,Encoder-Decoder框架通过encoding得出了一个包含中文句子全部信息的H6向量,并通过H6逐步生成中文单词:”I“、”am“、”a“、”student“。在翻译”student“这个单词的时候,分心模型里面每个英文单词对于翻译目标单词”student“的贡献程度是相同的,这很显然是不合道理的。显然”学生“对于翻译成”student“更为重要。
  那么它会存在什么问题呢?类似RNN无法捕捉长序列的道理,没有引入Attention机制在输入句子较短时影响不大,但是如果输入句子比较长,此时所有语义通过一个中间语义向量表示,单词自身的信息避免不了会消失,也就是会丢失很多细节信息,这也是为何引入Attention机制的原因。例如上面的例子,如果引入Attention的话,在翻译”student“的时候,会体现出英文单词对于翻译当前中文单词的不同程度影响,比如给出类似下面的概率分布:
          (我,0.2)
          (是,0.1)
          (一个,0.2)
          (学生,0.5)

  那么attention机制是通过什么方式来对于输入信息实现这种功能的能,答案是引入所谓的q、k、v三个矩阵并进行运算实现的,Attention有很多不同种类,本文具体以self-attention的来讲解Attention机制的实现过程(self-Attention中的Q是对自身(self)输入的变换,而在传统的Attention中,Q来自于外部):1、在self-attention中,会有三种矩阵向量,即Q(Query)查询向量、K(key)键值向量、V(value)值向量。它们是通过X乘以三个不同的权值矩阵 W Q W_Q WQ W k W_k Wk W v W_v Wv具体操作步骤如下:
在这里插入图片描述  注意,这里的每个单词都会通过这三个向量产生这三种矩阵,而这三种向量是怎么把每个单词联系起来的呢?
答案是在进行Attention运算时,首先会把当前单词产生的q(查询矩阵)和所有的k(键值矩阵进行相乘)得到一个中间结果,最后把自己的v(值矩阵)向量乘上这个中间结果矩阵,得到一个含有句子所有词语上下文信息的新向量。
  q,k,v这三个向量在通过反向传播不断的学习,而逐步习得句子中那些信息是模型需要关注的重要特征。
在这里插入图片描述

  self-Attention的实现代码:

# Muti-head Attention 机制的实现
from math import sqrt
import torch
import torch.nnclass Self_Attention(nn.Module):# input : batch_size * seq_len * input_dim# q : batch_size * input_dim * dim_k# k : batch_size * input_dim * dim_k# v : batch_size * input_dim * dim_vdef __init__(self,input_dim,dim_k,dim_v):super(Self_Attention,self).__init__()self.q = nn.Linear(input_dim,dim_k)self.k = nn.Linear(input_dim,dim_k)self.v = nn.Linear(input_dim,dim_v)self._norm_fact = 1 / sqrt(dim_k)def forward(self,x):Q = self.q(x) # Q: batch_size * seq_len * dim_kK = self.k(x) # K: batch_size * seq_len * dim_kV = self.v(x) # V: batch_size * seq_len * dim_vatten = nn.Softmax(dim=-1)(torch.bmm(Q,K.permute(0,2,1))) * self._norm_fact # Q * K.T() # batch_size * seq_len * seq_lenoutput = torch.bmm(atten,V) # Q * K.T() * V # batch_size * seq_len * dim_vreturn output

  Self-Attention可以通过qkv矩阵的计算过程中直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self-Attention对于增加计算的并行性也有直接帮助作用。正好弥补了RNN机制的两个缺点,这就是为何Self-Attention现在被广泛使用的主要原因。

总结

  Attention机制笔者认为是Transformer模型中最出彩的设计,效果很好的同时可解释性也很强,在笔者后续的文章中会向大家再介绍大名鼎鼎的Transformer和BERT。希望看到这里,能帮助小伙伴你搞懂Attention机制,这样才能更好的理解后续的Transformer和BERT模型。


http://chatgpt.dhexx.cn/article/ohKmli49.shtml

相关文章

关于Attention的超详细讲解

文章目录 一、动物的视觉注意力二、快速理解Attention思想三、从Encoder-Decoder框架中理解为什么要有Attention机制四、Attention思想步骤五、Self-Attention5.1 Self-Attention的计算步骤5.2 根据代码进一步理解Q、K、V5.3 再来一个例子理解 六、缩放点积中为什么要除以根号d…

浅聊古代————汉朝

文章目录 西汉西汉建立:汉高祖刘邦西汉灭亡:王莽篡汉新朝建立:王莽篡汉改新新朝灭亡:绿林赤眉起义 东汉东汉建立:起义军刘秀东汉灭亡:曹丕篡汉 西汉 西汉建立:汉高祖刘邦 刘邦被项羽封为汉王。…

XNU简介

XNU内核比较庞大复杂,因此这里只是进行主要内容的介绍 XNU据说是一个无限递归的缩写:XNU’s Not UNIX XNU内核是Mac和iOS的核心,有三个主要部分组成的一个分层体系结构;内核XNU是Darwin的核心,也是整个OS X的核心。 …

函数

1.编写函数,完成下面的程序,将一个字符串中的字母排序后输出。输出要求:字母从小到大排序(包括大小写)后的字符串。例如: 输入:Hello World! 输出:!HWdellloor 程序中的必要代码为: main() …

HangOver

How far can you make a stack of cards overhang a table? If you have one card, you can create a maximum overhang of half a card length. (We’re assuming that the cards must be perpendicular to the table.) With two cards you can make the top card overhang t…

❤️对比PyWinAuto和uiautomation实现微信联系人自动采集❤️

大家好,我是小小明。昨天我在《UI自动化工具轻松实现微信消息的自动收发和朋友圈爬取》一文中演示了UIAutomation的三个使用示例,链接:https://blog.csdn.net/as604049322/article/details/119899542 由于昨天对UIAutomation的API了解还不够全面,个别代码优化空间还较大。…

适用于winform程序的UI自动化实现(python+uiautomation)

适用于winform程序的UI自动化实现(pythonuiautomation) 一、使用的工具和库 定位工具:inspect(提取码:kvwx)、UISpy(提取码:ab0e) python库使用:subprocess(内置库&…

WPF UIAutomation测试套件开发

目录 介绍 目标 测试方案 功能测试(黑匣子) 测试示例 设计 记录测试并生成测试方法 更新测试方法并构建 测试用例规范 测试方法 初始化方法 实现自定义TestContext 测试配置 关于CodedUI的常见问题 不要手动更改* .Designer.cs文件中的代…

安卓手机 Python 自动化( uiautomation、uiautomation2、weditor )

其他自动化工具或者框架: Airtest:https://airtest.readthedocs.io/zh_CN/latest/autojs:Auto.js快速入门实战教程:https://zhuanlan.zhihu.com/p/90065914appium:https://blog.csdn.net/freeking101/article/details/…

UIAutomation识别UI元素

MS UI Automation(Microsoft User Interface Automation:UIA)是随.net framework3.0一起发布的,虽然在如今这个几乎每天都有各种新名词、新技术出来的所谓的21世纪,它显得已经有些过时了。前些日子,正好一个项目,可以用…

uiautomation实现自动化

1.下载UI SPY 下载地址:https://download.csdn.net/download/yangzhichao_csdn/85389759 2.CMD指令导入uiautomation库 pip install uiautomation 3.打开计算器,然后打开UISpy 如图ControlType为”ControlType.Window” 那么捕获窗口就用:uiautomation.WindowCo…

Python uiautomation初探,测试Win10计算器

在网上找 Python 客户端自动化测试的库,一般有 pywinauto、pywin32、pyautogui、uiautomation。本文仅对 uiautomation 做简单的了解。 MS UI Automation 是 MSAA 技术的一个替代品:即让控件和应用程序具有更好的可达性(accessible&#xff…

UIAutomation 自动化

Introduction UI Automation是Microsoft .NET 3.0框架下提供的一种用于自动化测试的技术,是在MSAA基础上建立的,MSAA就是Microsoft Active Accessibility。UI Automation在某些方面超过了MSAA,UI自动化提供了Windows Vista中,微软…

Python UI自动化 编程(一) UIAutomation

Python UI自动化 编程 第一章 Python UI自动化 编程入门之打开文件夹双击文件 文章目录 Python UI自动化 编程前言一、什么是Python UI自动化 编程二、环境说明1、Python环境:Python 3.82、IDE: Pycharm3、使用的库:UIAutomation 三、使用步…

【python】UI自动化-uiautomation

UI自动化-uiautomation 0- 前言1- inspect2- uiautomation3- 【实战】RustDesk软件自动 安装、指定服务器信息4- 参考文章 0- 前言 做应用程序自动点击的记录,暂不完整,仅供参考。参考多位大佬文章,链接在后面涉及工具 inspect【应用程序元素…

CAD 双击实体事件

CAD本身为我们提供的双击事件的设置。工具-工作空间-自定义...打开用户自定界面 窗体内找到双击动作。在双击动作下我们可以看到CAD自带的所有实体 例如我们在双击三维实体时自定义一个事件。那么我们就选中三维实体-快捷特性。在右侧特性里编辑宏内容。以下是系统彼带的宏$M$(…