pytorch 的自动求导功能简介

本文深入介绍了PyTorch的自动求导功能及其在神经网络训练中的应用,包括反向传播算法的基本原理、自动求导的具体实现方式及注意事项。


自动求导是 pytorch 的一项重要功能,它使得 pytorch 能够灵活快速地构建神经网络模型。反向传播算法是优化神经网络模型参数的一个重要方法,在反向传播过程中需要不断计算损失函数对参数的导数,然后更新相应的模型参数,首先简单介绍一下反向传播算法。

一、反向传播算法简介

这部分的主要参考资料来自这里:https://www.cnblogs.com/charlotte77/p/5629865.html,原文的计算过程非常详细,有需要可以去阅读原文,另外原文中有一处疏漏之处,就是也需要计算损失函数对偏置量 b 1 b_1 b1 b 2 b_2 b2的导数并且更新偏置量。

回到正题,对于一个典型的神经网络模型,如下所示:
nn
我们可以将它看作是一个映射( F \mathscr{F} F),即是从输入向量 [ i 1 , i 2 ] [i1, i2] [i1,i2]到输出向量 [ o 1 , o 2 ] [o1, o2] [o1,o2]之间的映射,而这个映射关系完全是由网络的连接关系w1-w8、b1、b2这些参数决定的。在模型的训练过程中,输入和输出数据是固定的,我们要做的是调节这些控制参数来使得通过神经网络计算的输出与实际输出的误差达到最小,误差的具体形式通过损失函数( L \mathscr{L} L)来定义,由于输入和输出数据是固定的,同时在网络结构固定的情况下,损失函数( L \mathscr{L} L)仅是w1-w8、b1、b2这些控制参数的函数,神经网络的优化过程用公式表达就是:
f i n d w 1 0 − w 8 0 , b 1 0 , b 2 0 s t L 0 ( w 1 0 − w 8 0 , b 1 0 , b 2 0 ) = m i n L ( w 1 − w 8 , b 1 , b 2 ) find \quad w1_0-w8_0,b1_0,b2_0 \quad st \\ \mathscr{L}_0(w1_0-w8_0,b1_0,b2_0) = min\mathscr{L}(w1-w8, b1, b2) findw10w80,b10,b20stL0(w10w80,b10,b20)=minL(w1w8,b1,b2)
反向传播过程就是通过不断计算损失函数( L \mathscr{L} L)对w1-w8、b1、b2这些控制参数的导数,根据梯度下降法的原理,更新参数,使得损失函数( L \mathscr{L} L)向着减小的方向优化,优化完成即代表损失函数达到最小。

需要注意的一点是,在网络参数优化过程中,我们是通过损失函数( L \mathscr{L} L)对控制参数求梯度来优化的,而不是通过网络模型( F \mathscr{F} F)对控制参数求梯度,损失函数( L \mathscr{L} L)是一个标量函数,而网络模型( F \mathscr{F} F)通常是一个向量函数,我们说的求梯度是对多变量的标量函数求梯度,参数的更新方法用公式可以表达为:
[ w 1 , … , w 8 , b 1 , b 2 ] = [ w 1 , … , w 8 , b 1 , b 2 ] − α [ ∂ L ∂ w 1 , … , ∂ L ∂ w 8 , ∂ L ∂ b 1 , ∂ L ∂ b 2 ] [w1, \dots, w8, b1, b2] = [w1, \dots, w8, b1, b2] - \alpha[\frac{\partial{\mathscr{L}}}{\partial{w1}}, \dots, \frac{\partial{\mathscr{L}}}{\partial{w8}}, \frac{\partial{\mathscr{L}}}{\partial{b1}}, \frac{\partial{\mathscr{L}}}{\partial{b2}}] [w1,,w8,b1,b2]=[w1,,w8,b1,b2]α[w1L,,w8L,b1L,b2L]
其中 α \alpha α学习率

一个完整的神经网络训练过程可以总结以下两步循环进行:

  1. 前向传播:计算在当前参数下,带入输入数据后模型的输出
  2. 反向传播:计算损失函数对网络各个控制参数的梯度,然后更新控制参数。这里要注意的是由于一些参数前后有耦合关系,因此在某些求导中需要用到链式法则

二、pytorch 的自动求导功能

pytorch 能够自动求导,这为构建神经网络提供了很大的方便。以下的内容大部分都翻译自 pytorch 官方的内容:https://pytorch.org/tutorials/beginner/introyt/autogradyt_tutorial.html,部分有所改动,以官网为准。

1. 前言

pytorch 的自动求导特征使得其能够快速灵活地构建机器学习项目,在复杂的计算中它能够快速且容易地计算多变量偏导数(梯度),在基于反向传播的神经网络模型中这一操作是核心。

pytorch 的自动求导能力来自于在程序运行过程中,它会动态地追踪你的计算,这意味着如果你的模型有条件分支,或者循环的步数在程序运行之前是未知的,它同样能够正确地追踪计算,你能够得到正确的结果来继续学习过程,所有的这些,结合你建立在 python 之上的模型,相比于传统的用于计算梯度的固定结构,能够提供一个更加灵活的框架。

2. 我们需要自动求导机制做什么

机器学习模型是一个有输入和输出的函数,在这个讨论中,我们将把输入看作是一个i维的向量 x ⃗ \vec{x} x ,其中的元素写作 x i x_i xi。我们可以把模型写作M,它是关于输入的一个向量函数: y ⃗ = M ⃗ ( x ⃗ ) \vec{y}=\vec{M}(\vec{x}) y

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值