人工智能基础部分21-神经网络中优化器算法的详细介绍,配套详细公式

大家好,我是微学AI,今天给大家介绍一下人工智能基础部分21-神经网络中优化器算法的详细介绍,配套详细公式。本文将介绍几种算法优化器,并展示如何使用PyTorch中的算法优化器,我们将使用MNIST数据集和一个简单的多层感知器(MLP)模型。本文仅用于演示不同优化器的用法,实际应用中可能需要调整超参数以获得最佳性能。
在这里插入图片描述

一、几种算法优化器介绍

1. SGD (随机梯度下降)

原理:SGD 是一种简单但有效的优化方法,它通过计算梯度的期望值来更新参数。

数学公式:
θ t + 1 = θ t − η ∇ J ( θ t ) \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) θt+1=θtηJ(θt)

其中, θ \theta θ 是参数, η \eta η 是学习率, ∇ J ( θ t ) \nabla J(\theta_t) J(θt) 是损失函数 J J J 关于参数 θ \theta θ 的梯度。

2. ASGD (平均随机梯度下降)

原理:ASGD 是 SGD 的一个变种,它在训练过程中计算参数的移动平均值,从而提高优化的稳定性。

数学公式:
θ t + 1 = θ t − η ∇ J ( θ t ) θ ˉ t + 1 = ( 1 − λ ) θ ˉ t + λ θ t + 1 \theta_{t+1} = \theta_t - \eta \nabla J(\theta_t) \\ \bar{\theta}_{t+1} = (1 - \lambda) \bar{\theta}_t + \lambda \theta_{t+1} θt+1=θtηJ(θt)θˉt+1=(1λ)θˉt+λθt+1

其中, θ ˉ \bar{\theta} θˉ 是参数的移动平均值, λ \lambda λ 是平滑因子。

3. Rprop (弹性反向传播)

原理:Rprop 是一种基于局部梯度信息的优化方法,它根据梯度的符号来更新参数,而不是梯度的大小。

数学公式:
Δ θ t + 1 = { Δ θ t ⋅ η + if  ∇ J ( θ t ) ⋅ ∇ J ( θ t − 1 ) > 0 Δ θ t ⋅ η − if  ∇ J ( θ t ) ⋅ ∇ J ( θ t − 1 ) < 0 Δ θ t otherwise θ t + 1 = θ t − sign ( ∇ J ( θ t ) ) ⋅ Δ θ t + 1 \Delta \theta_{t+1} = \begin{cases} \Delta \theta_t \cdot \eta^+ & \text{if } \nabla J(\theta_t) \cdot \nabla J(\theta_{t-1}) > 0 \\ \Delta \theta_t \cdot \eta^- & \text{if } \nabla J(\theta_t) \cdot \nabla J(\theta_{t-1}) < 0 \\ \Delta \theta_t & \text{otherwise} \end{cases} \\ \theta_{t+1} = \theta_t - \text{sign}(\nabla J(\theta_t)) \cdot \Delta \theta_{t+1} Δθt+1= Δθtη+ΔθtηΔθtif J(θt)J(θt1)>0if J(θt)J(θt1)<0otherwiseθt+1=θtsign(J(θt))Δθt+1

其中, Δ θ \Delta \theta Δθ 是参数更新的大小, η + \eta^+ η+ η − \eta^- η 是增加和减少更新大小的因子。

4. Adagrad (自适应梯度)

原理:Adagrad 是一种自适应学习率的优化方法,它根据参数的历史梯度来调整学习率。

数学公式:
G t = G t − 1 + ∇ J ( θ t ) 2 θ t + 1 = θ t − η G t + ϵ ∇ J ( θ t ) G_t = G_{t-1} + \nabla J(\theta_t)^2 \\ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{G_t + \epsilon}} \nabla J(\theta_t) Gt=Gt1+J(θt)2θt+1=θtGt+ϵ ηJ(θt)

其中, G t G_t Gt 是历史梯度的累积平方和, ϵ \epsilon ϵ 是平滑项。

5. Adadelta (自适应学习率和动量)

原理:Adadelta 是 Adagrad 的一个改进版本,它使用动量项来更新参数,并且不需要设置初始学习率。

数学公式:
E [ g 2 ] t = ρ E [ g 2 ] t − 1 + ( 1 − ρ ) ∇ J ( θ t ) 2 Δ θ t = − E [ Δ θ 2 ] t − 1 + ϵ E [ g 2 ] t + ϵ ∇ J ( θ t ) E [ Δ θ 2 ] t = ρ E [ Δ θ 2 ] t − 1 + ( 1 − ρ ) Δ θ t 2 θ t + 1 = θ t + Δ θ t E[g^2]_t = \rho E[g^2]_{t-1} + (1 - \rho) \nabla J(\theta_t)^2 \\ \Delta \theta_t = - \frac{\sqrt{E[\Delta \theta^2]_{t-1} + \epsilon}}{\sqrt{E[g^2]_t + \epsilon}} \nabla J(\theta_t) \\ E[\Delta \theta^2]_t = \rho E[\Delta \theta^2]_{t-1} + (1 - \rho) \Delta \theta_t^2 \\ \theta_{t+1} = \theta_t + \Delta \theta_t E[g2]t=ρE[g2]t1+(1ρ)J(θt)2Δθt=E[g2]t+ϵ E[Δθ2]t1+ϵ J(θt)E[Δθ2]t=ρE[Δθ2]t1+(1ρ)Δθt2θt+1=θt+Δθt

其中, E [ g 2 ] E[g^2] E[g2] E [ Δ θ 2 ] E[\Delta \theta^2] E[Δθ2] 分别是梯度平方和和参数更新平方和的指数移动平均值, ρ \rho ρ 是动量因子。

6. RMSprop (均方根传播)

RMSProp(Root Mean Square Propagation)优化算法是一种自适应学习率的优化算法,主要用于深度学习中。以下是RMSProp优化算法的数学公式:

首先,计算梯度的平方的指数加权移动平均值:

v t = β v t − 1 + ( 1 − β ) g t 2 v_t = \beta v_{t-1} + (1 - \beta) g_t^2 vt=βvt1+(1β)gt2

其中, v t v_t vt 是时间步 t 的平方梯度指数加权移动平均值, g t 2 g_t^2 gt2 是当前时间步梯度的元素平方, β \beta β 是梯度的指数衰减率。

然后,更新模型参数:

θ t + 1 = θ t − η v t + ϵ g t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{v_t} + \epsilon} g_t θt+1=θtvt +ϵηgt

其中, θ t \theta_t θt 是时间步 t 的模型参数, η \eta η 是学习率, ϵ \epsilon ϵ 是为了数值稳定性而添加的小常数。

以上描述了RMSProp优化算法中计算梯度平方指数加权移动平均值和更新模型参数的过程。RMSProp算法通过对梯度进行平方指数加权移动平均来自适应地调整学习率,从而在训练过程中更好地优化模型。

7.Adam

Adam(Adaptive Moment Estimation)是一种自适应学习率的优化算法,它结合了动量梯度下降和RMSprop算法的思想。Adam算法通过计算梯度的一阶矩估计和二阶矩估计来调整每个参数的学习率。

以下是Adam优化算法的数学公式:

首先,计算一阶矩估计(即梯度的指数移动平均值):

m t = β 1 m t − 1 + ( 1 − β 1 ) g t m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t mt=β1mt1+(1β1)gt

其中, m t m_t mt 是时间步 t 的一阶矩估计, g t g_t gt 是当前时间步的梯度, β 1 \beta_1 β1 是动量的指数衰减率。

其次,计算二阶矩估计(即梯度的平方的指数移动平均值):

v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 vt=β2vt1+(1β2)gt2

其中, v t v_t vt 是时间步 t 的二阶矩估计, g t 2 g_t^2 gt2 是当前时间步梯度的元素平方, β 2 \beta_2 β2 是梯度的指数衰减率。

接着,校正一阶矩的偏差:

m ^ t = m t 1 − β 1 t \hat{m}_t = \frac{m_t}{1 - \beta_1^t} m^t=1β1tmt

v ^ t = v t 1 − β 2 t \hat{v}_t = \frac{v_t}{1 - \beta_2^t} v^t=1β2tvt

然后,更新模型参数:

θ t + 1 = θ t − η v ^ t + ϵ m ^ t \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_t θt+1=θtv^t +ϵηm^t

其中, θ t \theta_t θt 是时间步 t 的模型参数, η \eta η 是学习率, ϵ \epsilon ϵ 是为了数值稳定性而添加的小常数。

以上描述了Adam优化算法中用于更新梯度估计、计算动量和RMSProp的过程,并最终利用它们来更新模型参数的方法。

概率论与数理统计中的矩估计介绍

在优化算法中,一阶矩估计和二阶矩估计是指对梯度的统计特征进行估计的过程,涉及了概率论与数理统计的知识。我来详细解释一下:

一阶矩估计通常表示对随机变量的期望值的估计,也可以理解为均值的估计。在优化算法中,一阶矩估计可以用来估计梯度的平均值,在Adam和RMSProp等算法中起到了动量的作用。动量可以帮助优化算法在参数更新时更平稳地前进,避免陷入局部极小值点。一阶矩估计可以通过指数加权移动平均的方式来计算,从而更好地反映梯度的变化趋势。

二阶矩估计则通常表示对随机变量的方差的估计。在优化算法中,二阶矩估计可以用来估计梯度的方差或者标准差,如在RMSProp算法中所使用的。通过估计梯度的方差,我们可以更好地了解梯度的变化范围,并且利用这个信息来自适应地调整学习率,以提高训练的效率和稳定性。

概率论与数理统计为我们提供了对随机变量的期望、方差等统计特征的概念和计算方法,优化算法中的一阶矩估计和二阶矩估计正是借鉴了这些概念和方法,使得优化算法能够更好地利用梯度的统计信息来指导参数更新的过程,从而提高模型的训练效果。

二、PyTorch实现算法优化器的代码

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader# 定义一个简单的多层感知器
class MLP(nn.Module):def __init__(self):super(MLP, self).__init__()self.fc1 = nn.Linear(28 * 28, 128)self.fc2 = nn.Linear(128, 64)self.fc3 = nn.Linear(64, 10)def forward(self, x):x = x.view(-1, 28 * 28)x = torch.relu(self.fc1(x))x = torch.relu(self.fc2(x))x = self.fc3(x)return x# 准备数据
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=64, shuffle=True)# 定义损失函数
criterion = nn.CrossEntropyLoss()# 定义优化器列表
optimizers = [optim.SGD,optim.ASGD,optim.Rprop,optim.Adagrad,optim.Adadelta,optim.RMSprop,optim.Adam
]# 训练函数
def train(optimizer_class, model, dataloader, criterion, epochs=3):optimizer = optimizer_class(model.parameters(), lr=0.01)model.train()for epoch in range(epochs):running_loss = 0.0correct = 0total = 0for batch_idx, (data, target) in enumerate(dataloader):optimizer.zero_grad()output = model(data)loss = criterion(output, target)loss.backward()optimizer.step()running_loss += loss.item()_, predicted = torch.max(output.data, 1)total += target.size(0)correct += (predicted == target).sum().item()print(f'Optimizer: {optimizer_class.__name__}, Epoch: {epoch + 1}, Loss: {running_loss / len(dataloader)}, Accuracy: {correct / total * 100}%')# 使用不同的优化器训练模型
for optimizer_class in optimizers:model = MLP()train(optimizer_class, model, train_loader, criterion)

运行结果:

Optimizer: SGD, Epoch: 1, Loss: 0.8009015738265093, Accuracy: 79.87333333333333%
Optimizer: SGD, Epoch: 2, Loss: 0.31090657713253106, Accuracy: 91.07333333333332%
Optimizer: SGD, Epoch: 3, Loss: 0.2509216960471894, Accuracy: 92.69833333333334%
Optimizer: ASGD, Epoch: 1, Loss: 0.8227703367659787, Accuracy: 79.11333333333333%
Optimizer: ASGD, Epoch: 2, Loss: 0.3227304352451362, Accuracy: 90.68833333333333%
Optimizer: ASGD, Epoch: 3, Loss: 0.2698148043155035, Accuracy: 92.145%
Optimizer: Rprop, Epoch: 1, Loss: 8.706047950292637, Accuracy: 85.69333333333333%
Optimizer: Rprop, Epoch: 2, Loss: 16.184261398441567, Accuracy: 85.75166666666667%
Optimizer: Rprop, Epoch: 3, Loss: 15.855906286521126, Accuracy: 85.99166666666666%
Optimizer: Adagrad, Epoch: 1, Loss: 0.24328371752172645, Accuracy: 92.56166666666667%
Optimizer: Adagrad, Epoch: 2, Loss: 0.12497247865737311, Accuracy: 96.25333333333333%
Optimizer: Adagrad, Epoch: 3, Loss: 0.09774033319570426, Accuracy: 97.06666666666666%
Optimizer: Adadelta, Epoch: 1, Loss: 1.3385312659526938, Accuracy: 69.485%
Optimizer: Adadelta, Epoch: 2, Loss: 0.5202090000229349, Accuracy: 86.955%
Optimizer: Adadelta, Epoch: 3, Loss: 0.39094064729427225, Accuracy: 89.41666666666667%
Optimizer: RMSprop, Epoch: 1, Loss: 0.6654755138456504, Accuracy: 88.81666666666666%
Optimizer: RMSprop, Epoch: 2, Loss: 0.23642293871569037, Accuracy: 93.51833333333333%
Optimizer: RMSprop, Epoch: 3, Loss: 0.20657251488222783, Accuracy: 94.41833333333334%
Optimizer: Adam, Epoch: 1, Loss: 0.2741849403957457, Accuracy: 91.88833333333334%
Optimizer: Adam, Epoch: 2, Loss: 0.18909314711804567, Accuracy: 94.86833333333334%
Optimizer: Adam, Epoch: 3, Loss: 0.1710762643500535, Accuracy: 95.42166666666667%

以上代码将为每个优化器运行3个训练周期,并打印损失值和准确率。我们可以看到针对这个任务Adagrad优化器表现较好,在实际应用中,我们可能需要运行更多的训练周期并调整学习率等超参数以获得最佳性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/158180.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 2使用element ui 表格不显示

直接修改package.json文件 把这两个依赖修改成对应的 删除node_modules 重新安装依赖 重启

VMware Workstation系列:Win11运行VMware延迟卡顿(侧通道缓解相关)

一. Win11运行VMware延迟卡顿 最近在使用VMware时&#xff0c;开机提示如下&#xff1a; 您在运行该虚拟机时启用了侧通道缓解。侧通道缓解可增强安全性&#xff0c;但也会降低性能。 要禁用缓解&#xff0c;请在虚拟机设置的“高级”面板中更改侧通道缓解设置。有关更多详细信…

电巢科技广州科技贸易职业学院高速PCB设计工程师训练营圆满结班!

为深化校企合作&#xff0c;产教融合助力新工科建设&#xff0c;提升学生工程实践能力&#xff0c;电巢工程能力实训班按照不同岗位类别&#xff0c;匹配对应的企业岗位任职能力要求对学生开展分级培养&#xff0c;以产业需求为导向&#xff0c;培养创新型、应用型人才。 11月1…

无法创建 8192 MB 的匿名分页文件: 系统资源不足,无法完成请求的服务。

好久没用VMware Workstation&#xff0c;今天突然要用&#xff0c;发现所有的虚机在启动的时候提示都提示&#xff1a; 无法创建 XXXX MB 的匿名分页文件&#xff1a;页面文件太小&#xff0c;无法完成操作。 未能分配主内存。 模块"MainMem"启动失败。 未能启动…

PDF Reader Pro 3.0.1.0(pdf阅读器)

PDF Reader Pro是一款功能强大的PDF阅读、注释、填写表单&签名、转换、OCR、合并拆分PDF页面、编辑PDF等软件。 它支持多种颜色的高亮、下划线&#xff0c;可以按需选择&#xff0c;没有空白处可以进行注释&#xff0c;这时候便签是你最佳的选择&#xff0c;不点开时自动隐…

全志R128芯片RTOS调试指南

RTOS 调试指南 此文档介绍 FreeRTOS 系统方案支持的常用软件调试方法&#xff0c;帮助相关开发人员快速高效地进行软件调试&#xff0c;提高解决软件问题的效率。 栈回溯 栈回溯是指获取程序的调用链信息&#xff0c;通过栈回溯信息&#xff0c;能帮助开发者快速理清程序执行…

探索实人认证API:保障在线交互安全的关键一步

前言 在数字化时代&#xff0c;随着人们生活的日益数字化&#xff0c;各种在线服务的普及&#xff0c;安全性成为用户体验的至关重要的一环。特别是在金融、电商、社交等领域&#xff0c;确保用户身份的真实性显得尤为重要。而实人认证API作为一种先进的身份验证技术&#xff…

特征工程完整指南 - 第一部分

苏米特班迪帕迪亚 一、说明 特征工程是利用领域知识从原始数据中提取特征的过程。这些功能可用于提高机器学习算法的性能。本篇叙述在特征选择过程的若干数据处理。 一般来说&#xff0c;特征工程有以下子步骤&#xff1a; 特征转换特征构建特征选择特征提取 二、特征转换的缺…

webpack external 详解

作用&#xff1a;打包时将依赖独立出来&#xff0c;在运行时&#xff08;runtime&#xff09;再从外部获取这些扩展依赖&#xff0c;目的时解决打包文件过大的问题。 使用方法&#xff1a; 附上代码块 config.set(externals, {vue: Vue,vue-router: VueRouter,axios: axios,an…

【实战教程】改进YOLOv5与Seg网络结合:实时车道线精准识别系统(含源码及部署步骤)

1.研究的背景 随着自动驾驶技术的不断发展&#xff0c;车道线的实时分割成为了自动驾驶系统中的重要任务之一。车道线的准确分割可以为自动驾驶系统提供重要的环境感知信息&#xff0c;帮助车辆进行准确的路径规划和决策。因此&#xff0c;开发一种高效准确的车道线实时分割系…

markdown常用命令说明,自己常用的,用到其他的再添加

对于要标红的字体 <font color"red">标签中的字会显示为红色</font> 之后的字不会再显示为红色注意: <font color"red">或者<font colorred>或者<font colorred>三种写法都可以

【ARFoundation学习笔记】2D图像检测跟踪

写在前面的话 本系列笔记旨在记录作者在学习Unity中的AR开发过程中需要记录的问题和知识点。主要目的是为了加深记忆。其中难免出现纰漏&#xff0c;更多详细内容请阅读原文以及官方文档。 汪老师博客 文章目录 2D图像检测创建一个图像检测工程图像追踪的禁用和启用多图像追踪…

快来瞧瞧这样制作出来的电子画册,还便于分享宣传呢!

说起电子画册制作&#xff0c;很多人都不知道从何入手。与传统纸质画册相比&#xff0c;电子画册最大的优点是便于传阅&#xff0c;通过微信、QQ等社交平台都能进行转发和分享。而且内容的排版基本上和纸质画册一致&#xff0c;不同的是&#xff0c;无论图片还是文字都可以赋予…

【数据结构算法(二)】链表总结

&#x1f308;键盘敲烂&#xff0c;年薪30万&#x1f308; 目录 普通单向链表 双向链表 带哨兵的链表 环形链表 ⭐双向带头带环链表的实现⭐ ⭐链表基础OJ⭐ 普通单向链表 结点结构&#xff1a;只有val 和 next指针 初始时&#xff1a;head null; 双向链表 指针&…

16.添加脚注footnote

在 LaTeX 中&#xff0c;您可以使用 \footnote 命令来添加脚注&#xff0c;其中包含您想要引用的网址。同时&#xff0c;为了使网址在文本中可点击&#xff0c;您可以使用 hyperref 宏包。 首先&#xff0c;在文档导言部分添加 hyperref 宏包&#xff1a; \usepackage{hyperr…

jvs-智能bi(自助式数据分析)11.21更新功能上线

jvs智能bi更新功能 新增: 1.字段设置节点新增自定义时间格式功能&#xff1b; 自定义功能允许用户根据需要自定义日期和时间字段的显示格式&#xff0c;为用户提供了更大的灵活性和便利性 2.图表时间搜索条件新增向下兼容模式&#xff1b; 时间搜索条件的向下兼容模式允许用…

超级会员卡积分收银系统源码 会员卡+积分商城+收银功能+多门店系统 附带完整的搭建教程

线上线下的融合已经成为趋势。在这个过程中&#xff0c;会员卡积分收银系统成为了许多企业不可或缺的一部分。该系统以超级会员卡为基础&#xff0c;结合积分商城、收银功能以及多门店系统&#xff0c;为企业提供了一站式的解决方案&#xff0c;帮助企业实现线上线下会员一体化…

汽车托运汽车会产生公里数吗?

汽车托运&#xff0c;顾名思义就是把汽车放在板车上进行托运&#xff0c;既然是被托运&#xff0c;那为什么还会产生公里数呢?是被司机私用了吗?还是被当成租赁工具租借出去了呢? 其实不然&#xff0c;回到托运流程里&#xff0c;特别是大板车&#xff0c;我们的线路有很多需…

使用CSS渲染不同形状

本文只是用来记录自己遇到的图形 1.图形一 2.图形二 3.图形三 4.图形四 5.图形五

Windows安装Linux双系统教程

&#x1f4bb;Windows安装Linux双系统教程 &#x1f959;资源准备&#x1f354;启动盘制作&#x1f373;分区&#x1f32d;重启电脑&#x1f371;安装Ubuntu &#x1f959;资源准备 &#x1f4a1;下载ubuntu系统、refus启动盘制作程序&#x1f448; &#x1f4a1;一个U盘 &am…