• umich cv-3-2


    UMICH CV Neural Network

    既然谈到神经网络,我们肯定要讨论在神经网络中是如何进行梯度的计算以及参数的优化的
    传统的方法就是我们手动计算梯度,但是随着神经网络层数的增加,这种方法显然过于复杂
    因此我们引入了计算图的概念,从一个简单的例子出发:
    img
    我们可以把一个(x+y)z的计算式拆分成上图所示,向前传播就是计算出我们的输出结果,一步步
    而反向传播是为了计算梯度,比如说我们想要f对x,y,z的偏导
    求f对y的偏导 我们可以根据链式法则来计算:
    img
    用专业的语言,我们要求下游梯度,现在我们在当前一个节点,可以很容易求出当前梯度,上游再将之前计算出的上游梯度传递给我们,我们就可以计算出下游梯度:
    img

    举一个更复杂的例子:
    img
    这里我们可以把中间sigmoid函数这一部分合并成为一个节点,直接用上游梯度,乘以计算得到的当前梯度,简化计算图的计算过程

    计算图本身有些节点也存在着规律:
    img
    +节点,它们的下游节点梯度于上游节点梯度相等
    *节点,它们下游节点梯度等于上游节点梯度乘以另一个下游节点的值
    复制节点,下游节点梯度等于上游节点梯度之和
    max节点,下游较大节点梯度于上游相等,较小节点为0

    涉及到实际应用时,我们可以选择直接一步步实现前向传播钰反向:
    img
    也可以写成模块化的形式:
    img

    上面讨论的都是针对一个数的梯度计算过程,我们还需要把它推广到矩阵与向量,首先需要一点矩阵/向量之间的微分知识:
    img

    向量反向传播:
    img
    img
    只有对角线上元素有关系,所以除了对角线其它元素均为0,在对角线上的元素,由于是max函数,所以大于0的和对y求导的值相等,小于0的值为0
    注意到这个矩阵绝大多数的数均为0,所以我们在具体实现的时候不要直接用矩阵来进行乘法,可以直接应用我们的推理结果:
    img

    矩阵反向传播:
    img
    显然当地矩阵非常大,我们不可能直接去用矩阵来进行乘法运算:
    img
    img
    img
    我们根据定义去求dy/dx1,1,可以发现最终数值等于w矩阵的第一行,最终结果可以换成下图所示形式
    img
    我们也可以通过矩阵的形状去记忆,最终结果是一个ND的矩阵,所以要乘以一个MD的矩阵,就是W的转置

    在作业中我们要实现两层神经网络的前向传播与反向传播,前向传播比较简单直接计算即可,反向传播分为两步
    score = W2h1+b2
    根据softmax损失函数的定义梯度,我们可以计算出dL/dscore,再根据之前推导,dL/dw2 = dL/dscore * dscore/dw2 = h1.t() * dL/dscore
    dL/dh1 = dL/dscore * w2.t()
    dL/db2 = dL/dscore,偏置项这里的梯度计算就是累和,注意维度一致
    同样h1 = W1
    x+b1 也可以这样计算

    反向传播也可以计算高阶导数,只需要把低阶导数作为计算图的一部分,然后反向传播即可
    img

  • 相关阅读:
    mysql里的主从复制
    ChatGPT-4 Alpha:OpenAI的革命性升级
    专题四:指令
    【搭建私人图床】本地PHP搭建简单Imagewheel云图床,在外远程访问
    DGIOT云云对接——第三方平台对接dgiot基本接口介绍
    TDengine3.0 新架构设计思路
    自媒体短视频怎么提高播放量?从这三个方面入手
    软件测试中如何测试算法?
    【MAPBOX基础功能】13、mapbox点击线图层高亮指定的线段
    【Windows Docker:安装nginx】
  • 原文地址:https://www.cnblogs.com/dyccyber/p/17764347.html