AI知识分享AI知识分享
✿导航
  • 人工智能
  • 神经网络
  • 机器学习
  • 深度学习
  • 强化学习
  • 自然语言处理
  • 计算机视觉
  • 大模型基础
  • 动手学深度学习
  • 理论理解
  • 工程实践
  • 应用开发
  • AI For Everyone
  • AIGC_2024大会
  • AIGC_2025大会
  • Transformer
  • Pytorch
  • HuggingFace
  • 蒸馏
  • RAG
  • 目标检测
  • MCP
  • 概念
  • 意图识别
  • 工具
✿导航
  • 人工智能
  • 神经网络
  • 机器学习
  • 深度学习
  • 强化学习
  • 自然语言处理
  • 计算机视觉
  • 大模型基础
  • 动手学深度学习
  • 理论理解
  • 工程实践
  • 应用开发
  • AI For Everyone
  • AIGC_2024大会
  • AIGC_2025大会
  • Transformer
  • Pytorch
  • HuggingFace
  • 蒸馏
  • RAG
  • 目标检测
  • MCP
  • 概念
  • 意图识别
  • 工具
  • 大模型基础

    • 语言模型基础

      • 概述
      • 基于统计方法的语言模型
      • 基于神经网络的语言模型
      • 语言模型的采样方法
      • 语言模型的评测
    • 大语言模型架构

      • 概述
      • 主流模型架构
      • Encoder-only
      • Encoder-Decoder
      • Decoder-only
      • 非Transformer 架构
    • Prompt工程

      • 工程简介
      • 上下文学习
      • 思维链
      • 技巧
    • 参数高效微调

      • 概述
      • 参数附加方法
      • 参数选择方法
      • 低秩适配方法
      • 实践与应用
    • 模型编辑

      • 简介
      • 方法
      • 附加参数法
      • 定位编辑法
    • RAG

      • 基础
      • 架构
      • 知识检索
      • 生成增强
  • 动手学深度学习

    • 深度学习基础

      • 引言
      • 数据操作
      • 数据预处理
      • 数学知识(线代、矩阵计算、求导)
      • 线性回归
      • 基础优化方法
      • Softmax回归
      • 感知机
      • 模型选择
      • 过拟合和欠拟合
      • 环境和分布偏移
      • 权重衰减
      • Dropout
      • 数值稳定性
    • 卷积神经网络

      • 模型基本操作
      • 从全连接层到卷积
      • 填充和步长
      • 多个输入和输出通道
      • 池化层
      • LeNet
      • AlexNet
      • VGG
      • NiN网络
      • GoogleNet
      • 批量归一化
      • ResNet
    • 计算机视觉

      • 图像增广
      • 微调
      • 目标检测
      • 锚框
      • 区域卷积神经网络
      • 单发多框检测
      • 一次看完
      • 语义分割
      • 转置卷积
      • 全连接卷积神经网络
      • 样式迁移
    • 循环神经网络

      • 序列模型
      • 语言模型
      • 循环神经网络
      • 序列到序列学习
      • 搜索策略
    • 注意力机制

      • 优化算法

优化算法

深度学习中的优化算法是训练神经网络的核心,旨在通过最小化损失函数来更新模型参数。

凸性

凸性(convexity)在优化算法的设计中起到至关重要的作用, 这主要是由于在这种情况下对算法进行分析和测试要容易。在进行凸分析之前,我们需要定义凸集(convex sets)和凸函数(convex functions)。

凸集 (Convex Set)

  • 定义:集合中任意两点间的线段仍完全属于该集合。

    • 简单地说,如果对于任何 a,b∈Xa, b \in \mathcal{X}a,b∈X, 连接a和b的线段也位于 X{X}X 中,则向量空间中的一个集合X{X}X​是凸(convex)的。 在数学术语上,这意味着对于所有,我们得到:

      λa+(1−λ)b∈X 当 a,b∈X.\lambda a + (1 - \lambda)b \in \mathcal{X} \text{ 当 } a, b \in \mathcal{X}. λa+(1−λ)b∈X 当 a,b∈X.

  • 意义:在凸集上优化时,局部最优解即为全局最优解(若目标函数也是凸的)。

  • 特性:

    • 第一组是非凸的,另外两组是凸的。

      • image-20260322085944861
    • 两个凸集的交集是凸的。

      • image-20260322090337584
    • 两个凸集的并集不一定是凸的。

      • image-20260322090420061

凸函数 (Convex Function)

  • 定义:函数图像上任意两点间的线段位于图像上方。

    • 即给定一个凸集X\mathcal{X}X,如果对于所有x,x′∈Xx, x' \in \mathcal{X}x,x′∈X和所有λ∈[0,1]\lambda \in [0, 1]λ∈[0,1],函数f:X→Rf: \mathcal{X} \to \mathbb{R}f:X→R是凸的,我们可以得到

    λf(x)+(1−λ)f(x′)≥f(λx+(1−λ)x′).\lambda f(x) + (1 - \lambda)f(x') \geq f(\lambda x + (1 - \lambda)x'). λf(x)+(1−λ)f(x′)≥f(λx+(1−λ)x′).

  • 性质:

    • 局部最小值 = 全局最小值。
    • 梯度下降可保证收敛到全局最优。
  • 深度学习的现实:神经网络的损失函数通常是非凸的(存在多个局部极小值和鞍点),但优化算法仍能有效工作。

梯度下降

(2) 批量梯度下降

一维梯度下降

一维梯度下降(1D Gradient Descent)是优化算法中最基础的形式,用于寻找单变量函数 f(x)f(x)f(x) 的最小值。

核心思想

梯度下降通过迭代方式更新参数。在每一步,计算当前点的导数(即一维情况下的“梯度”),然后沿着导数的反方向移动一小步。因为导数表示函数增长最快的方向,所以反方向就是函数下降最快的方向。

更新公式

对于单变量函数 f(x)f(x)f(x),第 ttt 次迭代的更新规则为:

xt+1=xt−η⋅f′(xt)x_{t+1} = x_t - \eta \cdot f'(x_t) xt+1​=xt​−η⋅f′(xt​)

其中:

  • xtx_txt​:当前时刻的参数值。
  • f′(xt)f'(x_t)f′(xt​):函数在 xtx_txt​ 处的导数(斜率)。
  • η\etaη (Eta):学习率 (Learning Rate),控制每一步移动的幅度(η>0\eta > 0η>0)。
  • xt+1x_{t+1}xt+1​:更新后的参数值。

直观解释

  • 如果 f′(xt)>0f'(x_t) > 0f′(xt​)>0:说明函数在当前点处于上升阶段(斜率为正),为了减小函数值,我们需要向左移动(减小 xxx)。公式中 −η⋅(正数)- \eta \cdot (\text{正数})−η⋅(正数) 会使 xt+1<xtx_{t+1} < x_txt+1​<xt​。
  • 如果 f′(xt)<0f'(x_t) < 0f′(xt​)<0:说明函数在当前点处于下降阶段(斜率为负),为了减小函数值,我们需要向右移动(增大 xxx)。公式中 −η⋅(负数)- \eta \cdot (\text{负数})−η⋅(负数) 会使 xt+1>xtx_{t+1} > x_txt+1​>xt​。
  • 如果 f′(xt)=0f'(x_t) = 0f′(xt​)=0:到达极值点(可能是最小值、最大值或鞍点),不再更新。

进一步理解

梯度下降 (Gradient Descent, GD),通常特指批量梯度下降 (Batch Gradient Descent, BGD),是优化算法中最基础的形式。它的核心特点是:在每次更新参数时,使用整个训练数据集来计算损失函数的梯度。

公式:

θt+1=θt−η⋅∇θJ(θt)=θt−η⋅1N∑i=1N∇θL(θt;x(i),y(i))\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t) = \theta_t - \eta \cdot \frac{1}{N} \sum_{i=1}^N \nabla_\theta L(\theta_t; x^{(i)}, y^{(i)}) θt+1​=θt​−η⋅∇θ​J(θt​)=θt​−η⋅N1​i=1∑N​∇θ​L(θt​;x(i),y(i))

其中 NNN 是训练样本总数。这意味着每走一步,都要遍历所有数据。

(2) 随机梯度下降 (Stochastic Gradient Descent, SGD)

  • 原理:每次迭代仅用一个样本计算梯度。
  • 公式:

    θt+1=θt−η⋅∇θJ(θt;x(i),y(i))\theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta_t; x^{(i)}, y^{(i)}) θt+1​=θt​−η⋅∇θ​J(θt​;x(i),y(i))

  • 优点:计算快,可在线学习,能跳出局部极小值(因噪声)。
  • 缺点:梯度波动大,收敛路径震荡,可能无法精确收敛到最小值。

(3) 小批量随机梯度下降 (Mini-batch SGD)

  • 原理:每次迭代使用一小批样本(如 32、64、128 个)计算梯度。
  • 公式:

    θt+1=θt−η⋅1b∑i=1b∇θJ(θt;x(i),y(i))\theta_{t+1} = \theta_t - \eta \cdot \frac{1}{b} \sum_{i=1}^b \nabla_\theta J(\theta_t; x^{(i)}, y^{(i)}) θt+1​=θt​−η⋅b1​i=1∑b​∇θ​J(θt​;x(i),y(i))

    (b b b 为批量大小)
  • 优势:
    • 平衡计算效率与梯度稳定性。
    • 利用矩阵运算加速(向量化)。
    • 实际深度学习中的默认选择。

改进优化算法

(1) 动量法 (Momentum)

  • 核心思想:引入“惯性”,累积历史梯度方向以加速收敛并抑制震荡。

  • 公式:

    vt+1=βvt+(1−β)∇θJ(θt)θt+1=θt−η⋅vt+1v_{t+1} = \beta v_t + (1-\beta) \nabla_\theta J(\theta_t) \\ \theta_{t+1} = \theta_t - \eta \cdot v_{t+1} vt+1​=βvt​+(1−β)∇θ​J(θt​)θt+1​=θt​−η⋅vt+1​

    (β \beta β 通常取 0.9,v v v 为速度向量)

  • 效果:

    • 在平坦区域加速。
    • 在震荡方向(如峡谷地形)抑制摆动。
  • 理解:

    • 速度向量 vtv_tvt​ 不是直接计算出来的(不像梯度gtg_tgt​ 那样通过求导得到),而是通过迭代更新(递归累积)得到的。

      你可以把它理解为一个**“滚雪球”**的过程:当前的速度 = 上一刻的速度(保留惯性) + 当前的梯度(新的推力)。

具体步骤:从 0 开始怎么算?

速度向量的获取是一个逐步累积的过程。假设我们要优化一个有 2 个参数 (x,y)(x, y)(x,y) 的模型,那么速度向量 vvv 也是一个 2 维向量 [vx,vy][v_x, v_y][vx​,vy​]。

第 0 步:初始化 (Initialization)

在训练开始前,我们没有任何历史速度,所以将所有速度分量初始化为 0。

v0=[00] v_0 = \begin{bmatrix} 0 \\ 0 \end{bmatrix} v0​=[00​]

第 1 次迭代 (t=1)

  1. 计算梯度:算出当前位置的梯度 g1g_1g1​。
    • 假设 g1=[23]g_1 = \begin{bmatrix} 2 \\ 3 \end{bmatrix}g1​=[23​]。
  2. 更新速度:

    v1=γ⋅v0+η⋅g1 v_1 = \gamma \cdot v_0 + \eta \cdot g_1 v1​=γ⋅v0​+η⋅g1​

    v1=0.9⋅[00]+0.01⋅[23]=[0.020.03] v_1 = 0.9 \cdot \begin{bmatrix} 0 \\ 0 \end{bmatrix} + 0.01 \cdot \begin{bmatrix} 2 \\ 3 \end{bmatrix} = \begin{bmatrix} 0.02 \\ 0.03 \end{bmatrix} v1​=0.9⋅[00​]+0.01⋅[23​]=[0.020.03​]

    此时,v1v_1v1​ 完全由当前梯度决定,因为之前没有速度。

第 2 次迭代 (t=2)

  1. 计算梯度:算出新位置的梯度 g2g_2g2​。
    • 假设方向没变,梯度稍微变小:g2=[1.82.7]g_2 = \begin{bmatrix} 1.8 \\ 2.7 \end{bmatrix}g2​=[1.82.7​]。
  2. 更新速度(关键步骤):

    v2=γ⋅v1+η⋅g2 v_2 = \gamma \cdot v_1 + \eta \cdot g_2 v2​=γ⋅v1​+η⋅g2​

    v2=0.9⋅[0.020.03]+0.01⋅[1.82.7] v_2 = 0.9 \cdot \begin{bmatrix} 0.02 \\ 0.03 \end{bmatrix} + 0.01 \cdot \begin{bmatrix} 1.8 \\ 2.7 \end{bmatrix} v2​=0.9⋅[0.020.03​]+0.01⋅[1.82.7​]

    v2=[0.0180.027]+[0.0180.027]=[0.0360.054] v_2 = \begin{bmatrix} 0.018 \\ 0.027 \end{bmatrix} + \begin{bmatrix} 0.018 \\ 0.027 \end{bmatrix} = \begin{bmatrix} 0.036 \\ 0.054 \end{bmatrix} v2​=[0.0180.027​]+[0.0180.027​]=[0.0360.054​]

    注意:速度变大了!因为旧速度(0.018)和新梯度贡献(0.018)方向一致,叠加了。这就是加速。

第 3 次迭代 (t=3) - 假设发生震荡

  1. 计算梯度:假设撞到了山谷壁,梯度方向反转。
    • g3=[−1.52.0]g_3 = \begin{bmatrix} -1.5 \\ 2.0 \end{bmatrix}g3​=[−1.52.0​] (x方向反向了)。
  2. 更新速度:

    v3=0.9⋅v2+0.01⋅g3 v_3 = 0.9 \cdot v_2 + 0.01 \cdot g_3 v3​=0.9⋅v2​+0.01⋅g3​

    v3=0.9⋅[0.0360.054]+0.01⋅[−1.52.0] v_3 = 0.9 \cdot \begin{bmatrix} 0.036 \\ 0.054 \end{bmatrix} + 0.01 \cdot \begin{bmatrix} -1.5 \\ 2.0 \end{bmatrix} v3​=0.9⋅[0.0360.054​]+0.01⋅[−1.52.0​]

    v3=[0.03240.0486]+[−0.0150.020]=[0.01740.0686] v_3 = \begin{bmatrix} 0.0324 \\ 0.0486 \end{bmatrix} + \begin{bmatrix} -0.015 \\ 0.020 \end{bmatrix} = \begin{bmatrix} 0.0174 \\ 0.0686 \end{bmatrix} v3​=[0.03240.0486​]+[−0.0150.020​]=[0.01740.0686​]

注意 x 分量:之前的速度是 0.0324,加上负的梯度贡献 -0.015,结果变小了(0.0174)。这就是抵消震荡,速度没有因为反向梯度而剧烈反转,而是被惯性“拉”住了。*

(2) Adam (Adaptive Moment Estimation)

  • 核心思想:结合动量法与自适应学习率(类似 RMSProp),对每个参数动态调整步长。
  • 步骤:
    1. 计算一阶矩(均值,类似动量):
      mt=β1mt−1+(1−β1)∇θJ(θt) m_t = \beta_1 m_{t-1} + (1-\beta_1) \nabla_\theta J(\theta_t) mt​=β1​mt−1​+(1−β1​)∇θ​J(θt​)
    2. 计算二阶矩(未中心化的方差):
      vt=β2vt−1+(1−β2)(∇θJ(θt))2 v_t = \beta_2 v_{t-1} + (1-\beta_2) (\nabla_\theta J(\theta_t))^2 vt​=β2​vt−1​+(1−β2​)(∇θ​J(θt​))2
    3. 偏差修正(避免初期估计偏小):
      m^t=mt1−β1t,v^t=vt1−β2t \hat{m}_t = \frac{m_t}{1-\beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1-\beta_2^t} m^t​=1−β1t​mt​​,v^t​=1−β2t​vt​​
    4. 参数更新:
      θt+1=θt−η⋅m^tv^t+ϵ \theta_{t+1} = \theta_t - \eta \cdot \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \epsilon} θt+1​=θt​−η⋅v^t​​+ϵm^t​​
  • 默认参数:β1=0.9,β2=0.999,ϵ=10−8 \beta_1=0.9, \beta_2=0.999, \epsilon=10^{-8} β1​=0.9,β2​=0.999,ϵ=10−8。
  • 优势:
    • 自动适应不同参数的梯度尺度。
    • 对超参数(如学习率)鲁棒性强。
    • 目前最流行的默认优化器。

4. 算法对比与选择建议

算法适用场景优点缺点
BGD小规模凸优化问题理论收敛保证计算慢,内存需求高
SGD在线学习、大数据集简单,可跳出局部最优震荡严重,需精细调学习率
Mini-batch SGD大多数深度学习任务效率与稳定性平衡仍需手动调学习率
Momentum损失函数存在峡谷或平坦区域加速收敛,减少震荡增加一个超参数 β \beta β
Adam默认首选(尤其复杂非凸问题)自适应学习率,收敛快,鲁棒可能泛化性略逊于调优后的 SGD

注:近年研究发现,在某些任务(如图像分类)中,精心调参的 SGD + 动量 可能比 Adam 获得更好的泛化性能,但 Adam 仍是快速原型开发的首选。

最近更新: 2026/3/22 18:37
Contributors: klc407073648