- Published on
理解 3D 中的位置编码
引言
原始坐标只能告诉模型“点在哪里”,却不能告诉模型“空间应该如何被组织”。在 3D 学习里,这个差别很快就会变得关键。网络既要区分那些几何上非常接近、却在细节上不同的点,也要避免让相距很远的位置在表示空间里变得过于相似。一个好的位置编码,必须同时服务于这两个目标:对局部细节敏感,同时保留全局空间分离能力。
这也是为什么位置编码并不只是 NeRF、点云模型或坐标网络里的一个技术附件。它本质上是在把 x 或 (x, y, z) 这样的朴素坐标,变成一个更适合几何学习的特征空间。真正有意思的问题并不是“要不要做位置编码”,而是“这种编码究竟给空间施加了怎样的结构偏置”。
这篇文章沿着一条比较清晰的脉络往下走:先把 Fourier / NeRF features 当作基线,再看 PMPE 如何修正它们的周期性歧义,然后看 Cube3D 风格实现怎样把这个想法落成可计算的 embedding,最后再扩展到更广义的可学习空间编码。
Fourier Features 作为基线
传统的 Fourier positional encoding 会把坐标映射到多组不同频率的正弦和余弦响应上:
它之所以有效,核心原因其实很直接。低频通道变化慢,更适合表达粗尺度的空间结构;高频通道变化快,能把很小的空间差异放大出来。也就是说,位置编码并不是要求网络自己从原始坐标里硬学出多尺度结构,而是先把这种结构显式暴露在输入特征里。
这也是为什么 3D 论文里总会出现“频率”这个词。这里的 frequency 不是说物体在振动,而是说特征值随着坐标移动变化得有多快。物体的大轮廓更容易由慢变化的通道描述,而细腿、尖角、狭窄边界这类细节,则更依赖快速变化的通道。
第一个 demo 最好分两步看。Positional Encoding 面板展示的是一个坐标如何被展开成多通道表示;Dot-product Similarity 面板展示的是两 个编码后的位置在特征空间里会有多相似,这一点对 attention 类模型尤其关键。也正是在第二个视角里,Fourier baseline 的优点和缺点会同时暴露出来。
Traditional Fourier / NeRF Positional Encoding
This demo shows how a 1D position x in [-1, 1] is expanded into many sine/cosine channels with different frequencies. The left plot shows the encoded values. The right plot shows how similar two positions look after encoding.
Vertical axis: input position x. Horizontal axis: encoding channel. White or dark line: the currently selected position.
Horizontal axis: position x_j. Vertical axis: position x_i. The cross shows the selected position.
This sparkline is the encoded feature vector of the selected x. Each point corresponds to one cosine or sine channel.
- More frequencies means more fine-scale variation, so nearby positions become easier to distinguish.
- The main diagonal in the similarity plot is bright because a position is always most similar to itself.
- Stripe-like off-diagonal patterns come from periodicity. They hint that some far-away positions can still look similar after encoding.
Fourier features 的优势在于简单、多尺度、而且在实践中确实有效。但它也天然带着周期性。因为正弦和余弦本身会重复,相距很远的两个位置仍然可能在部分通道上产生相似模式。放到 similarity plot 里,这通常会表现为主对角线之外的条纹结构。也就是说,它很擅长表达细节,却不总能把全局位置分得足够干净。这正是 PMPE 要切入的问题。
PMPE:降低周期性歧义
PMPE,也就是 Phase-Modulated Positional Encoding,是从 Fourier baseline 的一个明确缺陷出发的:如果整个编码几乎完全由周期函数组成,那么一部分歧义其实是结构性的,而不是训练不充分导致的。它的目标不是抛弃 sinusoidal features,而是在保留细节敏感性的同时,让相似性几何更接近真实空间关系。
概念上,PMPE 会在 Fourier-style branch 之外,再加上一条 phase-modulated branch:
这里最重要的不是符号本身,而是设计思路。PMPE 是一种叠加式修正。Fourier 分支继续提供多尺度细节,phase-modulated 分支则负责调整全局上“哪些位置会对齐在一起”。所以它追求的并不是“更多频率”,而是“更少的远距离误相似”。
比较 demo 其实就在说明这一点。相对于纯 Fourier baseline,主对角线仍然保持得很强,但远离主对角线的重复条纹会被削弱。结果就是:局部敏感性还在,但全局 similarity pattern 没那么容易误导模型了。
Traditional Fourier vs PMPE
This demo compares the classic Fourier-style positional encoding with a phase-modulated version. The goal is to show how PMPE keeps structured variation while reducing misleading global periodic similarity.
Traditional Fourier / NeRF Encoding
Vertical axis: input position x. Horizontal axis: encoding channel.
Horizontal axis: position x_j. Vertical axis: position x_i.
Phase-Modulated Positional Encoding (PMPE)
Vertical axis: input position x. Horizontal axis: encoding channel.
Horizontal axis: position x_j. Vertical axis: position x_i.
- In the traditional Fourier version, repeated stripe-like off-diagonal patterns often appear in the similarity matrix because of periodicity.
- In the PMPE version, the similarity structure is usually more spatially coherent, meaning distant positions are less likely to look accidentally similar.
- The core goal of PMPE is not to remove detail, but to improve how global spatial separation is reflected in the encoded space.
对 3D 模型来说,这种变化很重要,因为空间编码常常处在邻域选择、相似性打分或 attention 之前。如果两个本该分开的远距离位置在编码后看起来过于相似,模型就可能把不该混在一起的信号混掉。PMPE 有意思的地方就在于,它直接对准了这个失败模式,同时又不牺牲 Fourier features 原本最有价值的细节表达能力。
从 PMPE 到 Cube3D 风格的嵌入
当 PMPE 还是一个设计想法时,下一个自然问题就是:它在真实模型里长什么样?Cube3D 风格的写法把这种叠加直觉变成了一个可实现的 embedding 形式:
其中
这里的 是可学习投影, 是 carrier term。
这两条分支承担的职责并不一样。f_m = xW 这部分保留了 sinusoidal encoding 的核心逻辑,但把投影从固定频率变成了可学习形式。模型不再被手工设定的一组 basis 限死,而是可以自己决定哪些空间方向、哪些频率组合更重要。p_m 则额外提供了一种更有组织的全局 phase pattern,让表示空间不至于完全依赖重复的周期响应来组织。
真正关键的设计选择在于“加法”。Cube3D 风格的 PMPE 不是想把 Fourier features 全部替换掉,而是在保留其表达偏置的同时,用额外的 phase structure 去修正它的全局缺陷。从这个角度看,它更像是 PMPE 思想的工程化落地,而不是一个完全无关的新家族。
下面这个 demo 仍然是在简化的 1D 场景里展示同样的逻辑。第一幅图看的是通道响应,第二幅图看的是一个点周围的相似性场如何被组织起来。它的目标不是复现完整论文实现,而是把 learnable projection 和 phase structure 的配合关系直观地展示出来。
Cube3D-Style PMPE
This demo visualizes a simplified 1D version of a Cube3D-style phase-modulated positional encoding. It combines a learnable Fourier-like branch with a structured phase branch, then adds them together to form the final embedding.
Vertical axis: input position x. Horizontal axis: encoding channel. The highlighted line marks the selected position.
Horizontal axis: position x_j. Vertical axis: position x_i. The cross shows the selected position.
This sparkline shows the full embedding vector of the selected x, including the raw coordinate channel and the combined cosine/sine channels.
- Frequencies control how many combined channels are used.
- Seed changes the learnable Fourier-like projection, which slightly changes the detailed stripe pattern.
- The main idea is that the final embedding is formed by adding a Fourier-like branch and a phase-modulated branch together.
当编码变成可学习之后,会发生什么
PMPE 仍然和 Fourier 世界观很接近:坐标先进入一组结构化函数,问题在于这些函数该如何设计得更好。而一旦编码本身开始显式可学习,设计空间就会沿着多个维度同时打开:fixed basis 和 learned basis、absolute coordinates 和 relative offsets、function-based encoding 和 memory-based encoding。
最后这个 demo 有价值的地方在于,它并没有把这些方法混成一个模糊的大类,而是拆成三个 tab,分别暴露出“到底是谁在被学习”。
Learnable Fourier Features
最小的一步变化,就是让 Fourier projection 本身可学习。与其提前固定频率,不如让模型根据目标信号去调整 basis。这样做保留了 Fourier features 的多尺度风味,但频率基底不再只是手工先验,而变成了可训练结构。
在 demo 里,这个想法被实现成了一个很小的浏览器端训练循环。紫色曲线是固定的 target signal,它由几组不同频率的正弦波叠加而成;绿色曲线则是一个可学习模型:
这里可学习的并不只是系数 ,还包括每个 basis element 的频率 和相位 。Basis count 控制模型有多少个可学习余弦项,Learning rate 控制每次梯度更新的步长,Seed 控制随机初始化。Pause 和 Reset 则让你能明显看出:这不是预录好的动画,而是真的在浏览器里实时优化。
右侧的 frequency chips 也很重要。它们显示的是当前学到的频率幅值,所以这个 tab 要表达的不只是“绿色曲线越来越贴近紫色曲线”,而是“basis 本身在训练过程中也在移动”。
Relative Position Bias
另一条重要分支,是从 absolute position 转向 relative position。很多几何模型真正关心的不是“这个点在世界坐标里绝对位于哪里”,而是“它相对于另一个点发生了怎样的位移”。因此,可学习 relative encoding 的核心价值,是让模型直接学习一个局部偏置场。
在这个 tab 里,坐标轴不是世界坐标,而是 (dx, dy):围绕参考点的相对位移。热力图展示的是一个 toy relative-bias field。颜色更亮或更暗,表示某些相对位移被偏好、被压制,或者被区别对待,而绝对坐标本身根本没有进入这个视角。
这个 tab 是刻意做成“概念解释型”的,而不是“从数据训练型”的。实现上,它用的是一个带旋转的各向异性 Gaussian-like core,再叠加一个更宽的 ring term 和 directional oscillation。这样的 toy field 已经足够模拟 learned relative bias 常见的形状变化。Locality 控制有效邻域变宽还是变窄,Anisotropy 控制场在不同方向上的拉伸程度,Rotation 控制主偏好方向如何旋转。这个 demo 想让人直观看懂的一点是:relative encoding 是 displacement 的函数,而不是 absolute position 的函数。
Hash Grids as Spatial Memory
Hash-grid encoding 则比 Fourier 图景走得更远。它不再只用 wave 来描述一个点,而是把可学习特征存到多层不同分辨率的 grid 里,再通过插值把它们取出来。这样一来,表示空间就开始带有“memory system”的味道:局部、多尺度,而且参数效率高。
在这个 tab 里,这种 memory-like 行为被直接可视化了。它先选定一个 anchor point,用多个 grid level 对这个点编码,再把 anchor feature 和空间里其他位置的 feature 做 cosine similarity。图里的十字线就是 anchor,热力图颜色则表示 anchor embedding 和 query embedding 的相似度。
实现上,这里用的是一个刻意简化过的 multi-resolution hash grid。每一层有不同的分辨率;每个 grid vertex 先通过 hash function 映射到一个有限大小的 table;table 里存着一个短的 learned-style feature vector;查询点再对相邻四个顶点做双线性插值;最后把各层得到的向量拼接起来,形成最终表示。Levels 决定参与编码的分辨率层数,Table size 决定哈希存储容量,也就决定了碰撞压力,Anchor x/y 决定当前观察中心,Seed 则会重新抽样整张 toy table 的随机值。
把这三个 tab 放在一起看,会更容易意识到“可学习位置编码”并不是一个单一技巧。Learnable Fourier features 改的是 basis,relative encodings 改的是 reference frame,hash grids 改的是 storage mechanism。这个 demo 不是要复现三条完整训练管线,而是要把每一家到底在学习什么这件事拆开来让你看清楚。
Learned Spatial Encoding Examples
A compact browser-side demo of three learnable or task-adaptive encoding ideas: learnable Fourier features, learned relative bias, and a toy multi-resolution hash grid.
Purple is the target signal. Green is the learned Fourier model. The basis frequencies are trainable.
These are the current learned frequency magnitudes in cycles per unit interval.
结语
从 Fourier features 到 PMPE,再到 Cube3D 风格嵌入,这条脉络本质上讲的是 spatial inductive bias 的演化。Fourier features 给 coordinate network 提供了强有力的多尺度先验,但周期性也让它容易产生全局歧义。PMPE 保留了这种先验的有效部分,再加入 phase structure 去修正相似性几何。Cube3D 风格实现则说明,这个概念性修正最终可以落成一个具体、可计算的 embedding 设计。
而一旦编码本身进入可学习阶段,选择空间就更大了。模型既可以学习自己的 basis,也可以学习 relative bias field,甚至可以学习一套 multi-resolution spatial memory。到了这一步,3D 位置编码就不再是一条固定配方,而是一整族关于局部细节、全局组织和任务适配如何协同工作的设计选择。