【原创】NeRF 三维重建 神经辐射场 建模 算法详解 NeRF相关项目汇总介绍。
牙膏YagaoDirac:
我听说的位置编码的作用是,方便神经网络在相近的一些数据上去做一个判断。比如两个很靠近的像素,一个10,10,10,一个10,10,11,对神经网络来说,就很相似,很难区分,所以要一个区别够大的东西来让他们两个真的很不同。但是我感觉没什么道理。而且nerf的pe好像不是真的把所有像素都区分开,好像只是在空间靠近的像素上制造一个差异,但是比较远的像素是会共用一些编码的。但是我觉得这个解释好像没什么道理,但是就是有效果,就很神奇。
【回复】我在准备一个位置编码的作用的讲解。希望到时捧场[滑稽]
【回复】回复 @chi80 :俩月了,咋还没出呢,催更[微笑]
【回复】我觉得这个说法很有道理也,让我豁然开朗,位置编码在不同周期函数都分布,让神经网络自己去选一个合适的周期去拟合,如果在锐利的边缘,就选择高频的周期作为差异,如果在模糊连续的区域就选择低频的周期去拟合,我觉得很有道理呀牙膏YagaoDirac:
无法编辑自己以前的回复。关于位置编码,我后来观点变了。我觉得位置编码是为了让后续的层的激活不要太靠近0,因为激活太靠近0,反向传播的时候,梯度会迅速减小,从而导致整个神经网络只有最后的2个层是真的被修改了的。我的测试结果是,常规的relu,全连接,只有最后2个层能够被修改。如果换成是正弦,这个问题很大程度上就会缓解,于是后来就有了9层的全连接,全部用sin做激活,得到了非常好的效果。类似的还有一个用高斯函数的。我自己用图片做的2d的类似nerf的小玩具里面,如果坐标使用-1到1,那么在0,0点附近会有一个菱形区域永远是最后得到训练的,也就是abs(x)+abs(y)越小,越需要训练得久,而图片的4个角是可以瞬间ok的,然后ok的区域从4个角开始扩展,逐渐压缩到中间来。我后来测试了在第一层直接把坐标改成-3到-1,同时平行一个1到3,训练速度会快非常多,但是最终收敛精度会比较成问题。我是用float做的,显卡不够力,double会慢一些。娱乐一下而已,没有深入了。我后来还有一个我觉得有点用的测试就是,在反向传播的时候,我在每一层里面,先把得到的梯度做一次类似bn的操作,保证整个向量的长度是1(如果实在不行,那就肯定是0,那没办法了),然后乘以一个我额外指定的数字,然后这个数字渐渐减小,从而得到一个比较好的最终的收敛精度。这个做法可以让普通的全连接relu有更好的可训练性,但是我没深入了。代码在github,我的用户名是yagaodirac,库的名字是pytorch什么什么什么。