用神经网络表示物体或场景与用神经网络完成任务的区别与联系

目录

  • 前言
  • 二者联系
  • 二者区别
    • 局部与个体,个体与群体的区别
    • 物理约束与抽象约束的区别
    • 训练时的更具体的区别

前言

在读过NeRF,DeepSDF等文章的基础上,结合文章的核心思想与自己做过的idea,总结了一下用神经网络去表示物体或场景与我们一般认知的用神经网络去完成某项任务的区别与联系

二者联系

神经网络是一个通用的、万能的函数近似器,这个结论已经在数学上被严格证明出来了,所以说,不管我们拿神经网络,用深度学习的方法去做了什么看似神奇的事情,其实从本质上来说,都是建立了一个从输入到输出的映射关系,这个中间过程,其实是一种抽象的,复杂的数学变换,我们暂时没有找到合适的、便于理解的、清晰的数学表达式,只能先委屈一下用神经网络来代替了,这也是所谓的神经网络的“黑箱”性质。虽然从局部来看神经网络是个“黑箱”,无法直观的理解神经网络在使用中到底做了什么,但是从上帝视角来看,神经网络其实就是做了一个从输入到输出的函数映射关系的拟合。而这种拟合我们是通过某个具体的数据集,结合loss计算与梯度回传,优化神经网络内部的系数来进行实现的。

拿猫狗分类数据集举例,猫的图片对应着猫这一标签的输出,狗的图片对应着狗这一标签的输出,这就是一个抽象的函数映射关系,我们的目标是用神经网络去拟合这个映射关系,就必须用相关数据集进行训练,训练好之后,就能够将他应用在数据集之外的一些猫狗图像上去了,这其实也是函数拟合任务的最终目的,我的目的是为了得到这个完整的函数(在猫狗分类任务中用神经网络表示),然后去预测一个新的输入对应的新的输出,实现现实生活中的具体问题的处理,达到以不变应万变的效果。所以说,决定一个神经网络的上限与性能好坏的最关键的决定性的因素,不在于我使用的tricks有多么巧妙,我训练次数有多高,我的超参数设置有多么合理,而是在于我们训练(拟合)过程中所使用的数据集质量的好坏。

二者区别

不管使用神经网络去表示物体与场景(比如DeepSDF,NeRF),还是用神经网络完成某项任务(比如猫狗分类任务),其实本质上来说都是进行了输入到输出的一个映射关系的拟合,而二者的不同点在于:

局部与个体,个体与群体的区别

用神经网络去表示物体与场景,是针对某个单一的物体本身而言,我通过这个物体的局部,得到这个物体的函数,进而去预测这个物体的整体,物体的局部对应着采样点的一些集合,最终神经网络训练好之后,能做的事情,也仅仅是针对于这个单一的物体本身,如果换一个物体,就行不通了,还得重新训练;如果是用神经网络去完成某项具体的任务,学习的是整个数据集这个群体的特征(或者说将数据集看做是一个个体,数据集的样本看做是这个个体的局部),训练好之后,对于输入的不同个体,最终都能取得合理的、我们期望的输出

物理约束与抽象约束的区别

仅仅有上面的区别是不够的,我们都知道NeRF仅仅用8层简单的MLP就能简单粗暴地表示一个复杂的场景,也没有使用各种tricks,最终却能得到一个比较好的结果;但是我们要是用简单的MLP来进行图像分类任务的话,可能效果不太好,必须得通过设计一些花里胡哨的loss与正则化处理才能让结果变得稍微好一点。而为什么会造成这种差别呢?原因在于一方面就是上面提及的局部与个体,个体与群体的关系导致的拟合复杂度的问题,而另一方面则是当我们用神经网络去表示物体与场景的时候,整个映射关系是符合我们对物理世界的认知的,也就是说我们是可以直观解释的:

比如DeepSDF,神经网络的输入就是三个数字,分别代表物理世界的三维坐标,神经网络的输出就是这个三维坐标所对应的点到底离我们要表示的物体最近的表面距离与有多少,也就是说这个神经网络就相当于一个场景查询器,给我什么东西,我就负责查询这个东西的属性是什么,甚至说,我用一个简单的函数解析式就能直接表示一个简单的物体,用不到神经网络,之所以用神经网络是因为这个函数解析式在面对复杂物体时会变得复杂,因此我就用神经网络来拟合

而这种直观的解释性,在本身上也形成了我们要拟合的函数的各种约束条件,如果效果不好,我们可以直接根据我们对物理世界的认知去设计更为合理的结构,比如采样点的处理,loss的计算等。但是如果说用神经网络去完成某项具体的任务的话,任务变得抽象起来,比如猫狗分类任务,整个流程下来我们只知道函数的输入与输出的对应关系了,中间的每一步我们都无法根据对物理世界的理解来建模进行约束,因此只能使用一些我们自己都无法完全理解的tricks进行某种抽象的约束,比如各种胡乱调参,残差连接,初始化方式的选择,权值共享,换新的网络架构等等,整个过程越来越抽象,过于注重神经网络的中间结构,而忽略了两端(数据的处理,loss的计算),但是神经网络本身就是一个拟合器啊,从这个拟合器结构本身去进行这个拟合器的内部优化处理本身就没啥多大意义,唯一有指导性的意义个人觉得就只剩下了由神经网络结构所决定的归纳偏置(比如CNN的参数共享决定了CNN的平移不变性,进而适合与特征出现空间位置无关的分类任务)。而用神经网络去表示场景或物体的时候,所谓的归纳偏置就变成了一条条直观的物理定律与数学公式,不再需要我们调整网络结构而赋予,而是显式地成为了整个任务流程的确切的某一部分(比如NeRF的体渲染,就是把归纳偏置直接给写出来了,而不是通过调整神经网络结构实现)

训练时的更具体的区别

与用神经网络完成某项任务相比,用神经网络表示物体或场景本身的具体区别如下:

  • 应用的范围:训练完成时仅仅针对单一物体有效,因此无法做到“以不变应万变”
  • loss的选择:表示场景时,loss简单,并且合理,具有可解释性,即使训练效果不好我也可以基于对物理世界的理解进行合理的优化,比如DeepSDF的loss就是比较一下我预测的距离与ground truth的距离差别有多大,简单而直接
  • 训练数据的区别:用的训练数据是物体或场景身上一个个离散的采样点,从结构上来说比图像之类的数据更加简单,也没啥必要进行数据增强之类,但是或许可以考虑NeRF里的位置编码技巧
  • batchsize的区别:根据我们对一般的神经网络的理解,在训练时是每个epoch跑完一遍数据集,因为内存的限制我们在每个epoch会设置若干次迭代,每次迭代都对应着固定大小的batchsize,而batchsize在编程时也是作为tensor的第一个维度;而用神经网络表示物体或场景时,batchsize成了采样点的数量,跑完全部的采样点算是完成了一个epoch,而因为对内存需求不再紧张,batchsize的大小我们可以根据需要甚至可以直接设置成全部采样点数量,这样一次迭代就和一个epoch等价了
  • 过拟合与泛化的区别:用神经网络表示物体或场景时,“过拟合”在这里的意义变成了可能建模的物体会有点“棱角分明”的效果,可以通过添加光滑度之类的约束优化结果;“泛化性强”在这里的意义成了建模的物体表面会比较平滑。但是这其实并不意味着我们训练的效果“泛化性”越强越好,这个得根据物体或场景本身的属性以及我们的任务目标来判断!!!比如复杂的场景需要“过拟合”才可以更好地还原许多细节,不然可能会一片模糊(NeRF里面使用的是位置编码解决的场景模糊问题,或许这是一种实现“过拟合”的方式)
  • 训练数据的联系:对于一般的神经网络训练来说,数据集里的每个样本都是一个独立的个体,可以看做是一种彼此之间互不关联的分布,但是当我们用神经网络来表示物体或场景本身时,我们或许应当考虑一下每个采样点之间的关联性吧,或许是得引入某种先验假设?或许训练的时候采样点的顺序会对结果造成一定的影响?

你可能感兴趣的:(#,三维重建,神经网络,机器学习,深度学习)