昇腾社区首页
中文
注册
开发者
下载

aclnnLstmBackward

产品支持情况

[object Object]undefined

功能说明

  • 算子功能:LSTM的反向传播,计算正向输入input、权重params、初始状态hx的梯度。

  • 计算公式:

    [object Object][object Object]undefined

    其中:

    • σ\sigma 是 sigmoid 函数
    • \odot 表示逐元素乘法 (Hadamard product)
    • WW_* 是可学习的权重矩阵
    • bb_* 是可学习的偏置项[object Object]
    [object Object]
    • 总损失:L=t=1TLtL = \sum_{t=1}^{T} L_t
    • 隐藏状态梯度:δht=Lht\delta\mathbf{h}_t = \frac{\partial L}{\partial \mathbf{h}_t}
    • 细胞状态梯度:δct=Lct\delta\mathbf{c}_t = \frac{\partial L}{\partial \mathbf{c}_t}[object Object]
    [object Object]
    • 初始化
    δhT=0,δcT=0,fT=0\delta\mathbf{h}_{T} = \mathbf{0}, \quad \delta\mathbf{c}_{T} = \mathbf{0}, \quad \mathbf{f}_{T} = \mathbf{0}
    • 循环 t=T1t = T - 100

      1.当前隐藏状态梯度

      δht=Ltht+δhnext\delta\mathbf{h}_t = \frac{\partial L_t}{\partial \mathbf{h}_t} + \delta\mathbf{h}_{\text{next}}

      2.当前细胞状态梯度

      δct=δhtot(1tanh2(ct))+δcnextfnext\delta\mathbf{c}_t = \delta\mathbf{h}_t \odot \mathbf{o}_t \odot (1 - \tanh^2(\mathbf{c}_t)) + \delta\mathbf{c}_{\text{next}} \odot \mathbf{f}_{\text{next}}

      3.门控梯度计算

      δot=δhttanh(ct)ot(1ot)\delta\mathbf{o}_t = \delta\mathbf{h}_t \odot \tanh(\mathbf{c}_t) \odot \mathbf{o}_t \odot (1 - \mathbf{o}_t) δgt=δctit(1gt2)\delta\mathbf{g}_t = \delta\mathbf{c}_t \odot \mathbf{i}_t \odot (1 - \mathbf{g}_t^2) δit=δctgtit(1it)\delta\mathbf{i}_t = \delta\mathbf{c}_t \odot \mathbf{g}_t \odot \mathbf{i}_t \odot (1 - \mathbf{i}_t) δft=δctct1ft(1ft)\delta\mathbf{f}_t = \delta\mathbf{c}_t \odot \mathbf{c}_{t-1} \odot \mathbf{f}_t \odot (1 - \mathbf{f}_t)

      4.参数梯度累加

      LWf+=δftzt\frac{\partial L}{\partial \mathbf{W}_f} \mathrel{+}= \delta\mathbf{f}_t \mathbf{z}_t^\top Lbf+=δft\frac{\partial L}{\partial \mathbf{b}_f} \mathrel{+}= \delta\mathbf{f}_t LWi+=δitzt\frac{\partial L}{\partial \mathbf{W}_i} \mathrel{+}= \delta\mathbf{i}_t \mathbf{z}_t^\top Lbi+=δit\frac{\partial L}{\partial \mathbf{b}_i} \mathrel{+}= \delta\mathbf{i}_t LWg+=δgtzt\frac{\partial L}{\partial \mathbf{W}_g} \mathrel{+}= \delta\mathbf{g}_t \mathbf{z}_t^\top Lbg+=δgt\frac{\partial L}{\partial \mathbf{b}_g} \mathrel{+}= \delta\mathbf{g}_t LWo+=δotzt\frac{\partial L}{\partial \mathbf{W}_o} \mathrel{+}= \delta\mathbf{o}_t \mathbf{z}_t^\top Lbo+=δot\frac{\partial L}{\partial \mathbf{b}_o} \mathrel{+}= \delta\mathbf{o}_t

      5.传播到前一时刻

      δzt=Wfδft+Wiδit+Wgδgt+Woδot\delta\mathbf{z}_t = \mathbf{W}_f^\top \delta\mathbf{f}_t + \mathbf{W}_i^\top \delta\mathbf{i}_t + \mathbf{W}_g^\top \delta\mathbf{g}_t + \mathbf{W}_o^\top \delta\mathbf{o}_t δhprev=δzt[1:dim(ht1)]\delta\mathbf{h}_{\text{prev}} = \delta\mathbf{z}_t[1:\dim(\mathbf{h}_{t-1})] δcprev=δctft\delta\mathbf{c}_{\text{prev}} = \delta\mathbf{c}_t \odot \mathbf{f}_t

      6.更新传播变量

      δhnextδhprev\delta\mathbf{h}_{\text{next}} \leftarrow \delta\mathbf{h}_{\text{prev}} δcnextδcprev\delta\mathbf{c}_{\text{next}} \leftarrow \delta\mathbf{c}_{\text{prev}} fnextft\mathbf{f}_{\text{next}} \leftarrow \mathbf{f}_t
    [object Object][object Object]
    • 细胞状态梯度推导

      δct=Lhthtct+Lct+1ct+1ct\delta\mathbf{c}_t = \frac{\partial L}{\partial \mathbf{h}_t} \frac{\partial \mathbf{h}_t}{\partial \mathbf{c}_t} + \frac{\partial L}{\partial \mathbf{c}_{t+1}} \frac{\partial \mathbf{c}_{t+1}}{\partial \mathbf{c}_t}

      其中:

      htct=ot(1tanh2(ct))\frac{\partial \mathbf{h}_t}{\partial \mathbf{c}_t} = \mathbf{o}_t \odot (1 - \tanh^2(\mathbf{c}_t)) ct+1ct=ft+1\frac{\partial \mathbf{c}_{t+1}}{\partial \mathbf{c}_t} = \mathbf{f}_{t+1}
    • 遗忘门梯度推导

      δft=Laft=δctct1ft(1ft)\delta\mathbf{f}_t = \frac{\partial L}{\partial \mathbf{a}_f^t} = \delta\mathbf{c}_t \odot \mathbf{c}_{t-1} \odot \mathbf{f}_t \odot (1 - \mathbf{f}_t)
    • 参数梯度推导

      LWf=t=1Tδftzt\frac{\partial L}{\partial \mathbf{W}_f} = \sum_{t=1}^{T} \delta\mathbf{f}_t \mathbf{z}_t^\top
    • LSTM 梯度流动特性

      长程依赖处理

      cTc1=k=2Tfk(对角矩阵)\frac{\partial \mathbf{c}_T}{\partial \mathbf{c}_1} = \prod_{k=2}^{T} \mathbf{f}_k \quad \text{(对角矩阵)}
    [object Object][object Object]
    • h(l)\mathbf{h}^{(l)}:第 ll 层的隐藏状态(l=1,2,,Ll = 1, 2, \dots, L,其中 LL 为总层数)
    • LL:损失函数
    • Lh(l)\frac{\partial L}{\partial \mathbf{h}^{(l)}}:损失函数对第 ll 层隐藏状态的梯度

    核心传播公式

    梯度从顶层(l=Ll = L)向底层(l=1l = 1)传播,层间关系由链式法则给出:

    Lh(l1)=Lh(l)h(l)h(l1)\frac{\partial L}{\partial \mathbf{h}^{(l-1)}} = \frac{\partial L}{\partial \mathbf{h}^{(l)}} \cdot \frac{\partial \mathbf{h}^{(l)}}{\partial \mathbf{h}^{(l-1)}}

    其中:

    • Lh(l)\frac{\partial L}{\partial \mathbf{h}^{(l)}}:当前层 ll 的梯度(已由上一层反向传播得到)
    • h(l)h(l1)\frac{\partial \mathbf{h}^{(l)}}{\partial \mathbf{h}^{(l-1)}}:第 ll 层隐藏状态对第 l1l-1 层隐藏状态的雅可比矩阵
    • \cdot:矩阵乘法(梯度传播本质为向量-矩阵乘法)

    即每层的输出的梯度dx为上一层输入的梯度dy。

    [object Object]

函数原型

每个算子分为,必须先调用“aclnnLstmBackwardGetWorkspaceSize”接口获取计算所需workspace大小以及包含了算子计算流程的执行器,再调用“aclnnLstmBackward”接口执行计算。

[object Object]
[object Object]

aclnnLstmBackwardGetWorkspaceSize

  • 参数说明:

    [object Object]
  • 返回值:

    aclnnStatus: 返回状态码,具体参见

    第一段接口完成入参校验,出现以下场景时报错:

    [object Object]

aclnnLstmBackward

  • 参数说明:

    [object Object]
  • 返回值:

    aclnnStatus: 返回状态码,具体参见

约束说明

  • 确定性计算:

    • aclnnLstmBackward默认确定性实现。
  • 边界值场景说明:

    • 当输入是Inf时,输出为NAN。
    • 当输入是NaN时,输出为NaN。

调用示例

示例代码如下,仅供参考,具体编译和执行过程请参考

[object Object]