机器学习day08——神经网络参数的反向传播算法

拟合神经网络参数的代价函数

假设神经网络的训练样本有𝑚个,每个包含一组输入𝑥和一组输出信号𝑦,𝐿表示神经网络层数,𝑆 ᵢ 表示每层的神经元个数,𝑆˪表示输出层神经元个数)。
将神经网络的分类定义为两种情况:二类分类多类分类
二类分类:𝑆˪ = 1, 𝑦 = 0 𝑜𝑟 1表示哪一类;
𝐾类分类:𝑆˪ = 𝑘, 𝑦𝑖 = 1表示分到第 i 类;(𝑘 >2)
回顾在逻辑回归函数中我们的代价函数为:
逻辑回归的代价函数其中第一项表示预测值与实际值之间的差距,第二项为参数的正则化项
在逻辑回归中,我们只有一个输出值,也只有一个因变量𝑦,对于神经网络来说,不再是只有一个输出单元,取而代之的是 K 个,我们的ℎ𝜃(𝑥)是一个维度为𝐾的向量,(ℎ𝜃(𝑥))i来表示第i个输出,并且我们训练集中的因变量也是同样维度的一个向量在这里插入图片描述
因此我们的代价函数会比逻辑回归更加复杂一些,所以神经网络模型的代价函数为:
在这里插入图片描述
在这里插入图片描述 类似于求每一个的逻辑回归算法的代价函数,按输出的顺序 1 ~ K,依次相加。这个求和符号应用于y 和h ,因为我们是将第k个输出单元的值h 和实际表明类别的值y 的大小做比较。
在这里插入图片描述这一项类似我们在逻辑回归里所用的正则化项
这个看起来复杂很多的代价函数背后的思想还是一样的,我们希望通过代价函数来观察算法预测的结果与真实情况的误差有多大,唯一不同的是,对于每一行特征,我们都会给出𝐾个预测,基本上我们可以利用循环,对每一行特征都预测𝐾个不同结果,然后在利用循环在𝐾个预测中选择可能性最高的一个,将其与𝑦中的实际数据进行比较。
正则化的那一项只是排除了每一层𝜃0后,每一层的𝜃 矩阵的和。最里层的循环𝑗循环所有的行(由𝑠𝑙 +1 层的激活单元数决定),循环𝑖则循环所有的列,由该层(𝑠𝑙层)的激活单元数所决定。即:ℎ𝜃(𝑥)与真实值之间的距离为每个样本-每个类输出的加和,对参数进行正则化的偏置项处理所有参数的平方和。

代价函数最小化——反向传播算法

之前我们在计算神经网络预测结果的时候我们采用了一种正向传播方法,我们从第一层开始正向一层一层进行计算,直到最后一层的ℎ𝜃(𝑥)。
那么如何将神经网络的代价函数最小化呢?在上一个部分中,我们已经得到了代价函数 J(𝜃) 的表达式,想要用梯度下降法更高级的优化算法来求参数,就需要来计算J(𝜃)和𝜕𝜕𝛩𝑖𝑗(𝑙)𝐽(𝛩)
我们需要采用一种反向传播算法,也就是首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。 以一个例子来说明反向传播算法。
假设我们的训练集只有一个实例(𝑥, 𝑦),我们的神经网络是一个四层的神经网络,在这里插入图片描述其中𝐾 = 4,𝑆 ˪ = 4,𝐿 = 4;以向前传播为例。计算过程为:在这里插入图片描述其中,a(1)
就是第一层的激活值(激励值),也就是输入层,等同于为 X ,那么 z(2) 就等于矩阵𝜃(1) 乘 a( 1),第二层的激励值 a(2)就为 g(z(2)) ,后几层同理,同样用前向传播求出 a(3)和 a(4),其中 g 为 S 型激励函数。同样, a(4)也是假设函数的输出 h𝜃(x) 。如图正常传播
使用反向传播函数,从最后一层的误差开始计算,计算代价函数的偏导数:
𝛿ⱼ ⁽ ˡ ⁾:代表了第l层的第j个结点的误差
对于每个输入单元,我们将计算𝛿项,例如第4层第j个单元的𝛿就等于这个单元的激活值(假设的输出值)减去训练样本中的真实值,而这个单元的激活值同样可以写成(ℎ𝜃(𝑥)) ⱼ
在这里插入图片描述
将其向量化在这里插入图片描述
其中,各个参数都是个4维向量,𝛿⁽ 4 ⁾是第四层的误差,a⁽ 4 ⁾是第四层所有输出值组成的向量,y是真实值组成的向量。
接下来计算网络中前面几层的误差项𝛿:在这里插入图片描述
其中在这里插入图片描述是向量, 𝑔′(𝑧(3))是 𝑆 形函数的导数。等同于:在这里插入图片描述在这里插入图片描述则是权重导致的误差的和。下一步是继续计算第二层的误差;因为第一层是输入变量,不存在误差。
我们有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设𝜆 = 0,即我们不做任何正则化处理时有:在这里插入图片描述
𝑙 代表目前所计算的是第几层。
𝑗 代表目前计算层中的激活单元的下标,也将是下一层的第𝑗个输入变量的下标。
𝑖 代表下一层中误差单元的下标,是受到权重矩阵中第𝑖行影响的下一层中的误差单元的下标。
在更为一般的情况中,我们同样需要计算每一层的误差单元,但是我们需要为整个训练集计算误差单元,此时的误差单元也是一个矩阵,我们用𝛥𝑖𝑗(𝑙)来表示这个误差矩阵,这个误差矩阵会被用来计算偏导项。反向传播算法
m个训练集,𝛥𝑖𝑗(𝑙)为误差矩阵,使用循环计算每层的误差,a(1)为输入层激活值,x(i)为第i层输入值,y(i)是神经网络预测的值。
首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
在求出了𝛥𝑖𝑗(𝑙)之后,我们便可以计算代价函数的偏导数了,计算方法如下:
在这里插入图片描述
最后即可求出偏导项:
在这里插入图片描述

理解反向传播

正向传播过程:

正常传播
zᵢ ⁽2⁾是输入值的加权和,再将z应用在sigmoid函数和激活函数中得到这些激活值aᵢ ⁽2⁾,继续向前传播得到zᵢ ⁽3⁾,再应用sigmoid函数和激活函数得到激活值aᵢ ⁽3⁾,最后得到zᵢ ⁽4⁾,再应用sigmoid函数和激活函数得到激活值aᵢ ⁽4⁾,也就是神经网络中最后的输出值。

放大详解z ₁ ⁽3⁾:各个权重 ✖ 权重对应特征值,即,z ₁ ⁽3⁾ = 紫色权重✖上个单元的值即a₀ ⁽2⁾➕红色权重✖a₁ ⁽2⁾➕青色权重✖a₂ ⁽2⁾
详解z₁⁽3⁾

反向传播在这里插入图片描述

忽略代价函数中的λ,括号中的在这里插入图片描述对应第i个训练样本x(i)、y(i),所以第i个训练样本的代价函数可以写成如下形式:在这里插入图片描述,而这个代价函数扮演了一个类似方差的角色,所以我们可以简化这个表达式近似为:在这里插入图片描述,这表示了神经网络预测样本值得准确程度

再来看反向传播过程

δⱼ ⁽ ᶩ ⁾:在第l层第j个单元得到的激活项aⱼ ⁽ ᶩ ⁾的误差。
更准确地说δ项实际上是代价函数cost(i)关于zⱼ ⁽ ᶩ ⁾的偏导数,也就是计算出的z项的加权和,或者说代价函数关于z项的偏导数,这个代价函数是一个关于标签y和神经网络中h(x)的输出值的函数。它实际是代价函数关于这些所计算的中间项目的偏导数。它们衡量的是为了影响这些中间值我们想要改变神经网络中的权重的程度,进而影响整个神经网络的输出h(x),并影响所有的代价函数。
在这里插入图片描述
在上图所示模型中:δ1⁽4⁾ = y - a1⁽4⁾,在进行反向传播,计算出上一层的这些δ项【δ1⁽3⁾、δ2⁽3⁾】,再反向传播计算上一层【δ1⁽2⁾、δ2⁽2⁾】
例如求
δ2⁽2⁾

在这里插入图片描述
δ₂⁽2⁾ = 𝜃₁₂⁽2⁾ δ₁⁽3⁾ ➕ 𝜃₂₂⁽2⁾ δ₂⁽3⁾
**注意:**这些δ值都只关于隐藏单元,并不包括偏执单元

梯度检验

对一个较为复杂的模型(例如神经网络)使用梯度下降算法时,可能会存在一些不容易察觉的bug,虽然代价看上去在不断减小,但最终的结果可能并不是最优解。
为了避免这样的问题,我们采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法,来确保向前传播以及向后传播是正确的。
这种方法的思想是通过估计梯度值来检验我们计算的导数值是否真的是我们要求的。
对梯度的估计采用的方法是在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度。即对于某个特定的 𝜃,我们计算出在 𝜃-𝜀 处和 𝜃+𝜀 的代价值(𝜀是一个非常小的值,通常选取 0.0001),然后求两个代价的平均,用以估计在 𝜃处的代价值。
在这里插入图片描述
例如上图,若𝜃为实数,为了求J(𝜃)导数的近似值,取极小的值𝜀,得到 J(𝜃+𝜀) 和 J(𝜃-𝜀) ,连接J(𝜃+𝜀) 和 J(𝜃-𝜀)得到红色斜线,此斜线的斜率即为J(𝜃)导数的近似值,斜线的斜率等于 J(𝜃+𝜀) 与 J(𝜃-𝜀) 的高度差除以𝜃+𝜀与𝜃-𝜀的距离差,即**[ J(𝜃+𝜀) ➖ J(𝜃-𝜀) ]➗2𝜀**。[ J(𝜃+𝜀) ➖ J(𝜃-𝜀) ]➗2𝜀也叫双侧差分,而[ J(𝜃+𝜀) ➖ J(𝜃) ]➗𝜀叫单侧差分,一般单侧差分不够准确。
𝜃为向量参数,如图:
在这里插入图片描述
总结: 反向传播计算出的导数存储在矩阵 𝐷𝑖𝑗(𝑙) 中,检验时我们要将该矩阵展开成为向量,同时我们也将 𝜃 矩阵展开为向量,我们针对每一个 𝜃 都计算一个近似的梯度值,将这些值存储于一个近似梯度矩阵中,最终将得出的这个矩阵同 𝐷𝑖𝑗(𝑙) 进行比较。反向传播是正确的就要关闭梯度检验,使用反向传播进行模型的训练学习

随机初始化

任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为 0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。如果我们令所有的初始参数都为 0,这将意味着我们第二层的所有激活单元都会有相同的值,这样的问题叫做对称权重问题。同理,如果我们初始所有的参数都为相同一个非 0 的数,结果也是一样的。
随机初始化就是解决这种对称问题的方法。对于每个 𝜃都初始化在[-𝜀,𝜀]的区间范围内。

总结

当我们训练一个神经网络模型,步骤如下:
①选择一种网络架构。即神经元之间的连接模式,选择多少隐藏层以及决定每层分别有多少个单元。
首先我们已经决定了输入单元的数量(训练集的特征数量)、输出层的单元数目(训练集的结果的类的数量),注意:输出值为向量;对于隐藏层的单元个数以及隐藏层的数目,默认是只使用单个隐藏层,如果隐藏层数大于 1,默认每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好。
训练神经网络

  1. 构建神经网络并随机初始化权重参数。通常,我们把权重初始化为很小的值,接近于0。
  2. 执行向前传播算法计算所有的ℎ𝜃(𝑥)。对于任意一个输入X(i),计算出对应的h(x(i)),也就是一个输出值Y的向量。
  3. 计算出代价函数J(𝜃)
  4. 执行反向传播算法计算偏导数。J(𝜃)关于𝜃的偏导数。
  5. 使用梯度检验检验反向传播得到的偏导数。确保反向传播算法是正确执行的,检查完后要停用梯度检验。
  6. 使用最优化算法比如梯度下降算法或者更加高级的优化方法比如LBFGS算法、共轭梯度法,与反向传播算法相结合,最小化代价函数J(𝜃)

注:代价函数J(𝜃)值越小,表示假设函数ℎ𝜃(𝑥)与实际值y(x)越接近,拟合度好。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值