2021SC@SDUSC
在无监督数据增强uda模型的学习过程中,通过阅读代码了解到了在模型优化的核心--梯度下降优化参数,这就离不开今天的主题自动微分引擎与优化器了。
torch.autograd是 PyTorch 的自动微分引擎,为神经网络训练提供动力。
背景
神经网络 (NN) 是对某些输入数据执行的嵌套函数的集合。这些函数由参数 (由权重和偏差组成)定义,这些参数在 PyTorch 中存储在张量(Tensors)中。
概览:
- 定义具有一些可学习参数(或权重)的神经网络。
- 迭代输入数据集。
- 通过网络处理输入。
- 计算损失(距离函数)。
- 将梯度传播回网络参数。
- 更新网络的权重
训练 NN 分两步进行:
前向传播:在前向传播中,神经网络对正确的输出做出最好的猜测。它通过它的每个函数运行输入数据来做出这个猜测。
反向传播:在反向传播中,神经网络根据其猜测中的误差成比例地调整其参数。它通过从输出向后遍历,收集关于函数参数(梯度)的误差导数,并使用梯度下降优化参数来实现这一点。
通过预训练好的已加载的bert模型对输入数据进行编码等预处理后连接如图上分类器模型进行该模型的训练达成文本分类任务。
通过模型的每一层运行输入数据以进行预测。这是前传。
使用模型的预测和相应的标签来计算误差 ( loss
)。下一步是通过网络反向传播这个误差。当我们调用.backward()
误差张量时,反向传播就开始了。Autograd
然后计算每个模型参数的梯度并将其存储在参数的.grad
属性中。
接下来就需要加载一个优化器,并且在优化器中注册模型的所有参数。如下图:
要构造一个Optimizer,你必须给它一个包含参数(必须都是Variable对象)进行优化。然后,您可以指定optimizer的参数选项,比如学习率,权重衰减等。具体参考torch.optim中文文档,这里不进行详细描述,继续回到项目代码。
构建好优化器后,我们调用.step()
启动梯度下降。优化器通过存储每一个需要优化的参数中的梯度来调整每个参数.grad。
参数梯度的计算就是多元函数的偏导再次不赘述。
如上图首先使用随机梯度将所有参数和反向传播的梯度缓冲区归零,防止新的梯度计算累积到现有的梯度之上,然后计算模型损失,调用backward()函数,只需要定义forward函数(需要理解该函数内包含的函数就是神经网络前传步骤所用的参数也就是我们要进行优化的模型参数),backward 函数(计算梯度的地方)就会使用autograd将参数的梯度进行保存最后进行参数优化。