《吴恩达机器学习》9 神经网络参数的反向传播算法
前言
BP算法(即反向传播算法)是在有导师指导下,适合于多层神经元网络的一种学习算法,它建立在梯度下降法的基础上。BP网络的输入输出关系实质上是一种映射关系:一个n输入m输出的BP神经网络所完成的功能是从n维欧氏空间向m维欧氏空间中一有限域的连续映射,这一映射具有高度非线性。它的信息处理能力来源于简单非线性函数的多次复合,因此具有很强的函数复现能力。这是BP算法得以应用的基础。
以上是反向传播算法的定义,简单来说就是在多层神经网络中是不能用梯度下降法的(梯度下降可以应对带有明确求导函数的情况)。对于多隐层的神经网络,输出层可以直接求出误差来更新参数,但其中隐层的误差是不存在的,因此不能对它直接应用梯度下降,而是先将误差反向传播至隐层,然后再应用梯度下降,其中将误差从末层往前传递的过程需要链式法则(Chain Rule)的帮助,因此反向传播算法可以说是梯度下降在链式法则中的应用。
一、代价函数
首先看下logistic回归的代价函数如下示,但当有多层神经网络的代价函数就会变成第二个公式这种形式。这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出K个预测,基本上我们可以利用循环,对每一行特征都预测K个不同结果,然后在利用循环在K个预测中选择可能性最高的一个,将其与y中的实际数据进行比较。
正则化的那一项只是排除了每一层θ0后,每一层的θ 矩阵的和。最里层的循环 j 循环所有的行(由sl +1 层的**单元数决定),循环 i 则循环所有的列,由该层(sl层)的**单元数所决定。即: ℎtheta(x)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行正则化的偏移项处理所有参数的平方和。
二、反向传播算法
前面介绍的logisitic回归和线性回归,我们都是通过正向传播一层一层向前计算来更新的我们的θ得到解,为了计算代价函数的偏导数,我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 这个就是反向传播算法的通俗解释。
1、算法简单解析
假设我们有假设我们的训练集只有一个实例(x(1), y(1)),我们的神经网络是一个四层的神经网络,其中K = 4, SL = 4, L = 4。我们从最后一层的误差开始计算,误差是**单元的预测(ak(4))与实际值(yK)之间的误差。
我们用δ来表示误差,则: δ(4) = ak(4) - y
我们利用这个误差值来计算前一层的误差: δ(3) = (θ(3))Tδ(4) ∗ g′(z(3)) 其中 g′(z(3))
是 S 形函数的导数, g′(z(3)) = a(3) ∗ (1 − a(3))。而(θ(3))Tδ(4)则是权重导致的误差的和。
下一步是继续计算第二层的误差: δ(2) = (θ(2))Tδ(3) ∗ g′(z(2))
因为第一层是输入变量,不存在误差。我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了。
2、直观理解
上面的求解非常的生涩难懂,我们接下来看一个直观点的例子(或者参考这个博文,我们觉得写的很好 反向传播算法(过程及公式推导) )。
三、综合应用
1、梯度检验
当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ,我们计算出在 θ - ε 处和 θ + ε 的代价值(ε 是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ 处的代价值。
2、随机初始化
任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有**单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的。因此在代码中我们要让初始参数随机值。
3、综合
小结一下使用神经网络时的步骤:
网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。第一层的单元数即我们训练集的特征数量。最后一层的单元数是我们训练集的结果的类的数量。如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。我们真正要决定的是隐藏层的层数和每个中间层的单元数。
训练神经网络:
1. 参数的随机初始化
2. 利用正向传播方法计算所有的ℎθ(x)
3. 编写计算代价函数 J(θ)的代码
4. 利用反向传播方法计算所有偏导数
5. 利用数值检验方法检验这些偏导数
6. 使用优化算法来最小化代价函数
总结
以上就是《吴恩达机器学习》系列视频 神经网络参数的反向传播算法 的内容笔记,以便后续学习和查阅。