一、补充概念:
-
目标函数(Objective Function):这个术语通常指的是整个优化问题中需要最小化(或最大化)的函数。在机器学习和优化中,目标函数可以包括损失函数以及正则化项等。目标函数的最优化过程旨在找到使目标函数取得最小值或最大值的参数值。
-
损失函数(Loss Function):这个术语通常指的是在监督学习中用来衡量模型预测值与真实标签之间差异的函数。损失函数是目标函数的一部分,它通常作为目标函数的组成部分出现。在训练过程中,损失函数的值被用来作为优化算法的目标,以便通过调整模型参数来最小化损失函数。
3.损失函数:某些情况下为目标函数。
4.梯度:梯度通常是指损失函数关于模型参数的偏导数。
在机器学习和深度学习中,训练模型的目标是通过最小化损失函数来优化模型参数,而梯度是一种用于指导参数更新的重要工具。
二、SGD
SGD 是随机梯度下降(Stochastic Gradient Descent)的缩写。梯度下降是一种优化算法,用于最小化损失函数,通过迭代更新参数来逐步调整模型以最小化损失。在机器学习和深度学习中,梯度下降被广泛用于训练模型。
随机梯度下降是梯度下降的一种变体,其基本思想是每次迭代时随机选择一个样本来计算梯度并更新参数,而不是使用整个训练集来计算梯度。相比于传统的批量梯度下降(Batch Gradient Descent),随机梯度下降的计算代价更低,尤其在大规模数据集上更为高效。
优点:随机梯度下降通常用于训练大规模数据集和深度神经网络,因为它能够以较低的计算成本和内存消耗实现模型的训练。
缺点:由于随机梯度下降对梯度的估计是基于单个样本的,因此可能会导致参数更新的不稳定性,需要采用一些技巧来调整学习率和控制收敛速度,如学习率衰减、动量等。
三、简单代码举例
当使用 PyTorch 进行随机梯度下降的实现时,可以通过 PyTorch 提供的优化器类 torch.optim.SGD
来实现。以下是一个简单的示例代码,展示了如何使用 PyTorch 来实现随机梯度下降算法:
import torch
import torch.nn as nn
import torch.optim as optim# 假设有一些训练数据
# 这里我们创建一个简单的线性回归问题
# 输入特征维度为 1,输出维度为 1
# 我们的目标是拟合一个简单的线性函数 y = 2x + 1# 构建训练数据
x_train = torch.tensor([[1.0], [2.0], [3.0], [4.0]])
y_train = torch.tensor([[3.0], [5.0], [7.0], [9.0]])# 构建一个简单的线性模型
model = nn.Linear(1, 1)# 定义损失函数,这里使用均方误差损失
criterion = nn.MSELoss()# 定义优化器,这里使用随机梯度下降
optimizer = optim.SGD(model.parameters(), lr=0.01)# 进行模型训练
num_epochs = 100
for epoch in range(num_epochs):# 前向传播outputs = model(x_train)# 计算损失loss = criterion(outputs, y_train)# 梯度清零optimizer.zero_grad()# 反向传播loss.backward()# 更新参数optimizer.step()if (epoch+1) % 10 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')# 测试模型
x_test = torch.tensor([[5.0]])
predicted = model(x_test)
print(f'Predicted value for x = 5: {predicted.item():.4f}')
运行结果截图:
这个示例代码中,我们首先定义了训练数据 x_train
和 y_train
,然后构建了一个简单的线性模型 model
。接着定义了损失函数 criterion
,这里使用均方误差损失。然后使用 torch.optim.SGD
定义了优化器 optimizer
,学习率设置为 0.01。
在训练过程中,我们对模型进行多轮的迭代,每一轮中首先进行前向传播计算输出,然后计算损失,接着梯度清零,进行反向传播计算梯度,最后更新参数。最后我们对模型进行测试,对一个新的输入样本进行预测。