深度学习神经网络中的优化器的使用
深度学习:神经网络中的优化器的使用在深度学习中,优化器是用于更新和调解模型参数(例如权重和偏置)的算法,目的是减小模型在练习数据上的损失函数值。优化器的核心目标是通过得当的算法快速有用地找到损失函数的最小值或近似最小值。这一过程涉及计算损失函数相对于模型参数的梯度,并使用这些梯度来更新参数。
基本原理
优化过程基于以下步调进行:
[*] 梯度计算:在每次迭代中,起首计算损失函数关于当前参数的梯度。这些梯度指示了损失函数在参数空间中增加最快的方向。
[*] 参数更新:使用计算得到的梯度,按照特定的规则更新模型参数,以淘汰损失。更新规则由优化算法定义。
[*] 重复迭代:重复执行梯度计算和参数更新步调,直到满足某些停止条件,如达到最大迭代次数、损失降落到某个阈值,或梯度靠近零等。
常用的优化算法
[*] 随机梯度降落(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) 的梯度。
[*] 缺点:可能会导致更新过程高度波动,使得学习过程不稳定。
[*] 动员量的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或靠近该值。
[*] 优点:可以或许在相关方向上加快学习,在非相关方向上抑制波动。
[*] 自适应学习率优化算法(如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优化器进行练习:
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优化器更新权重,从而在迭代过程中逐步减小模型的损失。这种练习方式是范例的深度学习练习流程,实用于各种复杂的机器学习任务。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]