【Transformer模型学习】第二篇:多头注意力机制

文章目录

      • 0. 前言
      • 1. 注意力机制(Attention)概述
      • 2. Q、K、V矩阵是怎么来的?
      • 3. 缩放点积注意力(Scaled Dot-Product Attention)
      • 4. 多头注意力(Multi-Head Attention)
      • 5. 多头注意力的好处
      • 6. 总结

0. 前言

按照国际惯例,首先声明:本文只是我自己学习的理解,虽然参考了他人的宝贵见解及成果,但是内容可能存在不准确的地方。如果发现文中错误,希望批评指正,共同进步。

本文是Transformer学习系列的第二篇文章,在前面的Transformer模型架构说明中已经有多处提及(多头)注意力机制,注意力机制是Transformer的核心,本文将详细说明注意力机制的数学原理及作用。

1. 注意力机制(Attention)概述

注意力机制是Transformer模型的核心,因为它赋予了模型识别输入序列中不同元素之间复杂关系的能力,而无需受限于传统的顺序处理方式。通过自注意力(Self-Attention)机制,每个位置的元素都能直接与序列中的所有其他元素交互,从而有效地捕捉长距离依赖关系。

这种机制允许并行化计算,极大地提高了训练效率和模型性能,同时使得模型能够动态地对每个输入元素强调不同的关注点,根据其上下文调整对信息的关注程度。因此,注意力机制不仅加速了模型处理速度,还增强了模型的理解能力和表达能力,成为Transformer架构区别于以往模型的关键创新点。

注意力机制通过计算查询(Query)、键(Key)和值(Value)之间的关系来生成输出。强烈建议先阅读下前文【单点知识】多头注意力机制:torch.nn.MultiheadAttention的原理与实践中的例子。

Attention is All You Need 原文中提出了两种注意力机制:加法注意力和点乘注意力。虽然两者在理论上的复杂度相近,但在实际上点乘注意力性能更好,后面的注意力机制说明都默认是点乘注意力。

注意力机制通过 Q Q Q(Query,查询) K K K(Key,键) V V V(Value,值) 矩阵工作。 Q Q Q 表示当前词的查询向量, K K K 表示所有词的键向量, V V V 表示所有词的值向量。

首先,计算 Q Q Q K K K 的点积并缩放,得到注意力分数,表示词与词之间的相关性。然后,通过 Softmax 将分数转换为概率分布。最后,用这些概率加权 V V V V V V 矩阵提供了词的实际内容,而注意力机制通过加权 V V V 矩阵中的值向量,生成一个上下文相关的表示,帮助模型更好地理解序列中的关系。

2. Q、K、V矩阵是怎么来的?

一说到Transformer的注意力机制,众多文章往往一上来就开始QKVQKV……的解释,令人摸不到头脑。这也是Attention is All You Need 原文并没有太交代清楚的地方,我觉得有必要先说明白。

从模型最开始,Transformer输入的 n n n个Token会被转换为 ( n , d m o d e l ) (n, d_{model}) (n,dmodel)维的矩阵 X X X(回顾下前文【Transformer模型学习】第一篇:提出背景、模型架构及推理过程 中的第三章),Transformer 使用三个不同的可学习权重矩阵生成 Q Q Q K K K V V V矩阵:

  • W Q W_Q WQ:用于生成查询矩阵 Q = X ⋅ W Q Q = X \cdot W_Q Q=XWQ
  • W K W_K WK:用于生成键矩阵 K = X ⋅ W K K = X \cdot W_K K=XWK
  • W V W_V WV:用于生成值矩阵 V = X ⋅ W V V = X \cdot W_V V=XWV

权重矩阵 W Q W_Q WQ W K W_K WK的形状为 ( d model , d k ) (d_{\text{model}}, d_k) (dmodel,dk) ,生成的 Q Q Q K K K的形状为 ( n , d k ) (n , d_k) (n,dk) W V W_V WV的形状为 ( d model , d v ) (d_{\text{model}}, d_v) (dmodel,dv),生成的 V V V的形状为 ( n , d v ) (n, d_v) (n,dv)

3. 缩放点积注意力(Scaled Dot-Product Attention)

这是Transformer中使用的注意力机制。它通过计算查询和键的点积,然后进行缩放和Softmax操作来得到权重,最后用这些权重对值进行加权求和。

公式如下:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V
其中, Q Q Q K K K V V V分别表示查询、键和值, d k d_k dk是键的维度。

可以更形象一点表示为:

在这里插入图片描述

其中,缩放因子 d k \sqrt{d_k} dk 是为了防止点积结果过大,导致softmax函数输出接近0或1的极端值,从而减小梯度消失的风险,确保训练过程更加稳定有效。通过缩放点积的结果,可以使softmax函数更有效地分辨不同词之间的关联强度。

最终,如果我们令 d v = d m o d e l d_v=d_{model} dv=dmodel就会发现,Attention变成了和输入 X X X的维度一致,这样,输入 X X X就经历了一个“头”的处理,得到了单头注意力
在这里插入图片描述

4. 多头注意力(Multi-Head Attention)

在单头注意力的基础上我们也可以再将查询 Q Q Q、键 K K K和值 V V V分别投影到多个 d v = d m o d e l / h d_v=d_{model}/h dv=dmodel/h维子空间(在原文中 h h h设定为8, d m o d e l d_{model} dmodel设定为512),然后在每个子空间中并行计算注意力,最后将结果拼接并再次投影。

在这里插入图片描述
整个过程相当于把一个“大头”分解成了多个“小头”,其公式如下:
MultiHead ( Q , K , V ) = Concat ( head 1 , … , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \dots, \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,,headh)WO
W O W^O WO是一个可学习的权重矩阵,用于将多个注意力头的输出拼接后进行线性变换,最终生成多头注意力的输出。其中,每个头 head i \text{head}_i headi的计算方式为:
head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV)

5. 多头注意力的好处

多头注意力的主要好处可以总结为以下几点:

  • 捕捉多样化的特征:每个注意力头可以独立学习不同的注意力模式。例如,一个头可能关注局部依赖(如相邻词之间的关系),而另一个头可能关注长距离依赖(如句子中相隔较远的词之间的关系)。
  • 支持并行计算,提高效率:多头注意力机制中的每个头的计算是独立的,可以并行进行。这种并行性充分利用了硬件加速器(如GPU或TPU)的计算能力,显著提高了计算效率。
  • 增强模型的鲁棒性和表达能力:多个注意力头的组合使得模型能够从不同角度理解输入数据。即使某些头的注意力分配不理想,其他头仍然可以提供有用的信息。
  • 更好地建模上下文关系:多头注意力能够同时捕捉输入序列中的多种上下文关系。例如,在自然语言处理任务中,一个词可能与多个其他词有不同的语义关系。

6. 总结

本文详细说明了Transformer的核心——多头注意力机制。它可以通过计算词与词之间的相关性,捕捉序列中的全局依赖关系,允许模型动态关注输入的不同部分,增强上下文理解能力,而不用考虑输入间的举例。多头注意力并行计算多个注意力头,提取多样化的特征,提升模型的表达能力和鲁棒性,广泛应用于机器翻译、文本生成等任务。

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

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

相关文章

网络运维学习笔记(DeepSeek优化版)002网工初级(HCIA-Datacom与CCNA-EI)子网划分与协议解析

文章目录 子网划分与协议解析1. VLSM与CIDR技术解析1.1 VLSM(Variable Length Subnetwork Mask,可变长子网掩码)1.2 CIDR(Classless Inter-Domain Routing,无类域间路由) 2. 子网划分方法与计算2.1 常规划分…

将VsCode变得顺手好用(1

目录 设置中文 配置调试功能 提效和增强相关插件 主题和图标相关插件 创建js文件 设置中文 打开【拓展】 输入【Chinese】 下载完成后重启Vs即可变为中文 配置调试功能 在随便一个位置新建一个文件夹,用于放置调试文件以及你未来写的代码,随便命名但…

在线疫苗预约小程序(论文源码调试讲解)

第4章 系统设计 用户对着浏览器操作,肯定会出现某些不可预料的问题,但是不代表着系统对于用户在浏览器上的操作不进行处理,所以说,要提前考虑可能会出现的问题。 4.1 系统设计思想 系统设计,肯定要把设计的思想进行统…

MySql数据库运维学习笔记

数据库运维常识 DQL、DML、DCL 和 DDL 是 SQL(结构化查询语言)中的四个重要类别,它们分别用于不同类型的数据库操作,下面为你简单明了地解释这四类语句: 1. DQL(数据查询语言,Data Query Langu…

Redis 集群的三种模式:一主一从、一主多从和多主多从

本文记述了博主在学习 Redis 在大型项目下的使用方式,包括如何设置Redis主从节点,应对突发状况如何处理。在了解了Redis的集群搭建和相关的主从复制以及哨兵模式的知识以后,进而想要了解 Redis 集群如何使用,如何正确使用&#xf…

LangChain大模型应用开发:基于RAG实现文档问答

介绍 大家好,博主又来给大家分享知识了。随着大模型应用的不断发展,很多开发者都在探索如何更好地利用相关工具进行开发。那么这次给大家分享的内容是使用LangChain进行大模型应用开发中的基于RAG实现文档问答的功能。 好了,我们直接进入正…

零样本学习 zero-shot

1 是什么 2 如何利用零样本学习进行跨模态迁移? demo代码 安装clip pip install ftfy regex tqdm pip install githttps://github.com/openai/CLIP.git import torch import clip from PIL import Image# 加载 CLIP 模型 device "cuda" if torch.cuda.i…

防火墙双机热备---VRRP,VGMP,HRP(超详细)

双机热备技术-----VRRP,VGMP,HRP三个组成 注:与路由器VRRP有所不同,路由器是通过控制开销值控制数据包流通方向 防火墙双机热备: 1.主备备份模式 双机热备最大的特点就是防火墙提供了一条专门的备份通道(心…

面试八股文--数据库基础知识总结(1)

1、数据库的定义 数据库(DataBase,DB)简单来说就是数据的集合数据库管理系统(Database Management System,DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。数据库系统…

怎么在Github上readme文件里面怎么插入图片?

环境: Github 问题描述: 怎么在Github上readme文件里面怎么插入图片? https://github.com/latiaoge/AI-Sphere-Butler/tree/master 解决方案: 1.相对路径引用 上传图片到仓库 将图片文件(如 .png/.jpg&#xff…

Unity自定义树(Tree)

一、创建自定义树 右键——3D Object——Tree 树的大致形态: 二、主干树的整体设置 Distribution Tree Seed:树种子,调节此参数就可获得不同形态的树桩 Area Spread:区域的大小 Ground Offset:树距离初始地面的偏移…

Debezium日常分享系列之:Debezium 3.1.0.Alpha2发布

Debezium日常分享系列之:Debezium 3.1.0.Alpha2发布 模式历史配置默认值的变更可能的 Vitess 数据丢失Oracle 的 ReselectColumnsPostProcessor 行为变更Reselect 列后处理器的错误处理模式TinyGo WASM 数据类型改进Debezium 平台转换 UI 中的谓词支持Debezium 平台…

STM32MP157A-FSMP1A单片机移植Linux系统I2C总线驱动

由于I2C总线驱动为Linux内核自带的总线驱动,在一个新的板子上可能由于不同的定义与芯片原厂定义的I2C管脚有所不同,这时就需要开发人员对设备树信息及内核驱动进行更新。 原理图可知,I2C的SCL对应PF14,SDA对应PF15 在Linux内核中…

My first Android application

界面元素组成&#xff1a; 功能代码&#xff1a; /*实现功能&#xff1a;当输入内容后&#xff0c;欢迎文本发生相应改变&#xff0c;并清除掉文本域内容当未输入任何内容时&#xff0c;弹出提示文本以警告用户*/val greetingText findViewById<TextView>(R.id.printer)…

深度学习基础--ResNet网络的讲解,ResNet50的复现(pytorch)以及用复现的ResNet50做鸟类图像分类

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;这篇文章是本人学习ResNet的学习笔记&#xff0c;并且用pytorch复现了ResNet50&…

【DeepSeek】【GPT-Academic】:DeepSeek集成到GPT-Academic(官方+第三方)

目录 1 官方deepseek 1.1 拉取学术GPT项目 1.2 安装依赖 1.3 修改配置文件中的DEEPSEEK_API_KEY 2 第三方API 2.1 修改DEEPSEEK_API_KEY 2.2 修改CUSTOM_API_KEY_PATTERM 2.3 地址重定向 2.4 修改模型参数 2.5 成功调用 2.6 尝试添加一个deepseek-r1参数 3 使用千帆…

用Golang与WebAssembly构建高性能Web应用:详解`syscall/js`包

用Golang与WebAssembly构建高性能Web应用&#xff1a;详解syscall/js包 引言为什么选择syscall/js包&#xff1f;适用场景 syscall/js包概述syscall/js包的核心概念1. js.Global2. js.Value3. js.Func4. js.Null 和 js.Undefined syscall/js包在WebAssembly中的位置 环境配置与…

本地部署轻量级web开发框架Flask并实现无公网ip远程访问开发界面

文章目录 1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 本篇文章主要讲解如何在本地安装Flask&#xff0c;以及如何将其web界面发布到公网进行远程访问。 Flask是目前十分流行的web框架&#xff0c;采用Python编程…

ChatGPT背后的理论基础:从预训练到微调的深度解析

友情提示&#xff1a;本文内容由银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台GPT-4o-mini模型生成&#xff0c;仅供参考。请根据具体情况和需求进行适当的调整和验证。 随着人工智能特别是自然语言处理技术的飞速发展&#xff0c;ChatGPT作为一种强大的对话…

2025面试Go真题第一场

前几天参加了一场面试&#xff0c;GoLang 后端工程师&#xff0c;他们直接给了我 10 道题&#xff0c;我留了一个截图。 在看答案之前&#xff0c;你可以先简单做一下&#xff0c;下面我会对每个题目做一个说明。 文章目录 1、golang map 是否并发安全?2、协程泄漏的原因可能是…