各类神经网络学习:(十一)注意力机制(第3/4集),位置编码

上一篇下一篇
注意力机制(2/4集)注意力机制(4/4集)

位置编码

R N N RNN RNN L S T M LSTM LSTM 这些网络都是串行执行的,在潜移默化中,就包含了顺序关系,也就是词序关系。而注意力机制是并行的,词与词之间不存在顺序关系,比如说输入 [ A , B , C ] [A, B, C] [A,B,C] [ B , A , C ] [B, A, C] [B,A,C] 会被视为相似,那么这样就会丢失词序信息,所以需要在执行注意力机制之前,先进行位置编码,这样就包含了词序关系。

①位置编码向量添加方式

原本的自注意力机制的输入,就是词向量,但是对其位置编码后,会在原来的词向量上再加一个位置向量变成一个新的向量(对应元素相加),里面包含了当前词向量和其他的词向量之间的位置关系。并且位置向量的维度和词向量的维度是一致的。

②位置编码公式

编码方式其实有多种,不过 T r a n s f o r m e r Transformer Transformer 中用的就是下方这种(效果不是最好的,只是当时正好想到了这种方式)。

T r a n s f o r m e r Transformer Transformer 论文中使用的 正弦-余弦位置编码 是固定编码(不可训练),其公式如下:
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i d m o d e l ) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i d m o d e l ) \Large PE_{(pos,2i)}=sin(\frac{pos}{10000^{\frac{2i}{d_{model}}}})\\ \Large PE_{(pos,2i+1)}=cos(\frac{pos}{10000^{\frac{2i}{d_{model}}}}) PE(pos,2i)=sin(10000dmodel2ipos)PE(pos,2i+1)=cos(10000dmodel2ipos)
其中, p o s pos pos 表示元素在序列中的位置( 0 ≤ p o s ≤ 单词个数 0 ≤ pos ≤ 单词个数 0pos单词个数)。 i i i 表示编码向量的维度索引( 0 ≤ i < d m o d e l 2 0 ≤ i < \frac{d_{model}}{2} 0i<2dmodel)。 d m o d e l d_{model} dmodel 表示模型隐藏层维度(如 512 512 512 )。

上述公式表明:偶数位置的元素值使用 s i n sin sin 函数计算,奇数位置的元素值使用 c o s cos cos 函数计算(偶 s i n sin sin c o s cos cos )。

③举例帮助理解

举个例子帮助理解上述参数的含义:假设一句话中有 m m m 个单词,则有 0 ≤ p o s ≤ m 0 ≤ pos ≤ m 0posm ,每个单词的位置编码向量的维度为 d m o d e l d_{model} dmodel (就是这个向量中的元素个数),比如说第 p o s pos pos 个单词的位置编码向量为 [ 0.841 , 0.540 , 0.860 , 0.509 , . . . ] [0.841, 0.540, 0.860, 0.509, ...] [0.841,0.540,0.860,0.509,...]

现在我们来更具体化这个例子:

m = 3 m=3 m=3 ,假设句子为 “ I l o v e y o u I~love~you I love you”,包含 3 3 3 个单词(对应于位置 p o s = 0 , 1 , 2 pos=0,1,2 pos=0,1,2 ),模型维度 d m o d e l = 512 d_{model}=512 dmodel=512。则第 p o s pos pos 个单词的位置编码向量中第 2 i 2i 2i 和第 2 i + 1 2i+1 2i+1 个元素的值应按照如下公式计算:
P E ( p o s , 2 i ) = s i n ( p o s 1000 0 2 i 512 ) P E ( p o s , 2 i + 1 ) = c o s ( p o s 1000 0 2 i 512 ) \Large PE_{(pos,2i)}=sin(\frac{pos}{10000^{\frac{2i}{512}}})\\ \Large PE_{(pos,2i+1)}=cos(\frac{pos}{10000^{\frac{2i}{512}}}) PE(pos,2i)=sin(100005122ipos)PE(pos,2i+1)=cos(100005122ipos)
则有:

单词位置(pos)维度0维度1维度2维度3…(共512维)
pos=0 (“I”)0.0001.0000.0001.000
pos=1 (“love”)0.8410.5400.8600.509
pos=2 (“deep”)0.909-0.4160.876-0.481
  • 高频维度(如维度 512 的最后几维)的值接近微小波动,但对模型仍携带位置信息。
  • 单词很多时,其中更远的位置(例如pos=100)会因为频率放大分母,使得大幅衰减为小值。

测试代码:

import math
import numpy as npdef get_div_term(d_model):div_term = np.exp(np.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))return div_term  # 形状: [256]if __name__ == '__main__':np.set_printoptions(suppress=True)# 更改下面的 0 为其他的 posprint(np.sin(0 / get_div_term(512)))  # 输出向量中偶数位置元素print(np.cos(0 / get_div_term(512)))  # 输出向量中奇数位置元素

④为什么位置编码要这样编码

下面只做简单解释,详细的原因可以问 d e e p s e e k deepseek deepseek

按顺序推导,请耐心观看。

(里面为什么是除以 1000 0 2 i / 512 10000^{2i/512} 100002i/512 不用管,知道宏观公式的原因就行)

灵感来源:三角函数的和差化积公式:
s i n ( α + β ) = s i n α ⋅ c o s β + c o s α ⋅ s i n β c o s ( α + β ) = c o s α ⋅ c o s β − s i n α ⋅ s i n β sin(\alpha+\beta)=sin\alpha·cos\beta+cos\alpha·sin\beta\\ cos(\alpha+\beta)=cos\alpha·cos\beta-sin\alpha·sin\beta sin(α+β)=sinαcosβ+cosαsinβcos(α+β)=cosαcosβsinαsinβ

则第 p o s + k pos+k pos+k 个位置的单词的位置编码向量 P E ( p o s + k ) PE_{(pos+k)} PE(pos+k) 中的偶数和奇数位置的元素可被表示为:

偶数位: P E ( p o s + k , 2 i ) = sin ⁡ ( p o s + k 1000 0 2 i 512 ) = sin ⁡ ( p o s 1000 0 2 i 512 + k 1000 0 2 i 512 ) = sin ⁡ ( p o s 1000 0 2 i 512 ) ⋅ cos ⁡ ( k 1000 0 2 i 512 ) + cos ⁡ ( p o s 1000 0 2 i 512 ) ⋅ sin ⁡ ( k 1000 0 2 i 512 ) = P E ( p o s , 2 i ) ⋅ P E ( k , 2 i + 1 ) + P E ( p o s , 2 i + 1 ) ⋅ P E ( k , 2 i ) 奇数位: P E ( p o s + k , 2 i + 1 ) = cos ⁡ ( p o s + k 1000 0 2 i 512 ) = cos ⁡ ( p o s 1000 0 2 i 512 + k 1000 0 2 i 512 ) = cos ⁡ ( p o s 1000 0 2 i 512 ) ⋅ cos ⁡ ( k 1000 0 2 i 512 ) − sin ⁡ ( p o s 1000 0 2 i 512 ) ⋅ sin ⁡ ( k 1000 0 2 i 512 ) = P E ( p o s , 2 i + 1 ) ⋅ P E ( k , 2 i + 1 ) − P E ( p o s , 2 i ) ⋅ P E ( k , 2 i ) \begin{aligned} \text{偶数位:} & \\ PE_{(pos+k,2i)} &= \sin\left(\frac{pos+k}{10000^{\frac{2i}{512}}}\right) = \sin\left(\frac{pos}{10000^{\frac{2i}{512}}} + \frac{k}{10000^{\frac{2i}{512}}}\right) \\ &= \sin\left(\frac{pos}{10000^{\frac{2i}{512}}}\right) \cdot \cos\left(\frac{k}{10000^{\frac{2i}{512}}}\right) + \cos\left(\frac{pos}{10000^{\frac{2i}{512}}}\right) \cdot \sin\left(\frac{k}{10000^{\frac{2i}{512}}}\right) \\ &= PE_{(pos,2i)} \cdot PE_{(k,2i+1)} + PE_{(pos,2i+1)} \cdot PE_{(k,2i)} \\ \hline\\ \text{奇数位:} & \\ PE_{(pos+k,2i+1)} &= \cos\left(\frac{pos+k}{10000^{\frac{2i}{512}}}\right) = \cos\left(\frac{pos}{10000^{\frac{2i}{512}}} + \frac{k}{10000^{\frac{2i}{512}}}\right) \\ &= \cos\left(\frac{pos}{10000^{\frac{2i}{512}}}\right) \cdot \cos\left(\frac{k}{10000^{\frac{2i}{512}}}\right) - \sin\left(\frac{pos}{10000^{\frac{2i}{512}}}\right) \cdot \sin\left(\frac{k}{10000^{\frac{2i}{512}}}\right) \\ &= PE_{(pos,2i+1)} \cdot PE_{(k,2i+1)} - PE_{(pos,2i)} \cdot PE_{(k,2i)} \end{aligned} 偶数位:PE(pos+k,2i)奇数位:PE(pos+k,2i+1)=sin(100005122ipos+k)=sin(100005122ipos+100005122ik)=sin(100005122ipos)cos(100005122ik)+cos(100005122ipos)sin(100005122ik)=PE(pos,2i)PE(k,2i+1)+PE(pos,2i+1)PE(k,2i)=cos(100005122ipos+k)=cos(100005122ipos+100005122ik)=cos(100005122ipos)cos(100005122ik)sin(100005122ipos)sin(100005122ik)=PE(pos,2i+1)PE(k,2i+1)PE(pos,2i)PE(k,2i)

可以看出,对于 p o s + k pos+k pos+k 位置的位置向量中的 2 i 2i 2i 2 i + 1 2i+1 2i+1 维而言,可以被表示为: p o s pos pos 位置与 k k k 位置的位置向量中的 2 i 2i 2i 2 i + 1 2i+1 2i+1 维的线性组合,这样的线性组合意味着位置向量中蕴含了相对位置信息(也就是说:第 p o s + k pos+k pos+k 个单词和第 p o s pos pos 、第 k k k 个单词有关联)。

将上述推导过程中的 P E ( k , 2 i ) PE_{(k,2i)} PE(k,2i) P E ( k , 2 i + 1 ) PE_{(k,2i+1)} PE(k,2i+1) 看成是 W k W_k Wk ,那么上述公式就可以理解成:模型可以通过权重 W k W_k Wk 来掌握第 p o s pos pos 个单词和距离它 k k k 个单位远的单词之间的关联。

⑤这种编码方式的优缺点

  • 优点:

    • 泛化性强:支持处理比训练时更长的序列(外推能力)。
    • 计算高效:无需额外训练参数。
  • 缺点:这是一种不可学习,即给出即固定的编码方式,灵活性低。

后续的 GPT 等模型大部分都采用了可学习的编码方式。


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

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

相关文章

《Python Web部署应知应会》Flask网站隐藏或改变浏览器URL:从Nginx反向代理到URL重写技术

Flask网站隐藏或改变浏览器显示URL地址的实现方案&#xff1a;从Nginx反向代理到URL重写技术 引言 在Web应用开发中&#xff0c;URL路径的安全性往往被忽视&#xff0c;这可能导致网站结构和后端逻辑被攻击者轻易推断。对于Flask框架开发的网站&#xff0c;如何隐藏或改变浏览…

elementui里的el-tabs的内置样式修改失效?

1.问题图 红框里的是组件的内置样式&#xff0c;红框下的是自定义样式 2.分析 2.1scoped vue模板编译器在编译有scoped的stye标签时&#xff0c;会生成对应的postCSS插件&#xff0c;该插件会给每个scoped标记的style标签模块&#xff0c;生成唯一一个对应的 data-v-xxxhash…

大数据测试集群环境部署

Hadoop大数据集群搭建&#xff08;超详细&#xff09;_hadoop_小飞飞519-GitCode 开源社区 hadoop集群一之虚拟机安装(mac)_hadoop_皮皮虾不皮呀-华为开发者空间 hadoop集群二之hadoop安装_hadoop_皮皮虾不皮呀-华为开发者空间 虚拟机如何查看gateway | PingCode智库

Nginx 核心功能笔记

目录 一、Nginx 简介 二、核心功能详解 三、关键指令解析 四、性能优化要点 五、常见应用场景 一、Nginx 简介 定位 高性能的 HTTP/反向代理服务器&#xff0c;同时支持邮件协议代理&#xff08;IMAP/POP3/SMTP&#xff09;。采用 事件驱动、异步非阻塞 架构&#xff0c;…

强化学习(二)马尔科夫决策过程(MDP)

1. 简介 马尔可夫决策过程正式地描述了强化学习的环境其中环境是完全可观测的即当前状态完全表征了这个过程几乎所有的强化学习问题都可以形式化为马尔可夫决策过程&#xff0c;例如&#xff1a; 最优控制主要处理连续的马尔可夫决策过程部分可观察的问题可以转化为马尔可夫决…

Day16(贪心算法)——LeetCode45.跳跃游戏II763.划分字母区间

1 LeetCode45.跳跃游戏II 1.1 题目描述 与跳跃游戏类似&#xff0c;跳跃游戏II给定长为n的从0开始索引的整数数组nums&#xff0c;nums[i]是你在i处能向右跳跃的最大步数&#xff0c;求到达数组最后一个索引处需要跳跃的最少次数。   一个示例&#xff1a;nums[2,3,1,1,4]&a…

告别碎片化!两大先进分块技术如何提升RAG的语义连贯性?

研究动机 论文核心问题及研究背景分析 1. 研究领域及其重要性 研究领域&#xff1a;检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;系统&#xff0c;结合自然语言处理&#xff08;NLP&#xff09;与信息检索技术。重要性&#xff1a; RAG通过动态…

leetcode day37 474

474 一和零 给你一个二进制字符串数组 strs 和两个整数 m 和 n 。 请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中 最多 有 m 个 0 和 n 个 1 。 如果 x 的所有元素也是 y 的元素&#xff0c;集合 x 是集合 y 的 子集 。 示例 1&#xff1a; 输入&#xff1a;s…

二、信息时代社会结构的转变

到了信息时代,以及在核武器的前提下,上述的社会结构的逻辑,就有了一个根 本性的转变,就是暴力的成本和收益,都在下降。 暴力的成本在降低。比如说枪支,它的制造和分发都变得非常容易。现在我们都 知道有 3D 打印,它就好像工业时代的印刷机,印刷圣经或者书籍,使知识更加 普及和容…

Elasticsearch 堆内存使用情况和 JVM 垃圾回收

作者&#xff1a;来自 Elastic Kofi Bartlett 探索 Elasticsearch 堆内存使用情况和 JVM 垃圾回收&#xff0c;包括最佳实践以及在堆内存使用过高或 JVM 性能不佳时的解决方法。 堆内存大小是分配给 Elasticsearch 节点中 Java 虚拟机的 RAM 数量。 从 7.11 版本开始&#xff…

C++之类和对象:构造函数,析构函数,拷贝构造,赋值运算符重载

前提&#xff1a;如果一个类是空类&#xff0c;C中空类中真的什么都没有吗&#xff0c;不是的&#xff0c;编译器会自动生成6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 默认成员函数&#xff1a;构造函…

【专题五】位运算(1):常见位运算操作总结

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

小草GrassRouter多卡聚合路由器聚合卫星、MESH网络应用解决方案

一、多网融合解决方案 卫星网络融合‌ 支持接入卫星通信模块&#xff0c;在无地面网络覆盖的极端场景&#xff08;如偏远山区、海洋救援&#xff09;下&#xff0c;形成“5G卫星”双链路冗余传输&#xff0c;卫星链路可作为核心通信备份&#xff0c;确保关键指令和视频数据实…

【Mybatis】Mybatis基础

文章目录 前言一、搭建MyBatis1.1 创建maven工程1.2 加入log4j日志功能1.3 MyBatis的增删改查1.4 核心配置文件详解 二、MyBatis获取参数值的两种方式2.1 单个字面量类型的参数2.2 多个字面量类型的参数2.3 map集合类型的参数2.4 实体类类型的参数2.5 使用Param标识参数 三、 M…

AI四大边界

大模型训练的边界并非由单一因素决定&#xff0c;而是技术、伦理、法律及实际应用需求共同作用的结果。以下从四个维度解析其边界来源&#xff1a; 一、技术边界&#xff1a;资源与能力的双重限制 计算资源瓶颈 成本与算力&#xff1a;大模型训练依赖海量GPU/TPU资源&#xff…

Twitter 工作原理|架构解析|社交APP逻辑

这是对Twitter 工作原理&#xff5c;架构解析&#xff5c;社交APP逻辑_哔哩哔哩_bilibili的学习&#xff0c;感谢up小凡生一 在两年半前&#xff0c;埃隆马斯克收购了Twitter&#xff0c;并且进行了一系列重大改革。今天我们来解析一下这个全球知名社交平台的架构。首先&#x…

Java基础学习内容大纲

Java基础学习内容大纲 第一阶段:建立编程思想 ​ Java概述:如何快速学习Java技术、Java历史、Java特点、Sublime、Java运行机制、JDK、转义字符、Java开发规范、Java API ​ 变量:数据类型、变量基本使用、数据类型转换 ​ 运算符:运算符介绍、算数运算符、关系运算符、…

如何对多维样本进行KS检验

对于形状为 ( 10000 , 1 , 304 ) (10000, 1, 304) (10000,1,304)的三维数据&#xff0c;若需使用scipy.stats.ks_2samp进行KS检验&#xff0c;可按以下步骤处理&#xff1a; 数据降维 KS检验要求输入为一维数组&#xff0c;需将三维数据展平或按特定维度聚合&#xff1a; • 方…

在 VMware 虚拟机中安装 Windows7

文章目录 前言1.安装VMware 虚拟机1. VMware虚拟机软件安装2. 虚拟机创建配置&#xff08;超详细步骤&#xff09;3. Windows7系统安装 3、安装 VMware tools4. VMware Tools安装与优化5. 总结与常见问题 前言 最近有不少朋友在问如何在电脑上同时使用多个操作系统&#xff0c…

直播预告|TinyVue 组件库高级用法:定制你的企业级UI体系

TinyVue 是一个跨端跨框架的企业级 UI 组件库&#xff0c;基于 renderless 无渲染组件设计架构&#xff0c;实现了一套代码同时支持 Vue2 和 Vue3&#xff0c;支持 PC 和移动端&#xff0c;包含 100 多个功能丰富的精美组件&#xff0c;可帮助开发者高效开发 Web 应用。 4 月 …