DeepLearning&BP 补充
1、deep learning
这次听李宏毅老师的课程新发现了一个之前忽略的视角,在此记录一下。
首先机器学习的三个步骤如下:
-
确定一个函数集合(根据一定的假设)
-
确定损失函数来衡量各函数的好坏程度
-
根据这个损失函数从函数集合中选择一个最好的函数作为最终模型
对于深度学习来说,确定了网络架构实际上就是确定了函数集合,而网络中的参数对应的就是函数里的参数:
这件事说起来简单,但是我之前一直忽略了这个点,因为网络架构的内容在书本中出现得并不多,给人的感觉就是架构并不是非常重要,只要深度够了,函数的拟合能力就非常强。但是实际上网络的架构还是非常重要的,因为如果架构不够好,我们的函数集合里可能根本就不包含真实的(假设存在),另一个需要考虑的点就是计算量,过于复杂的网络架构不仅更容易导致过拟合,而且会大大增加计算量。CNN就是一个很好的例子,其特殊的网络架构使其在图像分类任务上的表现相比全连接网络有很大提升。
2、BP
首先,深度学习无非就是深一些的神经网络,其归根结底依然是一个函数,因此参数的学习和机器学习其它算法一样,都是用梯度下降法。
而所谓的BP(Backpropagation算法),实际上只是梯度下降法运用在神经网络上的一种快速计算方法。
关于BP的内容几乎所有教材或课程的讲解都说,无非是一个Chain Rule而已,非常简单,然后举一个例子手算一遍。回过头来看我们依然不清楚BP算法如何加速了梯度的计算。李宏毅老师的课程让我有豁然开朗的感觉,因此在此记录一下。
我们知道,梯度下降法关键的计算步骤(也是主要的计算量消耗)就是计算损失函数关于各个参数的偏导。在神经网络尤其是深度神经网路中这项任务变得更加艰巨,因为我们根据链式法则写出的式子可能会非常长,也就是计算一个偏导就要计算多个偏导然后计算它们的乘积。
BP算法的思路很简单,把梯度的计算过程分解成两部分:
这里的就是损失函数。
其中的计算非常容易,因为是关于的线性函数,因此这个偏导的值就是此权重连接的值(也就是这一层的输入)。
我们知道,在我们进行forward pass的时候,或者说我们按照当前权值计算一次输出的时候,每一层的输入值都计算好了,因此很容易计算出的值。
下图就是一个很好的例子:
接下来我们看比较困难的该如何计算。
如图所示,可以分解为两部分:
其中就是激活函数的导数,很好计算,于是我们的任务就变成计算:
这里,。而剩下的和和形式相同,我们只需要在下一层重复上述过程就可以了。
可以看到,我们找到了一个很好的递推形式。
于是我们假想一个结构和原网络相同但传递方向相反的网络,在这个网络中,可以很方便地计算各层的。
如图所示:
将Forward Pass和Backward Pass结合起来就得到了所需要的各个参数的梯度: