位置编码和RoPE

前言
关于位置编码和RoPE 

应用广泛,是很多大模型使用的一种位置编码方式,包括且不限于LLaMA、baichuan、ChatGLM等等


第一部分 transformer原始论文中的标准位置编码


RNN的结构包含了序列的时序信息,而Transformer却完全把时序信息给丢掉了,比如“他欠我100万”,和“我欠他100万”,两者的意思千差万别,故为了解决时序的问题,Transformer的作者用了一个绝妙的办法:位置编码(Positional Encoding)

1.1 标准位置编码的起源
即将每个位置编号,从而每个编号对应一个向量,最终通过结合位置向量和词向量,作为输入embedding,就给每个词都引入了一定的位置信息,这样Attention就可以分辨出不同位置的词了,具体怎么做呢?

  1. 如果简单粗暴的话,直接给每个向量分配一个数字,比如1到1000之间
  2. 也可以用one-hot编码表示位置

                 

   3. transformer论文中作者通过sin函数和cos函数交替来创建 positional encoding,其计算positional encoding的公式如下 

                                 

其中,pos相当于是每个token在整个序列中的位置,相当于是0, 1, 2, 3...(看序列长度是多大,比如10,比如100),dmodel代表位置向量的维度(也是词embedding的维度,transformer论文中设置的512维) 

不要小看transformer的这个位置编码,不少做NLP多年的人也不一定对其中的细节有多深入,而网上大部分文章谈到这个位置编码时基本都是千篇一律、泛泛而谈,很少有深入,故本文还是细致探讨下

1.2 标准位置编码的示例:多图多举例
考虑到一图胜千言 一例胜万语,举个例子,当我们要编码「我 爱 你」的位置向量,假定每个token都具备512维,如果位置下标从0开始时,则根据位置编码的计算公式可得『且为让每个读者阅读本文时一目了然,我计算了每个单词对应的位置编码示例(在此之前,这些示例在其他地方基本没有)』

当对上的单词「我」进行位置编码时,它本身的维度有512维

当对上的单词「爱」进行位置编码时,它本身的维度有512维

 

1.3 标准位置编码的coding实现
代码实现如下

“”“位置编码的实现,调用父类nn.Module的构造函数”“”
class PositionalEncoding(nn.Module):
    def __init__(self, d_model, dropout, max_len=5000):
        super(PositionalEncoding, self).__init__()  
        self.dropout = nn.Dropout(p=dropout)  # 初始化dropout层
        
        # 计算位置编码并将其存储在pe张量中
        pe = torch.zeros(max_len, d_model)                # 创建一个max_len x d_model的全零张量
        position = torch.arange(0, max_len).unsqueeze(1)  # 生成0到max_len-1的整数序列,并添加一个维度
        # 计算div_term,用于缩放不同位置的正弦和余弦函数
        div_term = torch.exp(torch.arange(0, d_model, 2) *
                             -(math.log(10000.0) / d_model))
 
        # 使用正弦和余弦函数生成位置编码,对于d_model的偶数索引,使用正弦函数;对于奇数索引,使用余弦函数。
        pe[:, 0::2] = torch.sin(position * div_term)
        pe[:, 1::2] = torch.cos(position * div_term)
        pe = pe.unsqueeze(0)                  # 在第一个维度添加一个维度,以便进行批处理
        self.register_buffer('pe', pe)        # 将位置编码张量注册为缓冲区,以便在不同设备之间传输模型时保持其状态
        
    # 定义前向传播函数
    def forward(self, x):
        # 将输入x与对应的位置编码相加
        x = x + Variable(self.pe[:, :x.size(1)], 
                         requires_grad=False)
        # 应用dropout层并返回结果
        return self.dropout(x)

                                                         

 

这里面其实有很大的一个关键,但大部分资料甚至RoPE原始论文都不会给你特别强调出来,即为何要构造这么一个等式呢?

  • 原因在于左边算是q和k向量的内积,而这恰好是transformer计算自注意力机制的核心一步,右边等式则意味着m与n的相对位置
  • 如此一来,该等式便把“q和k的内积”与“它们的相对位置”给串起来了 也如阿荀所说,左边是含有各自绝对位置信息的q向量和k向量,而这个等式就是RoPE追求的目标,物理含义就是通过显式传入绝对位置信息实现与传入相对位置信息对等的情况

 

所以简单来说 RoPE 的 self-attention 操作的流程是

  • 对于 token 序列中的每个词嵌入向量,首先计算其对应的 query 和 key 向量
  • 然后对每个 token 位置都计算对应的旋转位置编码
  • 接着对每个 token 位置的 query 和 key 向量的元素按照 两两一组 应用旋转变换
  • 最后再计算 query 和 key 之间的内积得到 self-attention 的计算结果
     

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

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

相关文章

手动使用 Docker 启动 MinIO 分布式集群(推荐生产环境)

在生产环境中,MinIO 集群通常部署在多个物理机或虚拟机上,每个节点运行一个 MinIO 容器,并通过 Docker 暴露 API 和 Console 端口。 1. 准备工作 假设有 4 台服务器(也可以是同一台服务器的不同端口模拟,但不推荐生产…

如何在IntelliJ IDEA中设置数据库连接全局共享

在现代软件开发中,数据库连接管理是开发过程中不可或缺的一部分。为了提高开发效率,减少配置错误,并方便管理,IntelliJ IDEA 提供了一个非常有用的功能:数据库连接全局共享。通过这个功能,你可以在多个项目…

【Python】文件应用: 查找读取的文件内容

查找读取的文件内容 from pathlib import Pathpath Path(pi_million_digits.txt) contents path.read_text()lines contents.splitlines() pi_string for line in lines:pi_string line.lstrip()birthday input("Enter your birthday, in the form mmddyy: "…

交互式剖腹产手术模拟系统开发方案

以下是为您设计的《交互式剖腹产手术模拟系统》开发方案框架,包含技术实现路径与详细内容结构建议。由于篇幅限制,这里呈现核心框架与关键模块说明: 交互式剖腹产手术模拟系统开发方案 一、项目背景与意义 1.1 传统医学教学痛点分析 尸体标本成本高昂(约$2000/例)活体训…

AWS WebRTC: 判断viewer端拉流是否稳定的算法

在使用sdk-c viewer端进行拉流的过程中,viewer端拉取的是视频帧和音频帧,不会在播放器中播放,所以要根据收到的流来判断拉流过程是否稳定流畅。 我这边采用的算法是:依据相邻帧之间的时间间隔是否落在期望值的 20% 范围内。 音频…

【Python】文件读取:逐行读取应用实例——从一个JSONL文件中逐行读取文件

从一个JSONL文件中逐行读取文件,并将这些问题保存到一个新的JSONL文件中 import json import argparse import os # 导入os模块用于检查文件是否存在def read_questions_from_jsonl(file_path, limit):"""从JSONL文件中读取指定数量的question部分…

百宝箱生成智能体

点击新建应用 工作流如下: 点击发布 点击Web服务,上架

嵌入式 数据结构学习(五) 栈与队列的实现与应用

一、栈(Stack)详解 1. 栈的基本概念 栈的定义与特性 后进先出(LIFO):最后入栈的元素最先出栈 操作限制:只能在栈顶进行插入(push)和删除(pop)操作 存储位置:我们实现的链栈位于堆区(malloc分配),系统栈区存储函数调用信息 栈…

汇编与接口技术:8259中断实验

一、实验目的 该实验使学生掌握8259向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。 二、实验内容 1、手动产生单脉冲作为中断请求信号连接到MIRQ3上和SIRT10上。每按一次开关产生一次中断,…

Ajax的初步学习

一、什么是 Ajax? Ajax (Asynchronous JavaScript and XML) 是一种无需重新加载整个网页的情况下,能够更新部分网页的技术。通过在后台与服务器进行少量数据交换,Ajax 可以使网页实现异步更新。 主要特性: 异步性 (Asynchronous…

OOM电商系统订单缓存泄漏,这是泄漏还是溢出

电商系统订单缓存泄漏的本质分析一、明确概念区别内存泄漏(Memory Leak)定义:对象已经不再被使用,但由于被错误引用而无法被垃圾回收特点:内存使用量随时间持续增长,最终可能导致OOM类比:像浴缸…

二进制安全-汇编语言-02-寄存器

二、寄存器 水滴石穿 一个典型的CPU由运算器、控制器、寄存器等器件构成,这些器件靠内部总线相连 内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系 简单说,在CPU中: 运算器进行信息处理寄存器进…

Java——初始guava(1)

基于 Google Guava 官方教程的解答 📚 Guava 提供了哪些 JDK 不具备的 API? Guava 扩展了 JDK 的集合框架,提供了多种 JDK 没有的实用 API: 不可变集合(Immutable Collections) ImmutableList、ImmutableSet、ImmutableMap 等特性:创建后不可修改,线程安全,性能优于…

day53

import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader, TensorDataset import numpy as np from sklearn.preprocessing import MinMaxScaler from sklearn.datasets import load_iris import warnings # 忽略不必要的警…

c++ python 共享内存

一、目的 是为了c来读取并解码传递给python,Python做测试非常方便,c 和 python之间必须定好协议,整体使用c 来解码,共享内存传递给python 二、主类 主类,串联decoder,注意decoder并没有直接在显存里面穿…

react函数组件的props,ref,state。

react开发我们会把页面分为一个个组件,组件是独立而且可复用的重复代码片段。具体来说组件可以是一个按钮,一个输入框。react组件有两种定义方法,一种是函数组件,一种是类组件。我们这里说一下函数组件之间父子之间如何传递props参…

基于ARM+FPGA实现的BISS-C协议解决方案,适用于高精度光栅位移传感器等

模块简介 本资源提供了专为FPGA设计的BISS-C接口协议发送模块源码。BISS-C模式作为一种高速、同步的串行通信协议,广泛应用于高精度光栅位移传感器的数据传输中,特别适用于需要精确位置信息的应用场景。此模式遵循主从架构,其中FPGA作为主控制…

spring中@Transactional注解和事务的实战理解附代码

文章目录 前言一、事务是什么?二、事务的特性2.1隔离性2.2事务的隔离级别 三、Transactional注解Transactional注解简介基本用法常用属性配置事务传播行为事务隔离级别异常处理与回滚性能优化建议 四、 事务不生效的可能原因方法访问权限非public自调用问题异常被捕…

替代进口SCA7606【智芯微】国产高精度电流传感器 工业新能源电网专用

SCA7606(智芯微)产品解析与推广文案一、产品概述SCA7606 是 智芯微电子(ZXMICRO) 推出的一款 高精度数字隔离式电流传感器芯片,采用 霍尔效应数字输出 技术,专为 工业控制、新能源、智能电网 等领域的电流检…

Java 与 Vue 全栈开发:“一课一得“ 学习笔记系统实战

一、项目背景与核心价值 "一课一得" 是一个面向学习者的笔记管理平台,旨在帮助用户系统化记录、整理和回顾学习内容。项目采用前后端分离架构:前端基于 Vue.js 构建交互式界面,后端使用 Java Spring Boot 实现业务逻辑&#xff0c…