【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)

论文基本信息
作者:THOMAS MÜLLER,NVIDIA,瑞士ALEX EV ANS,NVIDIA,英国CHRISTOPH SCHIED,美国NVIDIA ALEXANDER KELLER,德国
关键词:
Image Synthesis, Neural Networks, En-
codings, Hashing, GPUs, Parallel Computation, Function Approximation
发表时间:2022

摘要

Abstract: 由完全连接的神经网络参数化的神经图形基元的训练和评估成本可能很高。我们通过多功能降低成本新的输入编码允许在不牺牲质量的情况下使用更小的网络,从而显着减少浮点数和内存访问操作:通过可训练特征向量的多分辨率哈希表增强小型神经网络,其值通过随机梯度下降优化。多分辨率结构允许网络消除散列冲突的歧义,使一个简单的在现代 GPU 上并行化的架构是微不足道的。我们利用这个通过使用完全融合的 CUDA 内核实现整个系统来实现并行性,重点是最大限度地减少浪费的带宽和计算操作。我们实现了几个数量级的综合加速,使在几秒钟内训练高质量的神经图形原语,1920×1080分辨率下几十毫秒渲染。
SIGGRAPH 2022

【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第1张图片

Instant-NGP 源码阅读 参考的是一个torch的实现方式
原始仓库为:https://github.com/yashbhalgat/HashNeRF-pytorch
论文使用的仓库为:https://github.com/xunull/read-HashNeRF-pytorch

可以在训练很短的时间内就将图像表现得很清晰
NGP
特点
训练速度快
使用cuda编程
核心
使用多分辨哈希编码

内容记录

核心思想
这篇文章提出了一种对输入做哈希encoding的方式,来让很小的网络也能学到很高的质量。
之所以小网络就可以学到很好结果是因为,它把很多可学习的特征存在了多个不同分辨率的哈希表里,让那些feature来承担了很大部分的学习负担。

一些编码方式:
【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第2张图片

参数化编码

思路
对于神经网络,它们把数据信息存储在了网络权重中,但信息完全存在网络中会导致计算很慢,网络表达能力也会受到的限制。
于是考虑把latent feature用结构化的方式存储,比如存在3d grid上,这样表达能力不会受到网络权重数量的限制,每次bp的参数也只和3d grid对应的cell还有小网络相关,训练时间大大缩短。
但是,3d grid这种结构化数据其实是很浪费的,因为只有表面信息是有意义的,绝大多数cell是空的。用acorn那样的树形数据结构可以减少内存以及需要训练的数据量,但是训练过程中动态维护树的结构,带来比较大的开销。
所以它就提出了一种多层次的hash encoding方式,来解决像acorn这样的树形结构存在的弊端。它其实就是提出了用多分辨率的哈希表这个数据结构来存feature。

具体操作
【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第3张图片【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第4张图片(1)分层
先把现在的定义域划分成不同resolution的L层,比如下图中的红色和蓝色线就划分了不同resolution的格点。
【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第5张图片

这里的蓝线划分的格点就是L0,红色的是紧跟着下一层的L1

【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第6张图片

确定好最精细和最粗糙的grid划分的resolution之后,中间层的resolution通过等比级数计算得到。

这里的b是通过Nmax(最精细resolution)和Nmin(最粗糙resolution)算出来的一个系数。然后l是指第多少层。
(2)哈希
然后把不同层的grid全都映射到这个层对应的一个哈希表里。
【无标题】Instant NGP(使用哈希编码的多分辨率的即时神经图形原语)_第7张图片

比如这里的蓝色格点的0417/粉色格点的2036都映射到了哈希表的对应位置
最理想的情况当然是最精细的resolution下,每个格点也能有一个在哈希表上对应的位置来存它的feature,但是这会很费空间。所以这篇文章设定了哈希表最大的一个T。现在蓝色和红色情况下,格点数小于T,所以每一个grid都有一个对应的哈希槽来存它的feature。但如果grid数大于这个T,那通过哈希函数的映射后,很多格点会对应到哈希表上同一个位置。这里为了节省时间/空间,它不对hash collision做任何处理,如果算出来哈希值一样,那就用同一个feature来刻画这些格点。
(3)线性插值
每个点都是由周围格点的线性插值来得到自己的feature。

见(3)linear interpolation
(4)网络学习
然后它把这个点和它对应的所有层的feature全都concat起来喂给网络去学习。见上图的(4)操作。
几个着重强调的问题
这篇文章又着重强调了几个issue。

  1. performance & quanlity
    它很快,占用的空间很小,但是它对应的质量是否也很好?如果我们想要提高质量要怎么做。
    关于这个算法,有F(每个feature的维度),L(multiresolution的层数),T(每层哈希表的最大entry个数)这几个参数,关于这些参数怎么选,这篇文章做了大量实验(见下表)后推荐了F=2,L=16的参数设定。T可以根据对目标精度的要求再定,T越高参数所占空间越大,但是对应的能表达的精度也会越高。

最重要的是这个hash-enconding这个类

模型得输入输出
NeRFSmall(
(sigma_net): ModuleList(
(0): Linear(in_features=32, out_features=64, bias=False)
(1): Linear(in_features=64, out_features=16, bias=False)
)
(color_net): ModuleList(
(0): Linear(in_features=31, out_features=64, bias=False)
(1): Linear(in_features=64, out_features=64, bias=False)
(2): Linear(in_features=64, out_features=3, bias=False)
)
)

你可能感兴趣的:(算法,人工智能,论文阅读)