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

news2025/1/13 10:34:18

大家好,我是微学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.0
        correct = 0
        total = 0
        for 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.coloradmin.cn/o/1240332.html

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

相关文章

Tensorflow-gpu搭建,转载备忘

转载来自&#xff0c;所有版本号全部一致可以直接成功&#xff1a; https://blog.csdn.net/m0_38068876/article/details/128364154 https://blog.csdn.net/m0_46149071/article/details/128456089?ops_request_misc&request_id&biz_id102&utm_termtensorflow%E5%…

内部网关协议_路由信息协议RIP_开放路径优先OSPF协议_基本知识

目录: 因特网路由选择协议概述 路由信息协议RIP 开放路径优先OSPF协议 因特网路由选择协议概述 一.路由选择分类 静态路由选择和动态路由选择 静态路由选择: 采用人工配置的方式给路由器添加网络路由、默认路由和特定主机路由等路由条目。静态路由选择简单、开销小&#…

Seaborn画图颜色和给定的RGB hex code不一致

使用以下代码画图&#xff1a; import seaborn as sns import matplotlib.pyplot as plt plt.figure(dpi150) x [A,B,C,D] y [164, 86, 126, 53] sns.barplot(xx, yy, color#3a923a) 得到的颜色如下图所示&#xff1a; 这是因为seaborn默认降低了颜色的饱和度&#xff0c;即…

Android 10.0 mtp模式下连接PC后只显示指定文件夹功能实现

1. 前言 在android10.0的系统定制化开发中,对于usb作为otg连接电脑时,在mtp模式下会作为一个存储器在电脑端显示,作为电脑的 一个盘符,来显示设备的内部存储的文件,所以说如果要对设备内部的资料做保密处理的时候,需要在mtp模式下不显示某些 文件夹,接下来就分析下相关…

《QT从基础到进阶·三十七》QWidget实现左侧导航栏效果

NavigationBarPlugin插件类实现了对左侧导航栏的管理&#xff0c;我们可以在导航栏插件中添加界面&#xff0c;并用鼠标点击导航栏能够切换对应的界面。 源码在文章末尾 实现效果如下&#xff1a; NavigationBarPlugin实现的接口如下&#xff1a; class NAVIGATIONBAR_EXP…

centos7安装MySQL—以MySQL5.7.30为例

centos7安装MySQL—以MySQL5.7.30为例 本文以MySQL5.7.30为例。 官网下载 进入MySQL官网&#xff1a;https://www.mysql.com/ 点击DOWNLOADS 点击链接&#xff1b; 点击如上链接&#xff1a; 选择对应版本&#xff1a; 点击下载。 安装 将下载后的安装包上传到/usr/local下…

Linux上通过SSL/TLS和start tls连接到LDAP服务器

一&#xff0c;大致流程。 1.首先在Linux上搭建一个LDAP服务器 2.在LDAP服务器上安装CA证书&#xff0c;服务器证书&#xff0c;因为SSL/TLS&#xff0c;start tls都属于机密通信&#xff0c;需要客户端和服务器都存在一个相同的证书认证双方的身份。3.安装phpldapadmin工具&am…

前缀和——DP35 【模板】二维前缀和

文章目录 &#x1f34e;1. 题目&#x1f352;2. 算法原理&#x1f345;3. 代码实现 &#x1f34e;1. 题目 题目链接&#xff1a;【模板】二维前缀和_牛客题霸_牛客网 (nowcoder.com) 描述 给你一个 n 行 m 列的矩阵 A &#xff0c;下标从1开始。 接下来有 q 次查询&#xff0…

酷开科技OS——Coolita,让智能大屏走向国际

10月23日&#xff0c;2023中国—东盟视听传播论坛在南宁举行。作为第五届中国—东盟视听周重要活动之一&#xff0c;本次论坛以“共享新成果、共创新视听、共建新家园”为主题。来自中国和东盟的300余名专家学者、业界代表通过主旨演讲、主题发言、圆桌对话等方式进行深入探讨&…

python趣味编程-5分钟实现一个太空大战游戏(含源码、步骤讲解)

飞机战争游戏系统项目是使用Python编程语言开发的,是一个简单的桌面应用程序。 Python 中的飞机战争游戏使用pygame导入和随机导入。 Pygame 是一组跨平台的 Python 模块,专为编写视频游戏而设计。它包括设计用于 Python 编程语言的计算机图形和声音库。

飞桨——总结PPOCRLabel中遇到的坑

操作系统&#xff1a;win10 python环境&#xff1a;python3.9 paddleocr项目版本&#xff1a;2.7 1.报错&#xff1a;ModuleNotFoundError: No module named Polygon&#xff08;已解决&#xff09; 已解决所以没有复现报错内容 尝试方法一&#xff1a;直接使用pip命令安装&…

软件工程--软件建模--结构化方法通俗语言总结(暴肝超详解)(包含数据流图、数据字典、ER图、结构化设计和优化......)

目录 结构化分析 数据流图DFD 定义数据字典 实体关系图&#xff08;E-R图&#xff09; 结构化设计 变换映射 事务映射 优化结构设计 实例分析 详细设计&#xff08;过程设计&#xff09; 结构化方法是一种系统化开发软件的方法&#xff0c;该方法基于模块化的思想&am…

vue3项目中使用富文本编辑器

前言 适配 Vue3 的富文本插件不多&#xff0c;我看了很多插件官网&#xff0c;也有很多写的非常棒的&#xff0c;有UI非常优雅让人耳目一新的&#xff0c;也有功能非常全面的。 如&#xff1a; Quill&#xff0c;简单易用&#xff0c;功能全面。editorjs&#xff0c;UI极其优…

【OpenCV实现图像:使用OpenCV生成拼图效果】

文章目录 概要通用配置不考虑间隔代码实现考虑间隔代码实现小结 概要 概要&#xff1a; 拼图效果是一种将图像切割为相邻正方形并重新排列的艺术效果。在生成拼图效果时&#xff0c;可以考虑不同的模式&#xff0c;包括是否考虑间隔和如何处理不能整除的部分。 不考虑间隔&a…

〖大前端 - 基础入门三大核心之JS篇㊶〗- DOM事件传播和事件监听方法addEventListener()

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

华清远见嵌入式学习——网络编程——作业3

目录 作业要求&#xff1a;基于UDP的TFTP文件传输 代码 下载功能效果图​编辑 上传功能效果图 思维导图 模拟面试题和答案&#xff08;定期更新&#xff09; 作业要求&#xff1a;基于UDP的TFTP文件传输 完成文件的上传和下载功能 代码 #include<myhead.h>//实现…

CSS特效016:天窗扬起合上的效果

CSS常用示例100专栏目录 本专栏记录的是经常使用的CSS示例与技巧&#xff0c;主要包含CSS布局&#xff0c;CSS特效&#xff0c;CSS花边信息三部分内容。其中CSS布局主要是列出一些常用的CSS布局信息点&#xff0c;CSS特效主要是一些动画示例&#xff0c;CSS花边是描述了一些CSS…

在PyCharm中正确设置Python项目

大家好&#xff0c;在Mac和Linux都支持Python&#xff0c;但许多开发者发现正确设置Python项目很困难。本文汇总了多平台中运行Python的方法&#xff0c;提高编程的效率&#xff0c;如下所示&#xff1a; 使用命令行运行Python。 在PyCharm&#xff08;免费社区版&#xff09;…

微信小程序蓝牙连接 uniApp蓝牙连接设备

蓝牙列表期待效果 代码 <template><view class"bluetooth-list"><view class"align-items option" style"justify-content: space-between;" v-for"item in bluetoothList" :key"item.deviceId"><vie…

java基础-集合

1、集合 在java中&#xff0c;集合&#xff08;Collection&#xff09;指的是一组数据容器&#xff0c;它可以存储多个对象&#xff0c;并且允许用户通过一些方法来访问与操作这些对象。j 集合的实现原理都基于数据结构和算法&#xff0c;如下&#xff1a; 数据结构&#xff1…