vit中的位置编码,RoPE旋转位置编码,torch.nn.functional.embedding

大模型建模基础:Vision Transformer的位置编码 阅读详情

位置编码和RoPE旋转位置编码,torch.nn.functional.embedding

2. 位置编码和RoPE旋转位置编码

2.1 绝对位置编码

https://blog.csdn.net/v_JULY_v/article/details/134085503

位置编码:
在这里插入图片描述
在这里插入图片描述

图中每一行是一个位置的编码,编码的长度等于特征的长度512

位置编码代码:就是每个位置得到一个向量,直接加在特征上。
为什么要这么编码呢?

下面代码输入输出shape都是: batch, seq_len, dim

"""位置编码的实现,调用父类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)

优势: 实现简单,可预先计算好,不用参与训练,速度快。

劣势: 没有外推性,即如果预训练最大长度为512的话,那么最多就只能处理长度为512的句子,再长就处理不了了。当然,也可以将超过512的位置向量随机初始化,然后继续微调。

2.2 RoPE

RoPE通过绝对位置编码的方式实现相对位置编码,综合了绝对位置编码和相对位置编码的优点。RoPE 代表了一种编码位置信息的新方法。传统方法中无论是绝对方法还是相对方法,都有其局限性。绝对位置编码为每个位置分配一个唯一的向量,虽然简单但不能很好地扩展并且无法有效捕获相对位置;相对位置编码关注标记之间的距离,增强模型对标记关系的理解,但使模型架构复杂化。

RoPE巧妙地结合了两者的优点。允许模型理解标记的绝对位置及其相对距离的方式对位置信息进行编码。这是通过旋转机制实现的,其中序列中的每个位置都由嵌入空间中的旋转表示。RoPE 的优雅之处在于其简单性和高效性,这使得模型能够更好地掌握语言语法和语义的细微差别。

主要就是对attention中的q, k向量注入了绝对位置信息,然后用更新的q,k向量做attention中的内积就会引入相对位置信息了。

https://blog.csdn.net/weixin_43646592/article/details/130924280 这篇博客里面的代码写的比较清晰

1)第m个位置的q,第n个位置的k经过某个变换f之后,两者相乘得到的attention包含相对位置信息
如公式2,得到的attention(g)可以分解出m-n

在这里插入图片描述

2)其实利用旋转是可以达到公式2的要求的。
因此:如下图,Rm是第m位置的编码矩阵

在这里插入图片描述

3)再度简化后:得到公式13

还记得 绝对位置的编码是什么吗?绝对位置编码就是对每个位置编码一个位置相关的向量 ,然后加到原来的特征上。也就是直接相加

这里变成了下图:相乘后相加
在这里插入图片描述

4)具体代码如下
RoPE中首先是绝对位置编码,然后对q,k进行编码

import torch
import torch.nn as nn
import torch.nn.functional as F
import math

# %%

def sinusoidal_position_embedding(batch_size, nums_head, max_len, output_dim, device):
    # (max_len, 1)
    position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(-1)
    # (output_dim//2)
    ids = torch.arange(0, output_dim // 2, dtype=torch.float)  # 即公式里的i, i的范围是 [0,d/2]
    theta = torch.pow(10000, -2 * ids / output_dim)

    # (max_len, output_dim//2)
    embeddings = position * theta  # 即公式里的:pos / (10000^(2i/d))

    # (max_len, output_dim//2, 2)
    embeddings = torch.stack([torch.sin(embeddings), torch.cos(embeddings)], dim=-1)

    # (bs, head, max_len, output_dim//2, 2)
    embeddings = embeddings.repeat((batch_size, nums_head, *([1] * len(embeddings.shape))))  # 在bs维度重复,其他维度都是1不重复

    # (bs, head, max_len, output_dim)
    # reshape后就是:偶数sin, 奇数cos了
    embeddings = torch.reshape(embeddings, (batch_size, nums_head, max_len, output_dim))
    embeddings = embeddings.to(device)
    return embeddings


# %%

def RoPE(q, k):
    # q,k: (bs, head, max_len, output_dim)
    batch_size = q.shape[0]
    nums_head = q.shape[1]
    max_len = q.shape[2]
    output_dim = q.shape[-1]

    # (bs, head, max_len, output_dim)
    pos_emb = sinusoidal_position_embedding(batch_size, nums_head, max_len, output_dim, q.device)


    # cos_pos,sin_pos: (bs, head, max_len, output_dim)
    # 看rope公式可知,相邻cos,sin之间是相同的,所以复制一遍。如(1,2,3)变成(1,1,2,2,3,3)
    cos_pos = pos_emb[...,  1::2].repeat_interleave(2, dim=-1)  # 将奇数列信息抽取出来也就是cos 拿出来并复制
    sin_pos = pos_emb[..., ::2].repeat_interleave(2, dim=-1)  # 将偶数列信息抽取出来也就是sin 拿出来并复制

    # q,k: (bs, head, max_len, output_dim)
    q2 = torch.stack([-q[..., 1::2], q[..., ::2]], dim=-1)
    q2 = q2.reshape(q.shape)  # reshape后就是正负交替了



    # 更新qw, *对应位置相乘
    q = q * cos_pos + q2 * sin_pos

    k2 = torch.stack([-k[..., 1::2], k[..., ::2]], dim=-1)
    k2 = k2.reshape(k.shape)
    # 更新kw, *对应位置相乘
    k = k * cos_pos + k2 * sin_pos

    return q, k

https://cloud.tencent.com/developer/article/2403895 这篇博客中的RoPE给了另一个角度

2.3 图像视觉领域的绝对位置编码

2.1小节是 batch, seqlen, dim 用于自然语言处理

对于图像视觉领域对图像划分了patch,编码每个patch的位置

input:bchw
output:b2hw

来源:https://github.com/MCG-NJU/SGM-VFI/blob/main/model/position.py

import torch
import torch.nn as nn
import math


class PositionEmbeddingSine(nn.Module):
    """
    This is a more standard version of the position embedding, very similar to the one
    used by the Attention is all you need paper, generalized to wo
Positional Encodings in ViTs 近期各视觉Transformer中的位置编码方法总结及代码解析 1 Positonal Encodings in ViTs 近期各视觉Transformer中的位置编码方法总结及代码解析 最近CV领域的Vision Transformer将在NLP领域的Transormer结果借鉴过来,屠杀了各大CV榜单。对其做各种改进的顶会论文也是层出不穷,本文将聚焦于各种最新的视觉transformer的位置编码部分的设计思想及代码实现做一些总结。 ViT 论文:https://arxiv.org/abs/2010.11929 代码:https://github.com/lucidra 阅读详情

相关推荐

vision transformer(vit)笔记

transformer沐神讲解,笔记

zzcc00的博客 667

torch.nn.functional.embedding的隐藏用法:在位置编码中实现高效查表

本文深入探讨了PyTorch中`torch.nn.functional.embedding`在位置编码中的高效应用,特别是在RoPE旋转位置编码和ViT中的创新实践。通过查表法和内存优化技巧,显著提升了Transformer模型在处理长序列和高分辨率图像时的性能,为自然语言处理和计算机视觉任务提供了实用的工程解决方案。

weixin_29095587的博客 371

Embedding实战指南:从原理到部署的NLP物理接口详解

Embedding是自然语言处理中将离散符号映射为稠密向量的核心机制,其本质是低秩矩阵分解驱动的语义坐标系构建过程。它不仅决定词义相似性计算的准确性,更直接影响RAG检索质量、长文本建模能力与多模态对齐效果。在工程实践中,embedding层的设计选择——如位置编码类型(绝对vs旋转)、tokenizer空格处理逻辑、padding向量初始化方式——会直接引发梯度爆炸、向量空间错位或显存溢出等典型故障。本文聚焦真实项目中的embedding全链路问题,涵盖Hugging Face tokenizer陷阱、R

weixin_33682790的博客 349

大模型架构图解码:从RoPE到MoE的工程实践指南

大模型架构图是连接算法设计与工程落地的关键接口,其本质是一套高度压缩的硬件适配说明书。理解架构图需先掌握Transformer基础结构、位置编码原理与稀疏计算机制,进而识别RoPE参数配置、MoE路由策略等关键技术约束。这些标注直接决定显存占用、推理吞吐与微调可行性,构成模型部署的核心技术价值。在GPU资源优化、长上下文支持、专家稀疏调度等典型场景中,准确解码架构图中的连接线类型、模块维度与激活函数标注,已成为LLM工程师的必备能力。本文聚焦主流大模型架构图中的可执行信息提取方法。

weixin_30904593的博客 360

Qwen系列底层技术解剖:RoPE外推、GQA与多模态对齐机制

大语言模型的长文本处理能力、推理效率与多模态理解性能,本质上由位置编码、注意力架构和跨模态对齐三大基础技术共同决定。旋转位置编码(RoPE)通过复数域旋转变换建模序列顺序,其外推能力直接影响上下文扩展上限;分组查询注意力(GQA)在保持表达力的同时降低KV缓存开销,是平衡显存与延迟的关键设计;而多模态大模型的精准图文定位,则依赖视觉特征空间对齐、位置感知嵌入与跨模态门控等协同机制。Qwen系列正是围绕这三类核心技术展开深度优化:NTK-aware RoPE实现训练-推理一致性长程建模,GQA与FlashAt

weixin_34126557的博客 461

Stata实战:RCS限制立方样条非线性关系建模与P值解读全攻略

本文详细介绍了在Stata中使用RCS限制立方样条进行非线性关系建模的全过程,包括数据准备、节点设置、COX回归模型构建、结果可视化及P值解读。通过乳腺癌临床数据实例,展示了如何捕捉年龄与死亡风险之间的复杂非线性关系,并提供了实用的Stata代码和图形优化技巧。

weixin_30650039的博客 469

论文分享 - OctoMap八叉树建图原理

论文:OctoMap:An Efficient Probabilistic 3D Mapping Framework Based on Octrees。

一只废佐_的博客 2534

手把手教你离线部署Jupyter Notebook及高效插件配置

本文详细介绍了如何在离线环境中部署Jupyter Notebook及配置高效插件,包括离线安装步骤、依赖管理、核心扩展安装及常见问题排查。特别针对金融、科研等封闭网络场景,提供完整的whls包和requirements.txt解决方案,帮助开发者和数据分析师突破网络限制,提升工作效率。

weixin_28839549的博客 581

浅谈功放PA的VBW

摘要:VBW(视频带宽)反映功放的宽带非线性特性和记忆效应,影响数字预失真(DPD)校正能力。其成因是功放管寄生参数(如Cshunt和Leff)形成低频并联谐振,导致供电臂阻抗增大,引发电压波动和记忆效应。测试方法包括双音IM3/IM5测试(以两侧IM3差≥3dB定义VBW)和魔T测试(通过S21曲线测量谐振频率)。改善措施主要是减小Leff,如采用双电源平衡馈电。VBW指标要求通常为魔T测试结果大于3倍信号带宽,以确保功放线性度。

weixin_49761275的博客 1562

Tessent MBIST SDC

主要是两个PROC,tessent_constrain_${design_name}_mentor_ijtag_non_modal和tessent_constrain_${design_name}_mentor_memory_bist_modal。其中,Memory/MBIST controller/MEM Interface可以从func_clk_1来(用func_clk_1和func_clk_2的高频时钟),如图中红色线。其中,SIB和BAP用ijtag_tck的clock,如图绿色线。

po_poo的博客 1969

《LabVIEW ZYNQ实战指南》第6章>>案例解析:基于USB WiFi模块的ZYNQ无线通信部署与Linux RT开发

本文详细解析了如何为ZYNQ开发板部署USB WiFi模块,实现无线通信。通过LabVIEW Linux RT环境,利用封装好的驱动VI,开发者可轻松配置ZYNQ连接无线网络,摆脱网线束缚,实现程序无线部署与远程调试,为工业物联网应用奠定基础。

app77的博客 747

华为OD机试 新系统真题 【数字系统转换器】

华为OD机试 新系统真题【数字系统转换器】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【数字系统转换器】多语言题解。

qq_45776114的博客 524

vue3+vite:引入tailwindcss不生效的原因,详细解决Tailwind配置没问题但就是不生效的情况,配置正确无报错但样式没有生效(包括tailwindcss在Vue2使用不生效解决方案)

vue3 tailwind使用教程以及tailwind不生效的问题,vue3+vite引入tailwindcss不生效的原因,tailwindcss配之后不生效怎么办,如何解决tailwinscss不生效的原因,Vue3项目使用tailwindcss在Vue2使用,不生效解决,如何解决使用 Tailwind CSS 后出现的样式不生效的问题?tailwindcss配之后不生效 tailwindcss不生效,为什么我的 Tailwind css 类没生效,解决使用 Tailwind 时样式不生效的问题,配置没

✅ 精选推荐文章 4125

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: windows系统更新nvidia 驱动, 并安装pytorch
下一篇: MOE介绍
tony365
博客等级 码龄11年 2万+粉丝 243原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值