news 2026/3/2 6:41:48

vit创建一组可学习的位置编码是怎么初始化的,怎么体现不同位置的

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
vit创建一组可学习的位置编码是怎么初始化的,怎么体现不同位置的

❓1. ViT 的可学习位置编码是怎么初始化的?

❓2.不同位置的信息是怎么体现的?


一、ViT 的可学习位置编码(pos_embedding)是怎么初始化的?

非常简单:它就是一块 learnable 参数矩阵

pos_embedding=nn.Parameter(torch.zeros(1,num_patches+1,embed_dim))

也就是说:

  • 初始值通常是全零正态分布随机初始化(取决于实现)
  • 它和模型的其他权重一起被训练

OpenCLIP/CLIP 的实现是正态初始化(这个更常见):

nn.init.normal_(self.positional_embedding,std=0.02)

对应形状举例:

pos_embedding.shape=[1,197,768]# ViT-B/16

🟥关键点:初始时,位置编码并没有“位置含义”

刚开始训练时:

pos_embedding[1] 跟 pos_embedding[100] 没有区别 它们都是随机数

位置结构不是靠初始化给的,而是靠训练学出来的


🔥二、那不同位置的信息是怎么体现的?(核心原理)

⬇️ 下面是你要的核心答案 ⬇️

🌟不同 patch 具有不同的“index”,每个 index 对应一个独立的向量。

也就是:

pos_embedding[0] = CLS 的位置 pos_embedding[1] = 左上角 patch 的位置 pos_embedding[2] = 第二个 patch 的位置 ... pos_embedding[196] = 右下角 patch 的位置

注意:

  • 位置 1 和位置 2 的向量是不同的参数
  • 它们会在训练中被优化,分别学出“这个位置在哪个地方”

🔧三、为什么加上位置编码后 patch 会有空间信息?

模型输入:

x[i]=patch_feature[i]+pos_embedding[i]

Transformer 的 Q/K/V 是从x[i]线性变换来的:

Q_i = Wq * x[i] K_i = Wk * x[i] V_i = Wv * x[i]

每个位置都变成不同的 Q/K/V,这意味着:

  • patch(左上) 的注意力行为 ≠ patch(右下)
  • patch(最上) 会更多关注“上下邻近的 patch”
  • patch(最右) 会学到“自己在最右边”

训练过程会将不同的 pos 向量优化成有规律的 2D 空间结构。


🔥四、模型是怎么自动学出来“左上”和“右下”的?

举例:Transformer 在训练时会学习任务(分类或对比学习)。

假设某个任务需要识别“猫在左边还是右边”。

梯度会让:

  • 左边 patch 的 pos_embedding 学成一组特征分布
  • 右边 patch 的 pos_embedding 学成另一组分布

最后会形成一个非常规整的二维结构:

pos[1] ~左上 pos[2] ~靠右 pos[14] ~第二行 ... pos[196] ~右下

你看到的位置结构不是提前设计好的,而是训练自动形成的几何结构


📊五、位置编码如何体现“二维”?并没有特地编码 2D,2D 是训练自动学出来的

ViT 的位置编码本质上是1D 序列位置编码(不像卷积是 2D)。
但因为 patch 排列顺序固定:

行优先:从左到右 → 从上到下

所以:

  • patch[1~14] 代表第一行
  • patch[15~28] 代表第二行

Transformer 看到足够多的数据后会自动学出二维结构。

这已经在大量论文中可视化过 —— 位置编码的 PCA 会形成非常规整的 2D 网格。


🔍六、给你最直观的伪代码

H=W=14# 14×14 patchesN=H*W# 196 patchesD=768# embedding dimpos=nn.Parameter(torch.randn(1,N+1,D)*0.02)patches=embed_patches(img)# [1, 196, 768]x=torch.cat([cls_token,patches],dim=1)x=x+pos# 位置编码加在这里out=transformer(x)image_emb=out[:,0]# CLS = 图像最终向量

🎯七、最终总结(超级简短)

✔ 位置编码初始化

  • 就是一块随机参数
  • 训练的时候自动学出位置结构

✔ 为什么位置不同?

  • pos[i] 与 pos[j] 是不同参数
  • Transformer 在训练中把它们优化成 2D 几何结构

✔ 怎么“体现”位置?

  • 每个 patch embedding 加上自己对应的 pos embedding
  • Q/K/V 带着位置 → 注意力学习空间关系

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/28 4:08:47

为什么加上位置编码后 patch 会有空间信息 需要解释一下

❓为什么“把位置编码加到 patch 上”就能让模型拥有空间信息? 很多人以为:“位置编码只是几个数字,怎么就让模型知道左边右边、上下?”实际上理解这个问题,只需要搞清楚两件事: 🧠 核心机制 注…

作者头像 李华
网站建设 2026/2/24 22:47:08

基于Springboot船舶监造管理系统【附源码+文档】

💕💕作者: 米罗学长 💕💕个人简介:混迹java圈十余年,精通Java、小程序、数据库等。 💕💕各类成品Java毕设 。javaweb,ssm,springboot等项目&#…

作者头像 李华
网站建设 2026/2/28 4:22:50

从原型到产品:融合算子的单元测试、集成测试与持续集成

目录 🔍 摘要 1 🎯 融合算子测试的独特挑战与价值 1.1 为什么融合算子需要特殊测试策略 1.2 测试金字塔模型在算子开发中的实践 2 🏗️ 测试体系架构设计 2.1 多层次测试框架架构 2.2 测试环境容器化部署 3 ⚙️ 单元测试深度实战 3…

作者头像 李华
网站建设 2026/3/1 11:56:53

Servlet原理Mapping问题ServletContext对象

Servlet原理 Servlet是由Web服务器调用&#xff0c;web服务器在收到浏览器请求之后&#xff0c;会&#xff1a;Mapping问题 一个Servlet可以指定一个映射路径 <!--Servlet的路径绑定--><servlet-mapping><servlet-name>hello</servlet-name><url-pa…

作者头像 李华
网站建设 2026/2/26 19:33:00

军事图像分类检测数据集介绍-351张图片 军事身份识别 安全检查辅助 智能监控系统 军事训练分析 历史军事影像分析

&#x1f4e6;点击查看-已发布目标检测数据集合集&#xff08;持续更新&#xff09; 数据集名称图像数量应用方向博客链接&#x1f50c; 电网巡检检测数据集1600 张电力设备目标检测点击查看&#x1f525; 火焰 / 烟雾 / 人检测数据集10000张安防监控&#xff0c;多目标检测点…

作者头像 李华
网站建设 2026/3/2 6:31:37

人机环境系统智能是新理科与新文科的融点

人机环境系统智能&#xff08;Human-Machine-Environment System Intelligence, HME-SI&#xff09;是新理科与新文科的核心融点&#xff0c;其本质是通过人、机、环境的三元交互&#xff0c;实现科学逻辑性与人文非逻辑性的动态平衡&#xff0c;为新理科&#xff08;强调技术、…

作者头像 李华