深度学习——深度学习中的梯度计算

格格巫MMQ!! 格格巫MMQ!!     2022-12-08     783

关键词:

梯度下降在【机器学习基础】中已经总结了,而在深度学习中,由于模型更加复杂,梯度的求解难度更大,这里对在深度学习中的梯度计算方法进行回顾和学习。

本节主要是了解深度学习中(或者说是tensorflow中)梯度的计算是怎么做的。

  1. 计算图
      在学习tensorflow中,我们知道tensorflow都是基于图来进行计算的,那么什么是计算图呢?

所谓计算图就是将一个function利用图的结构来进行表示。如图所示:

上面的图就表示a=f(b,c)这样一个方程,而图的节点表示变量,图的边表示操作(operation)。

再比如方程f=f(g(h(x)))这样一个方程,用计算图来表示:

之所以用计算图来表示方程,是因为图能够使得方程的结构更加清晰,计算顺序上一目了然,同时为后面的梯度提供了很大的便利性。接着往后看。

有了计算图,根据一个计算式,我们就可以构建出一张图出来,比如:

根据所建立的图,给定a=2,b=1,则可以顺着图结构顺利求出e。

  1. 计算图的链式求导法则
      例子1:函数z=h(g(x)),按照上面的做法,将其变成计算图如图所示:

根据链式求导求dz/dx,z先对y求导,然后y再对x求导得到:

例子2:另一个更复杂的z=k(g(s), h(s))这样一个函数,求dz/ds,首先建立一张计算图:

根据链式求导法则,s和x、y均有关系,因此z对x求导,x再对s求导是一条路,然后z对y求导,y再对s求导另一条路,两条路相加得到:

上面就是链式求导法则,那么链式求导法则在图计算中如何应用呢,继续使用上面那个e=(a+b)*(b+1):

根据我们建立的计算图和链式求导法则,求de/db:

然后分别对每个边的导数进行计算:

那么假如a=3,b=2,求e对b的导数,a、b代进上面的每条边上,将所要求的导数记为1,从1开始出发:

那么最后沿着红色的箭头一路计算b到e的路径就可以了(这里可以不用管节点的值):

从这里可以看到,图计算在求导数的计算中非常便利且清晰。

那么这么对于梯度的求解有什么好处呢?我们可以用reverse mode,利用图计算,从顶端开始,向底部走:

还是如果求e对b的导数,这次从e开始走,e=1,然后向下走能够到达b的每一条路:

也就是图中绿色的箭头的方向,即为reverse mode。需要求e对a的导数,则就从e一路走到a就可以了

这里注意,反向的路径箭头必须是反向的,也就是只能沿着绿色的箭头能够到达a的路径,因此从e到a只有一条路:

下面再举一个例子:

建立计算图后,然后为每个边补上对应的导数,这里需要注意,v=x2,那v对x的导数应该是2x,但是这里x*x相当于是两个变量,要区分对待,当做x1、x2:

接下来求y对x的导数,沿着红色的箭头,一共有3条路径:

  1. 深度学习中的梯度计算
      有了上面的计算图和反向求导,以及几个示例的说明,对于深度学习中的梯度计算就有了一个初步的雏形了。不过是在深度学习中的方程更加复杂而已。

我们只需要能够画出深度学习中的计算图,那么计算梯度也就水到渠成。

3.1 全连接网络的梯度计算
  首先来看全连接神经网络,在【机器学习基础】中对反向传播的过程进行了描述,分为前向和后向两个方面:

红色框中的正向传播用于求z对w的导数,绿色框的反向传播用于求loss对z的导数,二者相乘最终得到loss对w的导数。

而反向传播像是从loss开始,向输出层传递的一种“正向传播”过程:

根据全连接网络的正向传播过程,整个网络的从输入到输出的方程为:

于是,按照上面这个方程,全连接网络的计算图表示如下(假设只有2个隐藏层):

最终得到的y与真实的yhat计算loss,那么按照上面计算图以及导数计算的方法,则有:

在计算每一部分导数之前,由于网络的输入和中间变量均为矩阵,这里需要了解Jacobian Matrix(雅克比矩阵):

y是21的矩阵,x是31的矩阵,那么y对x的导数:

行数是y原来的size,列数为原来x的size。比如:

接下来回到全连接的计算图的梯度计算,使用reverse mode,从后向前一部分一部分来看:

首先是loss C对y的导数,在计算loss时,采用cross entropy:

C是一个数,y是一个m1矩阵(m表示类别数量),那么根据Jacobian Matrix 知道C对y的导数为1m。

假设样本属于第r类,那么第r维=1,其他为0,因此用矩阵的形式计算:

接下来看下一层:

y对z2的导数,首先可以确定y对z2导数的形状,y为101,z2经过σ激活函数,形状不变,一次z2也是101的矩阵,那么y对z2的导数为一个方形;

而y=σ(z2),那么根据Jacobian Matrix,当yi是由zi求出来的元素才有值,其他y不是由z计算得来的那些都为0(因为二者根本没有关系)。

因此y对z2的导数是一个方形的对角矩阵。

然后继续到下一层:

z1是由w2和a1得到的:

首先看z2对a1的导数,a1是前一层的输出,那么有:

因此,z2对a1的导数就是W2。

然后是z2对W2的导数,z2是1m的矩阵,W2是一个mn的矩阵(n为上一层的输出维度),那么导数就是这样的:

这个可以理解为矩阵中元素依旧是矩阵的形式,而其中当i=j时,z2(i)对w2(j)的导数为a1,i≠j时,z2i与w2j没有关系, 到时为0。于是:

网络再继续往前,跟上述的过程基本一致,那么最后得到计算图的每一边上的导数:

那么此时可以求loss对任意参数的导数:

3.2 RNN中的梯度计算
  RNN的梯度计算也一样是根据计算图来一步一步地对每一部分求导,然后再用reverse mode计算loss对各个参数的导数。RNN的基本结构如下:

对于每一部分,按照计算图的形式,正常的计算图应该是这样的:

为方便计算和图的简洁性,将上图改为下面这样:

那么对于整个RNN网络的结构的计算图:

每一个时刻都要计算一个loss C,然后对于一个样本,要将所有时刻的C相加得到最终的loss。

有了计算图,然后计算每个边上的导数:

这里对于每条边的具体计算过程就不再展开了,接下来就可以求C对wh和C对wi的导数了:

这里需要注意的是,wh有3个,因此也是由三部分相加,而对于每一个wh,又有可能有多条路径,如①号wh,一共有三条路径:

C→C1→y1→h1→wh

C→C2→y2→h2→h1→wh

C→C3→y3→h3→h2→h1→wh

②号wh只有两条路径,③号wh有一条路径。注意这里的路径都是只能沿着红色箭头的方向行进到达wh的路径。

最终得到三部分wh的导数,然后进行相加:

这样就完成了RNN的梯度的计算。在tensorflow中就是这么运作的。

深度学习计算框架实现(代码片段)

参考与评述参考书目《DeepLearning》LanGoodfellow.经典的深度学习框架是以计算图&梯度下降方法实现对前馈网络的有监督学习。这里复现了前馈计算图的梯度计算实现。一、前馈计算图实现1.前向与梯度计算结果数组(保存输入节... 查看详情

深度学习相关概念整理

深度学习相关概念整理数值梯度和解析梯度数值梯度就是通过梯度得定义去计算出来的梯度:给予x_i一个非常小的偏移量,去计算出y的偏移量,最后用y的偏移去除以x_i的偏移就是在x_i处的偏导数。解析梯度就是对目标函数进行... 查看详情

深度学习中得数学,高效计算基础与线性分类器

深度学习说到底就是要调节网络中得权重,使网络的分类结果更接近于训练值。这个重复迭代的过程又是一个线性回归的问题。在这种可能会用到高数,线性代数,概率论中的知识。一、数学基础提一提。1.高数中得知识。 ... 查看详情

深度学习常见问题解析

深度学习常见问题解析计算机视觉与自动驾驶 今天一、为什么深层神经网络难以训练?1、梯度消失。梯度消失是指通过隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习会卡... 查看详情

深度学习梯度爆炸与梯度消失

背景了解深度学习中的梯度爆炸与消失的原因,及如何处理梯度爆炸与消失。梯度消失梯度消失是激活函数和权重矩阵初始化值,这两个因素决定的。sigmoid函数,求导的最大值为0.25根据链式求导法则:导数小于0.25,如果初始化... 查看详情

深度学习中的一些组件及使用技巧(代码片段)

...评指正,不喜勿喷![认真看图][认真看图]【补充说明】深度学习有多火,我就不多说了。本文主要介绍深度学习项目实践过程中可能遇到的一些组件及使用技巧!一、Optimizor优化器选择1.梯度下降:经典梯度下降的通用计算公式... 查看详情

《动手学深度学习》自动求梯度(代码片段)

《动手学深度学习》自动求梯度概念Tensor梯度在深度学习中,我们经常需要对函数求梯度(gradient)。PyTorch提供的autograd包能够根据输入和前向传播过程自动构建计算图,并执行反向传播。本节将介绍如何使用autog... 查看详情

学习深度学习如何下手

...讨论是毫无意义的,刚开始应该先打好编程和数学基础。深度学习看似难度大,按照正确的学习路径学习,可以大大降低学习门槛,同时激发学习的乐趣。简单的说,学习路线大概如下:先学编程、数学和深度学习知识,然后动... 查看详情

计算机视觉中的深度学习6:反向传播

Slides:百度云提取码:gs3n神经网络的梯度下降我们之前在学习线性分类器的时候,使用Loss函数以及梯度下降法来更新权重。那么对于神经网络,我们该如何计算每层神经元的权重呢?对每层W直接求导(愚蠢的... 查看详情

计算机视觉中的深度学习11:神经网络的训练2

Slides:百度云提取码:gs3n接着第10讲继续总览单次设置激活函数数据预处理权重初始化正则化动态训练学习率规划large-batch训练;超参数优化训练后模型融合迁移学习今天将介绍第二点和第三点。学习率规划我们有多种梯... 查看详情

深度学习入门2022最新版深度学习简介(代码片段)

【深度学习入门2022最新版】第一课深度学习简介概述深度学习vs机器学习机器学习是什么深度学习是什么机器学习和深度学习的区别神经网络机器学习实现二分类神经网络实现二分类TensorFlowPyTorch神经网络的原理张量张量最小值(... 查看详情

深度学习-计算机视觉-基础学习笔记-03

更好的优化方法前面提到的随机梯度下降(SGD)在实际使用中会产生很多问题,比如下图中的损失函数对水平方向不敏感而对竖直方向敏感的情况,实际在更高维涉及到非常多的参数时这个问题更明显。其另一个问题是局部... 查看详情

斯坦福cs231n—深度学习与计算机视觉----学习笔记课时8&&9

课时8反向传播与神经网络初步(上)反向传播在运算连路中,这是一种通过链式法则来进行递推的计算过程,这个链路中的每一个中间变量都会对最终的损失函数产生影响。链式法则通常包含两部分,局部梯度和后一层的梯度... 查看详情

深度学习激活函数比较

一、Sigmoid函数  1)表达式       2)函数曲线    3)函数缺点 梯度饱和问题。先看一下反向传播计算过程:          反向求导:          而其中:              ... 查看详情

神经网络和深度学习笔记-第五章深度神经网络学习过程中的梯度消失问题

之前的章节,我们利用一个仅包含一层隐藏层的简单神经网络就在MNIST识别问题上获得了98%左右的准确率。我们于是本能会想到用更多的隐藏层,构建更复杂的神经网络将会为我们带来更好的结果。就如同在进行图像模式识别的... 查看详情

深度学习基础:3.反向传播和梯度下降(代码片段)

动态计算图计算图可以用来表示两个变量之间的关系。例如,构建y=x2y=x^2y=x2,则可用一张简单计算图进行表示。pytorch支持动态计算图,动态意义在于,当创建其它由计算图中变量而来的新变量时,新... 查看详情

深度学习中的优化器原理总结(经典+前沿)

目录前言一、梯度下降的思想与批梯度下降法1.随机梯度下降法2.标准梯度下降法3.批梯度下降法二、经典的五类优化器1.SGD2.SGDM(SGDwithmomentum)3.Adagrad4.RMSProp5.Adam三、前沿方法1.AMSGrad2.AdaBound3.SWAT4.CyclicalLR/SGDR/One-cycleLR5.RAda... 查看详情

神经网络和深度学习笔记-第二章反向传播算法

上一章中我们遗留了一个问题,就是在神经网络的学习过程中,在更新参数的时候,如何去计算损失函数关于参数的梯度。这一章,我们将会学到一种快速的计算梯度的算法:反向传播算法。这一章相较于后面的章节涉及到的数... 查看详情