机器学习算法之动量法:优化梯度下降的“惯性”策略

目录

动量法:优化梯度下降的"惯性"策略

核心原理

与SGD的直观对比

关键推导

简洁案例

Python实现对比

算法优劣

核心总结


动量法:优化梯度下降的"惯性"策略

梯度下降是优化模型参数的核心方法,但其基础版本在训练中常面临收敛慢、震荡大的问题。

动量法通过引入物理中的"惯性"概念,有效提升了优化效率与稳定性。

核心原理

动量法在更新参数时,不仅考虑当前梯度,还累积历史梯度的指数加权平均作为"动量",使更新方向更平滑、更一致。

更新公式:

  • vt:当前时刻的动量(速度)

  • β:动量系数(通常0.9),控制历史信息的保留程度

  • η:学习率

  • ∇θL(θt):当前梯度

与SGD的直观对比

普通SGD :每次更新只依赖当前梯度,路径曲折,易震荡。
动量法:更新受历史动量引导,在稳定方向加速,在震荡方向减速,路径更平滑直接。

关键推导

动量更新可视为历史梯度的指数加权和:

当损失函数在某方向持续下降时,同向梯度不断累积,实现加速;当梯度方向频繁变化时,正负梯度相互抵消,抑制震荡。

简洁案例

优化目标:最小化 L(w)=(w−4)2,最优值 w∗=4。

SGD更新(η=0.1):

wt+1=wt−0.1×2(wt−4)

动量法更新(η=0.1,β=0.9):

vt=0.9vt−1+0.1×2(wt−4)

wt+1​=wt​−vt​

初始化 w0=0,v0=0:

  • 第一步:梯度=-8,SGD更新至0.8;动量法 v1=−0.8,更新至0.8

  • 第二步:梯度=-6.4,SGD更新至1.44;动量法 v2=0.9×(−0.8)+0.1×(−6.4)=−1.36,更新至2.16

可见,动量法因累积了之前的梯度,第二步更新幅度更大,加速接近最优值。

Python实现对比

python 复制代码
import numpy as np
import matplotlib.pyplot as plt

# 定义目标函数及其梯度
def loss(w):
    return (w - 4)**2

def grad(w):
    return 2 * (w - 4)

# 优化器
def sgd_update(w, lr):
    return w - lr * grad(w)

def momentum_update(w, v, lr, beta):
    v = beta * v + lr * grad(w)
    return w - v, v

# 参数设置
lr = 0.1
beta = 0.9
iterations = 20

# 初始化
w_sgd = 0
w_mom = 0
v = 0

# 记录路径
path_sgd = [w_sgd]
path_mom = [w_mom]

# 迭代优化
for i in range(iterations):
    w_sgd = sgd_update(w_sgd, lr)
    w_mom, v = momentum_update(w_mom, v, lr, beta)
    path_sgd.append(w_sgd)
    path_mom.append(w_mom)

# 可视化
plt.figure(figsize=(10, 4))

plt.subplot(1, 2, 1)
w_range = np.linspace(-1, 5, 100)
plt.plot(w_range, loss(w_range), 'k-', alpha=0.3, label='Loss')
plt.plot(path_sgd, loss(np.array(path_sgd)), 'o-', label='SGD', markersize=4)
plt.plot(path_mom, loss(np.array(path_mom)), 's-', label='Momentum', markersize=4)
plt.xlabel('Parameter w')
plt.ylabel('Loss')
plt.title('Optimization Trajectory')
plt.legend()
plt.grid(True, alpha=0.3)

plt.subplot(1, 2, 2)
plt.plot(range(len(path_sgd)), loss(np.array(path_sgd)), label='SGD')
plt.plot(range(len(path_mom)), loss(np.array(path_mom)), label='Momentum')
plt.xlabel('Iteration')
plt.ylabel('Loss')
plt.title('Loss Convergence')
plt.legend()
plt.grid(True, alpha=0.3)

plt.tight_layout()
plt.show()

算法优劣

优点:

  1. 加速收敛:在平缓或方向一致的区域快速前进

  2. 抑制震荡:平滑优化路径,提升训练稳定性

  3. 帮助逃离局部极小:惯性可能冲过窄小局部最优点

缺点:

  1. 增加超参数:需调整动量系数β

  2. 可能超调:动量过大时在最优值附近震荡

适用场景:

  • 高维非凸优化(如深度学习)

  • 梯度存在噪声或方向不一致时

  • 需要更快收敛速度的场景

核心总结

动量法通过累积历史梯度信息,为参数更新增加"惯性",在保持随机梯度下降计算效率的同时,显著改善了优化过程的收敛速度与稳定性。其核心思想简单而有效,已成为现代深度学习优化器的基础组件之一。

相关推荐
Leo.yuan几秒前
Dora企业级Data Agent应用指南:存量BI复用、私有化部署与权限管理
大数据·人工智能
火山引擎开发者社区4 分钟前
从代码执行到任务持续运行:企业级 Agent Sandbox 的云原生实践
人工智能
Nablai7 分钟前
LX系列多国语言能力技术解析:ESP32双栈架构下的语种策略设计
人工智能·架构
老牛日常随笔20 分钟前
微软开源Flint Chart:AI画图表总是画不对?让编译器来画,AI只写数据就行
人工智能·microsoft
jimmyleeee20 分钟前
Agent安全之六:(ASI06)记忆与上下文投毒——当 AI 把“昨天的错误”当成“今天的真理”
网络·人工智能·安全
deepseek2322 分钟前
Claude Code 2.1.314 新增工作目录写入边界:工具权限、沙箱与安全盲区怎么分层
人工智能·ai agent·claude code
Yolanda_202223 分钟前
week3深度学习处理文本(上)
人工智能·深度学习
Smoothcloud润云26 分钟前
GPU算力平台推荐:复现实验时,如何判断租用资源是否合适?
服务器·人工智能·深度学习·gpu算力·gpu
yz_aiks28 分钟前
WorkBuddy 使用技巧:Claude Code 国内平替,签到免费用、自动签到和手机远程控制电脑
人工智能·ai编程·效率工具·claude code·workbuddy
Fuyo_111938 分钟前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法