【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)

神经网络的学习

  • 代价函数(Cost Function)
  • 反向传播算法(Backpropagation Algorithm)
  • 理解反向传播(Backpropagation Intuition)
  • 使用注意:展开参数(Implementation Note: Unrolling Parameters)
  • 梯度检测(Gradient Checking)
  • 随机初始化(Random Initialization)
  • 综合起来( Putting it Together)
  • 无人驾驶(Autonomous Driving Example)

代价函数(Cost Function)

  • 假设神经网络的训练样本有 m m m

    每个样本包含一组输入 x x x和一组输出信号 y y y

    L L L表示神经网络层数

    S I S_I SI表示每层的神经元个数

    S L S_L SL代表最后一层中处理单元的个数

  • 二类分类和K类分类:

    【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第1张图片

  • 逻辑回归中只有一个输出变量,神经网络中可以有很多输出变量,代价函数更加复杂:
    J ( Θ ) = 1 m [ ∑ i = 1 m ∑ k = 1 K y k ( i ) l o g ( h Θ ( x ( i ) ) ) k + ( 1 − y k ( i ) ) l o g ( 1 − ( h Θ ( x ( i ) ) ) k ) ] + λ 2 m ∑ l = 1 L − 1 ∑ i = 1 s l ∑ j = 1 s l + 1 ( Θ j i ( l ) ) 2 J(\Theta)=\cfrac{1}{m}\big[\displaystyle\sum^m_{i=1}\sum^K_{k=1}y^{(i)}_klog(h_\Theta(x^{(i)}))_k+(1-y^{(i)}_k)log(1-(h_\Theta(x^{(i)}))_k)\big]+\cfrac{\lambda}{2m}\displaystyle\sum^{L-1}_{l=1}\sum^{s_l}_{i=1}\sum^{s_{l+1}}_{j=1}(\Theta^{(l)}_{ji})^2 J(Θ)=m1[i=1mk=1Kyk(i)log(hΘ(x(i)))k+(1yk(i))log(1(hΘ(x(i)))k)]+2mλl=1L1i=1slj=1sl+1(Θji(l))2

    • Θ \Theta Θ的大小为 s ( j + 1 ) × ( s j + 1 ) s_{(j+1)} \times (s_j +1) s(j+1)×(sj+1),由于不包含偏差单位,所以为 s ( j + 1 ) × s j s_{(j+1)} \times s_j s(j+1)×sj,所以下标为 j i ji ji.

反向传播算法(Backpropagation Algorithm)

  • 目的: 计算代价函数的偏导数 ∂ ∂ Θ i j ( l ) J ( Θ ) \cfrac{\partial}{\partial\Theta^{(l)}_{ij}}J(\Theta) Θij(l)J(Θ).

  • 步骤: 首先计算最后一层的误差,然后再一层一层反向求出各层的误差,直到倒数第二层。

  • 例子: 训练集只有一个样本 ( x ( 1 ) , y ( 1 ) ) ({x}^{(1)},{y}^{(1)}) (x(1),y(1)),神经网络是一个四层的神经网络,其中 K = 4 , S L = 4 , L = 4 K=4,S_{L}=4,L=4 K=4SL=4L=4

    • 向前传播算法:

      【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第2张图片

    • 向后传播算法:

      • 从最后一层的误差开始计算,误差是激活单元的预测值 a ( 4 ) {a^{(4)}} a(4)与实际值 y k y^k yk之间的误差。

      • δ \delta δ来表示误差,则: δ ( 4 ) = a ( 4 ) − y \delta^{(4)}=a^{(4)}-y δ(4)=a(4)y

      • 利用这个误差值来计算前一层的误差: δ ( 3 ) = ( Θ ( 3 ) ) T δ ( 4 ) ∗ g ′ ( z ( 3 ) ) \delta^{(3)}=({\Theta^{(3)}})^{T}\delta^{(4)}\ast g'(z^{(3)}) δ(3)=(Θ(3))Tδ(4)g(z(3)) 其中 g ′ ( z ( 3 ) ) g'(z^{(3)}) g(z(3))是 S 形函数的导数, g ′ ( z ( 3 ) ) = a ( 3 ) ∗ ( 1 − a ( 3 ) ) g'(z^{(3)})=a^{(3)}\ast(1-a^{(3)}) g(z(3))=a(3)(1a(3)) ( Θ ( 3 ) ) T δ ( 4 ) (\Theta^{(3)})^{T}\delta^{(4)} (Θ(3))Tδ(4)则是权重导致的误差的和。

      • 继续计算第二层的误差: $ \delta{(2)}=(\Theta{(2)}){T}\delta{(3)}\ast g’(z^{(2)})$ 。因为第一层是输入变量,不存在误差。

      • 有了所有的误差的表达式后,便可以计算代价函数的偏导数了,假设 λ = 0 λ=0 λ=0,即我们不做任何正则化处理时有: ∂ ∂ Θ i j ( l ) J ( Θ ) = a j ( l ) δ i l + 1 \cfrac{\partial}{\partial \Theta^{(l)}_{ij}}J(\Theta)=a^{(l)}_j\delta^{l+1}_i Θij(l)J(Θ)=aj(l)δil+1.

        l l l 代表目前所计算的是第几层。

        j j j 代表目前计算层中的激活单元的下标,也将是下一层的第 j j j 个输入变量的下标。

        i i i 代表下一层中误差单元的下标,是受到权重矩阵中第 i i i 行影响的下一层中的误差单元的下标。

      【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第3张图片

  • 反向传播算法:

    【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第4张图片

    • 首先用正向传播方法计算出每一层的激活单元,利用训练集的结果与神经网络预测的结果求出最后一层的误差,然后利用该误差运用反向传播法计算出直至第二层的所有误差。
    • 在求出了 Δ i j ( l ) \Delta_{ij}^{(l)} Δij(l)之后,便可以计算代价函数的偏导数 D i j ( l ) D_{ij}^{(l)} Dij(l) 了。

理解反向传播(Backpropagation Intuition)

  • “正向传播”求损失,“反向传播”回传误差。同时,神经网络每层的每个神经元都可以根据误差信号修正每层的权重
  • 参考链接:“反向传播算法”过程及公式推导(超直观好懂的Backpropagation)

【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第5张图片

使用注意:展开参数(Implementation Note: Unrolling Parameters)

  • 怎样把你的参数从矩阵展开成向量,以便我们在高级最优化步骤中的使用需要。

【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第6张图片

梯度检测(Gradient Checking)

  • 用途: 通过估计梯度值来检验导数值是否真的是我们要求的。(确保反向传播的正确性)

  • 方法: 在代价函数上沿着切线的方向选择离两个非常近的点然后计算两个点的平均值用以估计梯度(拉格朗日中值定理)。即 d d θ J ( θ ) ≈ J ( θ + ε ) − J ( θ − ε ) 2 ε \cfrac{d}{d\theta}J(\theta)\approx\cfrac{J(\theta+\varepsilon)-J(\theta-\varepsilon)}{2\varepsilon} dθdJ(θ)2εJ(θ+ε)J(θε).

    【机器学习】课程笔记08_神经网络的学习(Neural Networks Learning)_第7张图片

  • 注意: 当梯度检测结果与反向传播所求得的偏导一致时,要确保在机器学习之前关闭梯度检测,因为它花费的时间要远远大于反向传播,如果在每次梯度下降得迭代中进行梯度检测,会导致代码运行得很慢。

随机初始化(Random Initialization)

  • 对称权重问题: 若初始 θ \theta θ值均为0,则每次更新后,所有隐藏单元的每个参数输入都是相等的,每个输入值的权重也相等,即使梯度下降进行了一次迭代,但所有的隐藏单元依然以相同的函数作为输入来计算。造成高度冗余,最后的逻辑回归单元只能得到一个特征。

  • 随机初始化: 解决对称权重问题。

  • 方法: 对每个 θ \theta θ值将其初始化为一个范围在 [ − ε , ε ] [-\varepsilon,\varepsilon] [ε,ε]之间的随机值。

    Theta1 = rand(10, 11) * (2*eps) – eps  %rand(10,11)表示生成一个10×11的矩阵,每个元素值都在[0,1]之间
    

综合起来( Putting it Together)

  • 选择网络结构: 决定选择多少层以及决定每层分别有多少个单元。
    • 第一层的单元数即我们训练集的特征数量
    • 最后一层的单元数是我们训练集的结果的类的数量
    • 如果隐藏层数大于1,确保每个隐藏层的单元个数相同,通常情况下隐藏层单元的个数越多越好
    • 我们真正要决定的是隐藏层的层数(默认为1)和每个隐藏层的单元数(和输入特征数匹配或是其倍数)。
  • 训练神经网络
    1. 参数的随机初始化
    2. 利用正向传播方法计算所有的 h θ ( x ) h_{\theta}(x) hθ(x)
    3. 编写计算代价函数 J J J 的代码
    4. 利用反向传播方法计算所有偏导数
    5. 利用数值检验方法检验这些偏导数
    6. 使用优化算法来最小化代价函数

无人驾驶(Autonomous Driving Example)

你可能感兴趣的:(神经网络,学习)