zoukankan      html  css  js  c++  java
  • 详解神经网络中的反向传播

    严格的数学定义

    务必先认真研究参考资料1,否则后面的内容就不用看了.Jacobian在本质上是个行列式,在参考资料1下引出Jacobian式是为了解决方程组定义的隐函数求导问题.

    程序设计上的约定

    刚才已经明确,从严格的数学定义上讲,求导或者求偏导只有函数对自变量而言,其余任务情况,从数学上讲都是错的.但是很多机器学习的资料和开源库都涉及到标量对向量求导.比如下面这个pytorch的例子.

    import torch
    x = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
    y = x ** 2 + 2
    z = torch.sum(y)
    z.backward()
    print(x.grad)
    

    简单解释下,设(x=[x_1,x_2,x_3]),则

    [egin{equation*} z=x_1^2+x_2^2+x_3^2+6 end{equation*} ]

    [egin{equation*} frac{partial z}{partial x_1}=2x_1 end{equation*} ]

    [egin{equation*} frac{partial z}{partial x_2}=2x_2 end{equation*} ]

    [egin{equation*} frac{partial z}{partial x_3}=2x_3 end{equation*} ]

    当将x_1=1.0,x_2=2.0,x_3=3.0代入就可以得到

    [egin{equation*} (frac{partial z}{partial x_1},frac{partial z}{partial x_1},frac{partial z}{partial x_1})=(2x_1,2x_2,2x_3)=(2.0,4.0,6.0) end{equation*} ]

    结果是和pytorch的输出是一样的.反过来想想,其实所谓的"标题对向量求导"本质上是函数对各个自变量求导,这里只是把各个自变量看成一个向量.和数学上的定义并不矛盾.

    backward的gradient参数作用

    现在有如下问题,已知

    [egin{equation*} y_1=x_1^2+2 end{equation*} ]

    [egin{equation*} y_2=x_2^2+2 end{equation*} ]

    [egin{equation*} y_3=x_3^2+2 end{equation*} ]

    [egin{equation*} A=f(y_1,y_2,y_3) end{equation*} ]

    其中函数(f(y_1,y_2,y_3))的具体定义未知,现在求

    [egin{equation*} frac{partial A}{partial x_1}=? end{equation*} ]

    [egin{equation*} frac{partial A}{partial x_2}=? end{equation*} ]

    [egin{equation*} frac{partial A}{partial x_3}=? end{equation*} ]

    根据参考资料1中讲的多元复合函数的求导法则.

    [egin{equation*} frac{partial A}{partial x_1}=frac{partial A}{partial y_1}frac{partial y_1}{partial x_1}+frac{partial A}{partial y_2}frac{partial y_2}{partial x_1}+frac{partial A}{partial y_3}frac{partial y_3}{partial x_1} end{equation*} ]

    [egin{equation*} frac{partial A}{partial x_2}=frac{partial A}{partial y_1}frac{partial y_1}{partial x_2}+frac{partial A}{partial y_2}frac{partial y_2}{partial x_2}+frac{partial A}{partial y_3}frac{partial y_3}{partial x_2} end{equation*} ]

    [egin{equation*} frac{partial A}{partial x_3}=frac{partial A}{partial y_1}frac{partial y_1}{partial x_3}+frac{partial A}{partial y_2}frac{partial y_2}{partial x_3}+frac{partial A}{partial y_3}frac{partial y_3}{partial x_3} end{equation*} ]

    上面3个等式可以写成矩阵相乘的形式.如下

    [egin{equation}label{simple} [frac{partial A}{partial x_1},frac{partial A}{partial x_2},frac{partial A}{partial x_3}]= [frac{partial A}{partial y_1},frac{partial A}{partial y_2},frac{partial A}{partial y_3}] left[ egin{matrix} 1 & 2 & 3 \ 1 & 2 & 3 \ 1 & 2 & 3 end{matrix} ight] end{equation} ]

    参考资料

    1. 同济大学数学系,高等数学第七版下册,高等教育出版社,2015. p78-80,p88-91
  • 相关阅读:
    获取 iPhone 上联系人姓名、电话、邮件的代码
    NSDate常用代码范例
    iphone开发之多线程NSThread和NSInvocationOperation
    iphone 定时提醒
    iphone 程序自动登陆
    搞定大厂算法面试之leetcode精讲11剪枝&回溯
    大厂算法面试之leetcode精讲7.双指针
    大厂算法面试之leetcode精讲8.滑动窗口
    大厂算法面试之leetcode精讲15.链表
    大厂算法面试之leetcode精讲10.递归&分治
  • 原文地址:https://www.cnblogs.com/zhouyang209117/p/6434662.html
Copyright © 2011-2022 走看看