Pytorch Note13 反向传播算法

Posted Real&Love

tags:

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

Pytorch Note13 反向传播算法

全部笔记的汇总贴:Pytorch Note 快乐星球

反向传播算法

前面我们介绍了三个模型,整个处理的基本流程都是定义模型,读入数据,给出损失函数 f f f,通过梯度下降法更新参数。PyTorch 提供了非常简单的自动求导帮助我们求解导数,对于比较简单的模型,我们也能手动求出参数的梯度,但是对于非常复杂的模型,比如一个 100 层的网络,我们如何能够有效地手动求出这个梯度呢?这里就需要引入反向传播算法,自动求导本质是就是一个反向传播算法。

反向传播算法就是一个有效地求解梯度的算法,本质上其实就是一个链式求导法则的应用,然而这个如此简单而且显而易见的方法却是在Roseblatt 提出感知器算法后将近30 年才被发明和普及的,对此Bengio。这样说道:“很多看似显而易见的想法只有在事后才变得显而易见。”

链式法则

首先来简单地介绍一下链式法则,考虑一个简单的函数,比如
f ( x , y , z ) = ( x + y ) z f(x, y, z) = (x + y)z f(x,y,z)=(x+y)z

我们当然可以直接求出这个函数的微分,但是这里我们要使用链式法则,令
q = x + y q=x+y q=x+y

那么

f = q z f = qz f=qz

对于这两个式子,我们可以分别求出他们的微分

∂ f ∂ q = z , ∂ f ∂ z = q \\frac{\\partial f}{\\partial q} = z, \\frac{\\partial f}{\\partial z}=q qf=z,zf=q

同时 q q q x x x y y y的求和,所以我们能够得到

∂ q x = 1 , ∂ q y = 1 \\frac{\\partial q}{x} = 1, \\frac{\\partial q}{y} = 1 xq=1,yq=1

我们关心的问题是

∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z \\frac{\\partial f}{\\partial x}, \\frac{\\partial f}{\\partial y}, \\frac{\\partial f}{\\partial z} xf,yf,zf

链式法则告诉我们如何来计算出他们的值

∂ f ∂ x = ∂ f ∂ q ∂ q ∂ x \\frac{\\partial f}{\\partial x} = \\frac{\\partial f}{\\partial q}\\frac{\\partial q}{\\partial x} xf=qfxq

∂ f ∂ y = ∂ f ∂ q ∂ q ∂ y \\frac{\\partial f}{\\partial y} = \\frac{\\partial f}{\\partial q}\\frac{\\partial q}{\\partial y} yf=qfyq

∂ f ∂ z = q \\frac{\\partial f}{\\partial z} = q zf=q

通过链式法则我们知道如果我们需要对其中的元素求导,那么我们可以一层一层求导然后将结果乘起来,这就是链式法则的核心,也是反向传播算法的核心,更多关于链式法则的算法,可以访问这个链式法则

反向传播算法

了解了链式法则,我们就可以开始介绍反向传播算法了,本质上反向传播算法只是链式法则的一个应用。我们还是使用之前那个相同的例子 q = x + y , f = q z q=x+y, f=qz q=x+y,f=qz,通过计算图可以将这个计算过程表达出来

上面绿色的数字表示其数值,下面红色的数字表示求出的梯度,我们可以一步一步看看反向传播算法的实现。首先从最后开始,梯度当然是1,然后计算

∂ f ∂ q = z = − 4 ,   ∂ f ∂ z = q = 3 \\frac{\\partial f}{\\partial q} = z = -4,\\ \\frac{\\partial f}{\\partial z} = q = 3 qf=z=4, zf=q=3

接着我们计算
∂ f ∂ x = ∂ f ∂ q ∂ q ∂ x = − 4 × 1 = − 4 ,   ∂ f ∂ y = ∂ f ∂ q ∂ q ∂ y = − 4 × 1 = − 4 \\frac{\\partial f}{\\partial x} = \\frac{\\partial f}{\\partial q} \\frac{\\partial q}{\\partial x} = -4 \\times 1 = -4,\\ \\frac{\\partial f}{\\partial y} = \\frac{\\partial f}{\\partial q} \\frac{\\partial q}{\\partial y} = -4 \\times 1 = -4 xf=qfxq=4×1=4, yf=qfyq=4×1=4

这样一步一步我们就求出了 ∇ f ( x , y , z ) \\nabla f(x, y, z) f(x,y,z)

直观上看反向传播算法是一个优雅的局部过程,每次求导只是对当前的运算求导,求解每层网络的参数都是通过链式法则将前面的结果求出不断迭代到这一层,所以说这是一个传播过程

Sigmoid函数举例

下面我们通过Sigmoid函数来演示反向传播过程在一个复杂的函数上是如何进行的。

f ( w , x ) = 1 1 + e − ( w 0 x 0 + w 1 x 1 + w 2 ) f(w, x) = \\frac{1}{1+e^{-(w_0 x_0 + w_1 x_1 + w_2)}} f(w,x)=1+e(w0x0+w1x1+w2)1

我们需要求解出
∂ f ∂ w 0 , ∂ f ∂ w 1 , ∂ f ∂ w 2 \\frac{\\partial f}{\\partial w_0}, \\frac{\\partial f}{\\partial w_1}, \\frac{\\partial f}{\\partial w_2} w0f,w1f,w2f
首先我们将这个函数抽象成一个计算图来表示,即
f ( x ) = 1 x f c ( x ) = 1 + x f e ( x ) = e x f

以上是关于Pytorch Note13 反向传播算法的主要内容,如果未能解决你的问题,请参考以下文章

怎样理解神经网络的反向传播算法-ML Note 53

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

pytorch前向传播和反向传播

pytorch 如何通过 argmax 反向传播?

了解 PyTorch 中的反向传播

Pytorch之梯度下降和方向传播理论介绍