位置编码(绝对位置,相对位置)

Transformer架构:位置编码 2017年,Google的Vaswani 等人提出了一种新颖的纯注意力序列到序列架构,闻名学术界与工业界的 Transformer 架构横空出世。它的可并行化训练能力和优越的性能使其成为 NLP(以及最近的 CV)研究人员的热门选择。本文将重点讨论Transformer架构一个不可或缺的部分——位置编码(Positional Encoding)。 Transformer架构 位置编码是什么?它为什么这么重要? 在自然语言中,单词的位置与顺序定义了语法,也影响着语义。无法捕获的单词顺序会导致我们很难理解一句 阅读详情
AI摘要

本文介绍了位置编码在自然语言处理中的重要作用,重点分析了绝对位置编码和相对位置编码的区别及应用。绝对位置编码通过唯一标识每个位置来提供序列信息,常见的有正弦/余弦编码;而相对位置编码关注词与词之间的相对距离,提升了模型对语义关系的理解能力。文中还详细解析了Shaw等人提出的相对位置编码、Transformer-XL的改进方法以及RoPE旋转位置编码的工作原理。

1.前言

位置编码(Positional Encoding)是自然语言处理(NLP)和序列建模中的一项关键技术,主要用于为模型提供序列中元素的位置信息。由于像Transformer这样的模型本身不具备处理序列顺序的能力(即它们是“置换不变”的),因此必须显式地引入位置信息,以便模型能够区分“我爱猫”和“猫爱我”这样的不同语序句子。

2.绝对位置编码(Absolute Positional Encoding)

每个位置被赋予一个唯一的编码,直接表示其在序列中的绝对位置。
最常见的是正弦/余弦编码(Sinusoidal Encoding),公式如下:
P E p o s , 2 i = s i n ( p o s 1000 0 2 i d m o d e l ) PE_{pos,2i}=sin(\dfrac{pos}{10000^{\frac{2i}{d_{model}}}}) PEpos,2i​=sin(10000dmodel​2i​pos​)
p o s pos pos:位置索引(即第几个token)
i i i:维度索引(即token中第几个维度)
d m o d e l d_{model} dmodel​:嵌入向量的维度(如512)

3.相对位置编码

相对位置编码的核心理念是:对于一个词而言,它与其他词的“相对位置关系”比其“绝对位置”更重要。

例如,在句子 “I think I am right” 中,第二个 “I” 的指代关系更依赖于它前面和后面的词(“think” 和 “am”),而不是它处于整个句子的第2个位置。

因此,相对位置编码不再关注“每个词在序列中的绝对位置 ( i ) 和 ( j )”,而是关注“一对词 ( i ) 和 ( j ) 之间的相对距离 ( i - j )”。

3.1

首先,回顾一下标准自注意力的计算:
A i , j = softmax ( Q i K j T d k ) A_{i,j} = \text{softmax}\left( \frac{Q_i K_j^T}{\sqrt{d_k}} \right) Ai,j​=softmax(dk​ ​Qi​KjT​​)
其中, Q i = ( X i + P i ) W Q , K j = ( X j + P j ) W K Q_i=(X_i+P_i)W^Q,K_j=(X_j+P_j)W^K Qi​=(Xi​+Pi​)WQ,Kj​=(Xj​+Pj​)WK
如果我们把 Q i , K i Q_i,K_i Qi​,Ki​展开,会得到四项:
X i W Q ( X j W K ) T + X i W Q ( P j W K ) T + P i W Q ( X j W K ) T + P i W Q ( P j W K ) T X_iW^Q(X_jW^K)^T+X_iW^Q(P_jW^K)^T+P_iW^Q(X_jW^K)^T+P_iW^Q(P_jW^K)^T Xi​WQ(Xj​WK)T+Xi​WQ(Pj​WK)T+Pi​WQ(Xj​WK)T+Pi​WQ(Pj​WK)T
这四项分别代表:

  1. 内容-内容关联:词 ( i ) 的内容与词 ( j ) 的内容之间的相关性。
  2. 内容-位置关联:词 ( i ) 的内容与词 ( j ) 的绝对位置之间的相关性。
  3. 位置-内容关联:词 ( i ) 的绝对位置与词 ( j ) 的内容之间的相关性。
  4. 位置-位置关联:词 ( i ) 的绝对位置与词 ( j ) 的绝对位置之间的相关性。

3.1 Shaw et al. 相对位置编码

这是最早在Transformer中引入相对位置编码的论文之一 Self-Attention with Relative Position Representations (Shaw et al.2018), 使用相对位置信息 a i , j K , a i , j V a_{i,j}^K, a_{i,j}^V ai,jK​,ai,jV​来替代或修改这些项中依赖于绝对位置 P i , P j P_i, P_j Pi​,Pj​的部分。

具体步骤如下:

  • 创建可学习的嵌入表:为每个在 [ − k , k ] [−k,k] [−k,k]范围内的相对距离,分配两个可学习的嵌入向量:
    • a i − j K a^K_{i-j} ai−jK​:用于修饰键,影响注意力权重的计算。
    • a i − j V a^V_{i-j} ai−jV​:用于修饰值,影响注意力加权求和后的输出。
  • 在注意力分数中,将原来的 Q i K j T Q_iK_j^T Qi​KjT​ 修改为 Q i ( K j + a i , j K ) T Q_i(K_j+a_{i,j}^{K})^T Qi​(Kj​+ai,jK​)T ,这使得在计算词j相对于词i的重要性时,考虑了词j相对于词i的位置。
  • 在注意力输出中,将 A i , j V j A_{i,j}V_j Ai,j​Vj​ 修改为 A i , j ( V j + a i , j V ) A_{i,j}(V_j+a_{i,j}^V) Ai,j​(Vj​+ai,jV​),这使得在聚合信息时,不仅聚合了来自词j的内容信息,还聚合了i和j的相对位置信息。

缺点:计算效率低下,无法将所有的 a i , j V a_{i,j}^V ai,jV​ 聚合为一个矩阵 B B B ,然后计算 Q B T QB^T QBT,因为 B B B 的每一行会随 i i i 变化而变化,换句话说,不存在矩阵 B B B 使得 B j = a i , j V B_j=a_{i,j}^V Bj​=ai,jV​对所有 i i i 成立,所以无法进行高效的批量矩阵乘法。

3.2 Transformer-XL 中的相对位置编码

把标准transformer中的公式:
在这里插入图片描述
修改为
在这里插入图片描述
其中,绝对位置编码 U j U_j Uj​ 被替换为相对位置编码 R i , j R_{i,j} Ri,j​, U i T W q T U_i^TW_q^T UiT​WqT​ 被替换为可学习参数 u , v u,v u,v

在这里插入图片描述

3.3 旋转位置编码 (Rotary Position Embeddingz)

RoPE是一种相对位置编码方法,它通过将位置信息以旋转矩阵的形式融入 Query 和 Key 的向量表示中,从而在不增加参数、不改变模型结构的前提下,让注意力机制能够感知 token 的相对位置。
目标: 我们希望在计算注意力分数时,内积 q T k q^Tk qTk 的结果只依赖于这两个token的相对位置差 m-n,而不是它们的绝对位置 m,n 。
实现方式: RoPE 为每个位置 pos 分配一个独特的旋转矩阵 R p o s , θ R_{pos,\theta} Rpos,θ​ ,这个矩阵的作用是将词向量在某个维度平面上进行旋转,旋转的角度 θ \theta θ 与位置 pos 成正比,公式如下:
θ i = p o s 1000 0 2 i d m o d e l , i = 0 , 1 , . . . , d 2 − 1 \theta_i = \dfrac{pos}{10000^{\frac{2i}{d_{model}}}},i=0,1,...,\frac{d}{2}-1 θi​=10000dmodel​2i​pos​,i=0,1,...,2d​−1

假设向量 q , k q,k q,k只有两个维度,RoPE 的旋转操作如下:
对于位置为 m 的token,查询向量 q q q 会旋转 m θ m\theta mθ 角度
对于位置为 n 的token,键向量 k k k 会旋转 n θ n\theta nθ 角度
旋转矩阵 R θ R_\theta Rθ​ 在二维下是:
R θ = [ cos ⁡ θ − sin ⁡ θ sin ⁡ θ cos ⁡ θ ] R_\theta = \begin{bmatrix} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{bmatrix} Rθ​=[cosθsinθ​−sinθcosθ​]
旋转后的向量内积为
( R m , θ q ) T ( R n , θ k ) = q T R m , θ T R n , θ k (R_{m,\theta}q)^T(R_{n,\theta}k)=q^TR_{m,\theta}^TR_{n,\theta}k (Rm,θ​q)T(Rn,θ​k)=qTRm,θT​Rn,θ​k
由于旋转矩阵是正交矩阵,故
R m , θ T = R m , θ − 1 = R − m , θ R_{m,\theta}^T=R_{m,\theta}^{-1}=R_{-m,\theta} Rm,θT​=Rm,θ−1​=R−m,θ​
又
R m , θ R n , θ = R m + n , θ R_{m,\theta}R_{n,\theta}=R_{m+n,\theta} Rm,θ​Rn,θ​=Rm+n,θ​
则
q T R m , θ T R n , θ k = q T R n − m , θ k q^TR_{m,\theta}^TR_{n,\theta}k=q^TR_{n-m,\theta}k qTRm,θT​Rn,θ​k=qTRn−m,θ​k
最终的内积结果只依赖于原始向量 q,k,以及它们的相对位置 n-m,实现了我们的目标。注意,尽管 RoPE 使用绝对位置 m m m 来构造旋转矩阵,但其在注意力机制中实际起作用的是相对位置 m − n m-n m−n ,使用绝对位置 ≠ 是绝对位置编码,关键看模型在实际计算中利用的是绝对位置还是相对位置。

在现实中,向量的维度远大于2,RoPE将 d d d 维的向量空间看成 d / 2 d/2 d/2 个二维的子空间,对于第 i i i 个子空间,分配一个旋转角度 θ i \theta_i θi​ ,具体如下:
( cos ⁡ m θ 0 − sin ⁡ m θ 0 0 0 ⋯ 0 0 sin ⁡ m θ 0 cos ⁡ m θ 0 0 0 ⋯ 0 0 0 0 cos ⁡ m θ 1 − sin ⁡ m θ 1 ⋯ 0 0 0 0 sin ⁡ m θ 1 cos ⁡ m θ 1 ⋯ 0 0 ⋮ ⋮ ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 0 0 ⋯ cos ⁡ m θ d / 2 − 1 − sin ⁡ m θ d / 2 − 1 0 0 0 0 ⋯ sin ⁡ m θ d / 2 − 1 cos ⁡ m θ d / 2 − 1 ) ( q 0 q 1 q 2 q 3 ⋮ q d − 2 q d − 1 ) \begin{pmatrix} \cos m\theta_0 & -\sin m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ \sin m\theta_0 & \cos m\theta_0 & 0 & 0 & \cdots & 0 & 0 \\ 0 & 0 & \cos m\theta_1 & -\sin m\theta_1 & \cdots & 0 & 0 \\ 0 & 0 & \sin m\theta_1 & \cos m\theta_1 & \cdots & 0 & 0 \\ \vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots \\ 0 & 0 & 0 & 0 & \cdots & \cos m\theta_{d/2-1} & -\sin m\theta_{d/2-1} \\ 0 & 0 & 0 & 0 & \cdots & \sin m\theta_{d/2-1} & \cos m\theta_{d/2-1} \end{pmatrix} \begin{pmatrix} q_0 \\ q_1 \\ q_2 \\ q_3 \\ \vdots \\ q_{d-2} \\ q_{d-1} \end{pmatrix} ​cosmθ0​sinmθ0​00⋮00​−sinmθ0​cosmθ0​00⋮00​00cosmθ1​sinmθ1​⋮00​00−sinmθ1​cosmθ1​⋮00​⋯⋯⋯⋯⋱⋯⋯​0000⋮cosmθd/2−1​sinmθd/2−1​​0000⋮−sinmθd/2−1​cosmθd/2−1​​ ​ ​q0​q1​q2​q3​⋮qd−2​qd−1​​ ​
左侧是位置 m m m 的旋转矩阵,右侧是对应的 q 向量。
RoPE 通过这种优雅的几何变换,将相对位置信息自然地融入了注意力机制,成为了 LLaMA等众多现代大语言模型的首选位置编码方案。

绝对位置编码【三角/递归/相乘】->相对位置编码【XLNET/T5/DEBERTA】->旋转位置编码(ROPE/XPOS/FOPE)->复杂位置编码【CNN/RNN/复数/融合】 本文分成三类讲解: 1、绝对位置编码-BERT(学习位置编码) 2、正弦位置编码 3、相对位置编码-NEZHA 4、(处理超文本-层次位置编码) 对每一种都进行的讲解,并在代码中详细加了注释! 1、绝对位置编码-BERT BERT使用的是训练出来的绝对位置编码,这种编码方式简单直接,效果也不错。 这种方法和生成词向量的方法相似,先初始化位置编码,再放到预训练过程中,训练出每个位置的位置向量。 关于该方法的代码如下,用Keras写的,参考苏剑林老师的bert4keras中的代码 from keras.la. 阅读详情

相关推荐

Positional Encoding | 位置编码【详解】

transformer的作者刚开始说固定的位置编码和可学习的位置编码的效果是差不多的,后来证明固定的位置编码没有太大的必要,还不如省事直接使用可学习的位置编码,如下图,设置token的数量为10,token的特征向量长度为128,偶数项和奇数项的位置编码公式如下图所示,代码中,token_num是句子中的单词数量,embed_dim表示每个单词的特征向量长度,将对应位置的位置编码直接加在输入的单词上,如下图中的最后一行,为什么 attention 并不能赋予 token 位置信息?

qq_23022733的博客 2890

一文搞懂Transformer的位置编码

本文介绍Transformer的位置编码,有图有表有推导,看不懂你打我!!!在Transformer出现以前,NLP任务大多是以RNN、LSTM为代表的循环处理方式,即一个token一个token的输入到模型当中。这种设计存在天生的缺陷。为了解决这些缺陷,Transformer把token的顺序信号加到词向量上帮助模型学习这些信息,这就位置编码(Positional Encoding)。接下来的内容不会涉及Self-Attention等牛逼的创新设计,只讨论位置编码,希望对大家有所帮助。

xian0710830114的专栏 2万+

浅谈相对位置编码和绝对位置编码

相对位置编码:没有完整建模整个序列的位置信息,而是在算当前位置的Attention的时候,考虑了当前位置和被Attention位置之间的相对距离(这一操作可以体现在计算Attention过程中,在计算中引入一个相对位置向量进行学习,下图展示:);相对位置编码是一种根据位置之间的相对关系来编码序列的方法。(3)标题对于ij的相对位置表示为j与i的相对距离,其中clip(j-i,k)用来对j-i进行截断处理,截断范围为(-k,k)其中k表示相对位置的范围区间,当j-i小于-k则令成-k,大于k则令成k;

Xbusiwang的博客 6716

位置编码Positional Encoding

摘抄自这里。在以前的模型中,NLP的每个Sequence都是一个token一个token的输入到模型当中。比如有一句话是“我喜欢吃洋葱”,那么输入模型的顺序就是“我”,“喜”,“欢“,”吃“,”洋“,”葱”,一个字一个字的。上面的输入方式其实就引入了一个问题。一个模型每次只吃了一个字,那么模型只能学习到前后两个字的信息,无法知道整句话讲了什么。为了解决这个问题,Transformer模型引用了Self-attention来解决这个问题。

fb_941219的博客 8108

用Docker-Compose三节点部署生产级Doris集群:从配置文件到故障转移

本文详细介绍了如何使用Docker-Compose部署一个生产级的三节点Apache Doris集群。内容涵盖从核心架构理解、配置文件编写到集群初始化验证的全过程,并重点讲解了如何实现高可用、数据持久化、健康检查以及故障转移等生产级运维关键点,为中小团队提供了一种在容器化便利性与系统稳定性间取得平衡的可靠部署方案。

kkk56的博客 856

Jasper Report使用JSON数据源创建报表

最近在做一个项目小功能,表单结案要生成PDF报表。 起初,想用HTML模板(art-template模板引擎)编写,利用浏览器的打印功能保存成pdf文件下载。但是HTML编写好的模板,页码、页眉、页脚设置有坑,表单内容中的表格较多,表格不能设置跨页,导致跨页的表格内容与页眉重叠,没能解决这个问题。 于是,转战研究Jasper report生成报表,用更加专业的报表生成工具来做。刚开始,也是跌跌撞撞,遇到了很多问题,因为觉得没有退路了,必须要用这个搞出来,所以就硬着头皮去找各种资料。 主要使用的json

xiaogege2012的专栏 3319

Transformer中的位置编码:绝对位置编码、相对位置编码与旋转位置编码

位置编码是Transformer模型中至关重要的一部分,不同的编码方式适用于不同的任务和数据类型。本文详细介绍了绝对位置编码、相对位置编码和旋转位置编码的原理、实现及应用,通过具体的案例分析展示了它们在实际任务中的表现。随着NLP领域的不断发展,新的位置编码方法可能会不断涌现,进一步提升Transformer模型在复杂任务中的表现。了解并掌握这些位置编码方法,将有助于研究人员和工程师更好地应用Transformer模型,处理各种序列数据,提升模型的性能和应用效果。

python123456_的博客 2万+

基于Zemax的干涉仪仿真——Fizeau球面干涉仪

最近在用Zemax仿真干涉仪,在这之前查资料都是关于一些平面干涉仪的仿真,很少有关于Fizeau型的,尤其是球面干涉仪的仿真,看到很多关于这方面的问题回复都说利用多重结构仿照Zemax马赫-泽德干涉仪去做,但是也没有具体的过程,因此在这里分享一下我仿真的干涉仪步骤方法,具体是利用多重结构完成的仿真。

weixin_46657737的博客 6407

相对位置编码和绝对位置编码

位置编码的区别:相对位置编码和绝对位置编码是两种不同的位置编码方法。绝对位置编码是一种基于位置嵌入的方法,其中每个位置都被分配了一个唯一的位置向量。这些向量是固定的,与输入序列的内容无关。这种编码方式对于处理较短的序列效果较好,但在处理长序列时可能会存在问题,因为序列的长度超过了模型能够处理的位置编码的范围。相对位置编码是一种基于相对位置的方法,其中每个位置被编码为一个偏移量,表示该位置与其他位置之间的相对距离。相对位置编码可以通过在输入嵌入中添加额外的信息来实现。

ding_programmer的博客 6990

Vcenter虚拟机磁盘转换实战:如何用StarWind V2V将vmdk转为qcow2(附空间优化技巧)

本文详细介绍了如何使用StarWind V2V Converter将Vcenter中的vmdk虚拟机磁盘高效转换为qcow2格式,并提供了空间优化技巧。从准备工作、导出vmdk文件到转换过程中的性能调优,帮助管理员在迁移虚拟机时减少资源消耗,确保数据完整性和性能。

dell8的博客 202

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 368

相对位置编码,绝对位置编码代码pytorch实现

相对位置编码代码

qq_43733107的博客 5461

RAG测评实战代码

本文主要介绍了RAG测评实战代码,希望对使用RAG的同学们有所帮助。 文章目录 1. 前言 2. 实战代码 2.1 实战代码一 2.2 实战代码二

herosunly的博客 1万+

相对位置编码与绝对位置编码

相对位置编码与绝对位置编码

qq_43469443的博客 1957

教你写出高质量SQL(实践必备)

1、查询SQL尽量不要使用select * ,而是select具体字段。 //反例子 select * from sys_user; //正例子 select id,name from sys_user; 理由: 只取需要的字段,节省资源、减少网络开销;select * 进行查询时,很可能就不会使用到覆盖索引,就会造成回表查询; 覆盖索引:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 例如: 回表查询:先通过普通索引的值定位聚簇索引值,再通过聚簇索引的值定位行记..

ANGEL CITY 9996

YOLO11改进-模块-引入多尺度差异融合模块MDFM

MDFM主要用于融合双时相图像特征并生成带有丰富上下文信息的差异特征,其过程包含以下步骤:1. 特征提取与差异特征生成首先从双时相图像中提取特征f1和f2,然后将f1和f2进行像素级别的相减,再对相减结果取绝对值,最后通过一个3x3的卷积操作得到Di。2. 多尺度特征融合(MSFF)接着利用多尺度特征学习机制来增强特征融合效果。该机制通过不同核大小的卷积构建多尺度融合过程,具体是通过一个名为 MSFF 单元来实现的。

qq_64693987的博客 4378

【大模型知识点】位置编码——绝对位置编码,相对位置编码,旋转位置编码RoPE(附代码)

本文介绍了大模型中常见的绝对位置编码和相对位置编码方法,如transformer的正余弦位置编码,可学习位置编码,RoPE和ABiLi

想买很多漂亮衣服但是买不起的博客 5773

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

绝对位置编码和相对位置编码有什么联系和区别?

绝对位置编码和相对位置编码是Transformer模型中处理序列数据时引入位置信息的两种不同方法。它们各有优缺点,适用于不同的任务场景。在选择使用哪种位置编码时,需要根据具体任务的需求和模型的复杂度进行权衡。在某些情况下,结合使用两种位置编码方法可能会取得更好的效果。

weixin_63866037的博客 1296

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

绝对位置编码、相对位置编码、旋转位置编码分别是什么,他们的优缺点是【进阶版】

特性绝对位置编码相对位置编码旋转位置编码(RoPE)核心思想为每个位置分配唯一编码建模元素之间的相对位置通过旋转操作注入位置信息实现复杂度简单较复杂较复杂计算开销低较高中等长度外推能力有限(可学习编码)或较好(正弦)较好非常好是否建模相对位置否是是是否需要额外参数无(正弦余弦)或有(可学习)是无适用场景通用任务需要相对位置的任务(如翻译)长序列任务(如文档生成、代码)它的旋转操作是连续的、平滑的。它不需要额外参数,直接用数学公式计算位置信息。

yxx122345的博客 1689

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

绝对位置编码、相对位置编码、旋转位置编码分别是什么,他们的优缺点是

绝对位置编码、相对位置编码和旋转位置编码是 Transformer 模型中用于处理序列中元素顺序信息的不同方法。它们各自有不同的机制、优点和缺点。

yxx122345的博客 3115

绝对位置编码与相对位置编码区别

绝对位置编码(Absolute Positional Encoding)和相对位置编码(Relative Positional Encoding)是用于在Transformer等模型中处理序列数据时引入位置信息的两种不同方法。

slience_me的博客 1155

位置编码/绝对位置编码/相对位置编码/Rope原理+公式详细推导及代码实现

位置编码是Transformer架构中的关键组件,用于为序列中的每个位置提供位置信息。由于自注意力机制本身是位置无关的,需要额外的位置信息来理解序列中元素的顺序。绝对位置编码:简单高效,适用于固定长度序列相对位置编码:关注位置关系,泛化能力更强RoPE:通过旋转矩阵优雅地处理位置信息,支持长度外推选择合适的位置编码方式需要根据具体应用场景和性能需求来决定。现代大语言模型(如GPT、LLaMA等)普遍采用RoPE,因为它在处理长序列时表现出色。

哪惧明天,风高路斜 3158

[从0开始AIGC][Transformer相关]:一文看懂Transformer中的位置编码:绝对位置、相对位置、旋转位置编码

绝对位置编码最原始的正余弦位置编码(即sinusoidal位置编码)是一种绝对位置编码,但从其原理中的正余弦的和差化积公式来看,引入的其实也是相对位置编码。优势: 实现简单,可预先计算好,不用参与训练,速度快。劣势: 没有外推性,即如果预训练最大长度为512的话,那么最多就只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调。相对位置编码。

Bin_Dut的博客 5575

位置编码:绝对位置编码、相对位置编码、旋转位置编码

模型本身是“无状态”的,它看不到句子里单词的顺序(比如“我吃苹果”和“苹果吃我”,在模型眼里如果不做处理,输入的token是一样的),那它怎么区分语序、理解语义呢?答案就是「位置编码」——它就像给每个单词贴了一个“坐标标签”,告诉模型“这个单词在句子里排第1位、那个排第3位”,让模型能捕捉到语序带来的语义差异。

qq-1343330453 899

Transformer中的位置编码:绝对位置编码、相对位置编码与旋转位置编码_transformer位置编码

本文系统介绍了Transformer模型中三种主要位置编码方法:绝对位置编码、相对位置编码和旋转位置编码。绝对位置编码通过正弦余弦函数为序列每个位置生成固定向量,实现简单但长距离依赖表现有限;相对位置编码则关注元素间距离关系,更适合处理长序列任务;旋转位置编码通过旋转操作将位置信息融入注意力计算。文章以"我爱你,中国。"为例,结合代码展示了不同编码的实现方式,并分析了各自的优缺点。这些方法为Transformer模型处理序列顺序信息提供了关键支持,影响着模型对文本结构的理解能力。

2401_84208172的博客 1567

Transformer 位置编码:绝对位置和相对位置解决的问题不同

Transformer 位置编码用于补充序列顺序信息。绝对位置提供固定坐标,相对位置更关注距离关系,旋转位置编码则以不同方式注入 query/key。位置编码没有脱离任务的最优解。要结合长度范围、任务类型和推理实现一起评估。

lady_mumu的博客 1006
上一篇: 深入浅出BERT:原理、架构与应用
下一篇: 从GPT-1到GPT-3:生成式预训练语言模型的演进之路
LETTER•
博客等级 码龄3年 62粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值