吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(五)Adam 优化算法

此分类用于记录吴恩达深度学习课程的学习笔记。

课程相关信息链接如下:

  1. 原课程视频链接:[双语字幕]吴恩达深度学习deeplearning.ai
  2. github课程资料,含课件与笔记:吴恩达深度学习教学资料
  3. 课程配套练习(中英)与答案:吴恩达深度学习课后习题与答案

本篇为第二课的第二周内容,2.8的内容,同时也是本周理论部分的最后一篇。


本周为第二课的第二周内容,和题目一样,本周的重点是优化算法,即如何更好,更高效地更新参数帮助拟合的算法,还是离不开那句话:优化的本质是数学

因此,在理解上,本周的难道要相对较高一些,公式的出现也会更加频繁。

当然,我仍会补充一些更基础的内容来让理解的过程更丝滑一些。

本篇的内容关于Adam优化算法,是在之前的MomentumRMSprop基础上的集成算法。

1. Adam 优化算法

前面我们已经学过Momentum和RMSprop算法。

先回忆两个算法的核心思想:

算法 解决问题 技术手段
Momentum 梯度方向不稳定、震荡 平滑梯度
RMSprop 梯度幅度差异大 平滑梯度平方、调节步长

在上一篇最后,我们提到,二者在使用上并不冲突,可以结合使用。

而结合后的方法同时应用平滑梯度和平滑梯度平方,实现平稳方向和自适应步长。

这就是Adam优化算法。

说实话,从原理上讲,Adam基本就是把Momentum和RMSprop两种算法加起来
所以,只要能理解这两种算法,那Adam的理解基本不是问题,我们直接展开Adam算法的公式逻辑。

1.1 Adam 的基本思想

Adam 会维护两个量:

名称 含义 对应哪部分算法?
一阶矩 vₜ 平滑后的梯度(方向) Momentum
二阶矩 Sₜ 平滑后的梯度平方(幅度) RMSProp

也就是说:

  • vₜ = 用来稳方向
  • Sₜ = 用来调步长
    Adam = vₜ + Sₜ 的协作更新。

1.2 一二阶矩

(1)一阶矩:平滑梯度 vₜ

来自Momentum,我们用 vₜ 表示平滑梯度:

\[v_t = \beta_1 v_{t-1} + (1-\beta_1) g_t \]

这行的作用:平滑方向,避免梯度抖来抖去。

(2)二阶矩:平滑梯度平方 Sₜ

来自RMSprop,用 Sₜ 表示平滑梯度平方:

\[S_t = \beta_2 S_{t-1} + (1-\beta_2) g_t^2 \]

这行的作用:感知"梯度大小的平均幅度",用于自适应调步长。

1.3 一二阶矩为什么能起到相应作用?

再补充一点,你可能会有这样一个问题:
为什么用一阶矩来平滑方向,用二阶矩调节步长?这么设置的合理性在哪?他们能换个位置吗?

我们总地说一下梯度和梯度平方最大的区别:

  • 梯度带正负号,包含方向信息
  • 梯度平方一定为正,体现的是"幅度"

现在再展开看一下:

角色 是否保留方向(正负) 代表的意义 最适合的任务 为什么不能反过来?
一阶矩 vₜ 保留正负号 过去梯度的加权平均(趋势/方向) 按趋势稳定方向 vₜ 会为正或负,不代表"大小趋势",无法判断步长是否应该缩放
二阶矩 Sₜ 永远 ≥ 0(没方向) 梯度平方的平均(尺度/大小) 按尺度自适应调步长 Sₜ 没有方向信息,无法告诉你"往左还是往右"

总之,vₜ 和 Sₜ 的功能无法互换 ------ 一个负责"走哪边",一个负责"走多快"。

因此,我们不可能让速度决定方向,也不能让方向负责踩油门。

1.4 一二阶矩的偏差修正

因为 v₀ = 0、S₀ = 0,一开始偏小,所以 Adam 做偏差校正:

一阶矩修正:

\[\hat{v}_t = \frac{v_t}{1-\beta_1^t} \]

二阶矩修正:

\[\hat{S}_t = \frac{S_t}{1-\beta_2^t} \]

同样是之前就讲过的内容,我们用偏差修正来弥补EMA在初期偏小的情况,修正带来的影响也会在后期分母无限接近1的情况下自动消失。

1.5 Adam参数更新公式

到了这一步,我们先看看之前两种算法的更新公式:

首先是Momentum:

\[\theta_{t+1} = \theta_t - \alpha \cdot v_t,其中 v_t = \beta v_{t-1} + (1-\beta) g_t \]

这里,我们主要使用一阶矩 来形成"惯性",抵消样本参数的个性化特征信息同时加强共性特征信息来缓解"震荡"。如果你有些忘了为什么会有这种效果,再看看之前的详细解释:Momentum

然后,我们又引入RMSprop:

\[\theta_{t+1} = \theta_t - \alpha \cdot \dfrac{g_t}{\sqrt{S_t}+\epsilon},其中S_t = \beta S_{t-1} + (1-\beta) g_t^2 \]

这里,我们主要使用二阶矩 来对每个参数实现"自适应学习率",用平滑梯度平方测定梯度"幅度"并以此来缩小大梯度,放大小梯度。同样,如果你有些遗忘,详细的解释在这里:RMSprop

看这两个算法的公式,有没有发现,他们更改的位置完全不冲突?

  • Momentum 把和学习率相乘的梯度改为平滑梯度。
  • RMSprop 用平滑梯度的平方做开方当成梯度的分母。

就像之前说的,Adam 的参数更新公式相比创新,它更像合成:

\[\theta_{t+1}= \theta_t - \alpha \cdot \frac{\hat{v}_t}{\sqrt{\hat{S}_t} + \epsilon} \]

很明显,Adam 把上面两者结合起来,同时应用一阶矩和二阶矩 ,既有稳定方向,又能自动调节不同参数的学习率。

还是打个比方:Momentum就像告诉往哪走的指南针,而RMSprop像告诉怎么走的地图,二者相加就成了Adam这个智能导航。

2. 自适应优化算法(Adaptive Optimization Algorithm)

2.1传统学习率衰减方法

我们在之前学习率衰减部分学过各种"学习率衰减"方法,比如 指数衰减分段衰减1/t 衰减

而这些方法的共同点是:直接在超参数层面调整整体学习率 α。

也就是说,它们的核心思路是:用一个全局函数控制所有参数的步长变化,每次迭代时整个模型的学习率一起变小或变大。

而我们也在RMSprop部分了解了这种对所有参数应用统一学习率的不足。

2.2 自适应学习率算法

实际上,RMSprop,Adam 算法被统称为自适应学习率算法或者自适应优化算法。(还有一种叫AdaGrad,是改进前的RMSprop,几乎不再使用,所以就不提了)

"自适应学习率(Adaptive Learning Rate)"指的并不是简单地去改超参数 α, 而是根据每个参数自身的梯度特征,让它自己决定应该走快还是走慢。

换句话说,这类算法不是"直接改 α" , 而是"在更新时给每个参数都乘上一个自适应比例系数"。

从而形成一种 "隐式学习率" 的变化机制。

就像我们这两篇所介绍的,这种机制让算法能在不同维度上动态分配更新强度,即使学习率 α 是固定的,也能实现"局部自调节"的效果。

因此,Adam 不需要额外的衰减函数,也能自动学会该快时快、该慢时慢。

本周的理论部分就到此为止,下一篇的实操部分,我们就看看这些优化算法相比原来的普通梯度下降法,在性能上有多少提升。

3."人话版"总结

概念 原理 比喻
Adam 同时计算一阶矩(方向)和二阶矩(幅度),并做偏差修正。综合Momentum的"稳方向"和RMSprop的"调步长"。 像个智能导航系统:Momentum告诉你该往哪走,RMSprop告诉你怎么走得稳,两者合体成了"自动驾驶模式"。
传统学习率衰减 通过全局公式(如指数衰减、1/t衰减等)手动让整个模型学习率逐步下降。 像定时器:无论路况怎样,到点就自动降速。
自适应学习率算法 不再改α本身,而是让每个参数在更新时都带上"自调节比例",实现隐式学习率。 就像每个车轮都能独立判断地面情况,自主控制转速,整体协调而智能地前进。
相关推荐
wa的一声哭了2 小时前
hf中transformers库中generate的greedy_search
android·java·javascript·pytorch·深度学习·语言模型·transformer
粉色挖掘机2 小时前
矩阵在图像处理中的应用
图像处理·深度学习·线性代数·矩阵
Danceful_YJ2 小时前
36.优化方法
人工智能·pytorch·python·深度学习·优化器算法
化作星辰2 小时前
深度学习_神经网络_损失函数基础
人工智能·深度学习·神经网络
hxj..3 小时前
如何进行AI作图(架构图,流程图等)
人工智能·ai·ai作画
todoitbo3 小时前
使用n8n搭建服务器监控系统:从Webhook到Telegram告警的完整实现
运维·服务器·数据库·ai·向量数据库·流处理·n8n
CoderJia程序员甲3 小时前
GitHub 热榜项目 - 日榜(2025-11-11)
ai·开源·大模型·github·ai教程
没有钱的钱仔3 小时前
神经 网络
深度学习
小蜜蜂爱编程4 小时前
deep learning简介
人工智能·深度学习