吴恩达机器学习Coursera-Week5

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):

3959253-da0e10d4af5d33de.jpeg
Θ表示的说明

最终,我们需要针对所有的输出节点的J(Θ)进行加总,从而得出该神经网络的J(Θ)
先来看下之前logistic regression的J(θ), 如下:
3959253-b3f2fd08b3487b48.jpg
logistic regression J(θ)

因为我们要对所有输出的J(Θ)都进行加总,所以有如下公式:
3959253-b34c14f6c56ff6a3.jpg
神经网络的J(Θ)

  • 由于有K个输出,所以要从1到K进行加总J(Θ)
  • 需要注意的是最后还做了正则化,而正则化的时候是针对每一层的每一个Θ的平方都进行加总。

Backpropagation Algorithm

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


3959253-12ecfd7cbb0b4577.jpg
2.1-partial derivative of J(Θ)

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

3959253-16be44eb413d2b8e.jpeg
2.2-链式法则

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

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

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

给定一个样本的情况

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

3959253-d282c9829acbd435.jpg
2.4-δ计算过程

可以看出,我们先是利用前向传播算法,算出了输出层的a,然后与我们的训练集中的标签y相减就是它们的'error',即δ (4) (注意:关于δ如何推导出来的,可以参考文章 Backpropagation 算法的推导与直观图解). 之后,再利用公式可以计算出对应的δ (3), δ (2), 注意第一层不存在所谓的'error',所以没有δ (1).
到此我们就可以计算任意节点的δ,并通过公式可以计算出相应的J(Θ)对任意Θ ij (l)的偏导数。而由于计算δ是从后往前计算,所以该算法叫后向传播。
另外需要注意的是,我们需要对每一个Θ都进行计算,如下图所示:
3959253-b89da6f8664d644b.jpeg
2.5-针对所有的Θ都需要求导

这种情况下,可以想象在多维空间中,针对每一个维度,都做梯度下降,最终找到多维空间的最低点(极小值),这时我们的模型就拟合了。

完整训练过程

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


3959253-8373f099816c5cbe.jpg
2.6-backpropagation algorithm计算过程

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

扫描二维码关注公众号,回复: 5184676 查看本文章

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

Backpropagation Intuition

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


3959253-1beef682b42f4842.jpg
2.8-δ compute

关键是怎么推导出来的?

Backpropagation Practice

Implementation Note: Unrolling Parameters

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


3959253-750743a38c55ef7b.jpg
3.1-matrices

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


3959253-74d55bd28dd9cf76.jpg
3.2-enrolling

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

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


3959253-f9721285286e5460.png
3.4-complete precedure

Gradient Checking

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

3959253-707d1f435db88855.jpg
3.5-numerical estimation of gradients

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

上图展示了获取所有θ对应的近似值的过程,而计算机的程序实现流程如下图:

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

3959253-ece1ddef1f7d481b.jpg
3.7-implementation

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

Random Initialization

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

3959253-8123e05136a83790.jpg
4.1-Zero initialization

可以发现最终所有的hidden layer的输出都完全一致了,这样无论怎样训练,都会导致Θ 01 (1) = Θ 02 (1),所以这样的话就有问题了,我们需要取随机值作为其初始值,如下:
3959253-7ba876bff30429e8.jpg
4.2-random initialization

注:这里的ϵ与之前gradient checking中的ϵ无关
至此,本周的课程总结完成了,如果读者有任何疑问欢迎交流,另外,文章有错谬之处,也望指点。

猜你喜欢

转载自blog.csdn.net/weixin_33897722/article/details/87229775