深度学习神经网络中的优化器的使用

深度学习:神经网络中的优化器的使用

在深度学习中,优化器是用于更新和调整模型参数(例如权重和偏置)的算法,目的是减小模型在训练数据上的损失函数值。优化器的核心目标是通过适当的算法快速有效地找到损失函数的最小值或近似最小值。这一过程涉及计算损失函数相对于模型参数的梯度,并使用这些梯度来更新参数。

基本原理

优化过程基于以下步骤进行:

  1. 梯度计算:在每次迭代中,首先计算损失函数关于当前参数的梯度。这些梯度指示了损失函数在参数空间中增加最快的方向。

  2. 参数更新:使用计算得到的梯度,按照特定的规则更新模型参数,以减少损失。更新规则由优化算法定义。

  3. 重复迭代:重复执行梯度计算和参数更新步骤,直到满足某些停止条件,如达到最大迭代次数、损失下降到某个阈值,或梯度接近零等。

常用的优化算法

  1. 随机梯度下降(SGD)

    • 原理 :SGD是最简单的优化方法,它使用每个样本或小批量样本来近似整个数据集的梯度。每次更新都使用当前批次计算的梯度:

      w ← w − η ⋅ ∇ w L w \\leftarrow w - \\eta \\cdot \\nabla_w L w←w−η⋅∇wL

      其中 ( w w w) 是参数,( η \eta η) 是学习率,( ∇ w L \nabla_w L ∇wL) 是损失函数关于参数 ( w w w) 的梯度。

    • 缺点:可能会导致更新过程高度波动,使得学习过程不稳定。

  2. 带动量的SGD(Momentum)

    • 原理 :引入动量项,以减少更新中的波动,并加速学习过程。更新规则为:

      v ← α v − η ∇ w L , w ← w + v v \\leftarrow \\alpha v - \\eta \\nabla_w L, \\quad w \\leftarrow w + v v←αv−η∇wL,w←w+v

      其中 (v) 是累积的梯度(动量),(\alpha) 通常设置为0.9或接近该值。

    • 优点:能够在相关方向上加速学习,在非相关方向上抑制波动。

  3. 自适应学习率优化算法(如Adam)

    • 原理 :Adam结合了动量和自适应学习率的优点。它维护每个参数的学习率,使之适应参数的最近梯度的幅度:

      m ← β 1 m + ( 1 − β 1 ) ∇ w L m \\leftarrow \\beta_1 m + (1 - \\beta_1) \\nabla_w L m←β1m+(1−β1)∇wL

      v ← β 2 v + ( 1 − β 2 ) ( ∇ w L ) 2 v \\leftarrow \\beta_2 v + (1 - \\beta_2) (\\nabla_w L)\^2 v←β2v+(1−β2)(∇wL)2

      m \^ = m 1 − β 1 t , v \^ = v 1 − β 2 t \\hat{m} = \\frac{m}{1 - \\beta_1\^t}, \\quad \\hat{v} = \\frac{v}{1 - \\beta_2\^t} m\^=1−β1tm,v\^=1−β2tv

      w ← w − η v \^ + ϵ m \^ w \\leftarrow w - \\frac{\\eta}{\\sqrt{\\hat{v}} + \\epsilon} \\hat{m} w←w−v\^ +ϵηm\^

      其中 (m) 和 (v) 分别是一阶和二阶矩估计,( β 1 \beta_1 β1)、( β 2 \beta_2 β2) 是衰减率,通常接近1。

    • 优点:在不同的参数维度上可以有不同的自适应学习率,适用于处理非平稳目标和非常大规模的数据集。

示例:使用PyTorch实现Adam优化器

假设我们有一个简单的神经网络模型,用于解决二分类问题。以下代码展示了如何在PyTorch中定义模型、损失函数以及如何使用Adam优化器进行训练:

python 复制代码
import torch
import torch.nn as nn
import torch.optim as optim

# 定义模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.fc1 = nn.Linear(10, 50)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(50, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 初始化模型、损失函数和优化器
model = SimpleModel()
criterion = nn.BCEWithLogitsLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 假设有一批数据
inputs = torch.randn(32, 10)
targets = torch.rand(32, 1)

# 训练步骤
outputs = model(inputs)
loss = criterion(outputs, targets)
optimizer.zero_grad()
loss.backward()
optimizer.step()

print("Loss:", loss.item())

此示例中,我们构建了一个包含输入层、隐藏层和输出层的简单全连接神经网络。使用BCEWithLogitsLoss作为损失函数来处理二分类任务,并通过Adam优化器更新权重,从而在迭代过程中逐步减小模型的损失。这种训练方式是典型的深度学习训练流程,适用于各种复杂的机器学习任务。

相关推荐
wgc2k3 分钟前
吴恩达深度学习复盘(6)神经网络的矢量化原理
python·深度学习·矩阵
jndingxin7 分钟前
OpenCV 图形API(16)将极坐标(magnitude 和 angle)转换为笛卡尔坐标(x 和 y)函数polarToCart()
人工智能·opencv·计算机视觉
?Agony17 分钟前
P17_ResNeXt-50
人工智能·pytorch·python·算法
Ronin-Lotus20 分钟前
深度学习篇---模型训练早停机制
人工智能·pytorch·深度学习·模型训练·过拟合·早停
鲲志说41 分钟前
本地化部署DeepSeek-R1蒸馏大模型:基于飞桨PaddleNLP 3.0的实战指南
人工智能·nlp·aigc·paddlepaddle·飞桨·paddle·deepseek
hello_ejb31 小时前
聊聊Spring AI的MilvusVectorStore
java·人工智能·spring
HR Zhou1 小时前
群体智能优化算法-算术优化算法(Arithmetic Optimization Algorithm, AOA,含Matlab源代码)
人工智能·算法·数学建模·matlab·优化·智能优化算法
yolo大师兄1 小时前
【YOLO系列(V5-V12)通用数据集-火灾烟雾检测数据集】
人工智能·深度学习·yolo·目标检测·机器学习
jndingxin1 小时前
OpenCV 图形API(15)计算两个矩阵(通常代表二维向量的X和Y分量)每个对应元素之间的相位角(即角度)函数phase()
人工智能·opencv
liruiqiang051 小时前
循环神经网络 - 机器学习任务之同步的序列到序列模式
网络·人工智能·rnn·深度学习·神经网络·机器学习