【深度学习】Adam和AdamW优化器有什么区别,以及为什么Adam会被自适应学习率影响

news/2025/2/25 4:25:14

Adam 和 AdamW 的主要区别在于 权重衰减(Weight Decay) 的实现方式,具体如下:

1. 权重衰减(Weight Decay)处理方式

  • Adam:采用 L2 正则化,通过在梯度更新时手动添加 weight_decay 项:
    g t = ∇ f ( θ t ) + λ θ t g_t = \nabla f(\theta_t) + \lambda \theta_t gt=f(θt)+λθt
    其中, λ \lambda λ 是权重衰减系数。

  • AdamW:直接在 参数更新时 执行权重衰减,而不是在梯度计算时添加 L2 正则:
    θ t + 1 = θ t − η m t v t + ϵ − η λ θ t \theta_{t+1} = \theta_t - \eta \frac{m_t}{\sqrt{v_t} + \epsilon} - \eta \lambda \theta_t θt+1=θtηvt +ϵmtηλθt

    这里权重衰减项独立于梯度计算,在更新参数时进行。

2. 影响

  • Adam 的 L2 正则化 会影响梯度估计值,导致优化器在 自适应学习率的调节 过程中对权重衰减的影响不稳定。
  • AdamW 的独立权重衰减 让权重衰减成为一个真正的正则化项,而不会干扰梯度估计,使得模型的 泛化能力更强

3. 实验对比

  • 论文 Decoupled Weight Decay Regularization(Loshchilov & Hutter, 2019)表明,在深度学习任务(如 NLP 和 CV)中,AdamW 通常比 Adam 泛化性能更好,因为它的权重衰减不会被 Adam 的自适应学习率影响。
  • AdamW 在 Transformer 模型(如 BERT、ViT)中被广泛采用,因为它有更稳定的收敛性。

4. 总结

AdamAdamW
权重衰减方式L2 正则化(影响梯度)直接在更新时进行(不影响梯度)
对梯度估计的影响可能影响梯度自适应调整不影响自适应学习率调整
泛化能力较弱,可能过拟合更强,正则化效果更好
应用场景适用于小规模任务适用于大规模深度学习任务(如 BERT、ViT)

👉 如果你要在 Transformer 或深度学习任务中使用权重衰减,建议用 AdamW!


附:为什么Adam会被自适应学习率影响

Adam 之所以会被 自适应学习率(Adaptive Learning Rate) 影响,是因为它的 L2 正则化方式(梯度中的权重衰减项)与 Adam 的自适应梯度调整机制发生了耦合,导致实际的权重衰减效果不稳定。

Adam 的 L2 正则化(Weight Decay)

Adam 采用的是 L2 正则化,即在梯度计算时加入权重衰减项:
g t = ∇ f ( θ t ) + λ θ t g_t = \nabla f(\theta_t) + \lambda \theta_t gt=f(θt)+λθt
其中:

  • ∇ f ( θ t ) \nabla f(\theta_t) f(θt) 是损失函数对参数的梯度,
  • λ θ t \lambda \theta_t λθt 是 L2 正则化项(权重衰减项),
  • g t g_t gt 是最终用于 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
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
θ t + 1 = θ t − η m t v t + ϵ \theta_{t+1} = \theta_t - \eta \frac{m_t}{\sqrt{v_t} + \epsilon} θt+1=θtηvt +ϵmt
其中:

  • m t m_t mt 是一阶动量(类似于梯度的指数加权平均),
  • v t v_t vt 是二阶动量(类似于梯度平方的指数加权平均),
  • η \eta η 是学习率,
  • v t \sqrt{v_t} vt 代表梯度的自适应缩放因子。

为什么 L2 正则化会被自适应学习率影响?

由于 Adam 采用的是 自适应学习率机制,不同参数的梯度更新量会被调整:
m t v t + ϵ \frac{m_t}{\sqrt{v_t} + \epsilon} vt +ϵmt
如果某些参数的梯度较大(或较小),它们的更新量会被 缩放,从而影响 L2 正则化项的实际作用。结果是:

  1. 不同参数的权重衰减不均匀

    • L2 正则化是在梯度中加入 λ θ t \lambda \theta_t λθt,但这个梯度随后会被 Adam 的自适应更新缩放。
    • 由于 v t v_t vt 可能因梯度大小不同而变化,每个参数的权重衰减都会被 不同程度地缩放,导致正则化不均匀。
  2. 权重衰减效果变得不稳定

    • 在 SGD(随机梯度下降)中,L2 正则化始终是 固定比例 的衰减项( λ θ t \lambda \theta_t λθt)。
    • 但在 Adam 中,L2 正则化项会随着梯度的变化而变化,导致某些参数可能衰减得 太多太少,从而影响泛化能力。
  3. 学习率调整会干扰正则化效果

    • Adam 在训练早期可能会有 较大的自适应学习率,导致 L2 正则化项的实际作用被削弱。
    • 训练后期,学习率降低时,L2 正则化项的影响可能变得更大,导致训练不稳定。

AdamW 如何解决这个问题?

AdamW 采用了一种 去耦合(Decoupled)权重衰减 方式,直接在参数更新时进行权重衰减,而不是在梯度计算时添加 L2 正则化:
θ t + 1 = θ t − η m t v t + ϵ − η λ θ t \theta_{t+1} = \theta_t - \eta \frac{m_t}{\sqrt{v_t} + \epsilon} - \eta \lambda \theta_t θt+1=θtηvt +ϵmtηλθt

  • 这样,权重衰减的大小不受梯度缩放的影响,可以独立控制正则化效果,保持一致性。
  • 这避免了 Adam 中权重衰减的不均匀性,使得 AdamW 比 Adam 具有 更好的泛化能力

总结

优化器权重衰减方式是否受自适应学习率影响?正则化效果
AdamL2 正则化(梯度中加 λ θ \lambda \theta λθ会受影响(梯度被缩放)不稳定,可能导致不均匀的衰减
AdamW直接在参数更新时减去 λ θ \lambda \theta λθ不会受影响(与梯度分离)更稳定,正则化效果更好

👉 结论:Adam 的 L2 正则化被 Adam 的自适应梯度缩放影响,使得正则化不稳定,而 AdamW 通过去耦合权重衰减,解决了这个问题,因此在深度学习任务中表现更优!

写在最后

本文采用了 ChatGPT 辅助进行内容的书写和完善


http://www.niftyadmin.cn/n/5864971.html

相关文章

Ollama Open WebUI

Open WebUI 用户友好的 AI 界面(支持 Ollama、OpenAI API 等)。 Open WebUI 支持多种语言模型运行器(如 Ollama 和 OpenAI 兼容 API),并内置了用于检索增强生成(RAG)的推理引擎,使其…

JPA与存储过程的完美结合

在现代的Java开发中,JPA(Java Persistence API)已经成为ORM(对象关系映射)的主流选择之一。它不仅简化了数据库操作,还提供了强大的功能来与数据库交互。今天,我们将深入探讨如何通过NamedStore…

安全见闻5

今天学了Windows操作系统和驱动程序的相关知识 Windows注册表 注册表是windows系统中具有层次结构的核心数据库 储存的数据对windows 和Windows上运行的应用程序和服务至关重要。注册表时帮助windows控制硬件、软件、用户环境和windows界面的一套数据文件。 打开注册表编辑器…

搭建Docker Harbor仓库

搭建 Docker Harbor 仓库是一个常见的需求,Harbor 是一个企业级的 Docker 镜像仓库,提供了镜像管理、用户权限控制、漏洞扫描等功能。以下是详细的搭建步骤: 1. 环境准备 操作系统:Ubuntu 20.04 或更高版本(或其他 Li…

AxiosError: Network Error

不知怎么的,项目还在开发阶段,之前还好好的,玩儿了两天再一打开发现页面无法显示数据了,报错如下: 我以为是后端出问题了,但是后端控制台无报错,又用postman测试了一下,可以获取到数…

npm使用了代理,但是代理软件已经关闭导致创建失败

如果在关闭前打开了vscode,此时vscode中的终端没有刷新,就会出现这个问题,最开始会一直转圈圈,直到超时,然后出现该报错 ❯ npm create vuelatest npm error code ECONNREFUSED npm error syscall connect npm error …

Qt QTreeWidget 总结

Qt QTreeWidget 总结 1. 概述 QTreeWidget 是 Qt 中用于显示树形结构的控件,继承自 QTreeView,但提供了更简单的接口。适合展示层级数据(如文件目录、组织结构)。每个节点是 QTreeWidgetItem 对象,支持文本、图标、复…

《鸿蒙开发-答案之书》获取视频第一帧和视频时间

《鸿蒙开发-答案之书》获取视频第一帧和视频时间 /*** 获取视频信息**let result await MySightUtil.getSightInfo(this.sightUri);*let base64 : string result[0];*let duration : number result[1]** param uri 视频地址* returns 第一个数据是缩略图 base64 字符串&…