# AdamWeightDecay — MindSpore Signal+ 使用手册 alpha 文档

# AdamWeightDecay

对权重张量执行 Adam Weight Decay 优化更新。

> \[\begin{split}\begin{aligned} m_t &= \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t \\ v_t &= \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2 \\ \hat{m}_t &= \frac{m_t}{\sqrt{v_t} + \epsilon} \\ var_t &= var_{t-1} - lr \cdot (\hat{m}_t + decay \cdot var_{t-1}) \end{aligned}\end{split}\]
> 输入：

>   - var - 待更新权重张量首地址。

>   - m - 一阶动量张量首地址。

>   - v - 二阶动量张量首地址。

>   - gradient - 梯度张量首地址。

>   - lr - 学习率。

>   - beta1 - 一阶动量衰减系数。

>   - beta2 - 二阶动量衰减系数。

>   - epsilon - 数值稳定项。

>   - decay - 权重衰减系数。

>   - start - 参与计算的起始索引（闭区间）。

>   - end - 参与计算的结束索引（开区间）。

>   - core_mask(int, 可选) - 核掩码（仅适用于共享存储版本）。

> 输出：

>   - var - 原地写回更新后的权重张量。

>   - m - 原地写回更新后的一阶动量张量。

>   - v - 原地写回更新后的二阶动量张量。

> 支持平台：

>   `FT78NE` `MT7004`

> 备注

> - FT78NE 支持 fp32 数据类型。

> - MT7004 支持 fp16、fp32 数据类型。

共享存储版本:

void hp_adamweightdecay_s(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)

void fp_adamweightdecay_s(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int start, int end, int core_mask)

  C调用示例：

       1// FT78NE 多核示例
       2#include <stdio.h>
       3
       4int main(void) {
       5        float *var = (float *)0xA0000000;        // DDR 存储
       6        float *m = (float *)0xB0000000;
       7        float *v = (float *)0xC0000000;
       8        float *gradient = (float *)0xD0000000;
       9        int start = 0;
      10        int end = 4096;
      11        int core_mask = 0xff;
      12        float lr = 1e-3f;
      13        float beta1 = 0.9f;
      14        float beta2 = 0.999f;
      15        float epsilon = 1e-8f;
      16        float decay = 1e-2f;
      17        fp_adamweightdecay_s(var, m, v, gradient, lr,
      18                                                 beta1, beta2, epsilon, decay,
      19                                                 start, end, core_mask);
      20        return 0;
      21}

私有存储版本:

void hp_adamweightdecay_p(half *var, half *m, half *v, const half *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)

void fp_adamweightdecay_p(float *var, float *m, float *v, const float *gradient, float lr, float beta1, float beta2, float epsilon, float decay, int length)

  C调用示例：

       1// MT7004 单核示例
       2#include <stdio.h>
       3
       4int main(void) {
       5        half *var = (half *)0x10000000;        // L2 存储
       6        half *m = (half *)0x10002000;
       7        half *v = (half *)0x10004000;
       8        half *gradient = (half *)0x10006000;
       9        int length = 2048;
      10        float lr = 5e-4f;
      11        float beta1 = 0.9f;
      12        float beta2 = 0.999f;
      13        float epsilon = 1e-6f;
      14        float decay = 5e-3f;
      15        hp_adamweightdecay_p(var, m, v, gradient, lr,
      16                                                 beta1, beta2, epsilon, decay,
      17                                                 length);
      18        return 0;
      19}