美文网首页程序员
吴恩达机器学习Coursera-Week5

吴恩达机器学习Coursera-Week5

作者: geekpy | 来源:发表于2018-04-29 11:23 被阅读283次

    Cost Function and Back Propagation

    Cost Function

    这一节主要讲了基本的符号表示,主要如下:
    L:表示总共有几层神经网络,假设有四层那么L=4
    sl: 注意下标l(小写L),表示第l层的unit数,这个数不包含bias unit
    K:表示输出层有几个输出unit,即表示K分类问题,注意K=1 或者K>=3。(因为K=2就成了一个二分类问题了,那么我们只需要使用一个输出就可以用二分类来表示了)
    另外关于Θ的表示如下图所示(下图展示了针对第三层的三个输出,如何用Θ来计算,注意第二层有S2 + 1个节点,+1是因为有bias unit):

    Θ表示的说明
    最终,我们需要针对所有的输出节点的J(Θ)进行加总,从而得出该神经网络的J(Θ)
    先来看下之前logistic regression的J(θ), 如下:
    logistic regression J(θ)
    因为我们要对所有输出的J(Θ)都进行加总,所以有如下公式:
    神经网络的J(Θ)
    • 由于有K个输出,所以要从1到K进行加总J(Θ)
    • 需要注意的是最后还做了正则化,而正则化的时候是针对每一层的每一个Θ的平方都进行加总。

    Backpropagation Algorithm

    终于到了神经网络最重要的算法BP算法,而要理解这个算法,我想应当先明白这个算法是干什么用的。简单说这个算法是用于计算gradient,从而可以训练出我们的模型。
    我们知道要找到模型的参数,需要通过计算J(Θ)和Gradient,然后将其代入到优化函数当中,就可以训练出合适的模型,那么这个gradient的计算还是要计算J(Θ)的偏导数,如下图:


    2.1-partial derivative of J(Θ)

    而要计算这个导数,我们可以用如下公式

    2.2-链式法则
    要明白链式法则需要对微积分有些基本的了解,给定一个函数y=f(x),那么y对x的导数实际上是说y对x的变化速率,即x的一个微小变动,会导致y有多大的变动。那么假设x=g(z), 那么z的微小变动就会导致x的变动,而x的变动又会导致y变动,这就是链式法则的本质,所以也就有了如上图所示的公式。
    而δ本质上是J(Θ)对z的导数,也就是图中方框所圈的两个导数的乘积。
    而zi(l+1)对Θij(l)的导数,根据导数的定义我们就知道是aj(l), 可以看下图的示例更直观些:
    2.3-example

    详细的推导过程,可以参考这篇文章 Backpropagation 算法的推导与直观图解

    从图中我们可以看到要计算针对某个权重Θ的偏导数,需要使用下一层对应的δ和本层对应的输出a。我们先记住这个公式,那么问题就转化为如何计算a和δ的问题。

    给定一个样本的情况

    首先,通过前向传播算法,给定一个样本,我们可以推导出每个unit的a。(这里可以先随机设定Θ)
    那么,δ是如何计算的呢?这个计算过程如下:

    2.4-δ计算过程
    可以看出,我们先是利用前向传播算法,算出了输出层的a,然后与我们的训练集中的标签y相减就是它们的'error',即δ(4) (注意:关于δ如何推导出来的,可以参考文章 Backpropagation 算法的推导与直观图解). 之后,再利用公式可以计算出对应的δ(3), δ(2), 注意第一层不存在所谓的'error',所以没有δ(1).
    到此我们就可以计算任意节点的δ,并通过公式可以计算出相应的J(Θ)对任意Θij(l)的偏导数。而由于计算δ是从后往前计算,所以该算法叫后向传播。
    另外需要注意的是,我们需要对每一个Θ都进行计算,如下图所示:
    2.5-针对所有的Θ都需要求导
    这种情况下,可以想象在多维空间中,针对每一个维度,都做梯度下降,最终找到多维空间的最低点(极小值),这时我们的模型就拟合了。
    完整训练过程

    上边讲述的是针对一个样本和一个Θ计算gradient的过程,直观地说,就是我们只是在一个维度上下降了一步(从山上往某个方向下降了一步),我们需要大量样本计算,最终让模型收敛(走到山底,甚至谷底),所以完整的计算过程如下:


    2.6-backpropagation algorithm计算过程

    只看公式这里非常难于理解,还是看图,下图是基于图2.3的神经网络的一个样本的计算:


    2.7-one sample.png
    • 大写的delta Δ是一个矩阵,我们将其初始化为全0的Matrix,用于累加每次迭代计算出的gradient,每一个gradient对应一个Θ(gradient本质是对Θ的求导)
    • For循环中,每一轮循环都要计算一个样本对应的所有的Θ对应的偏导数
    • 最终的D是Δ取平均值并正则化后的结果

    Backpropagation Intuition

    本节课除详细讲述了前向传播的计算方法外,重点又讲述了后向传播时如何计算δ的过程,如下:


    2.8-δ compute

    关键是怎么推导出来的?

    Backpropagation Practice

    Implementation Note: Unrolling Parameters

    此节课主要讲解了如何unrolling参数,实际就是如何利用Octave或者matlab的功能将矩阵转化为vector,便于使用fminunc之类的函数进行计算,因为这类函数的可接受的参数是vector。
    我们已经知道,神经网络中Θ对应的是一个矩阵,同样gradient对应的也是一个矩阵,如下:


    3.1-matrices

    我们需要将其转化为vector,从而可以传递给fminunc函数进行计算,如下:


    3.2-enrolling
    而在cost function当中,我们则需要将它们恢复成原来的矩阵,如下:
    3.3-reshape

    最后看一张完整的流程图:


    3.4-complete precedure

    Gradient Checking

    此节课主要讲了如何检查gradient的结果是否正确。首先Andrew举了一个cost function J(θ)针对标量θ的情况,如下图:

    3.5-numerical estimation of gradients
    我们知道对J(θ)求导其实就是看其J(θ)在θ这一点的斜率,那么通过在θ左右两边各取两个点,其连线的斜率是近似等于θ点的斜率的, 这两个点就是通过加减ϵ (epsilon)来获取。(注意这个ϵ 要足够小,视频中Andrew使用10-4)
    现在,我们已经明白原理了,那么要针对所有的θ都取近似值,就需要通过如下的计算流程来计算:
    3.6-get every estimation of θ
    上图展示了获取所有θ对应的近似值的过程,而计算机的程序实现流程如下图:

    因为有多个维度,所以我们要在每个维度方向都取其近似值,从而检查每个维度的gradient

    3.7-implementation

    我们可以每一轮迭代后都比较一下近似值,不过最终我们实际训练的时候需要去掉这个gradient checking步骤,否则训练的过程会非常慢。我理解就是通过少量的迭代次数,检查一下就可以了,然后大量样本训练的时候就把这个检查步骤去掉。

    Random Initialization

    本节课Andrew首先讲了如果将Θ矩阵初始化为全0的矩阵会有什么问题,如下图:

    4.1-Zero initialization
    可以发现最终所有的hidden layer的输出都完全一致了,这样无论怎样训练,都会导致Θ01(1) = Θ02(1),所以这样的话就有问题了,我们需要取随机值作为其初始值,如下:
    4.2-random initialization
    注:这里的ϵ与之前gradient checking中的ϵ无关
    至此,本周的课程总结完成了,如果读者有任何疑问欢迎交流,另外,文章有错谬之处,也望指点。

    相关文章

      网友评论

        本文标题:吴恩达机器学习Coursera-Week5

        本文链接:https://www.haomeiwen.com/subject/geeskftx.html