通俗理解 Adam 优化器

31 篇文章 3 订阅
23 篇文章 12 订阅

Adam吸收了Adagrad(自适应学习率的梯度下降算法)和动量梯度下降算法的优点,既能适应稀疏梯度(即自然语言和计算机视觉问题),又能缓解梯度震荡的问题
常见优化器的详细解析请参考此文章->#深度解析# 深度学习中的SGD、BGD、MBGD、Momentum、NAG、Adagrad、Adadelta,RMSprop、Adam优化器

Adma的公式如下,这里我们主要分析红色的标记的这3行公式:
在这里插入图片描述
公式1:计算 历史梯度的一阶指数平滑值,用于得到带有动量的梯度值
公式2:计算 历史梯度平方的一阶指数平滑值,用于得到每个权重参数的学习率权重参数
公式3:计算变量更新值,由公式3可知,变量更新值正比于历史梯度的一阶指数平滑值,反比于历史梯度平方的一阶指数平滑值;

历史梯度的一阶指数平滑

历史梯度的一阶指数平滑(也叫一阶矩加权均值)可以理解为求历史梯度的加权平均,距离当前时刻距离越远权重越小,这里类似于求历史梯度的L1范数,这个思想来自于 动量梯度下降算法

如果权重参数更新时,某一维度存在较大震荡(梯度更新值正负交替),那么对当前梯度使用一阶指数平滑(对历史梯度进行正负抵消),可以得到一个较小的梯度值

如果变量在某一维度更新时不存在较大震荡,且在在某一方向上存在稳定较大的梯度更新,那么通过一阶指数平滑后会得到一个较大的值。

总的来说,历史梯度的一阶指数平滑就是使用历史梯度信息对当前梯度进行一个修正(消除变量更新时的震荡),从而得到一个稳定的梯度更新值

历史梯度平方的一阶指数平滑

历史梯度平方的一阶指数平滑(也叫二阶矩加权均值)可以理解为求历史梯度平方的加权平均,距离当前时刻距离越远权重越小,这里类似于求历史梯度的L2范数,这个思想来自于自适应学习率梯度下降算法

因为历史梯度平方的一阶指数平滑的作用就是使每个参数的学习率不同,因此这里我们将学习率参数 η \eta η v t + ϵ \sqrt{v_t}+\epsilon vt +ϵ 看作一个整体 η v t + ϵ \frac{\eta}{\sqrt{v_t}+\epsilon} vt +ϵη,这里我们简单称他为自适应学习率

在迭代过程中,如果某一维度一直以很小的梯度进行更新,证明此方向梯度变换较为稳定,因此可以加大学习率,以较大的学习率在此维度更新,体现在公式上就是:对历史梯度平方进行一阶指数平滑后,公式2会得到一个很小的值,公式3中的自适应学习率会相对较小

相反,某一维度在迭代过程中一直以很大的梯度进行更新,明此方向梯度变换较为剧烈(不稳定),因此可减小学习率,以较小的学习率在此维度更新 体现在公式上就是:对历史梯度平方进行一阶指数平滑后,公式2则会得到一个很大的值,公式3中的自适应学习率会相对较大

历史梯度平方的一阶指数平滑也可以解决梯度稀疏的问题;频繁更新的梯度将会被赋予一个较小的学习率,而稀疏的梯度则会被赋予一个较大的学习率,通过上述机制,在数据分布稀疏的场景,能更好利用稀疏梯度的信息,比标准的SGD算法更有效地收敛。

综上所述,Adam 优化器可以根据历史梯度的震荡情况和过滤震荡后的真实历史梯度对变量进行更新

关于 Adam 和 MSGD算法的比较请参考此文章->#深入探究# Adam和SGDM优化器的对比

  • 7
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
解释器模式是一种设计模式,它允许我们定义一种语言,并且可以使用该语言来解释和执行特定的任务。该模式适用于需要实现复杂语言处理的场景,例如编译器、解析器、计算器等。 实现解释器模式需要以下几个元素: - 抽象表达式(Abstract Expression):定义解释器的接口,通常包括一个解释方法(interpret),该方法的参数通常为一个上下文(Context)对象。 - 终结符表达式(Terminal Expression):表示语言中的基本单元,例如变量、常量等。 - 非终结符表达式(Nonterminal Expression):表示语言中的复合结构,通常由多个终结符表达式组成。 - 上下文(Context):保存解释器解释时所需的状态和信息。 下面是一个简单的例子,假设我们需要计算一个简单的四则运算表达式: ```python # 定义抽象表达式 class Expression: def interpret(self, context): pass # 定义终结符表达式 class Number(Expression): def __init__(self, number): self.number = number def interpret(self, context): return int(self.number) # 定义非终结符表达式 class Plus(Expression): def __init__(self, left, right): self.left = left self.right = right def interpret(self, context): return self.left.interpret(context) + self.right.interpret(context) # 定义上下文 class Context: def __init__(self, text): self.text = text def next(self): if len(self.text) > 0: return self.text.pop(0) else: return None ``` 在上面的代码中,我们定义了一个抽象表达式类 `Expression`,包含一个 `interpret` 方法;终结符表达式 `Number`,表示一个数字;非终结符表达式 `Plus`,表示加法运算;以及上下文类 `Context`,保存语言的状态和信息。 接下来,我们可以使用这些类来解释一个四则运算表达式: ```python # 创建表达式 expr1 = Plus(Number(3), Number(4)) expr2 = Plus(Number(2), expr1) # 创建上下文 context = Context(list(str(expr2.interpret(None)))) # 输出结果 print(expr2.interpret(context)) # 9 ``` 在上面的代码中,我们首先创建了一个四则运算表达式 `2 + 3 + 4`,然后使用上下文类 `Context` 将其转换为一个字符列表 `[2, +, 3, +, 4]`,最后通过调用 `interpret` 方法计算表达式的
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

energy_百分百

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值