深度学习正向传播反向传播和计算图(backprop)
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习正向传播反向传播和计算图(backprop)相关的知识,希望对你有一定的参考价值。
正向传播、反向传播和计算图
前面几节里我们使用了小批量随机梯度下降的优化算法来训练模型。在实现中,我们只提供了模型的正向传播(forward propagation)的计算,即对输入计算模型输出,然后通过autograd
模块来调用系统自动生成的backward
函数计算梯度。
基于反向传播(back-propagation)算法的自动求梯度极大简化了深度学习模型训练算法的实现。本节我们将使用数学和计算图(computational graph)两个方式来描述正向传播和反向传播。具体来说,我们将以带 L 2 L_2 L2范数正则化的含单隐藏层的多层感知机为样例模型解释正向传播和反向传播。
正向传播
正向传播是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。为简单起见,假设输入是一个特征为 x ∈ R d \\boldsymbolx \\in \\mathbbR^d x∈Rd的样本,且不考虑偏差项,那么中间变量
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 z∈Rh输入按元素运算的激活函数 ϕ \\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绘制了本节中样例模型正向传播的计算图,其中左下角是输入,右上角是输出。可以看到,图中箭头方向大多是向右和向上,其中方框代表变量,圆圈代表运算符,箭头表示从输入到输出之间的依赖关系。
反向传播
反向传播指的是计算神经网络参数梯度的方法。总的来说,反向传播依据微积分中的链式法则,沿着从输出层到输入层的顺序,依次计算并存储目标函数有关神经网络各层的中间变量以及参数的梯度。对输入或输出 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), ∂X∂Z=prod(∂Y∂Z,∂X∂Y),
其中 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. ∂L∂J=1,∂s∂J=1.
其次,依据链式法则计算目标函数有关输出层变量的梯度 ∂ J / ∂ o ∈ R q \\partial J/\\partial \\boldsymbolo \\in \\mathbbR^q ∂J/∂o∈Rq:
∂ 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. ∂o∂J=prod(∂L∂J,∂o∂L)=∂o∂L.
接下来,计算正则项有关两个参数的梯度:
∂ 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 机器学习(ML)八之正向传播反向传播和计算图,及数值稳定性和模型初始化