很多问题学来已久,但是对一些关键性的概念还是有些模糊,因此特开此贴来整理一下思维和知识路径(一)关于nn网络的一些澄清【问答模式】:
问:如果训练和模型在定义没有关系,那么二者是如何相互作用的呢?
答:训练本身是一个过程,它是将数据输入到模型最终得出结果的一个流程,而模型处理的是基于张量(tensor)数据的结果,你可以认为模型是一个动力核心,而训练是驱动这个动力核心的一个完整过程。
问:如果训练的不是在模型中完成的,那么如何得到loss值?
答:loss的值是处于“观察者”的位置得到的,模型本身是不知道自己训练的结果是否符合标准答案的,因此在训练的过程中我们需要用到backward的反向传播机制来验证模型的准确性,而模型的准确性是由模型之外的交叉熵来定义的
问:如果模型和训练之间不产生联系,那么训练本身是不是就意味着可以和无数模型相关,而模型也可以用于无数的训练?
答:照目前来看,是的,模型作为一个数据处理的过程,和训练是一种平行的关系,我们再关注模型的时候往往要通过训练获取它的准确性,而训练本身却和这种模型不相干,因此相同的模型可以应用到不同的数据,相同的数据也可以应用到不同的模型,这个是没有范式可言的
问:那照这样说,是不是就意味着,模型是一个黑盒机制,在训练的过程中无法查看其结果?
答:不是,有反向传播机制backward也有正向传播机制,这套机制可以帮助我们实现对模型训练过程的掌握
问:什么是forward?什么又是backward
答:
backward是反向传播。
forward是前向传播。
首先来说前向传播,模型在收到数据之后,会将数据发送到指定的层来进行计算,这个过程叫做前向传播,类似于驱动模型运作的一个流程,因为init函数只是定义了模型的结构,而真实让模型运作起来同时得到结果的是前向传播
反向传播则相反,这里用到了导数。在空间几何上,二维的导数是一个值在某个特定的区间的最优解,三维的导数是在三维空间的最优解,而我们知道在nn网络中我们用到了梯度下降算法,当梯度下降时,我们会在一个点寻找它的最小值,这个最小值只是局部最小,因此在这个情况下,为了让计算更加符合我们的对于拟合度的要求我们就要用反向求导的方式推算出各种局部最优解,来得出交叉熵的值,这个传播过程就叫做,反向传播。
问:既然反向传播可以实现对梯度最优的计算,那么为什么还要去对梯度本身进行清零?(zero_grad)
答:原因很简单,梯度的计算是一个循环的过程而不是一个静态的过程,当我们计算出一个模型在一个训练集合下的梯度之后,这个梯度还是存在的,因此会产生梯度的累加。
累积出来的梯度并不是真实导数区间的梯度值。因此在训练完成一个数据之后我们要对梯度进行清零,来保证,在新的计算过程中,原始的数据的梯度是一个相对静态的值。
这就好比,你从一个山坡往下走,你每往下走一步,下面的路径对你来说都是未知的,因此如果不对过去的梯度记忆进行清零,它必然会干扰到你下一步梯度的选择