🎯 一只猫,一个坐标,一个几乎必败的任务
先想象一个画面。
你有一张 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)的论文,问了一个看似简单但其实没人认真回答过的问题:
这串 sin 和 cos 出来的数字,到底是什么玩意儿?
不是"它有多长"、"它和 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 |
| DOI | 10.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^5 到 10^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 Grid | 45.30 | 0.992 | 基准 |
| LPE | 45.06 | 0.992 | 经典包装 |
| NTC_N | 44.87 | 0.992 | 业界 SOTA(多分辨率) |
| Grid-PEPS | 47.72 | 0.993 | 单 grid,三个频率 |
| Grid-PinkPEPS | 47.83 | 0.993 | + 1/f 分配器 |
| NTC_PEPS | 48.02 | 0.994 | 装在 NTC 架构里 |
| NTC_PinkPEPS | 48.07 | 0.994 | NTC + 1/f |
| Grid-PinkPEPS -25% | 44.89 | 0.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 ↑ |
|---|---|---|
| LPE | 40.21 | 0.95 |
| NTC_N | 40.20 | 0.95 |
| BI Grid | 41.25 | 0.95 |
| Grid-PEPS-4F | 41.23 | 0.95 |
| Grid-PinkPEPS-4F | 41.44 | 0.95 |
| NTC_PEPS | 41.79 | 0.95 |
| NTC_PinkPEPS | 41.89 | 0.95 |
| Grid-PinkPEPS-25% | 40.03 | 0.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 = 3 或 4。再多频率,理论上每个点变成查询的次数指数翻,但 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 曲线的唯一性——让你读完之后有种"我为什么没早看到"的挫折感。这通常是一个好问题被解决的标志。
📚 参考文献
-
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.
-
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.
-
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.
-
Rahaman, N., Baratin, A., Arpit, D., et al. (2019). On the spectral bias of neural networks. ICML.
-
Tancik, M., Srinivasan, P., Mildenhall, B., et al. (2020). Fourier features let networks learn high frequency functions in low dimensional domains. NeurIPS.
-
Vaidyanathan, K., Salvi, M., Wronski, B., et al. (2023). Random-Access Neural Compression of Material Textures. ACM TOG 42.
-
Fujieda, S., Yoshimura, A., Harada, T. (2023). Local Positional Encoding for Multi-Layer Perceptrons. Pacific Graphics.
-
Vaswani, A., et al. (2017). Attention is all you need. NeurIPS.(positional encoding 原始出处)
-
Lissajous, J. A. (1857). Mémoire sur l'étude optique des mouvements vibratoires. Mallet-Bachelier.
-
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 到现在),它的几何含义——那个最初的、简单的、几乎看不见的性质——值得回头看一眼。可能就在那里,藏着下一个解法。
讨论回复
加载中...正在加载回复...
推荐
智谱 GLM-5 已上线
我正在智谱大模型开放平台 BigModel.cn 上打造 AI 应用,智谱新一代旗舰模型 GLM-5 已上线,在推理、代码、智能体综合能力达到开源模型 SOTA 水平。