Pytorch学习笔记05----损失函数与优化器
栏目:公司新闻 发布时间:2024-03-04
在前文,我们初步完成了梯度下降算法求解线性回归问题的实例。在这个过程中,我们自己定义了损失函数和权重的更新,其实PyTorch也为我们直接定义了相应的工具包,使我们能够简洁快速的实现损失函数、权重的更新和梯度的求解。损失函数与优化器一、模型的内置函数1.损失函数torch.nn.MSELoss()2.优化器torch.optim二、模型的建立1.定义线性模型Linear2.定义优化器和损失

前文,我们初步完成了梯度下降算法求解线性回归问题的实例。在这个过程中,我们自己定义了损失函数和权重的更新,其实 PyTorch 也为我们直接定义了相应的工具包,使我们能够简洁快速的实现损失函数、权重的更新和梯度的求解。

 
 
 

在Pytorch中的中封装了很多损失函数,避免了我们手动定义损失函数,如均方差损失:。
首先,我们把需要的变量和数据集定义出来:

 

输出结果如下:

 

接下来,让我们通过 计算此时预测值和真实值之间的损失:

 

输出结果如下:

 
 

优化器可以理解为一种利用梯度下降算法自动求解所需参数的工具包。在 PyTorch 中提供了 方法优化我们的模型。 工具包中存在着各种梯度下降的改进算法,比如 、、 和 等。这些算法都是以传统梯度下降算法为基础,提出的改进算法,这些算法可以更快更准确地求解最佳模型参数。
我们可以通过下面方式定义一个 SGD 优化器:

 

其中第一个参数,表示的是损失函数中的权重,即我们需要求取的值。 l r lr lr 表示的是梯度下降的步长。

由于一般的模型都是复杂的多元函数,每次使用梯度下降算法时,我们都需要手动的对每个变量进行更新,这无疑是非常繁琐的。而使用优化器,我们可以一次性对所有的变量进行更新。函数如下:

:对模型(神经网络)中的参数进行更新,即所有参数值向梯度相反方向走一步。
:对损失函数的相关变量进行梯度的清空。
综上,让我们完整的进行一次线性回归的求解。

首先,定义损失函数和优化器:

 

输出结果如下:

 

接下来,根据正向传播结果,更新梯度,进而更新权重值:

 

输出结果如下:

 

这里我们进行了 100 次的迭代,可以发现得到的权重 ω \omega ω和实际值相同,损失无限接近于 0 。

除了梯度的求解、权重的更新和梯度的清空外,PyTorch 实际上还为我们提供了模型的定义。也就是说,我们不用手动定义 forward 函数了。PyTorch 中为我们提供了预定义模型,可以直接使用。如 表示线性函数模型。

 

总结一下,我们可以将一个线性问题的求解分为下面三个步骤:

1.定义模型(即正向传播函数)。
2.定义损失和优化器。
3.模型的训练(正向传播、反向传播、更新梯度、梯度下降、循环)。

首先,让我们利用 PyTorch 定义线性函数模型:

 

输出结果如下:

 
 

在模型训练时,我们可以直接利用 作为模型的正向传播,该函数返回数据 x x x的预测结果。

 

输出结果如下:

 
 

最后,我们就可以利用上面定义的模型、优化器和损失函数进行模型的训练了(即利用梯度下降算法,求解损失最小时的权重值):

 

输出结果如下:

 
 

模型训练的步骤是固定的:
1.利用 定义模型。
2.利用 定义损失。
3.利用 定义优化器。
4.利用梯度下降算法进行模型的训练。


模型的训练步骤也是固定的:
1.利用 进行正向传播。
2.利用 计算模型损失。
3.利用 计算模型梯度。
4.利用 更新权重。
5.利用 清空梯度。
6.重复 1-5 的操作。
因此,使用 PyTorch 可以大大的简化我们的编程难度。我们只需要改变模型的形式、损失函数的形式、优化器的形式以及各个参数的值,就能够训练出不同的模型,进而解决不同的深度学习问题了。


平台注册入口