把 positional encoding 的几何轨迹当采样点用:AMD 的一篇 CCGT 2026 文章

## 🎯 一只猫,一个坐标,一个几乎必败的任务 先想象一个画面。 你有一张 1024×1024 的猫图,3 个...

🎯 一只猫,一个坐标,一个几乎必败的任务

先想象一个画面。

你有一张 1024×1024 的猫图,3 个通道(RGB)。再想象一个极小的神经网络——三层 MLP,每层 64 个神经元——你打算用它来存这张图。

网络的输入是一个坐标 (x, y)x ∈ [0, 1]y ∈ [0, 1]。网络的输出是 3 个数字——(x, y) 处的红、绿、蓝。

训练方法很暴力:随机抽 100 万个像素坐标,把网络吐出来的 RGB 跟真实像素比对,反向传播更新权重。3 万次迭代后跑一遍测试集,看 PSNR。

完了。PSNR 大概 18 dB。肉眼一看,全糊了,猫的轮廓融成一片奶白色粥。这就是 Rahaman 等人 2019 年那篇 spectral bias 论文里描述的现象的活样本:MLP 不爱学高频。低频——色块、明暗梯度——学得挺好;高频——边缘、毛发、眼睛的反光——基本放弃。

怎么办?教科书答案是 positional encoding。NeRF 那篇论文里,Tancik 等人把这事儿说开了:把 (x, y) 在送进 MLP 之前,先过一个 sinusoidal 升维。

PE(x, 2i) = sin(x · φ_i) PE(x, 2i + 1) = cos(x · φ_i)

其中 φ_i = 2^i · π 是第 i 个频率。一下子 2D 坐标被吹成 2·L·d 维的高维向量,L 大概取 10。

加上 PE 之后,同样的三层 64 神经元 MLP,PSNR 飙升到 45 dB。这是 NeRF 的核心魔法——也是过去 6 年所有 NeRF 类方法的标配底料。

但故事没完。AMD 的一支团队,在 2026 年 5 月的 ACM CCGT 上,发了一篇叫 PEPS(Positional Encoding Projected Sampling)的论文,问了一个看似简单但其实没人认真回答过的问题:

这串 sincos 出来的数字,到底是什么玩意儿?

不是”它有多长”、”它和 x 的关系有多线性”。而是:它有没有几何含义?

他们的答案很意外:有。每个 x 经过 PE 后,并不是一个无意义的 2L 维向量。它在每个频率下,被投到了 Lissajous 曲线上的一个点。这条曲线对每个 x 都是唯一的。唯一这件事不是平凡的——下面是命题 2.1 的意思、PEPS 用它做什么、为什么有时候省 25% 参数还能涨点准确率。

🗺️ 论文速览

内容
标题PEPS: Positional Encoding Projected Sampling
作者Guillaume Perez, Janarbek Matai, Takahiro Harada
机构AMD(西班牙 / 美国)
会议ACM Proc. ACM Comput. Graph. Interact. Tech., Vol. 9, No. 1, Article 8
DOI10.1145/3806062
发表日期2026 年 5 月
核心一句话把 positional encoding 输出的每一对 (sin, cos) 当成一个查询点,去采样一个共享的 learned-PE encoder(grid、hash grid、multi-grid 都可以),曲线唯一性带来新的高频学习能力。
三个实验Kodak 图像表示、4K 纹理压缩、SDF 表示
关键结果在三个应用上均优于 SOTA;省 25% 参数时仍与 SOTA 持平甚至略胜;硬实例 Pitted Stonefish IoU 从 0.39 提到 0.45
代码配套通过 paper-fetch 配套仓库(README 链接在文末)

🧭 先把”习以为常”翻过来看

学 NeRF 的时候,大家都接受了一个默认设定:PE 是一根升维棒,把低维坐标打成高维向量,剩下的交给 MLP。

但你若稍微停下来,把这个升维过程的几何形状看一眼——你就能看到大多数教程跳过去的东西。

对一个标量坐标 x,PE 在频率 φ_i 下生成两个数:(sin xφ_i, cos xφ_i)

对。(sin α, cos α) 在平面上画出来是一个单位圆上的点。α 在变,对应点在单位圆上转圈。

那对 2D 坐标 (x, y) 呢?PE 在频率 φ_i 下生成四个数:(sin xφ_i, cos xφ_i, sin yφ_i, cos yφ_i)。前两个在 x-y1 平面上画一个圆,后两个在 x-y2 平面上画另一个圆。两个平面叠起来,点的轨迹是个 Lissajous 曲线——19 世纪的物理学家 Jules Antoine Lissajous 在音叉振动实验里第一次仔细画出这种曲线。

论文里有张图(Figure 2)画得很直观。一行 100 个均匀分布在 [0,1] × [0,1] 的点,在原始坐标空间里就是一条均匀的水平线。但送到 PE 里过一遍频率 2、3、4 后,平面上呈现的是一串交错的圆形轨迹,每个频率下一个圆环。

最重要的,是 Proposition 2.1:

> 两个不同的点 (x, y) ≠ (x', y'),它们在 PE 下的 Lissajous 轨迹不可能相同。

证明很短。假设有两组点 A、B 产生同样的曲线。那所有频率下都得满足 sin(xφ) = sin(x'φ),对所有 φ。两个 sin 函数要一样,必须频率相同——2π/x = 2π/x',推出 x = x',矛盾。

这看起来像数学家的消遣,但实质是:PE 把每个坐标点映射到了它自己的、独一无二的轨迹上。两个不同的输入坐标,永远不会落在同一条曲线上。

这意味着什么?意味着当你有一个 grid encoder(learned positional encoding 的一种实现),它本来只在你扔进网格的那个点上查询信息。但如果你接受”PE 把点投到了独一无二的 Lissajous 轨迹上”这个观察,那其实……这些轨迹上的点,每一个都是合法的查询点

这就把 ML 里 positional encoding 的角色,从”高维嵌入”换成了”采样位置的供给器”。

⚙️ PEPS:把 PE 的输出当采样序列

PEPS 的核心算法,写出来短得不像一篇顶会 paper。

给一个 d 维输入坐标 x,选 L 个频率,对每个频率 φ_i 生成两个投影点:

S_i(x) = (1 + sin(x · φ_i)) / 2 C_i(x) = (1 + cos(x · φ_i)) / 2

再加原始坐标 x 自己,得到一个长度为 2L + 1 的点序列 P_x = (x, S_1, …, S_L, C_1, …, C_L)

然后让一个共享的 grid encoder G 对序列里每一个点做查询,得到 2L + 1 个 latent 向量。把这些向量聚起来(concat、相加、按频率分层……),一起送进后面的 MLP。

g = G(x) # 原始点 for i in range(L): g.append(G(sin(x * phi_i))) # PE 投影点 g.append(G(cos(x * phi_i))) # PE 投影点 mlp_out = MLP(g)

就这点事。

直觉上发生了什么?每个频率 φ_i 代表一个”观察尺度”——φ 越大,看到的细节越细。PEPS 不再把这些不同尺度的”观察”加在一起,而是把它们当成独立的取证窗口:每个窗口去 grid 里查自己那部分信息,然后拼在一起送进 MLP。

为啥要在每个频率都用一个单独的网格查询,而不是把它们先线性组合再查?一个反过来的视角是这样:grid 是一个 lookup table。lookup table 的”分辨率”决定了它能区分多近的点。原坐标 x 只查一次,碰到需要表达高频细节的时候,单个格点的区分力就到顶了——多塞一个 latent 向量维度也救不了。但你在不同的位置上各查一次,每次查到的特征是独立的。等于把同一个 grid 的”小格子”通过 PE 的坐标变换铺到了更大的特征空间里。

论文里 Figure 5 把这事讲得很清楚:在固定参数预算下 (10^510^6 区间),普通 BI grid 把分辨率加到大、PSNR 涨不动了。LPE 类似。唯独 Grid-PEPS——只要参数给,它基本线性提升学习能力。换句话说,PEPS 把 grid 的”参数 → 学习力”曲线拉直了

🌸 Pink-PEPS:按频谱分配算力

Grid-PEPS 在数学上干净,但在 RDNA4 GPU 上跑就有点贵了。每次 PE 频率点都查一遍 grid,访存炸了。

论文又做了一件事,我第一次读觉得有点奇怪,但仔细想想发现很自然。

他们用 Kodak 图像和 10 张 4K 纹理,分别画了它们的 2D 功率谱密度(PSD)。两条曲线都呈现一条相当干净的 1/f^α 关系——α 大概在 1 到 2 之间。这意味着自然图像和纹理的能量,按频率递减。高频那边本来就薄。

这意味着原版 PEPS 把每个频率都当”平等的查证窗口”是低效的——高频的频率点本来就只能贡献一点点信号,逼着它和低频用一样多的 latency 通道往 MLP 里灌信息,浪费。

所以 Pink-PEPS 按 1/f 律,给频率 n 分配 d/2^n 维的子向量(最少 1 维):

a_n = max(1, ⌊d / f_n⌋)

f_n = 2^n(Fourier 编码下)。

加上一个移位(不是从 latent 向量的开头开始切片,是从一个偏移位置 G_(n-1) = Σ a_i 开始切),是为了让整个 latent 向量都能收到梯度——否则高频的 latent 那部分永远查不到,训练死掉。

Pink-PEPS 的精妙不在于它”聪明地节约”,而在于它把领域知识——自然图像服从 1/f 律——直接编译进了 encoder 的形状里。这种”算力按数据频谱动态调整”的设计思路,在 Perlin 1985 年那篇图像合成论文里就有,但 PEPS 是把它搬进 INR 的查表机制里第一次工业级地兑现。

最终你拿到的 encoder: – 一个 grid – 每个频率 n 算两份 latent 子向量(cos 和 sin 各一份),但只取 a_n 个维度 – 高频 (n=3, 4, 5, ...) 的子向量越来越短 – 总维度从 (2L+1) · d 压到 d + 2·a_1 + 2·a_2 + 2·a_3 + ...

跑 inference 时,连子向量的整段都不算——直接算 subvec。算力少,结果好。

📊 三个实验,三种 SOTA

PEPS 在三种完全不同的 INR 任务上测过,三种都 SOTA。我分头说。

🖼️ 隐式图像表示(Kodak 数据集)

24 张 768×512 自然图像。压缩比 ~2.7x。MLP 三层 64 神经元,公平比较。

方法PSNR ↑SSIM ↑备注
BI Grid45.300.992基准
LPE45.060.992经典包装
NTC_N44.870.992业界 SOTA(多分辨率)
Grid-PEPS47.720.993单 grid,三个频率
Grid-PinkPEPS47.830.993+ 1/f 分配器
NTC_PEPS48.020.994装在 NTC 架构里
NTC_PinkPEPS48.070.994NTC + 1/f
Grid-PinkPEPS -25%44.890.987减 25% 参数

最刺眼的不是 PSNR 第一名——而是最后一行。参数砍 25%,PSNR 仍然追平 SOTA。换句话说:NTC 的”多分辨率网格 + 频率编码”那套工程极复杂,而 PEPS 用一个普通的单 grid 就拿到了差不多的水平,只是少了 1/4 个参数。

🎨 4K 纹理压缩

18 个纹理集(来自 polyhaven.com),每个集平均 5 张纹理。神经纹理压缩的目标是:给定 (x, y),输出所有 5 张纹理在 (x, y) 处的 RGB。压缩比 14x(94%),减参数版 18x(95%)。

PEPS 全版本几乎在所有 8 种纹理类型上(AO、armature、roughness、specular、displacement、normal、metal、diffuse)都超出了 SOTA。Pink-PEPS 在 parametric budget 卡得紧的时候优势特别明显。

方法平均 PSNR ↑平均 SSIM ↑
LPE40.210.95
NTC_N40.200.95
BI Grid41.250.95
Grid-PEPS-4F41.230.95
Grid-PinkPEPS-4F41.440.95
NTC_PEPS41.790.95
NTC_PinkPEPS41.890.95
Grid-PinkPEPS-25%40.030.94

还有一个很少有论文愿意报的指标——inference 渲染时间,PEPS 在 RDNA4 上跑出来了:BI grid 4.32ms,Grid-PEPS 5.47ms(+26.6% 开销),Grid-PinkPEPS 4.86ms(+12.5%)

PEPS 不是廉价替代品,但 Pink-PEPS 几乎不影响实时性。

🗿 有符号距离场(SDF)

3D 形状的隐形表示。512³ 体素,比图像 / 纹理压缩都极端(压缩因子 227x,99.6% 压缩)。四种 SDF 实例:Lucy、Pitted Stonefish、Thai Statue、Armadillo。

PEPS 在全局 IoU 上 0.816,超过 Grid 的 0.799、LPE 的 0.793、PE 的 0.770。

但最让我盯着看的是 Pitted Stonefish——这是一个高细节、有内部结构的硬骨头。普通 grid IoU 只有 0.390,hash grid 惨到 0.242(L1 损失下),其他所有方法在这个 instance 上都崩。

Grid-PEPS:0.470。

这是大幅跃升。

附录里 Table 4 还有更有说服力的:换 L1 loss,Grid-PEPS 在 Stonefish 上到 0.453。其他方法把网格分辨率加 8 倍从 32 涨到 64,才到 0.456。换句话说,Grid-PEPS 用 8 倍少的参数,达到了同等的硬实例学习能力

为什么硬实例上 PEPS 优势特别突出?我猜(论文没明说,但 Figure 9 的 Flip error 图有暗示):PEPS 的高频采样”窗口”在高曲率区域(纹路密、有内部结构)里能抓到更多独立信号,普通 grid 在这种区域的格点区分力到极限。

🔩 一个细节我反复看才搞懂

PEPS 的一个微妙设计:它用同一个 grid 共享所有频率的查询,不是每个频率开一个独立 grid。

我第一遍以为这是省参数。读 Appendix A 才看明白——关键不是省,是梯度流

如果每个频率一个独立 grid,高频那个 grid 在训练数据稀疏的位置上根本收不到梯度信号(因为只有少部分坐标位置会落到那个 grid 的”高频格点”的临近区域)。训练死。共享 grid 等于把高频查表”挂”在低频的主流量上,让梯度自动从所有频率回传,整个 latent 向量都有更新。

这种”共享参数 + 频率偏移”的设计哲学,跟 multi-resolution hash grid 的”金字塔多 grid”是镜像——后者是想用不同分辨率覆盖不同频段,前者是用同一个 grid 但从不同位置查询。论文里 Table 1 里 Grid-PEPS 39% 完胜 NTC_N 这条就已经说清楚了,NTC 多 grid 设计在表征高频时的边际收益很低,因为 multi-resolution 那条”高分辨率的网格”自己训练不出来。

🧪 它真的比 Hash Grid 强吗?

这是个尖锐问题。Hash Grid(InstantNGP, Müller 2022)是过去几年 INR 的旗舰方法。它用 hash 函数把任意分辨率的查询都映射到一个固定大小的 hash 表里。理论上 hash grid 可以几乎无限分辨率。

PEPS 论文把这件事测了——SDF 实验 Table 3:

– Hash:0.547(global IoU) – Hash-PEPS:0.731

差距 18 个百分点。Hash-PEPS 把 hash grid 的硬实例失败率(Stonefish 从 0.339 提到 0.428)显著修好了。

原因可能是 hash collision——hash grid 在小 hash 表里注定有碰撞,输出位置相近的查询会被投到同一个 hash bucket 里,分辨率到顶。PEPS 通过加另一组查询点(cos 在不同频率上的点),相当于给 hash grid 额外的独立窗口——不同频率下的查询会落在不同 hash bucket 里,缓解碰撞。

所以 PEPS 不是在抢 Hash Grid 的饭碗,而是 Hash Grid 的一个非常顺手的扩展。

🪞 我没在论文里看到的几个疑问

我读了三遍,挑三个我觉得值得继续想的问题。

1. Pink-PEPS 真的通用吗?

Pink 假设数据服从 1/f^α。但 3D SDF 数据的 PSD 也是 1/f^α 吗?我猜不一定——SDF 在表面上接近阶跃函数,能量集中在高频。论文里 SDF 实验没单独报告 PSD。α=2 给出 Brownian-PEPS(论文顺带提到了),但没深入测。Pink-PEPS 在 SDF 上是不是还像在图像上一样有效,我没看到数据。

2. PEPS 能不能扩展到频率多于 4?

论文里大部分实验 L = 34。再多频率,理论上每个点变成查询的次数指数翻,但 Grid-PEPS 还能撑。论文报告 L=4 时 Pink-PEPS 比 L=3 反而慢(5.0ms vs 4.86ms)——查表开销相对独立的 subvec 计算优势。

是否有更优雅的方法去组织频率金字塔,而不是简单的 subvec 拼装?我没看到答案。

3. 真正的”理论解释”还在路上

论文的 Propostion 2.1 证明了 PE 不同点产生不同轨迹。但为什么这些不同的轨迹在同一 grid 的查询能合并成比单独查询更好的表征?这是个开放问题。一个直观的理由是:每个频率下的查询对应一个不同的”取证角度”,用 grid 共享参数把它们合到一起,至少能保证不会比任何单一角度更差。但这个解释要严谨起来需要量化的 spectral analysis,论文没给。

🧱 一个 cargo cult 检查

我觉得这个故事有一个 cargo cult 风险值得点出来。

过去几年,”再加一个频率项”在 INR 文献里几乎成了默认操作。位置编码本身就是这么来的(Vaswani 2017),然后 Fourier features、Hash Grid、Multi-Resolution Grid、Wire(Wavelet implicit neural)、SIREN(periodic activations)、Local Positional Encoding…… 工具越来越多。

它们之间的差异在哪儿?很多论文的差异是工程经验性的——PSNR 表里领先一两个 dB,渲染时间慢 5%,还有一个 LPIPS 数字好看一点。但理论的进步在哪里?

PEPS 的贡献是清楚的:它指出了一个被忽略的几何含义——PE 的每一对 (sin, cos) 输出都是一个 Lissajous 曲线上的点,且这些点对每个输入坐标唯一。这个命题给”为什么在不同频率下多个查询有用”提供一个完全不依赖调参的解释。

说它是”解释”而不是”现象”,是因为 Proposition 2.1 + 信息论的直觉(每个频率查表相当于独立证据)起码给了一个为什么

而绝大多数同代工作的”为什么”是看着表挺好

我不是说那些工作不好。但 PEPS 在这里有一种清亮——终于有一篇论文同时给了实证和解释

⚖️ 谁该读这篇,谁可以略过

适合的读者: – 做 NeRF / INR / 神经纹理压缩 / SDF 表示的研究者和工程师 – 对 implicit representations 的表征理论好奇的人 – 想看一个简单几何观察如何颠覆一个工程领域的范例

可以略过的部分: – 第 5 节(Kodak 实验数据):如果你只关心方法,可以跳过具体表格看趋势 – Appendix B、C、D:实验细节,几小时就能扫完

不适合的读者:如果你想找一个干净的 SDK 来直接接进你的代码库——论文配套的开源还没明确写出(CCGT 论文的代码传统上滞后),要看 AMD GitHub 是否后续释放。

🧭 一些带走的东西

如果你读到这里,回去重读 PE 公式 sin(x·φ), cos(x·φ),你看到的会是不一样的两个东西。

你会看到它们不是把坐标打乱的符号游戏,而是把坐标在 Lissajous 轨迹上的一个动作。每个频率代表一条曲线,每个输入对应曲线上一个唯一的位置。这是一种类似几何哈希的几何嵌入——只不过它早就在 Transformer positional encoding 里就存在了,只是没人把它当坐标用。

你还会看到这个几何嵌入给网格查询一个完全天然的分解——”每一个频率是一个独立的取证窗口”,不需要任何额外的设计直觉。再加上一个 1/f 的算力分配器(Pink-PEPS),就拿到了一个工业级的表征 encoder。

还有一个更抽象的启发:当一个工具被用了很久、且大家都在用、且没人解释为什么有用,那它大概率有一些被忽略的几何

PEPS 找到的这个几何,足够简单——Lissajous 曲线的唯一性——让你读完之后有种”我为什么没早看到”的挫折感。这通常是一个好问题被解决的标志。

📚 参考文献

1. Perez, G., Matai, J., Harada, T. (2026). PEPS: Positional Encoding Projected Sampling. Proc. ACM Comput. Graph. Interact. Tech. 9, 1, Article 8. DOI: 10.1145/3806062.

2. Mildenhall, B., Srinivasan, P., Tancik, M., Barron, J., Ramamoorthi, R., Ng, R. (2021). NeRF: Representing scenes as neural radiance fields for view synthesis. Communications of the ACM 65(1): 99–106.

3. Müller, T., Evans, A., Schied, C., Keller, A. (2022). Instant neural graphics primitives with a multiresolution hash encoding. ACM TOG 41(4): 1–15.

4. Rahaman, N., Baratin, A., Arpit, D., et al. (2019). On the spectral bias of neural networks. ICML.

5. Tancik, M., Srinivasan, P., Mildenhall, B., et al. (2020). Fourier features let networks learn high frequency functions in low dimensional domains. NeurIPS.

6. Vaidyanathan, K., Salvi, M., Wronski, B., et al. (2023). Random-Access Neural Compression of Material Textures. ACM TOG 42.

7. Fujieda, S., Yoshimura, A., Harada, T. (2023). Local Positional Encoding for Multi-Layer Perceptrons. Pacific Graphics.

8. Vaswani, A., et al. (2017). Attention is all you need. NeurIPS.(positional encoding 原始出处)

9. Lissajous, J. A. (1857). Mémoire sur l’étude optique des mouvements vibratoires. Mallet-Bachelier.

10. Field, D. J. (1987). Relations between the statistics of natural images and the response properties of cortical cells. JOSA A 4(12): 2379–2394.(1/f 律的基础来源)

📎 附录:为什么我在意这篇论文

这不是一篇”参数多一点、PSNR 高一点”的论文。它找到一个被忽略的几何含义,再用这个含义解一个工问题。

写它的人还在 AMD 工作——做底层硬件和编译器的公司,发一篇图形学顶会,里面用了 Radeon RX 9070 XT 实测 inference 时间。这说明两件事:(a) AMD 把 GPU 卖给研究界,不只是嘴上的姿态,是真的让研究者上 RDNA4 跑 inference 测真实 latency;(b) 这篇工作的实用性是经过真实硬件审查的,不是纸面数字。

这两个信号合在一起让 PEPS 比”又一篇文章”更可信。

它也提醒我一件事:当工具在社区里被广泛接受(六年前 NeRF 引进 PE 到现在),它的几何含义——那个最初的、简单的、几乎看不见的性质——值得回头看一眼。可能就在那里,藏着下一个解法。

发表回复

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网 🐾 智柴网 沪ICP备2024052574号-1