金桔
金币
威望
贡献
回帖0
精华
在线时间 小时
|
个人理解,这篇paper主要的idea就是用了parameter encoding这个方法做了减少参数/提速,最精彩的地方就是,忽略 hash 碰撞照样可以做的很好。
意思是说,对于函数 f(x; theta),这个 x 可能有一些结构特征,它的影响有局部性(例如 nerf 就是 x 处在三维空间内,对周围的 feature 影响最大),那不如变成 f(y(x; phi); theta),其中这个 phi 参数也是可以 train 的,把它放到一个数据结构(k-d 格点)里存起来。
每次查询 x 的时候,从数据结构里查 x 周围格点的 feature 插值一下作为一个 encoding,然后喂给 f 这个神经网络,输出结果。
这样的好处是,y(x; phi) 可以利用到空间局部性,这样 x 影响的范围大大减少,更好 train 了,参数量也可以降低。坏处是按道理会损失精度。
解决方法是 multiresolution,y 存多个分辨率互相纠正。但过高的分辨率又会导致参数量太大,于是给每个分辨率存 T 个 feature entry,格点会用一个哈希函数映射到 entry 中某一项。因为格点的权重是不一样的,对于一个 feature entry,访问频率高的格点对它的梯度影响更大,虽然频率低的格点也会更新它的梯度,但是相比之下只是噪声而已。另外,多个 resolution 也能缓解碰撞的问题。
所以这个算法生成的结果,在局部会有高频噪声,这也算一个缺点吧,但是无伤大雅。
当然实现上,他们的 tiny-cuda-nn 很牛逼就是了…… |
|