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

devtools/2024/11/23 13:27:16/

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

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

基本原理

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

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

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

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

常用的优化算法

  1. 随机梯度下降(SGD)

    • 原理:SGD是最简单的优化方法,它使用每个样本或小批量样本来近似整个数据集的梯度。每次更新都使用当前批次计算的梯度:
      [
      w ← w − η ⋅ ∇ w L w \leftarrow w - \eta \cdot \nabla_w L wwη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,ww+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} wwv^ +ϵη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优化器更新权重,从而在迭代过程中逐步减小模型的损失。这种训练方式是典型的深度学习训练流程,适用于各种复杂的机器学习任务。


http://www.ppmy.cn/devtools/136304.html

相关文章

Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥

续 上集说到语义搜索,这集接着玩一下图搜图,这种场景在电商中很常见——拍照搜商品。图搜图实现非常类似语义搜索,代码逻辑结构都很类似… 开搞 还是老地方modelscope找个Vision Transformer模型,这里选用vit-base-patch16-224…

百度Q3财报:净利润增长17%超预期 文心大模型日调用量增30倍达15亿

发布 | 大力财经 11月21日晚,百度发布2024年第三季度财务报告,显示季度总营收336亿元,百度核心营收265亿元,归属百度核心的净利润75.4亿元,同比增长17%,超出市场预期。财报显示,11月&#xff0…

【大数据获客】销售拓客秘籍:线上渠道探寻与选择

在销售领域,很多人觉得完成不了业绩,很大原因在于不认识人,缺乏客情,感觉没有资源,导致前期工作难以开展。 其实,B 端销售找客户并非难事。新人入行,可跟随前辈学习。若已入行一段时间却苦于无…

如何用AI写小说(二):Gradio 超简单的网页前端交互

上一篇写了基本的生成小说的脚本,但脚本终归是很丑的代码,不符合优雅的调性,在 huggingface 大家经常用一个叫 gradio 的东西来写交互,虽然我没有什么前端基础,但是这个gradio最大的特点就是简单!简单&…

布隆过滤器(超详细!!!含图解)

前言 通过对于位图的认识,位图对于整形的适用比较好,当我们想要进行字符串的映射时,需要将字符串进行转化成整形,但是字符串的来说,当字符串的长度较长时就会显得苍白无力,表示字符的ASCII值有256种&#x…

力扣——寻找峰值

题目 162. 寻找峰值 - 力扣(LeetCode) 思路 第一想法就是直接遍历,时间复杂度为O(n),肯定超时了。 然后就想到用二分,但是数组又不一定是有序的。仔细一思考,好像也可以用,关键在于这个峰值…

yolo自动化项目实例解析(九) 导航

比如我们经常使用的导航,说白了就是寻找两点之间最近的路径,也就是所谓的寻路,我们需要想办法让程序知道他要去哪里,路径包含(起点、轨迹、终点) 一、录制轨迹 从平面角度来看,我们可以把区域视…

Linux搭建MiniO

1、第一步,进入/opt目录,创建minio文件夹 输入以下命令 cd /opt mkdir minio 2、wget下载安装包 wget https://dl.minio.io/server/minio/release/linux-amd64/minio 3、在minio文件夹中创建log文件 cd /minio touch minio.log 4、修改权限 chmod 77…