反向传播

反向传播

参考链接

反向传播是关于理解如何改变网络中的权重和偏差来改变成本函数。最终,这意味着计算偏导数 ∂ C / ∂ w j k l \partial C/\partial w^l_{jk} C/wjkl ∂ C / ∂ b j l \partial C/\partial b^l_{j} C/bjl 。但为了计算这些,我们首先引入一个中间量 δ j l \delta_j^l δjl ,我们称其为第l层第j个神经元的误差。Backpropagation 将给我们一个计算误差 δ j l \delta_j^l δjl 的程序,然后将 δ j l \delta_j^l δjl ∂ C / ∂ w j k l \partial C/\partial w^l_{jk} C/wjkl ∂ C / ∂ b j l \partial C/\partial b^l_{j} C/bjl 相关联。

为了理解错误是如何定义的,想象我们的神经网络中有一个恶魔:

在这里插入图片描述

恶魔坐在第l层的第j个神经元处,当神经元的输入进来时,恶魔就会扰乱神经元的运作。它在神经元的加权输入中增加了一点变化 Δ z j l Δz^l_j Δzjl,所以神经元不是输出 σ ( z j l ) σ(z^l_j) σ(zjl),而是输出 σ ( z j l + Δ z j l ) σ(z^l_j+Δz^l_j) σ(zjl+Δzjl)。这种变化会通过网络中的后几层传播,最后导致整体成本发生变化,变化量为 ∂ C ∂ z j l Δ z j l \frac {∂C}{∂z^l_j}Δz^l_j zjlCΔzjl

现在,这个妖怪是个好妖怪,是想帮你改善成本函数,也就是说,他们是想找到一个能让成本函数变小的 Δ z j l Δz^l_j Δzjl。 假设 ∂ C ∂ z j l \frac {∂C}{∂z^l_j} zjlC有一个很大的值(正或负)。那么恶魔可以通过选择 Δ z j l Δz^l_j Δzjl ∂ C ∂ z j l \frac {∂C}{∂z^l_j} zjlC的相反符号来降低不少成本。相反,如果 ∂ C ∂ z j l \frac {∂C}{∂z^l_j} zjlC接近于零,那么恶魔通过扰动加权输入 z j l z^l_j zjl根本无法提高多少成本。就恶魔所能知道的,神经元已经很接近最优*了。所以有一个启发式的意义, ∂ C ∂ z j l \frac {∂C}{∂z^l_j} zjlC是对神经元的误差的衡量。

在这个故事的激励下,我们用以下方式定义层l中神经元j的误差 δ j l δ^l_j δjl

在这里插入图片描述

按照我们的惯例,我们用 δ l δ^l δl 来表示与第l层相关的误差向量。反向传播将使我们有办法计算每一层的 δ l δ^l δl ,然后将这些误差与实际利益量 ∂ C / ∂ w j k l ∂C/∂w^l_{jk} C/wjkl ∂ C / ∂ b j l ∂C/∂b^l_j C/bjl联系起来。

在这里插入图片描述

你可能会好奇为什么恶魔要改变加权输入 z j l z^l_j zjl。当然,想象恶魔改变输出激活 a j l a^l_j ajl会更自然一些,结果是我们会使用 ∂ C ∂ a j l \frac{∂C}{∂a^l_j} ajlC作为我们的误差测量。

事实上,如果你这样做,事情的结果和下面的讨论很相似。但事实证明,这使得反传播的呈现方式在代数上更加复杂一些。所以我们将坚持用 δ j l = ∂ C ∂ z j l δ^l_j=\frac{∂C}{∂z^l_j} δjl=zjlC作为我们对误差的测量。

Plan of attack: 反向传播是基于四个基本方程。这些方程一起给我们提供了一种计算误差 δ l δ_l δl和成本函数梯度的方法。我在下面陈述这四个方程。但要注意:你不应该期望瞬间吸收这些方程。这样的期望会导致失望。事实上,反推方程的内容非常丰富,随着你对方程的逐步深入,理解好这些方程需要相当的时间和耐心。好消息是,这种耐心会得到多次回报。因此,本节的讨论只是一个开始,帮助你在彻底理解方程的路上。

这里是我们在本章后面更深入研究方程的方法的预览。我将给出方程的一个简短证明,这有助于解释为什么它们是真实的;我们将以伪代码的算法形式重述这些方程,并看看如何将伪代码作为真实的、正在运行的Python代码来实现;在本章的最后一节,我们将对反向传播方程的含义进行直观的描述,以及某人如何从头开始发现它们。一路走来,我们会反复回到四个基本方程,随着你对这些方程理解的加深,这些方程会显得很舒服,甚至可能是美丽而自然的。

An equation for the error in the output layer, δ L δ^L δL:

δ L δ^L δL 的分量由以下公式给出

在这里插入图片描述

这是一个非常自然的表达。右边的第一个项 ∂ C / ∂ a j L ∂C/∂a^L_j C/ajL只是衡量成本函数对第j个输出激活函数的变化速度。例如,如果C对某一特定输出神经元j的依赖性不大,那么 δ j L δ^L_j δjL就会很小,这是我们所期望的。右边第二个项, σ ′ ( z j L ) σ′(z^L_j) σ(zjL),衡量激活函数σ在 z j L z^L_j zjL处变化的速度。

请注意,(BP1)中的所有内容都很容易计算。特别是,我们在前向时计算zLj,计算 σ ′ ( z j L ) σ′(z^L_j) σ(zjL)只是一个小小的额外开销。当然, ∂ C / ∂ a j L ∂C/∂a^L_j C/ajL的确切形式将取决于成本函数的形式。然而,只要成本函数已知,计算 ∂ C / ∂ a j L ∂C/∂a^L_j C/ajL应该没有什么问题。例如,如果我们使用二次成本函数,那么 C = 1 2 ∑ j ( y j − a j L ) 2 C=\frac{1}{2}∑_j(y_j-a^L_j)^2 C=21j(yjajL)2,所以 ∂ C / ∂ a j L = ( a j L − y j ) ∂C/∂a^L_j=(a^L_j-y_j) C/ajL=(ajLyj),显然这很容易计算。

等式(BP1)是 δ L δ^L δL的分量表达式。这是一个非常好的表达式,但不是我们想要的基于矩阵的反推形式。然而,很容易将方程改写成基于矩阵的形式,如

在这里插入图片描述

这里, ∇ a C ∇_aC aC被定义为一个矢量,其分量为偏导数 ∂ C / ∂ a j L ∂C/∂a^L_j C/ajL。 您可以把 ∇ a C ∇_aC aC看作是C相对于输出激活的变化率。很容易看出,方程(BP1a)和(BP1)是等价的,出于这个原因,从现在开始,我们将交替使用(BP1)来指代这两个方程。举个例子,在quadratic cost的情况下,我们有 ∇ a C = ( a L − y ) ∇_aC=(a^L-y) aC=(aLy),因此(BP1)的完全矩阵形式变成了

在这里插入图片描述

正如你所看到的,这个表达式中的所有内容都有一个漂亮的向量形式,并且很容易使用Numpy等库进行计算。

用下一层的误差 δ l + 1 δ^{l+1} δl+1来表示误差 δ l δ^l δl的公式:特别是

在这里插入图片描述

这个公式看起来很复杂,但每个元素都有一个很好的解释。假设我们知道第l+1层的误差 δ l + 1 δ^{l+1} δl+1。 当我们应用转置权重矩阵 ( w l + 1 ) T (w^{l+1})^T (wl+1)T时,我们可以直观地认为这是通过网络向后移动误差,给我们提供了第l层输出处误差的某种测量。

然后我们取Hadamard product ⊙ σ ′ ( z l ) ⊙σ′(z^l) σ(zl)。这就将误差通过层l中的激活函数向后移动,得到层l的加权输入中的误差 δ l δ^l δl

通过将(BP2)与(BP1)相结合,我们可以计算出网络中任何一层的误差 δ l δ^l δl。我们先用(BP1)计算出 δ l δ^l δll,然后应用公式(BP2)计算出 δ l − 1 δ^{l-1}{} δl1,再应用公式(BP2)计算出 δ l − 2 δ^{l-2} δl2,以此类推。

关于网络中任何偏置的成本变化率的公式。特别是

在这里插入图片描述

也就是说,误差 δ j l δ^l_j δjl正好等于变化率 ∂ C / ∂ b j l ∂C/∂b^l_j C/bjl。这是一个好消息,因为(BP1)和(BP2)已经告诉我们如何计算 δ j l δ^l_j δjl。我们可以将(BP3)简写为

在这里插入图片描述

其中,可以理解为δ与偏置b在同一神经元处被评估。

成本相对于网络中任何权重的变化率的公式。特别是:

在这里插入图片描述

这告诉我们如何用 δ l δ^l δl a l − 1 a^{l-1} al1这两个量来计算部分导数 ∂ C / ∂ w j k l ∂C/∂w^l_{jk} C/wjkl,我们已经知道如何计算。该方程可以用一个less index-heavy notation重写为

在这里插入图片描述

等式(32)的一个很好的结果是,当激活 a i n a_{in} ain很小, a i n a_{in} ain≈0时,梯度项∂C/∂w也将非常小。在这种情况下,我们会说权重学习得很慢,也就是说在梯度下降过程中,权重变化不大。换句话说,(BP4)的一个结果是,低激活神经元输出的权重学习速度很慢。

从(BP1)-(BP4)中还可以按照这些思路得到其他的启示。让我们从观察输出层开始。考虑(BP1)中的 σ ′ ( z j L ) σ′(z^L_j) σ(zjL) 项。

从上一章的sigmoid函数图中回想一下,当 σ ( z j L ) σ(z^L_j) σ(zjL)约为0或1时,σ函数会变得非常平坦。当这种情况发生时,我们将有 σ ′ ( z j L ) σ′(z^L_j) σ(zjL) ≈0.所以教训是,如果输出神经元是低激活(≈0)或高激活(≈1),最后一层的权重将缓慢学习。在这种情况下,通常说输出神经元已经饱和,因此,权重已经停止学习(或学习缓慢)。类似的说法也适用于输出神经元的偏差。

我们可以对更早的层获得类似的见解。特别是注意(BP2)中的 σ ′ ( z l ) σ′(z^l) σ(zl)项。这意味着,如果神经元接近饱和, δ j l δ^l_j δjl很可能变得很小。而这又意味着输入到饱和神经元的任何权重都会学习缓慢。

综上所述,我们已经了解到,如果输入神经元是低激活,或者输出神经元已经饱和,即是高激活或者低激活,那么权重就会学习很慢。

这些观察都没有太大惊奇。不过,它们还是有助于改善我们对神经网络学习时的心理模型。此外,我们可以把这种类型的推理转过来。四个基本方程原来对任何激活函数都是成立的,而不仅仅是标准的sigmoid函数(这是因为,我们一会儿会看到,证明没有使用σ的任何特殊属性)。因此,我们可以利用这些方程来设计具有特定理想学习特性的激活函数。举个例子给大家讲讲,假设我们选择一个(非sigmoid)激活函数σ,使σ′总是正值,并且永远不会接近零。这样就可以防止普通的sigmoid神经元饱和时出现的学习减速。在本书的后面,我们将看到对激活函数进行这种修改的例子。牢记四个方程(BP1)-(BP4)可以帮助解释为什么要尝试这种修改,以及它们会产生什么影响。

在这里插入图片描述

Problem

反推方程的交替呈现:

我已经用Hadamard乘积陈述了反推公式(特别是(BP1)和(BP2))。如果你不习惯使用Hadamard乘积,这种表述可能会让你感到不安。有一种基于传统矩阵乘法的替代方法,有些读者可能会觉得很有启发。(1)说明(BP1)可以改写为

在这里插入图片描述

其中 Σ ′ ( z L ) Σ′(z^L) Σ(zL)是一个正方形矩阵,它的对角线的项是 σ ′ ( z j L ) σ′(z^L_j) σ(zjL)的值,它的非对角的项为零。请注意,该矩阵通过常规矩阵乘法作用于 ∇ a C ∇_aC aC。(2)说明(BP2)可改写为

在这里插入图片描述

(3)结合观察(1)和(2)说明

在这里插入图片描述

对于熟悉矩阵乘法的读者来说,这个公式可能比(BP1)和(BP2)更容易理解。我之所以把重点放在(BP1)和(BP2)上,是因为这种方法在数值上实现起来更快。

Proof of the four fundamental equations (optional)

现在我们将证明四个基本方程(BP1)-(BP4)。这四个方程都是多变量微积分中的链式规则的结果。如果你对链式规则很熟悉,那么我强烈鼓励你在继续阅读之前自己尝试推导。

让我们从等式(BP1)开始,它给出了输出误差的表达式 δ L δ^L δL。为了证明这个等式,请回顾一下,根据定义

在这里插入图片描述

应用链式规则,我们可以将上面的偏导数重新表达为关于输出激活的偏导数。

在这里插入图片描述

其中,和为输出层中所有神经元k的和。当然,当k=j时,第k个神经元的输出激活 a k L a^L_k akL只取决于第j个神经元的加权输入 z j L z^L_j zjL。所以当k≠j时, ∂ a k L / ∂ z j L ∂a^L_k/∂z^L_j akL/zjL消失。因此,我们可以将上式简化为

在这里插入图片描述

回顾 a j L = σ ( z L j ) a^L_j=σ(zLj) ajL=σ(zLj),右边的第二个项可以写成 σ ′ ( z j L ) σ′(z^L_j) σ(zjL),方程就变成了

在这里插入图片描述

接下来,我们将证明(BP2),用下一层的误差 δ l + 1 δ^{l+1} δl+1给出误差 δ l δ^l δl的公式。为此,我们要将 δ j l = ∂ C / ∂ z j l δ^l_j=∂C/∂z^l_j δjl=C/zjl改写为 δ k l + 1 = ∂ C / ∂ k z l + 1 δ^{l+1}_k=∂C/∂^{zl+1}_k δkl+1=C/kzl+1。我们可以使用链式规则来实现:

在这里插入图片描述

其中,在最后一行,我们将右侧的两个项互换,并代入 δ k l + 1 δ^{l+1}_k δkl+1的定义。为了评估最后一行的第一个项,请注意到以下几点

在这里插入图片描述

微分后,我们得到

在这里插入图片描述

将其代入(42),我们得到

在这里插入图片描述

我们要证明的最后两个方程是(BP3)和(BP4)。这两个方程也是由链式法则得出的,与上述两个方程的证明方式类似。

这就完成了反传的四个基本方程的证明。这个证明可能看起来很复杂。但其实这只是仔细应用链式规则的结果。稍微简洁一点的说,我们可以把反向传播看成是通过系统地应用多变量微积分中的链式规则来计算成本函数梯度的一种方法。这就是反向传播的全部内容,剩下的就是细节了。

The backpropagation algorithm

反推方程为我们提供了一种计算成本函数梯度的方法。让我们以算法的形式明确地写出来。

  1. Input x:输入层相应的激活设置 a 1 a^1 a1

在这里插入图片描述

研究这个算法你就能明白为什么叫反向传播。我们从最后一层开始,向后计算错误向量 δ l δ^l δl。我们要向后穿过网络,这可能看起来很奇怪。但如果你思考一下反向传播的证明,向后移动是成本是网络输出的函数这一事实的结果。为了理解成本是如何随着早期的权重和偏差而变化的,我们需要反复应用链式规则,通过层层后移来获得可用的表达式。

In what sense is backpropagation a fast algorithm?

在什么意义上,反向传播是一种快速算法?为了回答这个问题,我们来考虑另一种计算梯度的方法。想象一下,现在是神经网络研究的早期。也许是20世纪50年代或60年代,你是世界上第一个想到用梯度下降来学习的人! 但要让这个想法成功,你需要一种计算成本函数梯度的方法。你回想了一下你的微积分知识,决定看看能不能用链式规则来计算梯度。但是玩了一下,代数看起来很复杂,你就泄气了。于是你试着寻找另一种方法。你决定将成本函数视为权重C=C(w)的函数(我们稍后将回到偏置的问题上)。你对权重 w1,w2,…进行编号,并希望计算某个特定权重 $w_j $的 ∂ C / ∂ w j ∂C/∂w_j C/wj。一个显而易见的方法是使用近似值

在这里插入图片描述

其中ϵ>0是一个小正数, e j e_j ej是第j个方向的单位向量。换句话说,我们可以通过计算两个略微不同的 w j w_j wj值的成本函数值C,然后应用公式(46)来估计 ∂ C / ∂ w j ∂C/∂w_j C/wj。同样的想法也可以让我们计算出部分导数 ∂ C / ∂ b ∂C/∂b C/b与偏置的关系。

这种方法看起来很有前途。它在概念上很简单,而且极易实现,只需要几行代码。当然,它看起来比使用链式规则来计算梯度的想法要有前途得多!

不幸的是,虽然这种方法看起来很有前途,但当你实现代码时,却发现它的速度非常慢。为了理解原因,想象一下我们的网络中有一百万个权重。那么对于每个不同的权重 w j w_j wj,我们需要计算 C ( w + ϵ e j ) C(w+ϵe_j) C(w+ϵej),以便计算 ∂ C / ∂ w j ∂C/∂w_j C/wj。这意味着,为了计算梯度,我们需要计算一百万次不同的成本函数,需要一百万次的网络前向传递(每个训练例子)。我们还需要计算C(w),所以总共需要通过网络100万次。

反向传播的巧妙之处在于,它使我们只需用一次网络的前向传递,然后再用一次网络的后向传递,就可以同时计算出所有的部分导数∂C/∂wj。粗略的说,后向传递的计算成本和前向传递的计算成本差不多,**这应该是可信的,但需要仔细分析才能说得清楚。之所以可信,是因为前向通证中最主要的计算成本是乘以权重矩阵,而后向通证中则是乘以权重矩阵的转置。这些操作显然有相似的计算成本。因此,反向传播的总成本与仅仅通过网络进行两次前向传递的成本大致相同。与我们基于(46)的方法所需要的一百万零一次的前向传递相比! 所以尽管反向传播表面上看起来比基于(46)的方法更复杂,但实际上它的速度要快得多。

反向传播的巧妙之处在于,它使我们只需用一次网络的前向传递,然后再用一次网络的后向传递,就可以同时计算出所有的部分导数 ∂ C / ∂ w j ∂C/∂w_j C/wj。粗略地讲,后向传递的计算成本与前向传递差不多。因此,反向传播的总成本与在网络中进行两次正向传播的成本大致相同。与基于(46)的方法所需的百万零一个正向传播相比,我们需要的是这样的成本! 因此,即使反向传播表面上看起来比基于(46)的方法更复杂,实际上它的速度要快得多。(这应该是可信的,但需要仔细分析才能说得通。之所以可信,是因为前传中最主要的计算成本是乘以权重矩阵,而后传中则是乘以权重矩阵的转置。这些操作显然具有相似的计算成本。)

这种速度的提升在1986年首次被充分认识到,它极大地扩大了神经网络能够解决的问题范围。这又引起了人们使用神经网络的热潮。当然,反推也不是万能的。即使在20世纪80年代末,人们也遇到了限制,特别是在试图使用反向传播来训练深度神经网络,即具有许多隐藏层的网络时。在本书的后面,我们将看到现代计算机和一些聪明的新想法现在如何使使用反向传播来训练这种深度神经网络成为可能。

Backpropagation: the big picture

正如我所解释的那样,反向传播带来了两个谜团。首先,算法到底在做什么?我们已经建立了一个从输出中反传播错误的图景。但我们能否再深入一点,建立更多的直觉,了解我们做这些矩阵和向量乘法时,到底发生了什么?第二个谜团是,当初怎么会有人发现反传播呢?按照算法中的步骤去做是一回事,甚至按照算法工作的证明去做也是一回事。但这并不意味着你对问题理解得很透彻,以至于你能在第一时间发现算法。有没有一个合理的推理思路,可以让你发现反推算法呢?在这一节中,我将对这两个谜团进行阐述。

为了提高我们对算法的直觉,让我们想象一下,我们对网络中的某个权重 w j k l w^l_{jk} wjkl做了一个小小的改变 Δ w j k l Δw^l_{jk} Δwjkl:

在这里插入图片描述

这种权重的变化将引起相应神经元输出激活的变化:

在这里插入图片描述

这又会引起下一层所有激活的变化:

在这里插入图片描述

这些变化又会引起下一层的变化,然后是下一层,以此类推,一直到引起最后一层的变化,然后是成本函数的变化:

在这里插入图片描述

成本中的变化ΔC与权重中的变化 Δ w j k l Δw^l_{jk} Δwjkl之间的关系由以下公式确定:

在这里插入图片描述

这表明,计算 ∂ C / ∂ w j k l ∂C/∂w^l_{jk} C/wjkl的一种可能的方法是仔细跟踪 w j k l w^l_{jk} wjkl的微小变化是如何传播到引起C的微小变化的。如果我们能做到这一点,小心翼翼地用容易计算的量来表达沿途的一切,那么我们应该能够计算 ∂ C / ∂ Δ w j k l ∂C/∂Δw^l_{jk} C/Δwjkl

让我们试着进行一下。 Δ w j k l Δw^l_{jk} Δwjkl的变化会引起第l层第j个神经元的激活量的微小变化 Δ a j l Δa^l_j Δajl。这个变化由以下公式给出

在这里插入图片描述

激活 Δ a j l Δa^l_j Δajl的变化将引起下一层,即(l+1)层的所有激活的变化。我们将专注于只影响其中一个激活的方式,比如说 a q l + 1 a^{l+1}_q aql+1

在这里插入图片描述

事实上,它会引起以下变化:

在这里插入图片描述

将公式(48)中的表达式代入,我们得到:

在这里插入图片描述

当然, Δ a q l + 1 Δa^{l+1}_q Δaql+1的变化又会引起下一层的激活度的变化。事实上,我们可以想象一条从 w j k l w^l_{jk} wjkl到C的路径一直贯穿网络,每一个激活的变化都会引起下一个激活的变化,最后,输出处的成本也会发生变化。如果路径经过激活 a j l a^l_j ajl, a q l + 1 a^{l+1}_q aql+1,…, a n L − 1 a^{L-1}_n anL1, a m L a^{L}_m amL,那么得到的表达式是

在这里插入图片描述

也就是说,我们每经过一个额外的神经元,都会拾取一个∂a/∂a型项,以及最后的∂C/∂aLm项。这代表了由于沿着这个特定路径通过网络的激活变化而导致的C的变化。当然,wljk的变化可以通过很多路径传播来影响成本,我们只考虑了一条路径。为了计算C的总变化,我们应该对权重和最终成本之间的所有可能路径进行加总,即:

在这里插入图片描述

其中,我们已经对路径上所有可能的中间神经元选择进行了求和。与(47)相比,我们看到

在这里插入图片描述

现在,公式(53)看起来很复杂。然而,它有一个很好的直观解释。我们计算的是C相对于网络中某个权重的变化率。这个方程告诉我们的是,网络中两个神经元之间的每一条边都与一个速率因子相关联,这个速率因子只是一个神经元的激活相对于另一个神经元的激活的部分导数。从第一个权重到第一个神经元的边有一个速率因子 ∂ a j l / ∂ w j k l ∂a^l_j/∂w^l_{jk} ajl/wjkl。一条路径的速率因子只是沿途速率因子的乘积。而总变化率 ∂ C / ∂ w j k l ∂C/∂w^l_{jk} C/wjkl只是从初始权重到最终成本的所有路径的速率因子之和。这里以单条路径为例说明这一过程:

在这里插入图片描述

到目前为止,我所提供的是一个启发式的论点,是一种思考方式,当你扰动网络中的一个权重时,会发生什么。让我勾勒出一条你可以用来进一步发展这个论点的思路。首先,你可以推导出等式(53)中所有单个部分导数的明确表达式。这很容易做到,只要用一点微积分就可以了。做完这些后,你可以试着找出如何将所有指数上的和写成矩阵乘法。这原来是很繁琐的,需要一些毅力,但不是非凡的洞察力。做完这一切,再尽可能地简化,你发现的是,你最终得到的正是反推算法! 所以你可以认为反传播算法提供了一种计算所有这些路径的速率因子之上的和的方法。或者,稍微换个说法,反向传播算法是一种巧妙的方法,当权重(和偏置)在网络中传播,到达输出,然后影响成本时,跟踪它们的小扰动。

现在,我不打算在这里把所有这些工作做完。它是混乱的,需要相当谨慎的工作,通过所有的细节。如果你愿意接受挑战,你可能会喜欢尝试它。即使不喜欢,我也希望这条思路能让你对回溯繁殖的成就有所了解。

的洞察力。做完这一切,再尽可能地简化,你发现的是,你最终得到的正是反推算法! 所以你可以认为反传播算法提供了一种计算所有这些路径的速率因子之上的和的方法。或者,稍微换个说法,反向传播算法是一种巧妙的方法,当权重(和偏置)在网络中传播,到达输出,然后影响成本时,跟踪它们的小扰动。

现在,我不打算在这里把所有这些工作做完。它是混乱的,需要相当谨慎的工作,通过所有的细节。如果你愿意接受挑战,你可能会喜欢尝试它。即使不喜欢,我也希望这条思路能让你对回溯繁殖的成就有所了解。

那另一个谜团–backpropagation怎么会在第一时间被发现呢?事实上,如果你按照我刚才勾画的方法,你就会发现一个反向传播的证明。不幸的是,这个证明比我在本章前面描述的那个证明要长不少,也更复杂。那么,那个简短的(但更神秘的)证明是如何发现的呢?当你写出长证明的所有细节时,你会发现,事后,有几个明显的简化在盯着你。你做了这些简化,得到一个更短的证明,然后写出来。然后又有几个明显的简化跳到你面前。于是你又重复了一遍。几次迭代后的结果就是我们之前看到的证明–虽然短,但有些晦涩,因为所有构造它的路标都被去掉了! 当然,我是请你相信我这一点,但前面的证明的来源确实没有什么大的神秘性。只是我在这一节中把我勾画的证明简化了许多辛苦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值