【DL】最优化理论和深度学习

最优化理论是计算机科学中一个重要的概念,它用于帮助我们找到最优解(即最小或最大值)的算法。在深度学习中,最优化理论用于帮助深度学习模型找到最优解。

  1. 训练误差(Training Error):指模型在训练数据上的误差,即使用训练数据计算的损失函数的值。
  2. 泛化误差(Generalization Error):指模型在新数据上的误差,即使用测试数据计算的损失函数的值。

Adam算法

Adam算法是在RMSProp算法的基础上提出的,并且使用了指数加权平均数来调整学习率。Adam算法被广泛用于神经网络的训练过程中,因为它能够自适应学习率,使得训练过程更加顺畅。

学习率调节器

学习率调节器是在训练神经网络时用来控制学习率的方法,更好的模型更新步骤大小的值。当学习率过大时,模型会振荡或者发散,而当学习率过小时,模型的收敛速度会变慢。学习率调节器的作用就是帮助我们在训练过程中动态调整学习率,以便获得更好的模型训练效果。

学习率衰减(Learning Rate Decay)、指数衰减法(Exponential Decay)、余弦学习率调节(Cosine Annealing)、自定义学习率调节、预热

=============

梯度下降

在使用梯度下降法时,我们需要计算损失函数的梯度。梯度的方向是参数的最佳修改方向,因此我们可以使用梯度的方向来更新参数,从而最小化损失函数。具体来说,在每一步迭代中,梯度下降法会根据当前参数计算损失函数的梯度,然后沿着梯度的反方向更新参数。这样做能使损失函数的值不断减小,直到达到最小值为止。这个过程中参数的更新规则如下:

在这里,θ 是要被更新的参数,α 是学习率,∇θL 是损失函数 L 关于参数 θ 的梯度。

学习率

学习率 α 是梯度下降法的一个重要超参数。它决定了每一步迭代中参数的更新幅度,也就是说,它决定了梯度下降法的收敛速度。

随机梯度下降法

随机梯度下降法(SGD,Stochastic Gradient Descent)的基本思想是每次迭代中仅使用一个样本来计算梯度,然后根据梯度来调整参数的值。具体来说,在每次迭代中,我们会随机选择一个样本 (xi,yi),并根据当前的参数值 w 计算出损失函数的梯度 ∇L(w;xi,yi)。然后,我们就可以使用梯度下降法的更新公式来调整参数的值:

其中 w 表示参数的值,α 表示学习率,即每次迭代中我们移动的幅度。每次迭代后,我们会检查函数的值是否已经减小到满足预期的程度,如果是则停止迭代,否则继续迭代。

首先,随机梯度下降法每次迭代中仅使用一个样本计算梯度,这使得计算速度快很多。相比之下,梯度下降法每次迭代中都需要使用所有的样本计算梯度,这使得计算速度要慢很多。

其次,随机梯度下降法每次迭代中仅使用一个样本计算梯度,这使得它比梯度下降法更加稳定

小批量梯度下降法

小批量随机梯度下降法(Mini-Batch Stochastic Gradient Descent)的基本思路是在每一次迭代中,使用一小部分的随机样本来计算梯度,然后根据梯度来更新参数的值。它的基本流程如下:

首先,初始化参数 w 和 b。然后,在每一次迭代中,随机抽取一小部分的样本来计算梯度。假设我们从训练集中随机抽取了 m 个样本,那么我们可以使用下面的公式来计算梯度:

其中 L(w,b,x,y) 是损失函数,∇w,bL(w,b,x,y) 表示对 w 和 b 的梯度

接下来,根据梯度的值来更新参数的值,使用下面的公式:

其中 α 是学习率,表示每次更新的步长。最后,重复上述过程直到模型收敛。

动量法

核心思想是让模型的更新更加平稳,从而使学习更加顺畅。具体来说,动量法通过将当前的梯度信息与上一步的梯度信息进行加权平均来减少梯度的震荡。这可以通过使用动量因子 β 来实现。给定一个参数 θ 和当前的梯度 ∇θJ(θ),我们可以使用动量法来更新 θ,公式如下:

其中,α 是学习率,vt 是梯度的动量,β 是动量因子。在每一步中,我们将当前的梯度与上一步的梯度加权平均起来,并使用这个平均值来更新参数。当 β 很大时,动量较大,这意味着梯度更多地“记住”之前的信息,因此梯度的波动会减少。

AdaGrad算法

Adagrad算法是一种梯度下降法,它是对批量梯度下降法的改进,但并不是对动量法的改进。Adagrad算法的目的是在解决优化问题时自动调整学习率,以便能够更快地收敛。

在优化问题中,我们通常需要找到使目标函数最小的参数值。批量梯度下降法是一种求解此类问题的方法,它在每次迭代时使用整个数据集来计算梯度。然而,批量梯度下降法的收敛速度可能较慢,因为它需要较多的计算。Adagrad算法在每次迭代中,会根据之前的梯度信息自动调整每个参数的学习率。具体来说,使用如下公式:

Adagrad算法会在每次迭代中计算每个参数的梯度平方和,并使用这些平方和来调整学习率。这样,Adagrad算法就可以使用较小的学习率来解决那些更难优化的参数,而使用较大的学习率来解决更容易优化的参数。

RMSProp算法

RMSProp 算法通过自动调整每个参数的学习率来解决这个问题。它在每次迭代中维护一个指数加权平均值,用于调整每个参数的学习率。如果某个参数的梯度较大,则RMSProp算法会自动减小它的学习率;如果梯度较小,则会增加学习率。这样可以使得模型的收敛速度更快。

这种算法的计算公式如下:

其中 gt 是指数加权平均值,ρ 是衰减率,η 是学习率,ϵ 是为了防止分母为0而添加的一个很小的常数。在每次迭代时,RMSProp 算法会计算参数的梯度平方值的指数加权平均值 gt,然后使用这个值来调整参数的学习率。这样可以使得模型的收敛速度更快,并且能够自动调整学习率。

优点方面,RMSProp算法能够自动调整学习率,使得模型的收敛速度更快。它可以避免学习率过大或过小的问题,能够更好地解决学习率调整问题。实现上看它较为简单,适用于各种优化问题。

缺点方面,它在处理稀疏特征时可能不够优秀。此外,它需要调整超参数,如衰减率 ρ 和学习率 η,这需要一定的经验。还有,收敛速度可能不如其他我们后面会介绍的优化算法,例如 Adam算法。

Adadelta算法

Adadelta是一种自适应学习率的方法,用于神经网络的训练过程中。它的基本思想是避免使用手动调整学习率的方法来控制训练过程,而是自动调整学习率,使得训练过程更加顺畅。

Adadelta算法主要由两部分组成:梯度积分和更新规则。

梯度积分:在每一个时刻,我们可以计算出每一层的梯度。梯度积分即是对这些梯度进行累加,并记录下来。

更新规则:我们通过使用梯度积分来更新每一层的权重。我们使用如下公式来计算权重的更新量:

其中,Δw 表示权重的更新量,g 表示当前梯度,E[g2] 表示梯度积分,E[Δw2] 表示权重更新量的积分,ϵ 是一个很小的正数,用于防止分母为 0 的情况。

从缺点来看,它可能会收敛得比较慢,因为它不会显式地调整学习率。此外,它需要维护梯度和权重更新量的积分,可能会增加空间复杂度。

import torch
import torch.nn as nn
import matplotlib.pyplot as plt# 定义一个简单的网络
class Net(nn.Module):def __init__(self):super(Net, self).__init__()self.fc1 = nn.Linear(1, 10)self.fc2 = nn.Linear(10, 1)def forward(self, x):x = self.fc1(x)x = self.fc2(x)return x# 随机生成训练数据
x = torch.randn(100, 1)
y = x.pow(2) + 0.1 * torch.randn(100, 1)# 实例化网络
net = Net()# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = torch.optim.Adadelta(net.parameters())# 记录训练损失
losses = []# 开始训练
for epoch in range(100):# 前向传播 + 反向传播 + 优化output = net(x)loss = criterion(output, y)optimizer.zero_grad()loss.backward()optimizer.step()# 记录损失losses.append(loss.item())# 绘制训练损失图
plt.plot(losses)
plt.show()

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

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

相关文章

商品分类拖拽排序设计

商品分类、菜单项以及其他需要排序的元素常常会用到拖拽排序功能。这个看似简单的交互背后,其实涉及到一系列复杂的后端逻辑处理,尤其是在如何高效地更新数据库记录方面。本文将探讨两种常见的实现方案,并分析各自的优缺点,帮助你…

ROS机器人云实践设计申报书-草稿

ROS机器人云实践作品申报书 ROS机器人云实践设计一、项目基本信息 项目名称:基于ROS的移动机器人云实践平台设计与应用 申报单位:[具体单位名称] 项目负责人:[具体参与人员] 申报日期:[填写日期] 二、项目背景与目标 项目背景&…

Jira 根据问题类型 为 描述 字段添加默认值

背景: jira 8.16 想要为问题类型为 需求 的问题默认增加描述字段默认值 想都没想直接根据之前添加缺陷类型时描述默认值的方式去添加(系统字段--描述--上下文和默认值--添加上下文), 结果不随我愿, 系统默认的这个功能不能根据问题类型切换而切换不同的默认值, 只能设置 1 个…

深度学习(5):激活函数

ss激活函数的作用是在隐藏层引入非线性,使得神经网络能够学习和表示复杂的函数关系,使网络具备非线性能力,增强其表达能力。一、常见激活函数1、sigmoid激活函数的作用是在隐藏层引入非线性,使得神经网络能够学习和表示复杂的函数…

洛谷 小 Y 拼木棒 贪心

题目背景上道题中,小 Y 斩了一地的木棒,现在她想要将木棒拼起来。题目描述有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法?答案对 1097 取模。输入格式第一行一个整数 n。第二行往下 n 行…

飞算JavaAI的“盾牌”计划:手撕Spring Security + JWT认证链

一、飞算JavaAI:智能时代Java开发的“全能引擎” 1.1 飞算JavaAI:重新定义Java安全开发的“技术革命”在数字化浪潮席卷全球的今天,Java作为企业级应用开发的首选语言,其安全性需求随着业务复杂度的提升而呈指数级增长——从用户认…

大语言模型提示工程与应用:大语言模型进阶提示工程技术

高级提示词使用 学习目标 掌握大语言模型中进阶提示工程技术的原理与应用,包括零样本/少样本提示、思维链推理、知识生成等核心方法,提升复杂任务解决能力。 相关知识点 零样本与少样本提示思维链提示技术高级推理技术 学习内容 1 零样本与少样本提…

【从零开始java学习|第五篇】项目、模块、包、类的概念与联系

目录 一、概念与作用:从宏观到微观的层级拆分 1. 项目(Project):最外层的 "大容器" 2. 模块(Module):项目的 "功能子单元" 3. 包(Package)&…

kernel pwn 入门(四) ret2dir详细

介绍 ret2dir 是哥伦比亚大学网络安全实验室在 2014 年提出的一种辅助攻击手法,主要用来绕过 smep、smap、pxn 等用户空间与内核空间隔离的防护手段, 原论文见此处: ret2dir原文论文 参考:kernel pwn入门到大神 ret2dir ret2di…

n阶常系数齐次线性微分方程的含义

微分方程 (Differential Equation): 含义: 包含未知函数及其导数(或微分)的方程。例子: dy/dx 2x(未知函数是 y(x),导数是 dy/dx), dy/dt 2 dy/dt y 0(未知函数是 y(t)&#xff…

hexo + github 搭建个人博客

hexo github 搭建个人博客环境配置部署环境配置部署 所需环境: 跳过github邮箱注册。 右键点击桌面空白处,选择 “Git Bash Here”,输入以下命令设置用户名和邮箱: git config --global user.name "GitHub用户名" g…

ERFA库全面指南:从基础概念到实践应用

ERFA库全面指南:从基础概念到实践应用 ERFA(Essential Routines for Fundamental Astronomy)作为天文学计算领域的重要开源库,为开发者提供了处理天文时间、坐标系转换和星体位置计算等核心功能。本文将深入探讨ERFA库的技术细节…

STM32 HAL库串口的功能实现与改进

目录 概述 1 CubeMX配置串口参数 1.1 STM32CUB配置参数 1.2 生成代码 2 核心代码介绍 2.1 初始化函数 2.2 中断函数 2.3 重要的用户函数 2.4 实现用户接口函数 3 接收数据函数的优化 3.1 HAL库接收函数的缺陷 3.2 改进接收函数 概述 在STM32开发中使用HAL库操作串…

DBA | SQL 结构化查询语言介绍与学习环境准备

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ]📢 大家好,我是 WeiyiGeek,一名深耕安全运维开发(SecOpsDev)领域的技术从业者,致力于探索DevOps与安全的融合(Dev…

day39_2025-08-13

知识点回顾: 彩色和灰度图片测试和训练的规范写法:封装在函数中 展平操作:除第一个维度batchsize外全部展平 dropout操作:训练阶段随机丢弃神经元,测试阶段eval模式关闭dropout 作业:仔细学习下测试和训练…

使用GTX ip core + SDI IP core实现SDI设计

使用GTX ip core SDI IP core实现SDI设计 1.SDI接口可以调用GTX IP,具体代码可以参考xapp592,将代码移植进入工程里,增加SDI IP核,增加引脚约束即可运行起来 2.使用transceiver的gt的ip core,然后协议选择SDI协议 3.使…

【无标题】centos 配置阿里云的yum源

1、查看系统正在使用的yum源列表yum repolist结果分析:目前这里看出有base ,extras ,updates三个yum源,这三个也是系统默认的yum源,一般还需要一个epel企业级额外的yum源,本文主要就是更改yum源的配置文件&…

GPT-5全面开放!OpenAI回应用户反馈:GPT-4o已重新上线!

OpenAI 近日宣布,其最新模型 GPT-5 现已全面向所有 Plus、Pro、Team 和免费用户开放。 为进一步优化用户体验并应对初期反馈: 用户额度提升: 在刚刚过去的周末,OpenAI已将 Plus 和 Team 用户的 GPT-5 使用额度提升至原来的 2 倍…

线程安全的单例模式,STL和智能指针

目录 什么是单例模式 什么是设计模式 单例模式的特点 饿汉实现方式和懒汉实现方式 饿汉方式实现单例模式 懒汉方式实现单例模式 懒汉方式实现单例模式(线程安全版本) STL,智能指针和线程安全 STL中的容器是否是线程安全的? 智能指针是否是线程安全的? 其他常见的各种锁 什么是…

[每周一更]-(第155期):深入Go反射机制:架构师视角下的动态力量与工程智慧

在构建高复杂度、高灵活性的Go语言系统时,反射(reflect)就像一把双刃剑——用得好能斩断开发枷锁,用不好则可能自伤程序。本文将深入探讨反射的内部机理、典型应用场景、安全边界及性能优化策略。一、反射核心:类型与值…