算法工程师修仙之路:吴恩达机器学习(十)

吴恩达机器学习笔记及作业代码实现中文版

第七章 神经网络参数的反向传播算法


理解反向传播

  • 为了更好地理解反向传播算法,我们再来仔细研究一下前向传播的原理:

在这里插入图片描述在这里插入图片描述

  • 反向传播算法做的是:
    在这里插入图片描述

梯度检测

  • 当我们对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的错误,意味着,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。为了避免这样的问题,我们采取一种叫做梯度的数值检验( Numerical Gradient Checking)方法。这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。

  • 对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 θ \theta ,我们计算出在 θ ε \theta-\varepsilon 处和 θ + ε \theta+\varepsilon 的代价值( ε \varepsilon 是一个非常小的值,通常选取 0.001),然后求两个代价的平均,用以估计在 θ \theta 处的代价值。
    在这里插入图片描述

  • θ \theta 是一个向量时,我们则需要对偏导数进行检验。因为代价函数的偏导数检验只针对一个参数的改变进行检验。下面是一个只针对 θ 1 \theta_1 进行检验的示例: J ( θ ) θ 1 = J ( θ 1 + ε 1 , θ 2 , θ 3 . . . θ n ) 2 ε \frac{\partial J(\theta)}{\partial\theta_1}=\frac{J(\theta_1+\varepsilon_1, \theta_2, \theta_3...\theta_n)}{2\varepsilon} 。最后我们还需要对通过反向传播方法计算出的偏导数进行检验。

  • 根据上面的算法,计算出的偏导数存储在矩阵 D i j ( l ) D_{ij}{(l)} 中。检验时,我们要将该矩阵展开成为向量,同时我们也将 θ \theta 矩阵展开为向量,我们针对每一个 θ \theta 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同 D i j ( l ) D_{ij}{(l)} 进行比较。

随机初始化

  • 任何优化算法都需要一些初始的参数。

  • 初始所有参数为0对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值。同理,如果我们初始所有的参数都为一个非 0 的数,结果也是一样的。

  • 我们通常初始参数为正负 ε \varepsilon 之间的随机值。

组合到一起

  • 使用神经网络时的步骤:
    • 网络结构:第一件要做的事是选择网络结构,即决定选择多少层以及决定每层分别有多少个单元。
      • 第一层的单元数即我们训练集的特征数量。
      • 最后一层的单元数是我们训练集的结果的类的数量。
      • 如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
      • 我们真正要决定的是隐藏层的层数和每个中间层的单元数。
    • 训练神经网络:
      • 参数的随机初始化;
      • 利用正向传播方法计算所有的 h θ ( x ) h_\theta(x)
      • 编写计算代价函数 J J 的代码;
      • 利用反向传播方法计算所有偏导数;
      • 利用数值检验方法检验这些偏导数;
      • 使用优化算法来最小化代价函数。

猜你喜欢

转载自blog.csdn.net/faker1895/article/details/84916792