吴恩达机器学习课程笔记(七)-神经网络参数的反向传播算法

本节课内容:
1、神经网络的代价函数,及求代价函数中对应每个参数的偏导数的反向传播算法
2、深入理解反向传播算法的思想
3、使用梯度检测判断反向传播的实现是否正确
4、随机初始化θ参数值
5、整合上述所有内容,介绍训练神经网络的步骤

代价函数

在神经网络中使用的代价函数是逻辑回归中使用的代价函数的一般形式
对于逻辑回归而言,通常使代价函数J(θ)最小化,下图中的逻辑回归代价函数的正则项是j从1到n的求和形式,因为没有把偏差项θ^0 正则化

对于一个神经网络来说,代价函数就会是逻辑回归代价函数的一般形式,不再仅有一个逻辑回归输出单元,而是K个,此时的求和项需要计算K个输出单元之和
e.g. 如果我们有四个输出单元,即神经网络的最后一层有四个输出单元,那么求和项就需要求k从1到4每一个逻辑回归算法的代价函数,然后按四次输出的顺序依次把这些代价函数加起来
代价函数的正则化项则是对θ_ji^((l)) 项所有i、j、l值求和,和逻辑回归的代价函数一样,这里要除去那些对应于偏差值的项,即不对i=0的项求和,当我们计算神经元的激励值时,i=0的项会对应乘上某个x_0或a_0的项,类比于逻辑回归的代价函数,我们不会将这些项加到正则项中,但即使真的加进去,依然是有效的,且不会有大的区别

反向传播算法

前向传播算法使我们可以计算神经网络中每一个神经元的激活值,为了计算导数项,要采用反向传播算法
反向传播算法从直观上讲,对于每一个神经元,计算δ_j^((l)),即第l层第j个节点的激活值的误差
以下图中的4层神经网络为例,对于每一个输出单元,计算δ项,所以第四层第j个单元的δ等于这个单元的激活值减去训练样本里的真实值,也可以看成假设的输出值与训练样本y值的差
下一步要计算神经网络中的前几层的误差项δ,这里不计算δ^((1)),因为第一层是输入层,表示在训练集中观察到的,不存在误差

反向传播算法,是从输出层开始计算δ项,然后返回上一层计算第三层隐藏层的δ项,再往前计算δ^((2)),这类似于把输出层的误差反向传播给了第三层,然后再传到第二层,这就是反向传播的意思
可以简单地证明(忽略正则项),代价函数的偏导数是激活值和δ项的乘积
反向传播算法可以快速计算出所有参数的偏导数项

反向传播算法的实现:
假设有m个样本的训练集:
1、设置下标为Δ_ij^((l)) 的初始值为0,其会被用来计算J(Θ)对应Θ_ij^((l)) 的偏导数项
2、遍历训练集
2.1 利用正向传播计算每层神经节点的激活值
2.2 计算最后一层输出值与训练集中y值的误差δ^((L))
2.3 运用反向传播算法,计算δ^((L−1)) 、δ^((L−2))… δ^((2)),不计算δ^((1)),因为不需要对输入层考虑误差项
2.4 通过累加,计算偏导数项Δ_ij^((l))
3、计算公式的D值,如下图所示
计算出D值后,它正好就是代价函数关于每个参数的偏导数,然后就可以使用梯度下降或者其他高级优化算法

理解反向传播

前向传播过程:

假设有一个如下图的神经网络,通过前向传播计算每一层中各个神经节点的z值和a值(激活值,输入层中样本原始值即激活值),Θ值为由前一层的神经节点指向后一层的神经节点的箭头的权值
z值的计算方法为前一层a值的加权和,权重为相应Θ值

反向传播做了什么?

考虑只有一个输出单元,忽略正则项,这时y^(i)为实数,下图中J(Θ)公式中蓝线的部分对应一个样本点(x^(i), y^(i))的代价值计算,即cost(i)的计算,可以将复杂的的公式简单理解为方差,表示神经网络输出值与实际观测值y^(i)的接近程度

反向传播过程:

一种简单的理解就是计算所有的δ项,即每个神经元的误差
更正式地,δ项实际上是代价函数cost(i)关于z_j^((l)) (中间项)的偏导数,它衡量的是为了影响这些中间值,我们想要改变神经网络中的权重的程度,进而影响整个神经网络的输出h(x),并影响所有代价函数
反向传播的计算与前向传播非常类似,指示方向反了过来,下图以计算δ_2^((2)) 为例展示了反向传播计算δ项的过程(彩色字)
此外这个δ项的计算过程并不包括偏置单元,偏置单元δ项的计算取决于对反向传播的定义,以及实现算法的方式,也可以用 其他方法计算偏置单元的δ项,偏置单元的输出总是+1,他们最后不会影响偏导数的计算

梯度检测

反向传播算法在实现时会有一些bug,当它与梯度下降或其他算法一同工作时,看起来确实能正常运行,而且代价函数J(Θ)在每次梯度下降的迭代中也在不断减小,但最后得到的神经网络的误差将比无bug的情况下高出一个量级而且你有可能不知道你得到的结果是由bug所致的
为解决这种问题,可以使用梯度检验,他将完全保证你的前向传播以及反向传播都是百分之百正确的,而且,上述问题的出现绝大多数情况下都和反向传播的错误实现有关

考虑下面这个例子,假设有一个代价函数J(Θ),其中Θ为实数,想估计函数在某一点上的导数,该点导数就是图像在该点上切线的斜率,现在要从数值上逼近它的导数,或者说从数值上来求近似导数
首先计算θ+ε和θ−ε,把对应的点用直线连接起来,图中红线斜率就是该点导数的近似值,蓝线斜率是该点导数的确切值

接下来考虑Θ更普遍的情况,即为向量参数的时候,设Θ是n维向量,它可能是神经网络中参数的展开式
我们可以用类似的思想来估计所有偏导数项

通过计算J(Θ)对应每个Θ的近似偏导数,将其与在反向传播中得到的梯度进行比较,如果这两个结果是否相等或非常接近,就可以说反向传播的实现是正确的

总结:
1、通过反向传播计算Dvec,DVec可能是矩阵的展开形式
2、实现数值上的梯度检验,计算出gradApprox
3、确定DVec和gradApprox都能得出相似的值
4、在使用代码进行学习或训练网络之前,关掉梯度检验,不要再使用导数计算公式来计算gradApprox,因为梯度检验的代码计算量非常大,也非常慢,相对的,反向传播算法是一个高性能的计算导数的方法,所以一旦通过检验确定反向传播的实现是正确的,就应该关掉梯度检验不再使用

随机初始化

当执行一个算法,如梯度下降法或高级优化算法时,我们需要为变量Θ取一些初始值,高级优化算法中会默认给Θ提供一些初始值,对于梯度下降法,同样的也需要对Θ进行初始化,之后就可以一步一步通过梯度下降,来最小化代价函数J
一种想法是将Θ的初始值全部设为0,尽管在逻辑回归中是允许的,但在训练网络时这起不到任何作用
假设下图中的一个神经网络,如果将Θ全部设为0,图中相同颜色线条上的权重均相等,即0,对于所有的训练样本,最后总能得到a_1^((2))=a_2^((2)),进一步计算会得到δ_1^((2))=δ_2^((2))
如果继续把图补全,会发现代价函数关于这些参数的偏导数会满足这样的关系,如:蓝色线条对应的权重的偏导数相等,这意味着在每一次梯度下降更新中,蓝色线条的权重仍会相等,也就是相同颜色线条的权重仍然相等,继续进行梯度下降,中间隐藏单元的激活值(a值)仍然相等

想象一下你有不止两个隐藏单元,而是有很多很多隐藏单元,也就是说所有的隐藏单元都在计算相同的特征,所有的隐藏单元都以相同的函数作为输入,这是一种高度冗余的现象,这意味着最后的逻辑回归单元只能得到一个特征,因为所有的单元都一样,这种情况阻止了神经网络去学习任何有趣的东西
上述问题被称为对称权重问题,也就是所有的权重都是一样的,为解决这种问题,在神经网络中要使用随机初始化的思想,对于Θ中的每一个值,将其设为一个范围在−ε到ε之间的随机值

因此,在初始化Θ时,要将其中的值初始化为接近0,范围在−ε到ε之间的数,然后进行反向传播,再进行梯度检验,最后使用梯度下降或者其他高级优化算法来最小化代价函数J

组合到一起

选择网络架构,即神经元之间的连接模式

输入层:
首先定义输入单元的数量,一旦确定了特征集x,输入单元的数量就等于特征x^((i)) 的维度,输入单元数目将会由此确定

输出层:
如果进行多分类,那么输出层的单元数目,将会由分类问题中所要区分的类别个数确定。如果多元分类问题y的取值范围是在1到10之间,那么就可能有10个分类,需要把输出y重新写成向量的形式

隐藏层:
对于中间的隐藏层的层数以及每层的单元个数,一个合理的默认选项是只使用单个隐藏层,如果使用不止 一个隐藏层,通常每个隐藏层都应有相同的单元数。但实际上通常来说,图中最左侧的结构是较为合理的默认结构,对于隐藏单元的个数,通常情况下,隐藏单元越多越好,不过如果有大量隐藏单元,计算量一般会比较大。此外,每个隐藏层的单元数量还应该和输入x的维度相匹配,即和特征的数量相匹配,隐藏单元的数目可以和输入特征的数量相同,或者它的二倍,或者三四倍

训练神经网络的步骤

1、随机初始化权重。将权重初始化很小的值,接近于0
2、执行前向传播算法。即对神经网络的任意一个输入x^((i)),计算出对应的〖hx〗^((i)))值,也就是一个输出值y的向量
3、计算代价函数J(Θ)
4、执行反向传播算法,来计算J(Θ)关于参数Θ的偏导数项。我们要遍历所有训练样本x^((i)),将其输入到输入层,执行前向传播和反向传播,然后就能得到每个神经元的激励值a和δ值,进而计算偏导数
5、使用梯度检查,将使用反向传播得到的导数值和使用数值方法得到的导数值进行比较,确保两种方法得到基本接近的两个值,从而确保我们的反向传播算法得到的结果是正确的。然后停用梯度检查,因为计算量大,计算非常慢
6、使用最优化方法,如梯度下降或者更加高级的优化算法,将这些优化方法和反向传播结合,来得到使代价函数J(Θ)最小化的参数Θ

理解梯度下降在神经网络中的应用

假设一个包含两个参数的代价函数,其图像如下图所示。代价函数度量的就是神将网络对训练数据的你和情况,假设取代价函数值最小的一点,即图像上最低的点,这一点所对应的一组参数对于大部分训练样本,假设函数的输出会非常接近y^((i)),也就是神经网络对训练数据拟合的较好
因此,梯度下降的原理就是从某个随机的初始点开始,它将会不停的往下下降,那么反向传播算法的目的就是算出梯度下降的方向,而梯度下降的作用就是沿着这个方向一点点下降,一直到我们希望得到的点
因此,当执行反向传播和梯度下降或者其他更高级的优化方法时,这幅图片解释了基本原理,也就是试图找到某个最优的参数使得神经网络的输出值与训练集中观测到的y^((i)) 的实际值尽可能的接近

课程资料

课程原版PPT-Neural Networks: Learning
练习内容和相关说明
相关数据ex4data1相关数据ex4weights

python代码实现
1.neural_network.ipynb
ML-Exercise3.ipynb