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的时候是调用模块的,所以计算偏导数的时候,之前就计算好了偏导数是多少,把值带入进去就可以了。

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

相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
【PyTorch深度强化学习】TD3算法(双延迟-确定策略梯度算法)的讲解及实战(超详细 附源码)
【PyTorch深度强化学习】TD3算法(双延迟-确定策略梯度算法)的讲解及实战(超详细 附源码)
1222 1
|
13天前
|
人工智能 PyTorch 算法框架/工具
【AI系统】动手实现 PyTorch 微分
本文介绍了使用操作符重载(OO)编程方式实现的自动微分,特别是采用反向模式(Reverse Mode)的实现方法。文中详细解释了操作符重载的基本概念及其在自动微分中的应用,以及反向模式的工作原理。通过 Python 示例代码,演示了如何手动实现类似 PyTorch 中自动微分的核心机制,包括定义 `Variable` 类、`Tape` 结构以及实现基本的数学运算符重载。最后,通过一个具体的数学函数示例展示了如何利用上述机制计算梯度,帮助读者理解反向模式自动微分的全过程。
27 1
【AI系统】动手实现 PyTorch 微分
|
2月前
|
机器学习/深度学习 PyTorch 算法框架/工具
探索PyTorch:自动微分模块
探索PyTorch:自动微分模块
|
4月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch中的自动微分机制:深入理解反向传播
【8月更文第27天】PyTorch 是一个强大的机器学习框架,它因其灵活性和易用性而受到广泛欢迎。其中一个关键特性就是它的自动微分机制,这个机制使得 PyTorch 能够自动计算任何张量操作的梯度,这对于训练深度学习模型至关重要。本文将详细介绍 PyTorch 中自动微分机制的工作原理,并通过具体的代码示例来展示如何使用这一机制来实现反向传播。
310 1
|
6月前
|
机器学习/深度学习 存储 PyTorch
Pytorch-自动微分模块
PyTorch的torch.autograd模块提供了自动微分功能,用于深度学习中的梯度计算。它包括自定义操作的函数、构建计算图、数值梯度检查、错误检测模式和梯度模式设置等组件。张量通过设置`requires_grad=True`来追踪计算,`backward()`用于反向传播计算梯度,`grad`属性存储张量的梯度。示例展示了如何计算标量和向量张量的梯度,并通过`torch.no_grad()`等方法控制梯度计算。在优化过程中,梯度用于更新模型参数。注意,使用numpy转换要求先`detach()`以避免影响计算图。
|
7月前
|
机器学习/深度学习 算法 PyTorch
深入理解PyTorch自动微分:反向传播原理与实现
【4月更文挑战第17天】本文深入解析PyTorch的自动微分机制,重点讨论反向传播的原理和实现。反向传播利用链式法则计算神经网络的梯度,包括前向传播、梯度计算、反向传播及参数更新。PyTorch通过`autograd`模块实现自动微分,使用`Tensor`和计算图记录操作历史以自动计算梯度。通过示例展示了如何在PyTorch中创建张量、定义计算过程及求梯度。掌握这些有助于提升深度学习模型的训练效率。
|
7月前
|
机器学习/深度学习 缓存 自然语言处理
PyTorch使用Tricks:梯度裁剪-防止梯度爆炸或梯度消失 !!
PyTorch使用Tricks:梯度裁剪-防止梯度爆炸或梯度消失 !!
610 0
|
7月前
|
机器学习/深度学习 算法 PyTorch
【PyTorch深度强化学习】带基线的蒙特卡洛策略梯度法(REINFOECE)在短走廊和CartPole环境下的实战(超详细 附源码)
【PyTorch深度强化学习】带基线的蒙特卡洛策略梯度法(REINFOECE)在短走廊和CartPole环境下的实战(超详细 附源码)
130 0
|
7月前
|
机器学习/深度学习 算法 关系型数据库
PyTorch深度强化学习中蒙特卡洛策略梯度法在短走廊环境(CartPole-v0)中的实战(超详细 附源码)
PyTorch深度强化学习中蒙特卡洛策略梯度法在短走廊环境(CartPole-v0)中的实战(超详细 附源码)
83 0
|
7月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
134 0

相关实验场景

更多
下一篇
DataWorks