反向传播(CS231n版)

核心概念:

  1. 计算图的概念
  2. 反向传播利用了链式求导但是本质不完全是链式法则

理解概要

与其说反向传播算法的本质是链式求导法则,到不如说它的本质是分治的思想在链式求导法则中的应用。因为当一个函数很复杂的时候,即使是我们会链式求导法则,求这个函数对某一个变量的偏导数(的解析解)依然是一个非常困难的事情。而反向传播则是把一个大问题拆成一个一个各自独立互不影响的小的问题,分别求出这些小的问题的解,再把这个解组合起来。
为了解释清这个问题我们需要引入一个工具——“计算图模型”
什么是计算图模型?在这个课程里虽然我们基于这个概念做了很多操作,但是没有直接定义。
我认为 计算图模型其实就是数学公式的一种图形化展示
其实我们以前学习数字电路的时候已经用到了这种工具,因为用起来很自然所以没有细琢磨。(还有一个理解方式是把一个计算表达式想象成一棵树,好像数据结构里用到过这种方法)这里用到了很多“门”的概念,而“门”就是数电里的概念。这里门就是一个运算单元,实现了基本的运算,比如加减乘除乘方等等。 其实神经网络和数字电路本质是一样的,都是数学表达式的图形化显示(或者说具象化的提现),神经网络是一种特殊的数字电路。数学公式是由基本的运算组合而成,而数字电路模拟了这个过程。
运算单元可以看成一个输入输出模型,所谓的输入输出模型,也就是下面这个东西,本质就是一个函数,而函数本质上就是一个映射。
函数、映射、输入输出模型

过去我们在设计数字电路的时候主要利用的是计算图的向前传播过程,也就是从左到右的计算出表达式的结果,而这里我们计算梯度就需要在这个自然感官的基础上定义一些新的操作。我在这块花琢磨了好长时间,看讲义的时候怎么也没搞明白
反向传播最简单的例子

虽然能知道q下面的那个-4是因为 d f d q = z \frac{df}{dq} = z dqdf=z 而 z = -4 所以是 q下面-4,顺着往下计算,能算出z下面的3以及x,y下面的-4,但是f下面的“1”是怎么回事?
后来看了视频课程之后才明白是怎么回事
我们在计算图上定义的求梯度的操作是这样的:
我们求的梯度都是f(最终输出的函数)对各个变量的梯度,比如q下面的值是f对q的梯度也就是 ∂ f ∂ q \frac{\partial f}{\partial q} qf,z下面的值是f对z的梯度也就是 ∂ f ∂ z \frac{\partial f}{\partial z} zf,x下面的值是f对x的梯度也就是 ∂ f ∂ x \frac{\partial f}{\partial x} xf,y下面的值是f对q的梯度也就是 ∂ f ∂ y \frac{\partial f}{\partial y} yf,同理,f下面的值是f对f的梯度也就是 ∂ f ∂ f \frac{\partial f}{\partial f} ff
梯度(在只有一个自变量的时候也叫导数)衡量的是自变量的变化能带来因变量多大的变化(变化带来的变化),不同的运算变化速率当然是不一样,比如加法运算,提升就是线性的,导数为1嘛,而乘法运算提升也是线性的不过要加上一个倍数,运算的阶数越高变化率越大。形象一点就是高度提升的速度,也就是坡度比较大或者梯度比较高。
从计算上来看,函数对任意某个变量的梯度,就等于函数的最终输出除以这边变量对应的门的输出。
在这里插入图片描述

我们从最右边的图末开始计算输出对于最后一个变量也就是f的梯度,很明显这个梯度是1,因为最终的输出和最后一个变量的值是一样的,自己和自己比,没有梯度的变化,注意梯度为1不代表没有梯度,只代横坐标和纵坐标的变化是一模一样的。
接下来我们想计算f在z方向上的梯度,也就是 ∂ f ∂ z \frac{\partial f}{\partial z} zf,而这个结果是q而q等于3,
之后我们计算f在q上的梯度, ∂ f ∂ q \frac{\partial f}{\partial q} qf,这个结果的z而z等于-4,
之后我们想计算f在y上的梯度,但是f和y没有直接联系,所以我们这里利用链式法则, ∂ f ∂ y = ∂ f ∂ q ∂ q ∂ y \frac{\partial f}{\partial y} = \frac{\partial f}{\partial q}\frac{\partial q}{\partial y} yf=qfyq,我们已经知道 ∂ f ∂ q \frac{\partial f}{\partial q} qf是3,而 ∂ q ∂ y \frac{\partial q}{\partial y} yq也可以计算出来是1,于是乎, ∂ f ∂ y = − 4 × 1 = − 4 \frac{\partial f}{\partial y} = -4 \times 1 = -4 yf=4×1=4,同理可以求出 ∂ f ∂ x \frac{\partial f}{\partial x} xf也是-4。
我一开始还有一个疑问,就是随着数据从左边留到右边,其实梯度是不断的在提升的,可以说,在输入端是山脚下,而在输出端是山顶,中间过了好多个陡坡,为什么反而最右边的输出的梯度反而比左边变量的梯度数值上还小呢?
其实这个变量下面的数值,代表这样一个含义:~~就是这个变量变化了1对最终的输出产生的变化是多少,比如q下面的那个-4,并不是说,右边梯度1传到这边就变成了-4,而是说q每变化1,造成最终的输出变化-4。~~这个理解有点点偏差
小姐姐的说法是这样:当y变化了一点点(不是1),那么y对q的影响就会变成1(也就是 ∂ q ∂ y \frac{\partial q}{\partial y} yq,这才是梯度的准确含义,是这一点切线的斜率),而q对f的影响也会马上变成-4(也就是 ∂ f ∂ q \frac{\partial f}{\partial q} qf),这样我们就得到y对f的影响( ∂ f ∂ y \frac{\partial f}{\partial y} yf
在这里插入图片描述
所以在我们的计算图中,我有这样的节点,每个节点值知道与它相邻的节点,只知道输入和输出

在这里插入图片描述
可能在进行普通的数值计算,这些属性就足够用了,
但是其实在这个结果上我们还能挖掘更多,我们可以计算这个节点的“本地梯度”
在这里插入图片描述
差不多也就只能挖掘出这么多了

当反向传播发生的时候发生了什么呢
在这里插入图片描述
从上游传递过来梯度这个梯度是函数的输出值对这个节点输出值的导数
接下来我找的就是这个节点输入的梯度
而这个节点的输入的梯度就是从上游传递来梯度与本地梯度的乘积
一般来说,本地梯度都是可以求出表达式的,而上游传过来的梯度都是计算好的数值。

不管整个函数有多么复杂,只要我把函数的计算图表示出来,实际上就是拆成一个一个简单的运算的组合,我要计算每个简单运算的梯度就可以,而每个运算单元的梯度很好求,只要前面传过来的值是一个具体的数值,我就可以求出当前节点对上一层节点的梯度
整个问题就是通过一个一个局部的组合,一层一层的传递,把一个很复杂的问题变成了多个简单问题的组合。

这个思想太精妙了,我的语言描述可能不到位,以后再慢慢的打磨
总之化整为零,每个人只要看局部就行。

当然还有一个问题就是写出函数的计算图,其实有一个粒度的问题,就是你把运算拆成多基础,这个可以做一个权衡,如果把每个运算都拆的特别简单,那么这个图也会变得特别的大,但是如果每个运算集成度比较高,虽然图的大小变小了,但是每个单元计算导数的复杂度也会提高。

对反向传播本质的一些想法

你说链式法则是反向传播的本质,也不算错。
因为你看,比如一个非常复杂的符合函数,如果函数对自变量偏导数,中间可能需要引入5到6个中间变量,
∂ f ∂ x = ∂ f ∂ p ∂ p ∂ q ∂ q ∂ k ∂ k ∂ m ∂ m ∂ n ∂ n ∂ x \frac{\partial f}{\partial x} = \frac{\partial f}{\partial p}\frac{\partial p}{\partial q} \frac{\partial q}{\partial k}\frac{\partial k }{\partial m} \frac{\partial m}{\partial n} \frac{\partial n}{\partial x} xf=pfqpkqmknmxn
其实这个就是完整计算图的一个分支
在这里插入图片描述
计算图其实是把所有到自变量的路径都展示出来了,但是其实我们计算的时候只用一条路径的。
其实一旦我们把完整的计算图画出来,并且考虑以计算机的方式进行处理的时候,我们会在手工处理的基础上进行一些优化
比如有一些计算路径是重合的
或者我们可能不会以深度优先遍历的方式,一个自变量一个自变量的计算,而是类似于像广度优先遍历的方式,一层一层的计算,等计算到最后一层的时候所有的自变量的梯度都有了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值