我的网站

耀世注册

联系我们

地址:海南省海口市

邮编:570521

电话:0898-08980898

传真:0898-1230-5678

行业新闻

当前位置: 首页 > 耀世资讯 > 行业新闻

Pytorch网络训练流程的作用原理:源码分析optimizer.zero_grad()loss.backward()optimizer.step()

添加时间:2024-04-29 03:47:42

在用训练模型时,通常会在循环的过程中,不断循环遍历所有训练数据集。

依次用到,和三个函数,如下所示:

 

(学习率更新的模块非必要所以暂时不放在这里讲,想了解的可以看如下文章:pytorch 动态调整学习率,学习率自动下降,根据loss下降主要集中在)

总得来说,这三个函数的作用是先将梯度归零(),然后反向传播计算得到每个参数的梯度(),最后通过梯度下降执行一步参数更新()。

接下来将通过源码分别理解这三个函数的具体实现过程。在此之前,先简要说明一下函数中常用到的参数变量:

  • : 在实例化时会在构造函数中创建一个,列表中的元素为字典,此时字典的数量就是的长度,也就是变量的含义。
  • 字典:此字典长度为6,包含了,,,,,这6组键值对。
  • 字典中的键值: 由模型参数组成的迭代器,模型参数即为实例化时传入并注册在模型的成员属性中,每个参数是一个对象。

代码如下(示例):

 

函数会遍历模型的所有参数,这里所说的参数都是之前总述中所叙述过的类型变量。也就是之后的。通过方法截断反向传播的梯度流,再通过函数将每个参数的梯度值设为0,即上一次的梯度记录被清空。

因为训练的过程通常使用方法,调用函数之前都要将梯度清零,因为如果梯度不清零,中会将上次计算的梯度和本次计算的梯度累加。

好处

当我们的硬件限制不能使用更大的时,代码构造成多个进行一次函数调用,这样就可以使用多次计算较小的的梯度平均值来代替,更方便。

坏处

每次都要清零梯度:进来一个的数据,计算一次梯度,更新一次网络。

总结

  1. 常规情况下,每个需要调用一次函数,把参数的梯度清零;
  2. 也可以多个只调用一次函数,这样相当于增大了。

的反向传播(即)是通过来实现的,会根据进行过的数学运算来自动计算其对应的梯度。

具体来说,是的基础类,如果你设置的为,就会开始跟踪这个上面的所有运算。

如果做完运算后使用,所有的梯度就会自动运算,的梯度将会累加到它的属性里面去。如果没有进行的话,梯度值将会是,因此要写在之前。

以为例,源码如下:

 

的作用是执行一次优化步骤,通过梯度下降法来更新参数的值。因为梯度下降是基于梯度的,所以在执行前应先执行来计算梯度。

注意:

不一样的优化器的函数具体的流程基本相似

主要不同的地方是在于由于优化手段的不同,会通过所计算出来的梯度,用不同的公式去更新参数,仅此而已

具体公式如何不同或者有什么区别可以参考

深度学习笔记(四):常用优化算法分析比较及使用策略(SGD、SGDM、SGD with Nesterov Acceleration、AdaGrad、AdaDelta、Adam、Nadam)_呆呆象呆呆的博客-CSDN博客

optimizer.zero_grad(),loss.backward(),optimizer.step()的作用原理 | 码农家园

深度学习笔记(四):常用优化算法分析比较及使用策略(SGD、SGDM、SGD with Nesterov Acceleration、AdaGrad、AdaDelta、Adam、Nadam)_呆呆象呆呆的博客-CSDN博客

地址:海南省海口市电话:0898-08980898传真:0898-1230-5678

Copyright © 2012-2018 耀世娱乐-耀世注册登录入口 版权所有ICP备案编号:琼ICP备xxxxxxxx号

平台注册入口