• 指数移动平均EMA


    介绍

    指数移动平均(Exponential Moving Average,简称 EMA)是一种常用的平滑方法,通常用于时间序列数据的平滑处理。EMA 可以减小噪声的影响,使得数据更加平滑,并且能够自适应地调整权重,更好地反映时间序列的趋势。

    EMA 的计算公式如下:

    E M A t = { x 0 , t = 0 α x t + ( 1 − α ) E M A t − 1 , t > 0 EMA_t =

    {x0,t=0αxt+(1α)EMAt1,t>0" role="presentation" style="position: relative;">{x0,t=0αxt+(1α)EMAt1,t>0
    EMAt={x0,αxt+(1α)EMAt1,t=0t>0

    其中, x t x_t xt 表示时间 t t t 的观测值, E M A t EMA_t EMAt 表示时间 t t t 的指数移动平均值, α \alpha α 是平均因子,通常取值范围为 ( 0 , 1 ) (0,1) (0,1)。当 α \alpha α 较小时,EMA 更加平滑;当 α \alpha α 较大时,EMA 更加灵敏,能够更快地反映最近的变化。

    在实际应用中,为了保持数据的平滑和稳定,通常需要对 EMA 进行偏差校正。偏差校正的目的是将 EMA 的初始值设置为第一个观测值 x 0 x_0 x0,并调整权重,使得 EMA 能够更加准确地反映时间序列的趋势。EMA 的偏差校正公式如下:

    E M A t ′ = E M A t 1 − α t EMA'_t = \frac{EMA_t}{1-\alpha^t} EMAt=1αtEMAt

    其中, E M A t ′ EMA'_t EMAt 表示经过偏差校正后的 EMA 值。

    在机器学习中,EMA 通常用于优化算法的参数更新。例如,在使用 Adam 优化算法时,每次迭代时会计算参数的一阶矩估计和二阶矩估计,并使用 EMA 对其进行平滑处理,以获得更加稳定和有效的参数更新。具体来说,Adam 优化算法中的 EMA 公式如下:

    m t = β 1 m t − 1 + ( 1 − β 1 ) g t v t = β 2 v t − 1 + ( 1 − β 2 ) g t 2 m ^ t = m t 1 − β 1 t v ^ t = v t 1 − β 2 t θ t = θ t − 1 − η v ^ t + ϵ m ^ t

    mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2m^t=mt1β1tv^t=vt1β2tθt=θt1ηv^t+ϵm^t" role="presentation" style="position: relative;">mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2m^t=mt1β1tv^t=vt1β2tθt=θt1ηv^t+ϵm^t
    mtvtm^tv^tθt=β1mt1+(1β1)gt=β2vt1+(1β2)gt2=1β1tmt=1β2tvt=θt1v^t +ϵηm^t

    其中, m t m_t mt v t v_t vt 分别表示参数的一阶矩估计和二阶矩估计, g t g_t gt 表示参数的梯度, β 1 \beta_1 β1 β 2 \beta_2 β2 分别是一阶矩和二阶矩的衰减因子, m ^ t \hat{m}_t m^t v ^ t \hat{v}_t v^t 分别是经过偏差校正后的一阶矩估计和二阶矩估计, η \eta η 是学习率, ϵ \epsilon ϵ 是一个很小的数,用于防止除数为零。在这个公式中,EMA 对一阶矩估计 m t m_t mt 和二阶矩估计 v t v_t vt 进行了平滑处理,并且使用了偏差校正,以获得更加稳定和有效的参数更新。

    示例代码

    使用torch.lerp函数实现EMA:

    def moving_average(model, model_test, beta=0.999):
        for param, param_test in zip(model.parameters(), model_test.parameters()):
            param_test.data = torch.lerp(param.data, param_test.data, beta)
    
    • 1
    • 2
    • 3

    补充:torch.lerp

    torch.lerp 是 PyTorch 中的一个函数,用于执行线性插值。它的函数原型如下:

    torch.lerp(start, end, weight, out=None)
    
    • 1

    其中,各参数的含义如下:

    • start:起始值的张量。
    • end:结束值的张量。
    • weight:插值系数的张量,取值范围为 [0, 1]。
    • out:输出张量(可选)。

    torch.lerp 的返回值是一个张量,表示线性插值的结果。

    以下是一个使用 torch.lerp 函数的示例代码:

    import torch
    
    # 创建起始值和结束值张量
    start = torch.tensor([1.0, 2.0, 3.0])
    end = torch.tensor([4.0, 5.0, 6.0])
    
    # 创建插值系数张量
    weight = torch.tensor([0.25, 0.5, 0.75])
    
    # 执行线性插值
    result = torch.lerp(start, end, weight)
    
    # 输出结果
    print(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这个例子中,我们创建了两个形状为 3 3 3 的张量 startend,分别表示起始值和结束值。然后,我们创建了一个形状为 3 3 3 的张量 weight,它表示插值系数。最后,我们使用 torch.lerp 函数对 startend 进行线性插值,并将结果保存在 result 变量中。最终,我们输出了插值的结果。

    需要注意的是,torch.lerp 函数要求起始值、结束值和插值系数的张量形状必须相同,且插值系数的取值范围必须在 [0, 1] 之间。如果插值系数的取值范围不在 [0, 1] 之间,可以使用 torch.clamp 函数对其进行截断。如果指定了输出张量 out,则插值结果会写入到 out 中,并返回 out 张量。

  • 相关阅读:
    一、docker的安装部署 - docker常用命令 - 底层隔离机制
    BD Rhapsody单细胞分析系统
    JavaWeb(一)
    error C2589: ‘(‘: illegal token on right side of ‘::‘
    如何禁止复制电脑文档到U盘或其它移动设备
    C++ —— 缺省参数和函数重载
    Postgresql源码(59)事务ID取值和判断规律总结
    Python tkinter - 第10章 文本控件(Text)方法
    【华为OD机试】按身高和体重排队【2023 B卷|100分】
    【组成原理-存储】Cache 和页式虚拟存储器
  • 原文地址:https://blog.csdn.net/qq_36892712/article/details/133774755