zoukankan      html  css  js  c++  java
  • 李宏毅机器学习课程笔记-5.3神经网络中的反向传播算法

    链式法则(Chain Rule)

    • (z=h(y),y=g(x) ofrac{dz}{dx}=frac{dz}{dy}frac{dy}{dx})
    • (z=k(x,y),x=g(s),y=h(s) ofrac{dz}{ds}=frac{dz}{dx}frac{dx}{ds}+frac{dz}{dy}frac{dy}{ds})

    反向传播算法(Backpropagation)

    变量定义

    如下图所示,设神经网络的输入为(x^n),该输入对应的label是(hat y^n),神经网络的参数是( heta),神经网络的输出是(y^n)

    整个神经网络的Loss为(L( heta)=sum_{n=1}^{N}C^n( heta))。假设( heta)中有一个参数(w),那(frac{partial L( heta)}{partial w}=sum^N_{n=1}frac{partial C^n( heta)}{partial w})

    Backpropagation1

    一个神经元的情况

    如下图所示,(z=x_1w_1+x_2w_x+b),根据链式法则可知(frac{partial C}{partial w}=frac{partial z}{partial w}frac{partial C}{partial z}),其中为所有参数(w)计算(frac{partial z}{partial w})是Forward Pass、为所有激活函数的输入(z)计算(frac{partial C}{partial z})是Backward Pass。

    Backpropagation2.png

    Forward Pass

    Forward Pass是为所有参数(w)计算(frac{partial z}{partial w}),它的方向是从前往后算的,所以叫Forward Pass。

    以一个神经元为例,因为(z=x_1w_1+x_2w_x+b),所以(frac{partial z}{partial w_1}=x_1,frac{partial z}{partial w_2}=x_2),如下图所示。

    Forward Pass1

    规律是:该权重乘以的那个输入的值。所以当有多个神经元时,如下图所示。

    Forward Pass2

    Backward Pass

    Backward Pass是为所有激活函数的输入(z)计算(frac{partial C}{partial z}),它的方向是从后往前算的,要先算出输出层的(frac{partial C}{partial z}),再往前计算其它神经元的(frac{partial C}{partial z}),所以叫Backward Pass。

    BackwardPass1

    如上图所示,令(a=sigma(z)),根据链式法则,可知(frac{partial C}{partial z}=frac{partial a}{partial z}frac{partial C}{partial a}),其中(frac{partial a}{partial z}=sigma'(z))是一个常数,因为在Forward Pass时(z)的值就已经确定了,而(frac{partial C}{partial a}=frac{partial z'}{partial a}frac{partial C}{partial z'}+frac{partial z''}{partial a}frac{partial C}{partial z''}=w_3frac{partial C}{partial z'}+w_4frac{partial C}{partial z''}),所以(frac{partial C}{partial z}=sigma'(z)[w_3frac{partial C}{partial z'}+w_4frac{partial C}{partial z''}])

    对于式子(frac{partial C}{partial z}=sigma'(z)[w_3frac{partial C}{partial z'}+w_4frac{partial C}{partial z''}]),我们可以发现两点:

    1. (frac{partial C}{partial z})的计算式是递归的,因为在计算(frac{partial C}{partial z})的时候需要计算(frac{partial C}{partial z'})(frac{partial C}{partial z''})

      如下图所示,输出层的(frac{partial C}{partial z'})(frac{partial C}{partial z''})是容易计算的。

      BackwardPass3
    2. (frac{partial C}{partial z})的计算式(frac{partial C}{partial z}=sigma'(z)[w_3frac{partial C}{partial z'}+w_4frac{partial C}{partial z''}])是一个神经元的形式

      如下图所示,只不过没有嵌套sigmoid函数而是乘以一个常数(sigma'(z)),每个(frac{partial C}{partial z})都是一个神经元的形式,所以可以通过神经网络计算(frac{partial C}{partial z})

      BackwardPass2

    总结

    1. 通过Forward Pass,为所有参数(w)计算(frac{partial z}{partial w})
    2. 通过Backward Pass,为所有激活函数的输入(z)计算(frac{partial C}{partial z})
    3. 最后(frac{partial C}{partial w}=frac{partial C}{partial z}frac{partial z}{partial w}),也就求出了梯度。

    Github(github.com):@chouxianyu

    Github Pages(github.io):@臭咸鱼

    知乎(zhihu.com):@臭咸鱼

    博客园(cnblogs.com):@臭咸鱼

    B站(bilibili.com):@绝版臭咸鱼

    微信公众号:@臭咸鱼的快乐生活

    转载请注明出处,欢迎讨论和交流!


  • 相关阅读:
    Js--Array类型1
    利用js生成一个在线考试系统
    在Asp.net core 项目中操作Mysql数据库
    Unity游戏接入TypeSDK集成笔记
    第一篇博客
    两次面试
    [OC笔记] static 关键字
    cellForRowAtIndexPath方法不执行的那些坑
    一行代码设置UITableView分割线的长度
    [转载]iOS开发:获取设备信息
  • 原文地址:https://www.cnblogs.com/chouxianyu/p/14348627.html
Copyright © 2011-2022 走看看