目录
一、概述
NGP(Neural Graphics Primitives)是一种基于神经网络的图形基元,使用全连接的神经网络进行参数化,其训练和评估成本可能很高。
作者提出了一种多分辨率哈希编码方法,该编码具有自适应性和高效性的特点,可用于改善神经网络输入以提高近似质量和训练速度。多分辨率结构允许网络消除哈希冲突的歧义,从而形成一个简单的架构,可以在现代 GPU 上并行化。
作者将多分辨率哈希编码应用到全融合的CUDA内核,使得NGP得以利用其并行性,从而减小带宽和计算上的浪费。最终能够在几秒钟内训练得到高质量的NGP,并在数十毫秒内以1920x1080的分辨率进行渲染,故称Instant-NGP。
二、原理介绍
多分辨率哈希编码(Multiresolution Hash Encoding)具有自适应和高效的特点:
- 可以应用在多种场景表示,如 Gigapixel图像、sdf(符号距离场)、nerf(神经辐射场);
- 哈希查找的时间复杂度是O(1),无需控制流,在GPU上表现出色,避免了执行分歧和串行指针跟踪;
- 结合了多个不同分辨率的层次,以捕捉场景中的粗糙和精细特征。
具体实现原理如下:
- 对于给定的输入坐标x,在不同分辨率级别上找到包围它的体素,并通过对整数坐标进行哈希映射的方式,为这些体素的角(顶点)分配索引。
- 对于所有生成的角索引,从哈希表中查找相应的F维特征向量。
- 根据x在相应体素中的相对位置对这些特征向量进行线性插值。
- 将每个级别的特征向量以及辅助输入 𝜉∈ R𝐸 连接起来,得到 MLP 的输入编码 𝑦 ∈ R𝐿𝐹+𝐸。
- 最后,通过反向传播损失梯度(loss gradients)来训练编码,梯度将通过MLP网络(5)、连接(4)、线性插值(3)反向传播,然后累积到查找到的特征向量中(2)。
三、实现细节
作者在CUDA中实现该多分辨率哈希编码,将其与tiny-cuda-nn框架的快速完全融合的MLP相结合,下面是一些具体实现细节:
-
性能考虑:为了优化推理和反向传播性能,哈希表条目以半精度(每个条目2字节)存储。同时,维护一个全精度副本以稳定混合精度参数更新。
-
分级计算:作者按级别评估哈希表,在处理一批输入位置时,仅需小部分连续哈希表保留在缓存中,从而充分利用GPU的缓存和并行性。
-
模型结构:除了NeRF场景之外的任务,MLP的结构包括两个宽度为64个神经元的隐藏层(使用ReLU激活函数)和一个线性输出层。
-
最大分辨率(Nmax):使用较大的值可以支持在广阔场景中靠近物体时的高质量渲染。
- 对于NeRF和SDF,最大分辨率被设定为场景尺寸的2048倍;
- 对于gigapixel image(十亿像素图像),最大分辨率被设定为图像宽度的一半;
- 对于辐射缓存(Radiance Cache),最大分辨率被设定为219。
-
初始化:作者根据相关文献,对神经网络权重进行初始化,为神经网络各层的激活及其梯度提供合理的缩放;使用均匀分布 U(−10−4, 10−4) 对哈希表条目进行初始化,以提供一些随机性。
-
训练:作者使用