zoukankan      html  css  js  c++  java
  • Andrew Ng机器学习课程笔记--week5(上)

    Neural Networks: Learning
    内容较多,故分成上下两篇文章。

    一、内容概要

    • Cost Function and Backpropagation

      • Cost Function
      • Backpropagation Algorithm
      • Backpropagation Intuition
    • Backpropagation in Practice

      • Implementation Note:Unroll Parameters
      • Gradient Checking
      • Random Initialization
      • Putting it Together
    • Application of Neural Networks

      • Autonomous Driving

    二、重点&难点

    1.Cost Function and Backpropagation

    1) Cost Function

    首先定义一下后面会提到的变量

    L: 神经网络总层数
    Sl:l层单元个数(不包括bias unit)
    k:输出层个数

    回顾正则化逻辑回归中的损失函数:

    [J( heta) = - frac{1}{m} sum_{i=1}^m [ y^{(i)} log (h_ heta (x^{(i)})) + (1 - y^{(i)}) log (1 - h_ heta(x^{(i)}))] + frac{lambda}{2m}sum_{j=1}^n heta_j^2 ]

    在神经网络中损失函数略微复杂了些,但是也比较好理解,就是把所有层都算进去了。

    [egin{gather*} J(Theta) = - frac{1}{m} sum_{i=1}^m sum_{k=1}^K left[y^{(i)}_k log ((h_Theta (x^{(i)}))_k) + (1 - y^{(i)}_k)log (1 - (h_Theta(x^{(i)}))_k) ight] + frac{lambda}{2m}sum_{l=1}^{L-1} sum_{i=1}^{s_l} sum_{j=1}^{s_{l+1}} ( Theta_{j,i}^{(l)})^2end{gather*} ]

    2)BackPropagation反向传播

    更详细的公式推导可以参考http://ufldl.stanford.edu--反向传导算法

    下面给出我自己对BP算法的理解以及ufldl上的推导:

    假设神经网络结构如下

    神经网络结构

    - 1. FP

    1. 利用前向传导公式(FP)计算(2,3……) 直到 ({n_l})层(输出层)的激活值。
      计算过程如下:

    前向传导公式(FP)

    - 2. BP


    • 权值更新

    首先需要知道的是BP算法是干嘛的?它是用来让神经网络自动更新权重(W)的。
    这里权重(W)与之前线性回归权值更新形式上是一样:

    那现在要做的工作就是求出后面的偏导,在求之前进一步变形:

    注意(J(W,b;x^{(i)},y^{(i)}))表示的是单个样例的代价函数,而(J(W,b))表示的是整体的代价函数。

    所以接下来的工作就是求出(frac{∂J(W,b;x,y)}{∂W_{ij^{(l)}}}),求解这个需要用到微积分中的链式法则,即

    [egin{align*} frac{∂J(W,b;x,y)}{∂W_{ij^{(l)}}} = frac{∂J(W,b;x,y)}{∂a_{i^{(l)}}} frac{∂a_{i^{(l)}}}{∂z_{i^{(l)}}} frac{∂z_{i^{(l)}}}{∂w_{ij^{(l)}}} = a_j^{(l)}δ_i^{(l+1)} end{align*} ]

    更加详细运算过程可以参考一文弄懂神经网络中的反向传播法——BackPropagation,这篇文章详细的介绍了BP算法的每一步骤。

    上面的公式中出现了(δ)(误差error),所以后续的目的就是求出每层每个node的(δ),具体过程如下:

    • 计算δ

    对于第 (n_l)层(输出层)的每个输出单元(i),我们根据以下公式计算残差:

    (l = n_l-1, n_l-2, ……,3,2)的各个层,第 (l) 层的第 (i) 个节点的残差计算方法如下:

    将上面的结果带入权值更新的表达式中便可顺利的执行BackPropagation啦~~~

    但是!!!需要注意的是上面式子中反复出现的 (f '(z_i^{(l)})) ,表示激活函数的导数。这个在刚开始的确困惑到我了,因为视频里老师在演示计算(δ)的时候根本就乘以这一项,难道老师错了?其实不是的,解释如下:
    常用的激活函数有好几种,但使用是分情况的:

    • 线性情况下:f(z) = z
    • 非线性情况下:(只举一些我知道的例子)
      • sigmoid
      • tanh
      • relu

    所以这就是为什么老师在视频中没有乘以 (f '(z_i^{(l)})) 的原因了,就是因为是线性的,求导后为1,直接省略了。

    另外sigmoid函数表达式为(f(z)=frac{1}{1+e^{-z}}),很容易知道(f'(z)=frac{-e^{-z}}{ (1+e^{-z}) ^2 } = f(z)·(1-f(z)))这也就解释了Coursera网站上讲义的公式是这样的了:


    所以现在总结一下BP算法步骤

    1. 进行前馈传导计算,利用前向传导公式,得到(L_2, L_3, ldots)直到输出层 ( extstyle L_{n_l})的激活值。
    2. 对输出层(第 ( extstyle n_l)层),计算:
      (delta^{(n_l)}= - (y - a^{(n_l)}) ullet f'(z^{(n_l)}))
    3. 对于 ( extstyle l = n_l-1, n_l-2, n_l-3, ldots, 2) 的各层,计算:
      (delta^{(l)} = left((W^{(l)})^T delta^{(l+1)} ight) ullet f'(z^{(l)}))
    4. 计算最终需要的偏导数值:

    [ egin{align} abla_{W^{(l)}} J(W,b;x,y) &= delta^{(l+1)} (a^{(l)})^T, \ abla_{b^{(l)}} J(W,b;x,y) &= delta^{(l+1)}. end{align} ]

    使用批量梯度下降一次迭代过程:

    1. 对于所有( extstyle l),令 ( extstyle Delta W^{(l)} := 0 , extstyle Delta b^{(l)} := 0) (设置为全零矩阵或全零向量)
    2. 对于( extstyle i = 1)( extstyle m)
      使用反向传播算法计算( extstyle abla_{W^{(l)}} J(W,b;x,y))( extstyle abla_{b^{(l)}} J(W,b;x,y))
      计算( extstyle Delta W^{(l)} := Delta W^{(l)} + abla_{W^{(l)}} J(W,b;x,y))
      计算( extstyle Delta b^{(l)} := Delta b^{(l)} + abla_{b^{(l)}} J(W,b;x,y))
    3. 更新权重参数:

    [ egin{align} W^{(l)} &= W^{(l)} - alpha left[ left(frac{1}{m} Delta W^{(l)} ight) + lambda W^{(l)} ight] \ b^{(l)} &= b^{(l)} - alpha left[frac{1}{m} Delta b^{(l)} ight] end{align} ]

    3) Backpropagation Intuition

    本小节演示了具体如何操作BP,不再赘述。

    具体可参考Coursera讲义




    MARSGGBO原创

    2017-8-3

  • 相关阅读:
    ****** 2019-2020-1 《数据结构与面向对象程序设计》第1周学习总结
    预备作业
    《数据结构与面向对象程序设计》第01周学习总结
    我太难了——00周作业
    作业二
    预备作业 作业一
    FIR滤波器设计
    第五章:相关分析
    通常来说分频电路用计数器来实现,奇数倍的话记得用上或门!
    HDLBits 刷题记录(5)
  • 原文地址:https://www.cnblogs.com/marsggbo/p/7429210.html
Copyright © 2011-2022 走看看