梯度下降算法是机器学习中最常用的优化算法之一,它可以求得目标函数的最小值,即算法的最优解。而对于复杂的多层神经网络来说,运用梯度下降算法十分复杂,因为其包含求导过程,为此学者将多层神经网络的优化问题简化为反向传播过程,也就是说,将目标函数(输出误差项)层层传递回输入层,求出每个节点的误差项,并根据每个节点的误差项更新各个权值。首先我们复习梯度下降算法,然后详细推导反向传播算法的原理。
梯度下降算法
我们的目标是优化目标函数,即求得目标函数的最小值,根据微积分的知识,求导数为0的点即是极值点。不过计算机可不会解方程,但是它可以凭借强大的计算能力,一步一步的去把函数的极值点『试』出来。
那怎么保证快速地朝下降的方向走到局部最低点呢?这里的奥秘在于,我们每次都是向函数的梯度相反方向走的。梯度是一个向量,它指向函数值上升最快的方向。显然,梯度的反方向当然就是函数值下降最快的方向了。我们每次沿着梯度相反方向去修改的值,当然就能走到函数的最小值附近。
梯度下降算法计算如下:
。 (1)
首先计算出最终的误差项(待优化函数),其中y表示目标值,而带上标的代表计算出的实际值。我们用均方误差表示误差项。
接下来对E求导如下,将导数值代入(1)式即得到权值的更新值。
反向传播算法
梯度下降算法在计算单个感知器或线性单元的优化函数时很方便,然而单个感知器功能十分有限。早在1969年,作为人工神经网络创始人的明斯基和佩珀特就论证了简单的线性感知器不能解决如“异或”(XOR )这样的基本问题。因此出现了由多个感知器构成的多层神经网络,可以模拟复杂的非线性函数。但是怎么优化多层神经网络呢?此时仍然可以采用梯度下降算法,只是梯度下降算法包含求导过程,对于多层神经网络而言求导十分复杂,因此学者把多层神经网络的梯度下降问题分解成了反向传播过程。
首先我们用传统梯度下降算法计算一个三层神经网络,其中求导部分使用的链式求导法则,关于这个大家可以看看微积分,这里就不赘述了。下面公式预警!(太难打了就手写,见谅)
三层神经网络如图,神经元的激活函数为sigmoid函数。从左到右分别为输入层(i),隐藏层(h),输出层(o),net代表单个神经元的输入,out代表单个神经元的输出。w代表权值。
对于隐藏层第一个神经元h1我们采用梯度下降算法计算其更新后的值,过程如下:主要是在计算误差E对权值w的导数,采用链式求导法(很多次,比较难懂,可以自己写一下),最后得到结果。这个网络只有三层,但是有六项链式求导项,那么更复杂层数更多的的网络计算将非常困难。怎么解决这个问题呢?可以将结果分为三部分。第二和第三部分很好理解,一个是sigmoid函数求导,一个是权值。第二部分定义为神经元h1的误差项,记为。
经过计算可知,其中,因此更新过程可写为:。
即使是非常复杂的神经网络也可以采用这个算法进行权值更新,它被称为反向传播算法的原因可以直观理解为下图:
误差传递:
权值更新:
这与前向传播过程十分相似,只是前向传播过程将输入层层传输至输出以获得目标函数(误差项),而反向传播过程将误差层层传递至输入层以更新权值矩阵。
前向传播过程如下图所示:
(图片参考自CSDN: “反向传播算法”过程及公式推导(超直观好懂的Backpropagation))
Reference
- 零基础入门深度学习: https://www.zybuluo.com/hanbingtao/note/448086
- 吴恩达教授,《机器学习》,斯坦福大学
- David E. Rumelhart, Geoffrey E. Hinton, Ronald J. Williams, Learning Representations By Back Propagating Errors , Nature 1986
- Aurelien Geron, Hands on Machine-Learning with Scikit-Learn, Keras &TensorFlow
- CSDN:“反向传播算法”过程及公式推导(超直观好懂的Backpropagation)