IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 【论文】Adam -> 正文阅读

[人工智能]【论文】Adam


【论文】Kingma D , Ba J . Adam: A Method for Stochastic Optimization[J]. Computer ence, 2014.(pdf


论文首次提出了 Adam 算法——基于一阶导数的随机梯度下降算法

Adam 是对 SGD、AdaGrad 和 RMSProp 算法的优化

Adam 结合 AdaGrad 和 RMSProp 两种算法的优点,对梯度的一阶矩估计和二阶矩估计都进行综合考虑,具体算法如下
在这里插入图片描述
算法流程,

  1. 计算 t t t 时刻目标函数对 θ \theta θ 的梯度
  2. 计算梯度的一阶矩,即前面梯度与当前梯度的平均
  3. 计算梯度的二阶矩,即前面梯度与当前梯度平方的平均
  4. 对一阶矩 m t m_t mt? 进行校正,因为 m 0 m_0 m0? 初始化为 0 0 0,会导致 m t m_t mt? 偏向于 0 0 0
  5. 对二阶矩 v t v_t vt? 进行校正,因为 v 0 v_0 v0? 初始化为 0 0 0,会导致 v t v_t vt? 偏向于 0 0 0
  6. 更新参数 θ t \theta_t θt?,注意此时可将 α v ^ t + ? \frac{\alpha}{\sqrt{\hat v_t}+\epsilon} v^t? ?+?α? 视为更新参数 θ t \theta_t θt? 的学习率, m ^ t \hat m_t m^t? 视为更新参数 θ t \theta_t θt? 的梯度

注意上述算法可以通过改变计算顺序而提高效率,将循环的最后三行替代为下面两条句

α t = α ? 1 ? β 2 t / ( 1 ? β 1 t ) θ t ← θ t ? 1 ? α t ? m t / ( v t + ? ^ ) \alpha_t=\alpha\cdot\sqrt{1-\beta_2^t}/(1-\beta_1^t) \\ \theta_t\leftarrow\theta_{t-1}-\alpha_t\cdot m_t / (\sqrt{v_t}+\hat\epsilon) αt?=α?1?β2t? ?/(1?β1t?)θt?θt?1??αt??mt?/(vt? ?+?^)

代码实现

# ADAM
# 以 y=x1+2*x2为例
import math
import numpy as np


def adam():
    # 训练集,每个样本有三个分量
    x = np.array([(1, 1), (1, 2), (2, 2), (3, 1), (1, 3), (2, 4), (2, 3), (3,
                                                                           3)])
    y = np.array([3, 5, 6, 5, 7, 10, 8, 9])

    # 初始化
    m, dim = x.shape
    theta = np.zeros(dim)  # 参数
    alpha = 0.01  # 学习率
    momentum = 0.1  # 冲量
    threshold = 0.0001  # 停止迭代的错误阈值
    iterations = 3000  # 迭代次数
    error = 0  # 初始错误为0

    b1 = 0.9  # 算法作者建议的默认值
    b2 = 0.999  # 算法作者建议的默认值
    e = 0.00000001  #算法作者建议的默认值
    mt = np.zeros(dim)
    vt = np.zeros(dim)

    for i in range(iterations):
        j = i % m
        error = 1 / (2 * m) * np.dot((np.dot(x, theta) - y).T,
                                     (np.dot(x, theta) - y))
        if abs(error) <= threshold:
            break

        gradient = x[j] * (np.dot(x[j], theta) - y[j])
        mt = b1 * mt + (1 - b1) * gradient
        vt = b2 * vt + (1 - b2) * (gradient**2)
        mtt = mt / (1 - (b1**(i + 1)))
        vtt = vt / (1 - (b2**(i + 1)))
        vtt_sqrt = np.array([math.sqrt(vtt[0]),
                             math.sqrt(vtt[1])])  # 因为只能对标量进行开方
        theta = theta - alpha * mtt / (vtt_sqrt + e)

    print('迭代次数:%d' % (i + 1), 'theta:', theta, 'error:%f' % error)


if __name__ == '__main__':
    adam()

m t m_t mt? v t v_t vt? 的偏差修正

可以将 v t = β 2 ? v t ? 1 + ( 1 ? β 2 ) ? g t 2 v_t=\beta_2\cdot v_{t-1}+(1-\beta_2)\cdot g_t^2 vt?=β2??vt?1?+(1?β2?)?gt2? 改写为所有时间步上只包含梯度和衰减率的函数,即 v t = ( 1 ? β 2 ) ∑ i = 1 t β 2 t ? i ? g i 2 v_t=(1-\beta_2)\sum^t_{i=1}\beta_2^{t-i}\cdot g_i^2 vt?=(1?β2?)i=1t?β2t?i??gi2?

下面我们用数学归纳法简单证明一下

请添加图片描述
我们知道梯度的真实一阶矩为 E ( g t ) E(g_t) E(gt?),真实的二阶矩为 E ( g t 2 ) E(g_t^2) E(gt2?)。现在,我们希望知道的是时间步 t t t 上指数移动均值的期望 E ( v t ) E(v_t) E(vt?) 与真实的二阶矩 E ( g t 2 ) E(g_t^2) E(gt2?) 之间的差异,这样才好对这两个量之间的偏差进行修正
请添加图片描述

我们可以简单通过下面代码模拟看一下初始值的影响

import numpy as np
import matplotlib.pyplot as plt

beta = 0.9
num_samples = 100

np.random.seed(0)
raw_data =  np.random.randint(32, 38, size = num_samples)
x_index = np.arange(num_samples)

v_ema = []
v_pre = 0
for i, t in enumerate(raw_data):
    v_t = beta * v_pre + (1 - beta) * t
    v_ema.append(v_t)
    v_pre = v_t

    v_ema_corr = []
    for i, t in enumerate(v_ema):
        v_ema_corr.append(t / (1 - np.power(beta, i + 1)))

plt.plot(x_index, raw_data, label='raw_data')  # Plot some data on the (implicit) axes.
plt.plot(x_index, v_ema, label='v_ema')  # etc.
plt.plot(x_index, v_ema_corr, label='v_ema_corr')
plt.xlabel('time')
plt.ylabel('T')
plt.title("exponential moving average")
plt.legend()
plt.savefig('./ema.png')
plt.show()

请添加图片描述
可以看到不经过修正的指数移动平均值在初始阶段阶段的结果与真实的曲线有很大的偏差,但是这种偏差随着步数的增加会越来越小;当然,经过修正的指数移动平均值在开始就可以很好的跟踪真实变化趋势

一阶矩、二阶矩

由前面可知,一阶矩 E ( g t ) E(g_t) E(gt?) 即当前梯度 g t g_t gt? 的期望(估计一阶矩 m t m_t mt?),由于当前梯度 g t g_t gt? 是随机采样得到的估计结果,因此更关注它在统计意义上的期望

二阶矩 E ( g t 2 ) E(g_t^2) E(gt2?) 即当前梯度的平方 g t 2 g_t^2 gt2? 的期望(估计二阶矩),考虑它的意义要分四种情况:

  • v t v_t vt? 很大且 ∣ ∣ m t ∣ ∣ ||m_t|| mt? 很大时,说明梯度大且稳定。 v t v_t vt? 是梯度平方的指数移动均值自然结果为正,当 v t v_t vt? 很大,说明过往大部分的梯度与当前梯度的绝对值都不会太小。 ∣ ∣ m t ∣ ∣ ||m_t|| mt? 指的是当前梯度指数移动均值的绝对值,当 ∣ ∣ m t ∣ ∣ ||m_t|| mt? 很大,则说明过往梯度与当前梯度正负抵消的很少,即过往梯度与当前梯度一般是同号。这样,梯度更新相对稳定,过度平滑,可以看成梯度下降在**『走大下坡』**,梯度下降方向明确
  • v t v_t vt? 很大而 ∣ ∣ m t ∣ ∣ ||m_t|| mt? 却很小时,则说明过往的大部分梯度和当前梯度的绝对值都很大,但是出现了很多的正负抵消的情况。此时,梯度更新**『处于震荡的状态』**,一会儿正,一会儿负,但由于 g t 2 g_t^2 gt2? 的指数移动均值很大,说明单个梯度的绝对值很大,可能是向下更新到一个局部的波谷,有进行一波反弹
  • ∣ ∣ m t ∣ ∣ ||m_t|| mt? 但是 v t v_t vt? 却趋于零,这种情况不可能会出现
  • ∣ ∣ m t ∣ ∣ ||m_t|| mt? 趋于零且 v t v_t vt? 也趋于零时,『可能达到局部最低点,也可能走到一个极度平缓的地方』,此次要避免陷入平原

梯度更新

Adam 更新规则的一个重要特性时其步长的谨慎选择。假设 ? = 0 \epsilon=0 ?=0,时间步 t t t 下参数空间中的有效步长是 Δ t = α ? m ^ t / v ^ t \Delta_t=\alpha\cdot\hat m_t/\sqrt{\hat v_t} Δt?=α?m^t?/v^t? ?

这个有效步长有两个明确的上界:

  1. ( 1 ? β 1 ) > 1 ? β 2 (1-\beta_1)>\sqrt{1-\beta_2} (1?β1?)>1?β2? ? 的情况下,有效步长的上确界满足 ∣ Δ t ∣ ? α ? ( 1 ? β 1 ) / 1 ? β 2 |\Delta_t|\leqslant\alpha\cdot(1-\beta_1)/\sqrt{1-\beta_2} Δt??α?(1?β1?)/1?β2? ?
  2. 在其他情况下 ∣ Δ t ∣ < α |\Delta_t|<\alpha Δt?<α

第一种情况只有在极稀疏的情况下才会发生:即梯度除了当前时间步不为 0,其余时间步上梯度都为 0;而在不那么稀疏的情况下,有效步长会变得更小

( 1 ? β 1 ) = 1 ? β 2 (1-\beta_1)=\sqrt{1-\beta_2} (1?β1?)=1?β2? ? 时,我们有 ∣ m ^ t / v ^ t ∣ < 1 |\hat m_t/\hat v_t|<1 m^t?/v^t?<1,此时我们可以确定出上确界 ∣ Δ ∣ < α |\Delta|<\alpha Δ<α

在更通用的场景中,因为 ∣ E ( g ) / g 2 ∣ ? 1 |E(g)/\sqrt{g^2}|\leqslant1 E(g)/g2 ??1,我们有 m ^ t / v ^ t ≈ ± 1 \hat m_t/\sqrt{\hat v_t}\approx \pm1 m^t?/v^t? ?±1,于是每一个时间步的有效步长在参数空间中的量级近似受限于步长因子 α \alpha α, 即 ∣ Δ t ∣ < α ? o r ? ∣ Δ t ∣ ≈ α |\Delta_t|<\alpha\ or\ |\Delta_t| \approx\alpha Δt?<α?or?Δt?α。这可以理解为在当前参数值下确定了一个置信域区间,这个置信域区间提供了一些当前梯度估计没有提供的信息。于是,通过其通常便可以提前知道正确的 α \alpha α 取值的右边界

对于多数机器学习模型来说,我们知道好的最优状态是在参数空间内的集合域上有着极高的概率,例如,我们可以在参数上有一个先验分布。 α \alpha α 确定了参数空间内有效步长的上确界,通常也就可以推断出 α \alpha α 的正确量级,而最优解也可以从 θ 0 \theta_0 θ0? 开始通过一定数量的跌倒到达这个正确的量级

我们将 m ^ t / v ^ t \hat m_t/\hat v_t m^t?/v^t? 称作信噪比(SNR),如果 SNR 值较小,那么有效步长 Δ t \Delta_t Δt? 将接近于 0,目标函数也将收敛到极值。这是十分令人满意的,因为越小的 SNR 意味着就判断 m ^ t \hat m_t m^t? 的方向是否符合真实梯度方向这点上有着越大的不确定性。例如,SNR 值在最优解附近通常会趋近于 0,这同时也导致了在参数空间中使用更小的有效步长,这类似于一种自动退火的机制

对于不同的梯度范围来说,有效步长 Δ t \Delta_t Δt? 是不变的,如果将梯度 g g g 乘以一个系数 c c c 进行缩放,那么 m ^ t \hat m_t m^t? 也要乘以一个一样的系数因子 c c c,而 v ^ t \hat v_t v^t? 则乘以系数 c 2 c^2 c2,而最终的结果并不产生变化 ( c ? m ^ t ) / ( c 2 ? v ^ t ) = m ^ t / v ^ t (c\cdot\hat m_t)/(\sqrt{c^2\cdot\hat v_t})=\hat m_t/\sqrt{\hat v_t} (c?m^t?)/(c2?v^t? ?)=m^t?/v^t? ?

Adam 算法的优点

  • 惯性保持
    Adam 记录了梯度的一阶矩,即过往梯度与当前梯度的指数移动平均值,是的每一次更新时,上一次更新的梯度与当前更新的梯度不会相差太大,即梯度平滑、稳定的过度,可以适应不稳定的目标函数
  • 环境感知:
    Adam 记录了梯度的二阶矩,即过往梯度批平方与当前梯度平方的平均,为不同参数产生自适应的学习速率
  • 超参数易控制
    α 、 β 1 、 β 2 、 ? \alpha、\beta_1、\beta_2、\epsilon αβ1?β2?? 具有良好的解释性,且通常无需调整参数或仅需很少的调整

AdaMax

前面我们有 v t = ( 1 ? β 2 ) ∑ i = 1 t β 2 t ? i ? g i 2 v_t=(1-\beta_2)\sum^t_{i=1}\beta_2^{t-i}\cdot g_i^2 vt?=(1?β2?)i=1t?β2t?i??gi2?,这可以看成一个关于 g i g_i gi? L 2 L^2 L2 范数,换句话说,权重 θ t \theta_t θt? 的各维度上的增量是根据该维度上当前和过往梯度的 L 2 L^2 L2 范数。我们可以从 L 2 L^2 L2 范式的更新规则推广到 L p L^p Lp 范数的更新规则,但是 p p p 值越大,推广算法在数值上将变得不稳定。在特例中,作者让 p → ∞ p\rightarrow\infty p 可以的得到一个极其稳定且简单的算法

L p L^p Lp 范数的情况下, v t = ( 1 ? β 2 p ) ∑ i = 1 t β 2 p ( t ? i ) ? ∣ g i ∣ p v_t=(1-\beta_2^p)\sum^t_{i=1}\beta_2^{p(t-i)}\cdot| g_i|^p vt?=(1?β2p?)i=1t?β2p(t?i)??gi?p

在这里插入图片描述请添加图片描述
于是,我们就得到了算法 2 里面的公式 u t = m a x ( β 2 ? u t ? 1 , ∣ g t ∣ ) u_t=max(\beta_2\cdot u_{t-1}, |g_t|) ut?=max(β2??ut?1?,gt?),初始化时 u 0 = 0 u_0=0 u0?=0

在算法 2 里面我们不需要对初始化偏差作出修正。同时,参数更新的范围也有一个更加简洁的界限: ∣ Δ t ∣ ? α |\Delta_t|\leqslant\alpha Δt??α

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:31:26  更:2021-09-04 17:33:48 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/5 21:14:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码