理解深度学习中的反向传播

概述

反向传播主要广泛应用于深度学习中的优化器,是优化器的主要工作原理

介绍

反向传播是使训练深度模型在计算上易于处理的关键算法。对于现代的神经网络来说,相对于实现一个简单的网络,它可以使梯度下降的训练速度快1000万倍。这就是一个模型的训练时间一周和20万年的区别。
除了在深度学习中使用外,反向传播在许多其他领域也是一种强大的计算工具,从天气预报到分析数值稳定性,它只是有不同的名称。事实上,该算法已经在不同领域进行了至少数十次的重新设计(参见Griewank(2010))。与应用无关的一般名称是反向模式求导。
从根本上说,这是一种快速计算导数的技巧。这是你们必须掌握的技巧,不仅在深度学习中,而且在各种各样的数值计算情境中。

图示计算过程

用图像表达计算过程是思考数学表达式的一种很好的方式。例如,考虑e=(a+b)*(b+1)。这当中有三种运算符:两次加法和一次乘法。为了帮助我们讨论这个问题,我们引入两个中间变量,c和d,这样每个函数的输出都有一个变量。我们现在有

c = a + b
d = b + 1
e = c * d
为了图解计算过程,我们将这些操作中的每一个,连同输入变量一起,放入节点中。当一个节点的值是另一个节点的输入时,箭头从一个节点指向另一个节点。

在这里插入图片描述
这类图表在计算机科学中经常出现,尤其是在讨论函数式程序时。它们与依赖图和调用图的概念密切相关。它们也是流行的深度学习框架Theano背后的核心。
我们可以通过将输入变量设置为特定值并向上计算图中的节点来计算表达式的值。例如,设a=2, b=1
在这里插入图片描述

图示求导

如果想要理解计算图中的导数,关键是理解临界点上的导数。如果a直接影响c,那么我们想知道它是如何影响c的,如果a有一点变化,c又是如何变化的?我们称它为c对a的偏导。为了求这个图中的偏导数,我们需要 和法则 和 积法则
在这里插入图片描述
下面,图上标记了每条边的导数
在这里插入图片描述
如果我们想了解没有直接连接的节点是如何相互影响的呢?让我们来看看e是如何受到a的影响的。如果我们以1的速度改变a, c也会以1的速度改变。反过来,c以1的速度变化导致e22的速度变化。所以e对a的变化速率是1*2。
一般的规则是对从一个节点到另一个节点的所有可能路径求和,将路径每条边的导数相乘。例如,要求e对b的导数,我们得到
在这里插入图片描述
这解释了b是如何通过c影响e的,也解释了它是如何通过d影响e的。

两种模式

对路径求和的问题是很容易得到可能路径数量的组合爆炸。
在这里插入图片描述
在上图中,从XYY有三条路径,从Y到Z有三条路径,如果我们想对所有路径相加得到z对x的偏导数,我们需要对3*3=9条路径相加。
在这里插入图片描述
上面只有9条路径,但是随着图变得越来越复杂,路径的数量很容易呈指数增长。与其天真地对路径求和,不如因式分解:
在这里插入图片描述
这就是前向模式求导和反向模式求导的作用。它们是通过分解路径有效计算总和的算法。它们没有显式地对所有路径求和,而是通过在每个节点上合并路径来更有效地计算相同的和。实际上,两种算法都只接触每条边一次。
前向模式求导从图形的输入点开始,并向末端移动。在每个节点上,它将所有输入的路径相加。每个路径都表示输入影响该节点的一种方式。把它们加起来,我们就得到了节点受输入的影响的方式,也就是它的导数。
在这里插入图片描述
虽然你可能没有从图的角度考虑过,前向模式求导和你在微积分入门课上学过的隐式微分很相似。另一方面,反向模式求导从图的输出点开始,并向起点移动。在每个节点上,它合并所有起源于该节点的路径。
在这里插入图片描述
正向模式求导区分跟踪一个输入如何影响每个节点。反向模式差异跟踪每个节点如何影响一个输出。即前向模微分对每个节点使用操作符∂/∂x,而反向模微分对每个节点使用操作符∂z/∂

计算结果

现在,你可能想知道为什么有人会关心反向传播。这看起来和前向传播一样,是一种奇怪的方式。有什么好处吗?让我们再考虑一下原来的例子:
在这里插入图片描述
我们可以用前向传播区分b向上。它给出了每个结点对b的导数。
在这里插入图片描述
我们已经计算了∂e/∂b,即输出对一个输入的导数
如果我们从e向下进行反向传播会怎样? 这给了我们关于每个节点的e的导数
在这里插入图片描述
当我说反向模式微分使我们相对于每个节点都有e的导数时,我的确表示每个节点。 我们得到∂e/∂a和∂e/∂b,这是e对两个输入的导数。 正向模式微分给了我们关于单个输入的输出导数,但是反向模式微分给了我们所有的输入。
对于这张图,这只是提高了两倍的速度,但是想象一下具有一百万个输入和一个输出的函数。 前向模式微分将要求我们遍历该图一百万次才能获得导数。 反向模式差分可以使他们一举成败! 将速度提高一百万倍非常不错!
在训练神经网络时,我们将成本(一个值描述一个神经网络的性能差)作为参数的函数(一个数字来描述网络的行为)。 我们要针对梯度下降计算所有参数的成本导数。 现在,神经网络中通常有数百万甚至数千万个参数。 因此,反向模式微分(在神经网络的上下文中称为反向传播)使我们大幅度提高了速度!
(有在某些情况下,前向传播更有意义吗?是的,有!!当反向传播相对于所有输入给出一个输出的导数时,前向传播相对于我们给出所有输出的导数。 一个输入。如果一个功能具有很多输出,则前向传播的速度会快很多。)

重要性

当我第一次了解什么是反向传播时,我的反应是:“哦,那只是连锁法则! 我们花了这么长时间才弄清楚吗?” 我不是唯一一个有这种反应的人。 的确,如果您问“在前馈神经网络中是否存在一种计算导数的聪明方法?” 答案并不难。
但是我认为这比看起来要困难得多。 您会发现,在反向传播技术发明之初,人们并不十分关注我们研究的前馈神经网络。 衍生工具是否是训练它们的正确方法也并不明显。 只有当您意识到可以快速计算导数时,这些才很明显。 存在循环依赖。
更糟糕的是,撇开循环依赖的任何部分,这是很容易的,因为偶然的想法是不可能的。 用导数训练神经网络? 当然,您只会陷入当地的最低要求。 显然,计算所有这些导数会很昂贵。 仅仅是因为我们知道这种方法行得通,所以我们没有立即开始列出它可能不会这样做的原因。
这就是事后观察的好处。 确定问题的框架后,最艰巨的工作已经完成。

译自:Calculus on Computational Graphs: Backpropagation

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值