深度学习系列--04.梯度下降以及其他优化器

目录

一.梯度概念

1.一元函数

2.二元函数

 3.几何意义上的区别

二.梯度下降

 1.原理

 2.步骤

3.示例代码(Python)

4.不同类型的梯度下降

 5.优缺点

 三.动量优化器(Momentum)

适用场景

1.复杂地形的优化问题

 2.数据具有噪声的问题

3.目标函数变化缓慢的问题

4.特征稀疏的问题

指定参数 

1. params

3. momentum(动量系数)

4. weight_decay(权重衰减)

5. nesterov(是否使用 Nesterov 动量)

 四.Adagrad(Adaptive Gradient Algorithm)

 五.Adadelta

 六.RMSProp(Root Mean Square Propagation)

 七.Adam(Adaptive Moment Estimation)

 八.Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG)


一.梯度概念

梯度和导数既有联系又有区别,下面从一元函数、多元函数以及几何意义等方面为你详细解释:

1.一元函数

联系:在一元函数  中,梯度和导数本质上是相同的概念。导数表示函数在某一点处的变化率,它描述了函数值随自变量变化的快慢程度。其定义为函数在该点的极限:

 

 梯度在一元函数中也是指函数在某一点的变化率,所以此时梯度就是导数。例如,对于函数y=2x+1 ,其导数y`=2 ,这也是该函数在任意点的梯度。

  • 表示形式:在一元函数里,导数和梯度都可以用一个标量值来表示。

2.二元函数

  • 作用:偏导数只能反映函数在某一个坐标轴方向上的变化情况,而梯度则综合了函数在各个自变量方向上的变化信息,它指向函数值增长最快的方向,梯度的模表示函数在该方向上的最大变化率。

 3.几何意义上的区别

  • 导数(一元函数):一元函数的导数在几何上表示函数曲线在某一点处的切线斜率,反映了曲线在该点的倾斜程度。
  • 梯度(多元函数):多元函数的梯度在几何上表示函数在某一点处的一个向量,该向量垂直于函数在该点的等值面(或等高线),并且指向函数值增加的方向。

综上所述,在一元函数中梯度等同于导数,但在多元函数中,梯度是由多个偏导数组成的向量,与导数(偏导数)的概念不同。

二.梯度下降

 梯度下降(Gradient Descent)是一种常用的优化算法,主要用于寻找函数的最小值。在机器学习和深度学习领域,它被广泛应用于模型参数的优化,例如神经网络中权重和偏置的更新,以最小化损失函数。

 1.原理

梯度下降的核心思想基于函数的梯度特性。对于一个多元函数f=(x1,x2,x3.....) ,其梯度vf  是一个向量,它指向函数值增长最快的方向。那么,负梯度方向就是函数值下降最快的方向。梯度下降算法通过不断地沿着负梯度方向更新参数,逐步逼近函数的最小值

 2.步骤

1.初始化参数:随机初始化待优化的参数 θ = (θ1,θ2,θ3.....θn)

 2.计算梯度:计算损失函数 J(θ) 关于参数 θ 的梯度▽θ 

 3.更新参数:根据负梯度方向更新参数,更新公式为:

       θ:=θ - α▽J(θ)

其中, α学习率(Learning Rate),它控制着每次参数更新的步长。

 4.重复步骤 2 和 3:不断重复计算梯度和更新参数的过程,直到满足停止条件,例如达到最大迭代次数、梯度的模小于某个阈值等。

3.示例代码(Python)

以下是一个简单的示例,使用梯度下降算法来最小化一个简单的一元函数 :f(x) = x₂

import numpy as np

# 定义目标函数
def f(x):
    return x**2

# 定义目标函数的导数
def df(x):
    return 2 * x

# 初始化参数
x = 2.0
# 学习率
alpha = 0.1
# 最大迭代次数
max_iter = 100

# 梯度下降过程
for i in range(max_iter):
    # 计算梯度
    gradient = df(x)
    # 更新参数
    x = x - alpha * gradient
    # 输出当前迭代的结果
    print(f'Iteration {i+1}: x = {x}, f(x) = {f(x)}')

print(f'Optimal x: {x}, f(x) = {f(x)}')

4.不同类型的梯度下降

  • 批量梯度下降(Batch Gradient Descent,BGD):在每次迭代中,使用整个训练数据集来计算梯度并更新参数。这种方法的优点是收敛稳定,能够保证收敛到全局最优解(对于凸函数),但计算开销大,尤其是当数据集较大时。
  • 随机梯度下降(Stochastic Gradient Descent,SGD):在每次迭代中,随机选择一个样本进行梯度计算和参数更新。这种方法的优点是计算速度快,能够快速跳出局部最优解,但收敛过程可能会比较震荡,不稳定。
  • 小批量梯度下降(Mini-Batch Gradient Descent,MBGD):结合了批量梯度下降和随机梯度下降的优点,在每次迭代中,随机选择一小部分样本(一个小批量)来计算梯度并更新参数。这种方法在计算效率和收敛稳定性之间取得了较好的平衡,是实际应用中最常用的方法。

 5.优缺点

  • 优点
    • 通用性强:适用于各种类型的损失函数和模型,只要损失函数可导,就可以使用梯度下降算法进行优化。
    • 易于实现:算法的原理和实现都比较简单,容易理解和掌握。
  • 缺点
    • 学习率选择困难:学习率  α的选择对算法的性能影响很大。如果学习率过大,算法可能会发散,无法收敛到最优解;如果学习率过小,算法的收敛速度会非常慢
    • 可能陷入局部最优解:对于非凸函数,梯度下降算法可能会陷入局部最优解,而无法找到全局最优解。不过,在实际应用中,通过一些技巧(如随机初始化、动量法等)可以在一定程度上缓解这个问题。

 三.动量优化器(Momentum)

  • 原理:动量优化器借鉴了物理中动量的概念,它在更新参数时不仅考虑当前的梯度,还会结合之前的梯度信息。在梯度下降的基础上,引入了一个动量项 ,用于累积之前的梯度。动量项可以帮助参数更新在相同方向上加速,减少在局部最优解附近的震荡,更快地越过局部极小值。

 更新公式

  • 优点:收敛速度通常比普通的梯度下降更快,能有效减少震荡,更快地收敛到最优解。
  • 缺点:需要额外的超参数(动量系数)进行调整。

适用场景

1.复杂地形的优化问题

具有高曲率或局部极小值的函数优化

  • 在目标函数的曲面具有复杂的形状,存在许多局部极小值和鞍点时,普通的梯度下降算法容易陷入局部最优解,或者在鞍点附近停滞不前。而动量优化器凭借动量项的累积效应,能够帮助算法更快地跳出局部极小值和鞍点区域。
  • 例如,在训练深度神经网络时,损失函数的地形通常非常复杂。以图像识别任务中的卷积神经网络为例,其损失函数可能存在大量的局部极小值。动量优化器可以让参数更新在遇到局部极小值时,利用之前累积的动量继续前进,从而更有可能找到全局最优解更好的局部最优解

 2.数据具有噪声的问题

随机梯度下降中的噪声影响缓解

  • 在使用随机梯度下降(SGD)处理大规模数据集时,每次迭代仅使用一个或一小部分样本计算梯度,这会导致梯度估计存在噪声,使得参数更新过程产生较大的震荡。动量优化器可以通过动量项平滑这些噪声的影响。
  • 例如,在推荐系统中,训练数据通常非常庞大且具有一定的噪声。当使用 SGD 进行模型训练时,梯度的波动会比较大。引入动量优化器后,动量项可以对梯度的波动进行平均,使得参数更新更加稳定,减少了噪声对训练过程的干扰,从而加快收敛速度。

3.目标函数变化缓慢的问题

加速收敛过程

  • 当目标函数在某些方向上的变化非常缓慢时,普通的梯度下降算法收敛速度会变得很慢。动量优化器可以在这些方向上累积动量,加快参数在这些方向上的更新速度。
  • 比如,在训练循环神经网络(RNN)处理序列数据时,由于梯度消失梯度爆炸问题,目标函数在某些方向上的变化可能极其缓慢。动量优化器能够在这些方向上积累动量,使得参数更新更快地朝着最优解的方向前进,从而显著提高训练效率。

4.特征稀疏的问题

更好地处理稀疏梯度

  • 在处理稀疏数据时,某些特征的梯度可能很少被更新。动量优化器可以记住之前的梯度信息,即使某个特征的梯度在当前迭代中为零,动量项也能利用之前的梯度推动参数更新。
  • 例如,在自然语言处理中的文本分类任务中,使用词袋模型表示文本时,特征向量通常是非常稀疏的。动量优化器可以有效地处理这种稀疏梯度,让模型更好地学习到稀疏特征与目标之间的关系,提高模型的性能。

指定参数 

1. params
  • 说明:这是必须指定的参数,它表示需要优化的模型参数。在 PyTorch 里,通常通过 model.parameters() 来获取模型中所有可训练的参数。

2. lr(学习率) 

  • 说明学习率控制着每次参数更新的步长,是一个非常关键的参数。如果学习率设置过大,模型可能会在最优解附近震荡甚至发散;如果学习率设置过小,模型的收敛速度会变得非常缓慢。
3. momentum(动量系数)
  • 说明动量系数决定了之前梯度信息在当前参数更新中所占的比重。合适的动量系数可以加速模型的收敛速度,减少震荡。一般来说,常见的动量系数取值在 0.9 左右。
4. weight_decay(权重衰减)
  • 说明权重衰减是一种正则化方法,用于防止模型过拟合。它通过在损失函数中添加一个正则化项,使得模型的参数在更新过程中逐渐变小。权重衰减系数通常设置为一个较小的正数,如 0.0001。
5. nesterov(是否使用 Nesterov 动量)
  • 说明:Nesterov 动量是动量优化器的一种改进版本,它在计算梯度时会考虑到下一个位置的参数值,具有更好的收敛性能。可以通过将 nesterov 参数设置为 True 来启用 Nesterov 动量。

 示例代码

import torch
import torch.nn as nn

# 定义一个简单的线性模型
class SimpleModel(nn.Module):
    def __init__(self):
        super(SimpleModel, self).__init__()
        self.linear = nn.Linear(10, 1)

    def forward(self, x):
        return self.linear(x)

model = SimpleModel()
# 学习效率
learning_rate = 0.01
# 动量系数
momentum = 0.9
# 权重衰减
weight_decay = 0.0001
# 是否使用 Nesterov 动量
nesterov = True

# 创建优化器
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum,
                            weight_decay=weight_decay, nesterov=nesterov)

 四.Adagrad(Adaptive Gradient Algorithm)

  • 原理Adagrad 是一种自适应学习率的优化器,它会根据每个参数的历史梯度信息自动调整学习率。对于那些经常更新的参数,学习率会逐渐减小;而对于不经常更新的参数,学习率会相对较大。这样可以让每个参数根据自身的特性进行更合理的更新。
  • 更新公式

  • 优点:无需手动调整学习率,能够自适应地为不同参数分配合适的学习率,在稀疏数据场景下表现良好。
  • 缺点:随着迭代次数的增加,学习率会不断减小,可能导致后期收敛速度过慢,甚至提前停止更新。

 五.Adadelta

  • 原理Adadelta 是对 Adagrad 的改进,它解决了 Adagrad 学习率单调递减的问题。Adadelta 不需要手动设置全局学习率,而是通过计算梯度的指数移动平均来动态调整学习率,使得学习率在训练过程中不会一直减小。
  • 优点:无需设置全局学习率,避免了 Adagrad 学习率衰减过快的问题,在不同的数据集和模型上都有较好的表现。
  • 缺点:需要调整的超参数相对较多,包括指数衰减率等。

 六.RMSProp(Root Mean Square Propagation)

  • 原理RMSProp 也是一种自适应学习率的优化器,它与 Adadelta 类似,通过计算梯度平方的指数移动平均来调整学习率。RMSProp 能够有效地缓解 Adagrad 学习率下降过快的问题,使得模型在训练过程中能够持续学习。
  • 更新公式

  • 优点:自适应调整学习率,在处理非凸优化问题时表现较好,收敛速度较快。
  • 缺点:仍然需要手动调整学习率和衰减率等超参数。

 七.Adam(Adaptive Moment Estimation)

  • 原理Adam 结合了动量优化器和自适应学习率的思想,它同时计算梯度的一阶矩估计均值)和二阶矩估计方差),并利用这些估计值来动态调整每个参数的学习率。Adam 具有较快的收敛速度和较好的稳定性。
  • 更新公式

  • 优点:收敛速度快,对不同类型的数据集和模型都有较好的适应性,在深度学习中被广泛使用。
  • 缺点:可能会在某些情况下出现过拟合的问题,需要进行适当的正则化处理

 八.Nesterov 加速梯度(Nesterov Accelerated Gradient,NAG)

  • 原理NAG 是动量优化器的一种改进版本。它在计算梯度时,先根据动量项大致预估下一个位置的参数值,然后在这个预估位置计算梯度,这样可以让优化器更有前瞻性,提前知道梯度的变化趋势,从而更快地收敛。

 更新公式:

  • 优点:比传统的动量优化器收敛速度更快,尤其在处理一些复杂的优化问题时表现更优。
  • 缺点:同样需要调整动量系数和学习率等超参数。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

π0开源了且推出自回归版π0-FAST——打造机器人动作专用的高效Tokenizer:比扩散π0的训练速度快5倍但效果相当

前言 过去的半个多月 对于大模型 deepseek火爆全球,我对其的解读也写成了整整一个系列 详见《火爆全球的DeepSeek系列模型》,涉及对GRPO、MLA、V3、R1的详尽细致深入的解读 某种意义来讲,deepseek 相当于把大模型的热度 又直接拉起来了——…

导航守卫router.beforeEach

router.beforeEach 是一个全局前置守卫,在每次路由跳转之前都会触发。 //index.jsrouter.beforeEach((to, from, next) > {// 打印即将要进入的目标路由信息console.log(即将要进入的目标路由信息:, to)// 打印当前正要离开的路由信息console.log(当前正要离开的…

[ESP32:Vscode+PlatformIO]添加第三方库 开源库 与Arduino导入第三方库的区别

前言 PlatformIO与Arduino在添加第三方库方面的原理存在显著差异 在PlatformIO中,第三方库的使用是基于项目(工程)的。具体而言,只有当你为一个特定的项目添加了某个第三方库后,该项目才能使用该库。这些第三方库的文…

了解AI绘图,Stable Diffusion的使用

AI绘图对GPU算力要求较高。 个人电脑配置可参考: CPU:14600kf 盒装 显卡:RTX 4080金属大师 OC,16G显存 主板:z790吹雪d4 内存:芝奇皇家戟4000c18,162G 硬盘:宏基gm7000 1T 散热:追风…

linux环境自动化golang项目启动脚本解析

一.场景介绍 当在本地创建了golang项目,修改了代码功能,怎么在远程测试服务器上更新该功能呢,可以使用下面的步骤来解决该问题(这只是其中一种方法): (1).推送最新代码到远程仓库 (2).在测试服务器上创建该项目并拉取最新代码 (3).创建deploy.sh脚本 (4).运行deploy.sh脚本 二.…

归一化与伪彩:LabVIEW图像处理的区别

在LabVIEW的图像处理领域,归一化(Normalization)和伪彩(Pseudo-coloring)是两个不同的概念,虽然它们都涉及图像像素值的调整,但目的和实现方式截然不同。归一化用于调整像素值的范围&#xff0c…

基于DeepSeek API和VSCode的自动化网页生成流程

1.创建API key 访问官网DeepSeek ,点击API开放平台。 在开放平台界面左侧点击API keys,进入API keys管理界面,点击创建API key按钮创建API key,名称自定义。 2.下载并安装配置编辑器VSCode 官网Visual Studio Code - Code Editing…

Open WebUI项目源码学习记录(从0开始基于纯CPU环境部署一个网页Chat服务)

感谢您点开这篇文章:D,鼠鼠我是一个代码小白,下文是学习开源项目Open WebUI过程中的一点笔记记录,希望能帮助到你~ 本人菜鸟,持续成长,能力不足有疏漏的地方欢迎一起探讨指正,比心心&#xff5e…

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码:2.保存物品信息代码:3.删除仓库信息代码: 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SSM框架开发的仓库…

Python微博动态爬虫

本文是刘金路的《语言数据获取与分析基础》第十章的扩展,详细解释了如何利用Python进行微博爬虫,爬虫内容包括微博指定帖子的一级评论、评论时间、用户名、id、地区、点赞数。 整个过程十分明了,就是用户利用代码模拟Ajax请求,发…

时序数据库:Influxdb详解

文章目录 一、简介1、简介2、官网 二、部署1、安装2、配置(1)用户初始化 三、入门(Web UI)1、加载数据(1)上传数据文件(2)代码接入模板 2、管理存储桶(1)创建…

unity学习32:角色相关1,基础移动控制

目录 0 应用商店 1 角色上新增CharacterController 组件 1.1 角色上新增CharacterController 组件 1.2 如果没有这个则会报错 2 速度 2.1 默认速度,按帧率计算 2.2 修改速度为按时间计算 2.3 movespeed,基础是1米/秒,这个就是每 move…

Centos Ollama + Deepseek-r1+Chatbox运行环境搭建

Centos Ollama Deepseek-r1Chatbox运行环境搭建 内容介绍下载ollama在Ollama运行DeepSeek-r1模型使用chatbox连接ollama api 内容介绍 你好! 这篇文章简单讲述一下如何在linux环境搭建 Ollama Deepseek-r1。并在本地安装的Chatbox中进行远程调用 下载ollama 登…

mysql8.0使用pxc实现高可用

环境准备 准备三台虚拟机,其对应的主机名和IP地址为 pxc-1192.168.190.129pxc-2192.168.190.133pxc-3192.168.190.134 解析,都要做解析 测试 下载pxc的安装包, 官网:https://www.percona.com/downloads 选择8.0的版本并下载,…

LabVIEW污水生化处理在线监测

污水处理是环保领域的重要工作,传统污水处理方法在监测方面存在实时性差、操作不便等问题。为解决这些问题,本项目设计并实现了一套基于LabVIEW的污水生化处理在线监测平台,能够实时监测污水处理过程中的关键参数,如温度、pH值、溶…

【AI学习】关于 DeepSeek-R1的几个流程图

遇见关于DeepSeek-R1的几个流程图,清晰易懂形象直观,记录于此。 流程图一 来自文章《Understanding Reasoning LLMs》, 文章链接:https://magazine.sebastianraschka.com/p/understanding-reasoning-llms?continueFlagaf07b1a0…

vs封装dll 给C#使用

一,vs创建控制台应用 创建控制台应用得好处时,我们可以自己测试接口,如果接口没有问题,改成dll重新编译一遍就可以。 二, 创建一个c 类,将所需提供得功能 封装到类中。 这样可以将 所有功能,进…

ubuntu20使用tigervnc远程桌面配置记录

一、安装tigervnc sudo apt install tigervnc-common sudo apt install tigervnc-standalone-server二、增加配置文件 安装完后新增配置文件:vim ~/.vnc/xstartup #!/bin/sh #Uncomment the following two lines for normal desktop: #unset SESSION_MANAGER #ex…

DeepSeek使用技巧大全(含本地部署教程)

在人工智能技术日新月异的今天,DeepSeek 作为一款极具创新性和实用性的 AI,在众多同类产品中崭露头角,凭借其卓越的性能和丰富的功能,吸引了大量用户的关注。 DeepSeek 是一款由国内顶尖团队研发的人工智能,它基于先进…

网络原理之HTTPS(如果想知道网络原理中有关HTTPS的知识,那么只看这一篇就足够了!)

前言:随着互联网安全问题日益严重,HTTPS已成为保障数据传输安全的标准协议,通过加密技术和身份验证,HTTPS有效防止数据窃取、篡改和中间人攻击,确保通信双方的安全和信任。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要…