反向传播

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反向传播相关的知识,希望对你有一定的参考价值。

参考技术A

反向传播 (英语:Backpropagation,缩写为 BP )是“误差反向传播”的简称,是一种与 最优化方法 (如 梯度下降法 )结合使用的,用来训练 人工神经网络 的常见方法。该方法对网络中所有权重计算 损失函数 的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。
基本的神经网络结构:

前向传播也就是推导过程, 一般网络训练好后, 只需要进行以此前向传播就可以得到预测结果, 这些预测结果是根据输入以及网络权重和激活函数得到的, 这和LR很像, 每一个隐藏层的神经元, 都存在一个激活函数
前向传播比较容易理解

现在经过前向传播之后, 我们来到了输出层的神经元, 那么输出结果和我们预想的是否一致? 需要一个评价指标, 使用平方误差和来计算总误差:

其中, 代表输出层的第 个神经元, 意味着有 个类, 我们看到 , 它是因为后面求偏导的时候, 为的是可以消除平方, 这个不影响模型参数的求解

反向传播的目标是:通过更新网络中的每一个权重,使得最终的输出接近于groundtruth,这样就得到整个网络的误差作为一个整体进行了最小化。
BP以gradient decent为策略. 以目标的负梯度方向对参数进行调整, 反向都是从最后的一层开始的:

这个公式也有这样的含义: 的改变, 可以多大程度上影响 , 其中 分别是两个相连接的神经元

我们来看输出层, 先看 ,想知道 多大程度上可以影响到总误差? 也就是 ,通过链式求导法则:

隐藏层权重的更新方式与输出层的类似, 不过有一点不同, 就是每个隐藏层神经元的输出对最终的输出都是有贡献的, 既影响 也影响 , 因此, 要考虑到对两个输出的影响
在 更新 的时候, 路径是 out(o1)->net(o1)-> , 而在更新 的时候, 路径是 out(h1)->net(h1)-> , 而此时我们可以忽略掉最后一层输出层, out(h1)会接受来自两个误差 E(o1)和E(o2), 这两个我们都需要计算
先计算
可以看到.

对于:

此时,

BP是对链式法则的巧妙运用,反向传播仅仅指反向计算梯度的方法. 它从最后一个输出的神经元开始, 通过求误差和当前神经元的偏导得到该层的权重更新

深度学习正向传播反向传播和计算图(backprop)

正向传播、反向传播和计算图

前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd模块来调用系统自动生成的backward函数计算梯度。

基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使用数学和计算图(computational graph)两个方式来描述正向传播和反向传播。具体来说,我们将以带 L 2 L_2 L2范数正则化的含单隐藏层的多层感知机为样例模型解释正向传播和反向传播。

正向传播

正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。为简单起见,假设输入是一个特征为 x ∈ R d \\boldsymbolx \\in \\mathbbR^d xRd的样本,且不考虑偏差项,那么中间变量

z = W ( 1 ) x , \\boldsymbolz = \\boldsymbolW^(1) \\boldsymbolx, z=W(1)x,

其中 W ( 1 ) ∈ R h × d \\boldsymbolW^(1) \\in \\mathbbR^h \\times d W(1)Rh×d是隐藏层的权重参数。把中间变量 z ∈ R h \\boldsymbolz \\in \\mathbbR^h zRh输入按元素运算的激活函数 ϕ \\phi ϕ后,将得到向量长度为 h h h的隐藏层变量

h = ϕ ( z ) . \\boldsymbolh = \\phi (\\boldsymbolz). h=ϕ(z).

隐藏层变量 h \\boldsymbolh h也是一个中间变量。假设输出层参数只有权重 W ( 2 ) ∈ R q × h \\boldsymbolW^(2) \\in \\mathbbR^q \\times h W(2)Rq×h,可以得到向量长度为 q q q的输出层变量

o = W ( 2 ) h . \\boldsymbolo = \\boldsymbolW^(2) \\boldsymbolh. o=W(2)h.

假设损失函数为 ℓ \\ell ,且样本标签为 y y y,可以计算出单个数据样本的损失项

L = ℓ ( o , y ) . L = \\ell(\\boldsymbolo, y). L=(o,y).

根据 L 2 L_2 L2范数正则化的定义,给定超参数 λ \\lambda λ,正则化项即

s = λ 2 ( ∥ W ( 1 ) ∥ F 2 + ∥ W ( 2 ) ∥ F 2 ) , s = \\frac\\lambda2 \\left(\\|\\boldsymbolW^(1)\\|_F^2 + \\|\\boldsymbolW^(2)\\|_F^2\\right), s=2λ(W(1)F2+W(2)F2),

其中矩阵的Frobenius范数等价于将矩阵变平为向量后计算 L 2 L_2 L2范数。最终,模型在给定的数据样本上带正则化的损失为

J = L + s . J = L + s. J=L+s.

我们将 J J J称为有关给定数据样本的目标函数,并在以下的讨论中简称目标函数。

正向传播的计算图

我们通常绘制计算图来可视化运算符和变量在计算中的依赖关系。图3.6绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出。可以看到,图中箭头方向大多是向右和向上,其中方框代表变量,圆圈代表运算符,箭头表示从输入到输出之间的依赖关系。

图3.6 正向传播的计算图

反向传播

反向传播指的是计算神经网络参数梯度的方法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。对输入或输出 X , Y , Z \\mathsfX, \\mathsfY, \\mathsfZ X,Y,Z为任意形状张量的函数 Y = f ( X ) \\mathsfY=f(\\mathsfX) Y=f(X) Z = g ( Y ) \\mathsfZ=g(\\mathsfY) Z=g(Y),通过链式法则,我们有

∂ Z ∂ X = prod ( ∂ Z ∂ Y , ∂ Y ∂ X ) , \\frac\\partial \\mathsfZ\\partial \\mathsfX = \\textprod\\left(\\frac\\partial \\mathsfZ\\partial \\mathsfY, \\frac\\partial \\mathsfY\\partial \\mathsfX\\right), XZ=prod(YZ,XY),

其中 prod \\textprod prod运算符将根据两个输入的形状,在必要的操作(如转置和互换输入位置)后对两个输入做乘法。

回顾一下本节中样例模型,它的参数是 W ( 1 ) \\boldsymbolW^(1) W(1) W ( 2 ) \\boldsymbolW^(2) W(2),因此反向传播的目标是计算 ∂ J / ∂ W ( 1 ) \\partial J/\\partial \\boldsymbolW^(1) J/W(1) ∂ J / ∂ W ( 2 ) \\partial J/\\partial \\boldsymbolW^(2) J/W(2)。我们将应用链式法则依次计算各中间变量和参数的梯度,其计算次序与前向传播中相应中间变量的计算次序恰恰相反。首先,分别计算目标函数 J = L + s J=L+s J=L+s有关损失项 L L L和正则项 s s s的梯度

∂ J ∂ L = 1 , ∂ J ∂ s = 1. \\frac\\partial J\\partial L = 1, \\quad \\frac\\partial J\\partial s = 1. LJ=1,sJ=1.

其次,依据链式法则计算目标函数有关输出层变量的梯度 ∂ J / ∂ o ∈ R q \\partial J/\\partial \\boldsymbolo \\in \\mathbbR^q J/oRq

∂ J ∂ o = prod ( ∂ J ∂ L , ∂ L ∂ o ) = ∂ L ∂ o . \\frac\\partial J\\partial \\boldsymbolo = \\textprod\\left(\\frac\\partial J\\partial L, \\frac\\partial L\\partial \\boldsymbolo\\right) = \\frac\\partial L\\partial \\boldsymbolo. oJ=prod(LJ,oL)=oL.

接下来,计算正则项有关两个参数的梯度:

∂ s ∂ W ( 1 ) = λ W ( 1 ) , ∂ s ∂ W ( 2 ) = λ W ( 2 ) . \\frac\\partial s\\partial \\boldsymbolW^(1) = \\lambda \\boldsymbolW^(1),\\quad\\frac\\partial s\\partial \\boldsymbolW^(2) = \\lambda \\boldsymbolW^(2). W(1)s=λW(1),W(2)s=λW(2).

现在,我们可以计算最靠近输出层的模型参数的梯度 ∂ J / ∂ W ( 2 ) ∈ R q × h \\partial J/\\partial \\boldsymbolW^(2) \\in \\mathbbR^q \\times h 反向传播梯度求解推导

一文搞懂反向传播算法

读懂反向传播算法(bp算法)

前向传播和反向传播

007-卷积神经网络-前向传播-反向传播

Torch反向传播时出错或者梯度为NaN的问题排查