吴恩达机器学习(七)——神经网络的学习(Neural Networks: Learning)

1、代价函数(Cost Function)

本节主要讨论神经网络在分类问题中的应用。
在这里插入图片描述

  • ?表示神经网络层数,上图?=4,??表示每层神经元个数(不包括偏置单元),??代表最后一层中处理单元的个数。
  • 二分类:?? = 1,? = 0 ?? 1表示哪一类;?分类:?? = ?,?? = 1表示分到第 i 类(? > =3),hθ(x)为K维。
    在这里插入图片描述
  • 在逻辑回归中,只有一个输出变量y,又称标量(scalar) ?,在神经网络中,可以有很多输出变量,ℎ?(?)是一个维度为?的向量,h(x)带下标i 来表示第i个输出。
  • 式中k=1到K为k个输出神经元代价函数总和。

2、反向传播算法(Backpropagation Algorithm)

本节主要介绍让代价函数最小化的算法。计算代价函数的偏导数 ??(?)/????(?) ,需要采用一反向传播算法,首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。

假设训练集只有一个实例(?(1),?(1)):
在这里插入图片描述
神经网络是一个四层的神经网络,其中? = 4,?? = 4,? = 4。
在这里插入图片描述

  • 从最后一层的误差开始计算,误差是激活单元的预测(aj(4))与实际值(??)之间的误差。用?来表示误差,则:?(4) = ?(4) − ?。
  • 利用这个误差值来计算前一层的误差:?(3) = (?(3))??(4) ∗ ?′(?(3)), 其中 ?′(?(3))是 ? 形函数的导数,?′(?(3)) = ?(3) ∗ (1 − ?(3))。而(?(3))??(4)则是权重导致的误差的和。
  • 下一步是继续计算第二层的误差: ?(2) = (?(2))??(3) ∗ ?′(?(2))。
  • 没有?(1),因为第一层是输入变量,不存在误差。
  • 假设? = 0,即不做任何正则化处理时有:
    在这里插入图片描述
    上面式子中上下标的含义:
    ? 代表目前所计算的是第几层。
    ? 代表目前计算层中的激活单元的下标,也将是下一层的第?个输入变量的下标。
    ? 代表下一层中误差单元的下标,是受到权重矩阵中第?行影响的下一层中的误差单元的下标。

假设训练集有m个实例:
在这里插入图片描述
设置???(?) = 0,Δ表示大写的δ,累加用来算出偏导数,第 ? 层的第 ? 个激活单元受到第 ? 个参数影响而导致的误差。

  • 设定a(1)(也就是输入层的激励函数)等于 x(i), x(i) 是第 i 个训练样本的输入值。
  • 接下来运用正向传播来计算第二层的激励值,然后是第三层、第四层直到最后一层 L层。
  • 接下来用这个样本的输出值 y(i) ,来计算这个输出值所对应的误差项 δ(L) ,所以 δ(L) 就是假设输出减去目标输出。
  • 接下来用反向传播算法来计算 δ(L-1) 、δ(L-2) 一直到 δ(2) ,没有 δ(1) ,因为不需要对输入层考虑误差项。
  • 最后用这些大写的 Δ来累积前面写好的偏导数项,如果δij 中 i j 代表矩阵中的位置,那么如果 δ(L) 是一个矩阵,可以写成Δ(l):= Δ(l)(l+1) * (a(l))T
  • 跳出 for 循环,计算下面式子,对于 j=0 和 j≠0分两种情况讨论对应偏差项。

计算出来这些,正好是代价函数关于每一个参数的偏导数,所以可以把他们用在梯度下降法或者其他一种更高级的优化算法上。

3、反向传播算法的直观理解(Backpropagation Intuition)

前向传播算法:
在这里插入图片描述

  • 训练样本(x(i) ,y(i)),x(i)将被传入输入层,标注如图隐藏层 x1(i) 和 x1(i)
  • 进行前向传播传播到第一个隐藏层时,算出 z1(2)和z2(2),这两个值是输入单元的加权总和。
  • 接下来将S型的逻辑函数和S型的激励函数应用到z值上,得出了这样的激励值a1(2)和a2(2)的值。
  • 然后再做一次前向传播,z1(3)应用S型的逻辑函数和激励函数得到a1(3)
  • 依次进行下去,最后得到 z1(4)应用激励函数得到a1(4)

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

  • 在逻辑回归中,用稍微复杂的一点的log函数表示代价函数,为了容易理解可以把这个代价函数看作是某种平方误差函数。
  • 同理可以把 cost(i) 想成是该神经网络输出值与实际值的差的平方。表征该神经网络是否能准确地预测样本 i 的值,也就是输出值和实际观测值y(i)的接近程度。
    在这里插入图片描述
  • 把z(l)j 项稍微改一点点,那就将影响到该神经网络的输出,并且最终会改变代价函数的值。
  • δ 项实际上是关于cost 函数对中间项zj(l)的偏微分,度量神经网络权值改变的多少,对中间的计算量影响是多少,进一步地对整个神经网络的输出 h(x)影响多少,以及对整个的代价值影响多少。
  • 设置δ项,δ1(4),输出层δ1(4) =y(i) - a1(4)
  • 计算出δ1(3)和 δ2(3),然后同样的再进行下一层的反向传播,计算出δ1(2)及 δ2(2)
  • 设置权重,得 δ2(2) = Θ12(2)δ1(3)22(2)δ2(3),δ2(3)12(3)1(4)
  • 这里 δ 值没有包括偏差单元 1,是否包括偏差单元取决于如何定义这个反向传播算法,或者取决于怎样实现这个算法。

4、实现注意:展开参数(Implementation Note_ Unrolling Parameters)

本节主要介绍一个细节的实现过程,如何把参数从矩阵展开成向量,以便在高级最优化步骤中的使用。
在这里插入图片描述

  • Octave函数中的这些 θ 和 θ的初始值 都是n或者n+1阶参数向量,梯度值(gradient)也是n阶或者n+1阶的向量。
  • 然而神经网络的参数Θ不是向量而是矩阵。
    在这里插入图片描述
  • 假设有一个神经网络其输入层有10个输入单元,隐藏层有10个单元,输出层只有一个输出单元,则Θ和D的维度均是10x11的矩阵。 在这里插入图片描述
  • 取出三个 Θ 和 D 矩阵中所有元素,把它们展成长向量thetaVec和DVec(initialTheta)。
    在这里插入图片描述
  • 从向量表达式返回到矩阵表达式,从thetaVec抽出前110个元素,再使用reshape矩阵变维命令,就可以得到10x11维度的Theta1的矩阵。 在这里插入图片描述
  • 使用矩阵表达式的好处是当以矩阵的形式储存参数时,进行正向传播和反向传播时会更加方便。
  • 向量表达式的优点是,当使用一些高级的优化算法时这些算法,通常要求所有的参数都要展开成长向量像thetaVec或者DVec这样的矩阵的形式。

5、梯度检验(Gradient Checking)

反向传播有很多细节,在实现的时候会有点复杂,而且在实现反向传播时会遇到很多细小的错误,如果把它和梯度下降法或者其他优化算法一起运行时,可能看起来它运行正常,一些小错误也会检查不出来。然而J(θ)看起来在减小,但是最后得到的神经网络误差可能比没有错误的还要高。

为了避免这样的问题,可以采取一种叫做梯度的数值检验(Numerical Gradient Checking)方法,这种方法的思想是通过估计梯度值来检验计算的导数值是否真的是所要求的,它可以解决基本所有的问题。每次实现反向传播或者或者其他比较复杂的模型采用类似的梯度下降算法时,这么做确定前向传播和反向传播是100%正确的,出现的错误大多数与反向传播有关。

θ为实数:
在这里插入图片描述

  • 在代价函数上沿着切线的方向选择离两个非常近的点,然后计算两个点的平均值用以估计梯度。即对于某个特定的 ?,计算出在 ?- ε 处和 ?+ε 的代价值(非常小,通常选取 10-4 = 0.001),然后求两个代价的平均,用以估计在 ? 处的代价值。
  • 上图左边公式叫做双侧差分,右边叫做单侧差分,双侧差分估计更加精确。
  • Octave实现:在这里插入图片描述

θ是n维向量:
在这里插入图片描述

  • 代价函数的偏导数检验只针对一个参数的改变进行检验。
    在这里插入图片描述
  • 将gradApprox实现数值梯度检验与反向传播计算DVec进行对比,如果相同或非常接近,最多几位小数的差距,那么就确信实现的反向传播正确的。
  • 把这些DVec向量用在梯度下降法或者其他高级优化算法,可以比较确信计算的导数是正确的,代码会正常运行。
    在这里插入图片描述
  • 在运行算法之前(比如多次迭代的梯度下降或是多次迭代训练分类器高级优化算法),要确保禁用梯度检验代码。如果在每次梯度下降迭代或者每次代价函数的内循环里都运行一次梯度检验,程序会变得非常慢,因为梯度检验比反向传播算法要慢得多。

6、随机初始化(Random Initialization)

  • 任何优化算法都需要一些初始的参数。到目前为止我们都是初始所有参数为0,这样的初始方法对于逻辑回归来说是可行的,但是对于神经网络来说是不可行的。
  • 如果令所有的初始参数都为 0,这将意味着第二层的所有激活单元,误差项等都是相同的值。同理,如果初始所有的参数都为一个非 0 的数,结果也是一样的。
  • 对称权重:所有权重都相同。
  • 通常初始参数为正负之间的接近于0的随机值,假设我们要随机初始一个尺寸为 10×11 的参数矩阵,代码如下:
    在这里插入图片描述

7、综合应用(Putting It Together)

本节小结一下使用神经网络时的步骤。

  • 网络结构:第一件要做的事是选择网络结构,也就是神经网络之间的连接模式,即决定选择多少层以及决定每层分别有多少个单元。
  • 第一层的单元数即我们训练集的特征数量。
  • 最后一层的单元数是我们训练集的结果的类的数量,每个类别用向量表示[1,0,0,0,0,…]T,[0,1,0,0,0,…]T,……。
  • 如果隐藏层数大于 1,确保每个隐藏层的单元个数相同,数目要与特征数相匹配,大约几倍,且通常情况下隐藏层单元的个数越多越好,但计算量也随之增大。
  • 我们真正要决定的是隐藏层的层数和每个中间层的单元数。

训练神经网络:

  1. 构建一个神经网络,然后随机初始化权重(通常很小,接近于0)
  2. 执行前向传播算法,即对神经网络输入任意一个?(i)计算出对应的值ℎ?(?(i)),也就是一个输出值y的向量
  3. 通过代码计算出代价函数 ?(Θ)
  4. 利用反向传播方法计算所有偏导数项aJ(Θ)/aΘjkl
  5. 利用梯度检验来比较这些已经计算得到的偏导数项,把用反向传播算法得到的偏导数值与用数值方法得到的估计值进行比较,确保两种方法得到相近的值,停用梯度检验;
  6. 使用优化算法来最小化代价函数,如梯度下降算法或高级优化算法(LBFGS算法、共轭梯度法或其他内置到fminunc函数中的方法),将这些方法和反向传播算法相结合去最小化代价函数J(Θ)

注:神经网络中的代价函数J(Θ)是一个非凸函数。
在这里插入图片描述

8、无人驾驶(Autonomous Driving)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值