【PyTorch】第五节:损失函数与优化器
栏目:公司动态 发布时间:2024-04-29
作者??:让机器理解语言か专栏?:PyTorch描述?:PyTorch是一个基于Torch的Python开源机器学习库。寄语?:?没有白走的路,每一步都算数!??在上一节实验中,我们初步完成了梯度下降算法求解线性回归问题的实例。在这个过程中,我们自己定义了损失函数和权重的更新,其实PyT

作者🕵♂?:让机器理解语言か

专栏🎇PyTorch

描述🎨:PyTorch 是一个基于 Torch 的 Python 开源机器学习库。

寄语💓:🐾没有白走的路,每一步都算数!🐾?

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

知识点🍉

  • 🍓损失函数的定义
  • 🍓优化器的定义
  • 🍓模型的训练步骤

在上一个实验中,我们利用了自己定义的损失函数对线性问题进行了求解。其实??中存在很多封装好的损失函数。比如均方差损失,用表示。

 

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

 
 

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

我们可以通过下面方式定义一个 SGD 优化器:

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

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

  • ?:对模型(神经网络)中的参数进行更新,即所有参数值向梯度相反方向走一步
  • ?:对损失函数的相关变量进行梯度的清空。

综上,让我们完整的进行一次线性回归的求解。

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

 

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

 

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

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

  • input_size:输入数据的维度
  • output_size:输出数据的维度

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

  1. 🌐定义模型(即正向传播函数)。

  2. 🌐定义损失优化器

  3. 🌐模型的训练正向传播、反向传播、更新梯度、梯度下降、循环)。

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

 

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

接下来,让我们定义优化器和损失函数

 

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

 

?可以看到其实求解一个线性问题的步骤是固定的:

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

并且模型的训练步骤也是固定的:

  1. 🌿利用??进行正向传播。
  2. 🌿利用??计算模型损失。
  3. 🌿利用??计算模型梯度。
  4. 🌿利用??更新权重。
  5. 🌿利用??清空梯度。
  6. 🌿重复 1-5 的操作。

因此,使用 PyTorch 可以大大的简化我们的编程难度。我们只需要改变模型的形式、损失函数的形式、优化器的形式以及各个参数的值,就能够训练出不同的模型,进而解决不同的深度学习问题了。

本实验详细的阐述了如何使用 PyTorch 对模型进行求解。这个过程既可以适用于传统机器学习问题的求解,也可以适用于神经网络的模型求解。

平台注册入口