【自注意力与Transformer架构在自然语言处理中的演变与应用】
背景介绍
-
在自然语言处理(NLP)领域,序列到序列(seq2seq)模型和Transformer架构的出现,极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络(RNN)来处理输入序列,并通过编码器-解码器结构进行信息传递。然而,这种方法在处理长序列时存在一定的局限性,主要体现在信息的丢失和长距离依赖的建模能力不足。
-
为了解决这些问题,Transformer模型于2017年被提出。它引入了自注意力机制(Self-Attention),使得模型能够在处理每个单词时,考虑到句子中所有其他单词的上下文信息。这种机制不仅提高了模型对长距离依赖的捕捉能力,还显著提升了并行计算的效率,从而加快了训练速度。
-
自注意力机制的核心在于通过计算查询(Query)、键(Key)和值(Value)向量之间的相关性,来动态调整每个单词在上下文中的重要性。这种方法使得模型能够灵活地关注句子中不同位置的词,从而更好地理解和生成语言。
-
此外,Transformer模型的多头注意力机制进一步增强了模型的表达能力。通过将注意力机制分成多个头,模型能够在不同的子空间中学习到多种不同的表示,从而捕捉到更丰富的语义信息。
-
近年来,基于Transformer的模型,如BERT、GPT和CLIP等,已经在多个NLP任务中取得了显著的成果。这些模型不仅在文本处理上表现出色,还扩展到了图像处理和多模态学习等领域,展示了Transformer架构的广泛适用性和强大能力。
-
综上所述,seq2seq模型和Transformer架构的演变,标志着自然语言处理技术的重大进步,为实现更智能的语言理解和生成奠定了基础。
seq2seq原理
- 参考:https://blog.csdn.net/zhuge2017302307/article/details/119979892
- 对比作用
Transformer原理
Self-Attention 过程
如上一节所讲,Self Attention 在处理某个词之前,通过对句子片段中每个词的相关性进行打分,并将这些词的表示向量加权求和。
Self-Attention 沿着句子中每个 token 的路径进行处理,主要组成部分包括 3 个向量:
- Query:Query 向量是当前单词的表示,用于对其他所有单词(使用这些单词的 key 向量)进行评分。我们只关注当前正在处理的 token 的 query 向量。
- Key:Key 向量就像句子中所有单词的标签。它们就是我们在搜索单词时所要匹配的。
- Value:Value 向量是实际的单词表示,一旦我们对每个词的相关性进行了评分,我们需要对这些向量进行加权求和,从而表示当前的词。
- 以下是计算it时的评分
- 这些加权的 Value 向量会得到一个向量,它将 50% 的注意力放到单词robot 上,将 30% 的注意力放到单词 a,将 19% 的注意力放到单词 it。最终一个具有高分数的 Value 向量会占据结果向量的很大一部分
- 上面都是展示大量的单个向量,是想把重点放在词汇层面上。而实际的代码实现,是通过巨大的矩阵相乘来完成的
MultiheadAttention
- 多头注意力模型中,head数是一个超参数,语料大,电脑性能好就可以设置的高一点
torch实现
torch.nn.MultiheadAttention(embed_dim, num_heads, dropout=0.0, bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None)
1.embed_dim:最终输出的 K、Q、V 矩阵的维度,这个维度需要和词向量的维度一样
2.num_heads:设置多头注意力的数量。要求embed_dim%num_heads==0,即要能被embed_dim整除。这是为了把词的隐向量长度平分到每一组,这样多组注意力也能够放到一个矩阵里,从而并行计算多头注意力。
3.dropout:这个 dropout 加在 attention score 后面
例如,我们前面说到,8 组注意力可以得到 8 组 Z 矩阵,然后把这些矩阵拼接起来,得到最终的输出。
如果最终输出的每个词的向量维度是 512,那么每组注意力的向量维度应该是512/8=64 如果不能够整除,那么这些向量的长度就无法平均分配。
Self-Attention 和经典的(seq2seq)模型的区别
一个注意力模型不同于经典的(seq2seq)模型,主要体现在 3 个方面:
- 编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而非只传递最后一个 hidden state。即编码器会把更多的数据传递给解码器。
- 对于 Self Attention 机制,会把其他单词的理解融入处理当前的单词。使得模型不仅能够关注这个位置的词,而且能够关注句子中其他位置的词,作为辅助线索,进而可以更好地编码当前位置的词。
- 解码器输出之前,计算了注意力。让模型找到此时刻最该注意的词。
对于第二点举例如下:
机器人第二定律
机器人必须服从人给予它的命令,当该命令与第一定律冲突时例外。
句子中高亮的 3 个部分,用于指代其他的词。如果不结合它们所指的上下文,就无法理解或者处理这些词。当一个模型要处理好这个句子,它必须能够知道:
- 它 指的是机器人
- 该命令 指的是这个定律的前面部分,也就是人给予它的命令
- 第一定律 指的是机器人第一定律
Self Attention 能做到这一点。它在处理某个词之前,将模型中这个词的相关词和关联词的理解融合起来(并输入到一个神经网络)。它通过对句子片段中每个词的相关性打分(attention score),并将这些词向量加权求和。
下图顶部模块中的 Self Attention 层在处理单词 it 的时候关注到 a robot。它最终传递给神经网络的向量,是这 3 个单词的词向量加权求和的结果。
QKV计算过程
为什么求内积之后除以 d \sqrt{d} d
在计算相似度 s = ⟨ q , k ⟩ s = \langle q, k \rangle s=⟨q,k⟩ 时, s s s 要除以 d k e y \sqrt{d_{key}} dkey(Key 向量的长度)。原因是词向量 embedding 维度过高时, s s s 过大,softmax 函数会进入饱和区。例如:
对于两个 d d d 维向量 q , k q, k q,k,假设它们都采样自“均值为 0、方差为 1”的分布。Attention 是内积后 softmax,主要设计的运算是 e q ⋅ k e^{q \cdot k} eq⋅k,我们可以大致认为内积之后、softmax 之前的数值在 − 3 d -3\sqrt{d} −3d 到 3 d 3\sqrt{d} 3d 这个范围内,由于 d d d 通常都至少是 64,所以 e 3 d e^{3\sqrt{d}} e3d 比较大而 e − 3 d e^{-3\sqrt{d}} e−3d 比较小,softmax 函数进入饱和区。这样会有两个影响:
- 带来严重的梯度消失问题,导致训练效果差。
- softmax 之后,归一化后计算出来的结果 a a a 要么趋近于 1 要么趋近于 0,Attention 的分布非常接近一个 one hot 分布了,加权求和退化成胜者全拿,则解码时只关注注意力最高的(attention 模型还是希望别的词也有权重)。
相应地,解决方法有两个(参考苏剑林《浅谈 Transformer 的初始化、参数化与标准化》):
-
像 NTK 参数化那样,在内积之后除以 d \sqrt{d} d,使 q ⋅ k q \cdot k q⋅k 的方差变为 1,对应 e 3 e^{3} e3, e − 3 e^{-3} e−3 都不至于过大过小,这也是常规的 Transformer 如 BERT 里边的 Self Attention 的做法。对公式 s = ⟨ q , k ⟩ s = \langle q, k \rangle s=⟨q,k⟩ 进行优化:( q q q 和 k k k 求内积,所以其实 key 和 q q q 的向量长度一样。)
s = ⟨ q , k ⟩ d k e y s = \frac{\langle q, k \rangle}{\sqrt{d_{key}}} s=dkey⟨q,k⟩
-
另外就是不除以 d \sqrt{d} d,但是初始化 q , k q, k q,k 的全连接层的时候,其初始化方差要多除以一个 d d d,这同样能使得 q ⋅ k q \cdot k q⋅k 的初始方差变为 1,T5 采用了这样的做法。
参考
- https://blog.csdn.net/qq_56591814/article/details/119759105
- https://blog.csdn.net/weixin_38252409/article/details/133828294
相关文章:

【自注意力与Transformer架构在自然语言处理中的演变与应用】
背景介绍 在自然语言处理(NLP)领域,序列到序列(seq2seq)模型和Transformer架构的出现,极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络(RNN&…...

LabVIEW交直流接触器动态检测系统
LabVIEW软件与霍尔传感器技术结合的交直流接触器动态检测系统通过实时数据采集和处理技术,有效地测量并分析交直流接触器在吸合及吸持阶段的电流和电压变化,以及相应的功率消耗,从而优化电力和配电系统的性能和可靠性。 项目背景 交直流接触…...
Unity3D中基于四叉树的范围检测算法详解
在游戏开发中,碰撞检测和范围检测是常见的需求,尤其是在处理大量物体时,传统的暴力检测法(即每个物体与其他所有物体进行碰撞检测)会消耗大量的计算资源,导致性能下降。为了优化这一过程,四叉树…...

k8s网络通信
k8s通信整体架构 k8s通过CNI接口接入其他插件来实现网络通讯。目前比较流行的插件有flannel,calico等 CNI插件存放位置:# cat /etc/cni/net.d/10-flannel.conflist 插件使用的解决方案如下 虚拟网桥,虚拟网卡,多个容器共用一个虚…...

07 欢乐的跳
题目: 代码: #include<bits/stdc.h> using namespace std; #define M 1000005int main() {int n;cin>>n;int a[M]{0};for(int i0;i<n;i){cin>>a[i];}int c[M]{0};for(int i1;i<n;i){c[i]abs(a[i]a[i1]);}sort(c1,cn); // 注意f…...

【韩顺平Java笔记】第8章:面向对象编程(中级部分)【262-271】
文章目录 262. 回顾上一章内容263. IDEA介绍263.1 IDEA 介绍263.2 Eclipse 介绍 264. IDEA下载265. IDEA使用1257. IDEA使用2268. IDEA使用3268. 269. 270. IDEA快捷键1,2,3271. IDEA模板 262. 回顾上一章内容 看视频 263. IDEA介绍 263.1 IDEA 介绍 IDEA 全称 IntelliJ ID…...
GNU链接器(LD):输入分区的垃圾回收及保护处理(KEEP命令)介绍
0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分: (1)编译器 (2)汇编器 (3)链接器 (4)lib库 在GNU工具链中&…...

论文翻译 | Fairness-guided Few-shot Prompting for LargeLanguage Models
摘要 大型语言模型已经显示出令人惊讶的执行上下文学习的能力,也就是说,这些模型可以通过对由几个输入输出示例构建的提示进行条件反射,直接应用于解决大量下游任务。然而,先前的研究表明,由于训练示例、示例顺序和提示…...
【分布式微服务云原生】战胜Redis脑裂:深入解析与解决方案
战胜Redis脑裂:深入解析与解决方案 摘要: Redis脑裂问题(Split Brain Syndrome)是分布式系统中的一个常见且复杂的问题,通常发生在网络分区或主节点出现问题时。本文将详细探讨脑裂的主要原因、导致的问题以及有效的解…...

数据治理与可持续发展:开启企业价值新模式——The Open Group 2024生态系统架构·可持续发展年度大会邀您共襄盛举
在当今数字化转型的浪潮中,企业正面临着前所未有的机遇和挑战。当数据治理遇上可持续发展,企业价值的新模式应运而生。那么,如何在数字化时代实现数据治理与可持续发展的融合,推动企业价值的飞跃? The Open Group 202…...
数据库的分类及主流数据库
一、数据库的分类 (一)关系型数据库(RDBMS) 定义与原理 关系型数据库是基于关系模型建立的数据库。它以表格(关系)的形式组织数据,每个表格包含行(记录)和列࿰…...
Qt C++设计模式->备忘录模式
备忘录模式(Memento Pattern)是一种行为型设计模式,用于在不破坏封装性的前提下,捕获并保存对象的内部状态,以便在将来的某个时刻可以恢复到之前的状态。备忘录模式的核心是状态的保存和恢复,常用于实现撤销…...

Vue使用@别名替换后端ip地址
1. 安装 types/node types/node 包允许您在TypeScript项目中使用Node.js的核心模块和API,并提供了对它们的类型检查和智能提示的支持。 npm install types/node --save-dev 比如安装之后,就可以导入nodejs的 path模块,在下面代码 import path…...

强大的PDF到Word转换工具
Solid Converter:强大的PDF到Word转换工具推荐 在日常工作和学习中,PDF是最常用的文件格式之一。然而,编辑PDF文档并不总是那么方便,尤其是当你需要将PDF文件转换为Word文档时。Solid Converter 是一款强大的工具,专为…...
js进阶——深入解析JavaScript中的URLSearchParams
深入解析 JavaScript 中的 URLSearchParams 在现代Web开发中,我们经常需要处理URL中的查询参数,尤其是在构建动态Web应用时。这些查询参数(query parameters)通常以 ?keyvalue&key2value2 的形式存在。JavaScript 提供了一个…...

如何利用wsl-Ubuntu里conda用来给Windows的PyCharm开发
前提:咱们在wsl-Ubuntu上,有conda的虚拟环境 咱们直接打开PyCharm,打开Settings 更换Python Interpreter即可 当然一开始可能没有下面的选项,需要我们点击右边的Add Interpreter 这里选择wsl 点击next 将这两步进行修改 可以看出来࿰…...

操作系统的了解及安装
一、linux系统认识 linux是指操作系统的内核,ubuntu是指基于这种内核的操作系统,Ubuntu属于Linux的一个发行版本,有简易的用户界面,完善的包管理系统,Ubuntu还对大多数硬件有着良好的兼容性,包含最新的图形…...

【C++篇】虚境探微:多态的流动诗篇,解锁动态的艺术密码
文章目录 C 多态详解(进阶篇)前言第一章:多态的原理1.1 虚函数表的概念1.1.1 虚函数表的生成过程 1.2 虚表的存储位置 第二章:动态绑定与静态绑定2.1 静态绑定2.1.1 静态绑定的实现机制:2.1.2 示例代码: 2.…...
uniapp的相关知识(1)
1、hover-class:当有鼠标按下时,会切换对应的样式;也可以设置对应的变色时间。 2、selectable:设置text组件的文本是否可以进行复制。 3、with:当设置为80%时,表示宽占整个屏幕的80%。 4、border&#x…...
uniapp生成随机数
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
QMC5883L的驱动
简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...