PyTorch中的梯度微分机制

简介: PyTorch中的梯度微分机制
PyTorch创建模型的一般的写法是:
outputs = Your_model(data_x)
optimizer.zero_grad()
loss = loss_function(data_y,outputs)
loss.backward()
optimizer.step()
这里的loss不是一个tensor吗?
这个tensor就是存了一个值,
loss.backward()会实现一个什么样的过程?
是计算梯度吗?
感觉这里的loss和网络没什么关系啊?
是outputs 经过loss_function使得loss这个tensor和网络间接产生了关联,
所以程序可以自动识别网络的参数结构并以此来求梯度吗?

首先是构建计算图,loss.backward()的时候就是走一遍反向图。

举个例子就明白了:


例子定义


为了简单起见,就假设只有一个训练样本( x , t )。网络模型是一个线性模型,带有一个非线形的sigmoid层,然后用均方差作为其Loss函数,这个模型用公式可以表示为如下形式:

image.png

其中λ 是超参数。

想要做梯度下降的话,我们就需要对wb求偏微分:∂ E / ∂ w ∂ E / ∂ b

将目标函数展开可以表示为:

image.png

对w 求偏导数可以得到:


image.png

b 求偏导数可以得到:


image.png

述方法确实能够得出正确的解,但是有以下缺陷:

  1. 计算非常冗余复杂;
  2. 上述计算过程中有很多地方是重复计算的,比如w x + b 计算了四次, ( σ ( w x + b ) − t ) σ ′ ( w x + b ) 计算了两次。


多变量链式求导:简单的例子


其实上述方法就是在计算一元链式求导多次,一元链式求导可以定义为如下形式:

image.png

多变量的求导可以定义为:

image.png


为了方便叙述,定义一个符号,比如对v 的导数可以定义为:

image.png

多变量求导:计算图模式


上述带有正则化的模型用计算图可以表示为:

整个模型可以表示为:


image.png


反向传播的时候,我们需要去计算得到w ˉ b ˉ, 就需要反复利用链式求导计算偏微分。

也就是要从结果(这里定义为E ,一步一步往前去计算它的前一个节点的导数。定义v 1 , ⋯   , v N是计算图中的所有节点,并且以输入到输出的拓扑顺序进行排序的。

我们期望去计算得到所有节点的偏导数v ˉ , 神经网络工作的时候就是走一遍前向传播,然后走一遍反向传播。最末尾的这个节点是v N, 我们也需去得到它的偏导数,为了方便计算,我们通常令其偏导数为1。也就是v N ˉ = 1


此时整个算法的逻辑可以表示为:

image.png

我们再进行反向传播,来计算y ˉ z ˉ

image.png

最后到了我们需要更新的参数w b

image.png

总结一下推导过程为:

image.png

总结一下最终结果为:


image.png

可以看到相比之前的推导偏微分方程的方式,这种反向传播的方式更为简洁。

PyTorch中loss.backward()的时候就是把上述这个最终结果走一遍,因为创建model的时候是调用模块的,所以计算偏导数的时候,之前就计算好了偏导数是多少,把值带入进去就可以了。

下面这篇文章有兴趣可以看

相关文章
|
4月前
|
机器学习/深度学习 人工智能 算法
【PyTorch深度强化学习】TD3算法(双延迟-确定策略梯度算法)的讲解及实战(超详细 附源码)
【PyTorch深度强化学习】TD3算法(双延迟-确定策略梯度算法)的讲解及实战(超详细 附源码)
428 1
|
10天前
|
机器学习/深度学习 算法 PyTorch
深入理解PyTorch自动微分:反向传播原理与实现
【4月更文挑战第17天】本文深入解析PyTorch的自动微分机制,重点讨论反向传播的原理和实现。反向传播利用链式法则计算神经网络的梯度,包括前向传播、梯度计算、反向传播及参数更新。PyTorch通过`autograd`模块实现自动微分,使用`Tensor`和计算图记录操作历史以自动计算梯度。通过示例展示了如何在PyTorch中创建张量、定义计算过程及求梯度。掌握这些有助于提升深度学习模型的训练效率。
|
1月前
|
机器学习/深度学习 缓存 自然语言处理
PyTorch使用Tricks:梯度裁剪-防止梯度爆炸或梯度消失 !!
PyTorch使用Tricks:梯度裁剪-防止梯度爆炸或梯度消失 !!
75 0
|
4月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch深度强化学习】带基线的蒙特卡洛策略梯度法(REINFOECE)在短走廊和CartPole环境下的实战(超详细 附源码)
【PyTorch深度强化学习】带基线的蒙特卡洛策略梯度法(REINFOECE)在短走廊和CartPole环境下的实战(超详细 附源码)
48 0
|
4月前
|
机器学习/深度学习 算法 关系型数据库
PyTorch深度强化学习中蒙特卡洛策略梯度法在短走廊环境(CartPole-v0)中的实战(超详细 附源码)
PyTorch深度强化学习中蒙特卡洛策略梯度法在短走廊环境(CartPole-v0)中的实战(超详细 附源码)
29 0
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
51 0
|
4月前
|
机器学习/深度学习 并行计算 PyTorch
PyTorch使用快速梯度符号攻击(FGSM)实现对抗性样本生成(附源码和数据集MNIST手写数字)
PyTorch使用快速梯度符号攻击(FGSM)实现对抗性样本生成(附源码和数据集MNIST手写数字)
73 0
|
9月前
|
机器学习/深度学习 存储 算法
PyTorch 中的多 GPU 训练和梯度累积作为替代方案
PyTorch 中的多 GPU 训练和梯度累积作为替代方案
115 0
|
11月前
|
机器学习/深度学习 人工智能 PyTorch
【Pytorch神经网络理论篇】 04 Variable类型与自动微分模块剖析
Autograd模块:在神经网络的反向传播中,基于正向计算的结果进行微分计算,从而实现对于网络权重的更新与迭代,提供了张量的自动求微分功能,可以通过代码来实现对反向过程的控制,使得权重参数朝着目标结果进行更新与发展。
110 0
|
11月前
|
机器学习/深度学习 人工智能 算法
【Pytorch神经网络基础理论篇】 06 自动求导+导数与微分
【Pytorch神经网络基础理论篇】 06 自动求导+导数与微分
219 0

相关实验场景

更多