笔记参考和图片来源@hanbingtao:零基础入门深度学习(6) - 长短时记忆网络(LSTM)

长短时记忆网络

从前的RNN容易产生梯度消失的问题。长短时记忆网络可以解决这一问题。

原始的RNN的隐藏层只有一个状态hh,它对于短期的输入非常敏感。假设再增加一个状态cc,让其保存长期的状态,如下图:

新增的状态cc称为单元状态(cell state)。将上图按时间维度展开:

对于时刻tt,LSTM的输入有三个:当前时刻网络的输入值xtx_t,上一时刻LSTM的输出值ht1h_{t-1},上一时刻的单元状态ct1c_{t-1}。LSTM的输出有两个:当前时刻LSTM的输出值hth_t,当前时刻的单元状态ctc_t。其中x,h,cx,h,c都是向量。

LSTM的关键即为如何控制长期状态cc。在这里,LSTM的思路是使⽤三个控制开关。第⼀个开关,负责控制继续保存⻓期状态cc;第⼆个开关,负责控制将即时状态输⼊到⻓期状态cc;第三个开关,负责控制是否把⻓期状态cc作为当前的LSTM的输出。三个开关的作⽤如下图所示:

长短时记忆网络的前向计算

以上思路在算法中的实现需要的概念。门实际上是一层全连接层,它的输入是一个向量,输出是一个0到1之间的实数向量。假设WW是门的权重向量,bb是偏置项,则门的表示为:

g(x)=σ(Wx+b)g(x)=\sigma(Wx+b)

在LSTM中,门是一种用于控制信息流动的机制,它通过一个全连接层加上Sigmoid\text{Sigmoid}函数实现,输出是一个取值在0到1之间的向量。门的作用是将这个输出与需要控制的信息向量按元素相乘,从而决定信息的保留程度:如果门输出为0,信息被完全屏蔽;如果输出为1,信息被完全保留;如果介于0和1,则表示信息部分通过。因此,门的状态可以看作是“半开半闭”的。

LSTM用两种门来控制单元状态cc的内容,一个是遗忘门,它决定了上一时刻的单元状态ct1c_{t-1}有多少保留到当前时刻ctc_t;另一个是输入门,它决定了当前时刻网络的输入xtx_t有多少保存到单元状态ctc_t

LSTM用输出门来控制单元状态ctc_t有多少输出到LSTM的当前输出值hth_t

遗忘门

ft=σ(Wf[ht1,xt]+bf)\mathbf{f}_t = \sigma\left(W_f \cdot [{\mathbf h}_{t-1}, {x}_t] + {b}_f\right)

其中, WfW_f是遗忘门的权重矩阵,[ht1,xt][h_{t-1},x_t]表示将两个向量相连,bfb_f是遗忘门的偏置项,σ\sigmaSigmoid\text{Sigmoid}函数。如果输入维度是dxd_x,隐藏层维度是dhd_h,单元状态维度是dcd_c(通常dc=dhd_c=d_h),则遗忘门的权重矩阵WfW_f的维度是dc×(dh+dx)d_c\times (d_h+d_x)。事实上,权重矩阵WfW_f是由两个矩阵拼接而成的:一个是wfhw_{fh},对应输入项ht1h_{t-1},其维度是dc×dhd_c\times d_h;另一个是WfxW_{fx},对应输入项xtx_t,其维度是dc×dxd_c\times d_x。即Wf=Wfhht1+WfxxtW_f=W_{fh}h_{t-1}+W_{fx}x_t.

下面是神经网络与反向传播算法一章中Sigmoid\text{Sigmoid}函数的回顾:

Sigmoid\text{Sigmoid}函数定义如下:

Sigmoid(x)=11+ex\text{Sigmoid}(x)=\frac1{1+e^{-x}}

那么对于输出yy

y=11+eωTxy=\frac1{1+e^{-\omega^T\cdot x}}

image.png

y=Sigmoid(x)y=\text{Sigmoid}(x),则y=y(1y)y'=y(1-y)

Sigmoid\text{Sigmoid}函数的输出值就是在0和1之间的,起到控制信息保留程度的作用。

下图展示了遗忘门的计算。

输入门

it=σ(Wi[ht1,xt]+bi)\mathbf{i}_t=\sigma(W_i\cdot[\mathbf h_{t-1},x_t]+b_i)

上式中,WiW_i是输入门的权重矩阵,bib_i是输入门的偏置项。

下图表示了输入门的计算。

下面计算用于描述当前输入的单元状态ct\mathbf{ c}'_t, 它是根据上一次的输出和本次输入来计算的:

ct=tanh(Wc[ht1,xt]+bc)\mathbf c'_t=\tanh(W_c\cdot[\mathbf h_{t-1},x_t]+b_c)

下图展示了ct\mathbf c'_t的计算。

image.png

现在计算当前时刻的单元状态ct\mathbf c_t。它是由上一次的单元状态ct1\mathbf c_{t-1}按元素乘以遗忘门ft\mathbf f_t,再用当前输入的单元状态ct\mathbf c'_t按元素乘以输入门it\mathbf i_t,再将两个积加和产生的:

ct=ftct1+itct\mathbf c_t=\mathbf f_t\circ\mathbf c_{t-1}+\mathbf i_t\circ\mathbf c'_t

下图展示了ct\mathbf c_t的计算。

下面是四个变量的对比表格:

符号 名称 含义 作用 计算公式
ft\mathbf f_t 遗忘门(forget gate) 控制旧记忆 ct1\mathbf c _{t-1} 保留多少 保留多少旧信息 σ(Wf[ht1,xt]+bf)\sigma(W_f \cdot[{\mathbf h}_{t-1}, {x}_t] + {b}_f)
it\mathbf i_t 输入门(input gate) 控制当前输入写入记忆的比例 控制新信息写入量 σ(Wi[ht1,xt]+bi)\sigma(W_i \cdot[{\mathbf h}_{t-1},{x}_t] +{b}_i)
ct\mathbf c '_t 候选单元状态(candidate cell state) 由当前输入和上一个状态生成的新记忆提案 候选要写进记忆的值 tanh(Wc[ht1,xt]+bc)\tanh(W_c \cdot[{\mathbf h}_{t-1}, {x}_t] + {b}_c)
ct\mathbf c _t 当前单元状态(cell state) 当前时刻 LSTM 的最终记忆 真实记忆内容(保留旧的+写入新的) ftct1+itctf_t \circ \mathbf c _{t-1} + i_t \circ \mathbf c '_t

这样就把LSTM关于当前的记忆ct\mathbf c'_t和长期的记忆ct1\mathbf c_{t-1}组合在一起,形成了新的单元状态ct\mathbf c_t。遗忘门的控制可以保留很久以前的信息,输入门的控制可以避免当前无关紧要的内容进入记忆。

输出门

ot=σ(Wo[ht1,xt]+bo)\mathbf o_t=\sigma(W_o\cdot[\mathbf h_{t-1},x_t]+b_o)

下图展示了输出门的计算。

image.png

LSTM的最终输出是由输出门和单元状态共同决定的:

ht=ottanh(ct)\mathbf h_t=\mathbf o_t\circ\tanh(\mathbf c_t)

下图展示了LSTM最终输出的计算。

至此为前向计算的所有步骤。

下面是两个变量的对比表格:ht\mathbf{h}_t 是每一步 LSTM 的输出,而 ct\mathbf c _t 是“控制”或“生成”这个输出的重要内部变量。

符号 名称 含义 特点
ct\mathbf c _t 单元状态(cell state) 长期记忆 可以跨很多时间步延续,信息“走得远”
ht\mathbf{h}_t 隐藏状态(hidden state) 当前输出,也可理解为短期记忆 每个时刻都要输出(用于下游任务)

长短时记忆网络的训练

LSTM训练算法框架

LSTM的训练算法仍然是反向传播算法。主要有三步:

  1. 前向计算每个神经元的输出值,即ft,it,ct,ot,ht\mathbf f_t,\mathbf i_t,\mathbf c_t,\mathbf o_t,\mathbf h_t五个向量的值
  2. 反向计算每个神经元的误差项δ\delta。与普通RNN一样,LSTM误差项的反向传播也是包括两个方向:一个是沿时间的反向传播,即从当前时刻tt开始,计算每个时刻的误差项;另一个是将误差项向上一层传播
  3. 根据相应的误差项,计算每个权重的梯度

公式和符号

在接下来的推导中,设定门的激活函数为Sigmoid\text{Sigmoid}函数,输出的激活函数为tanh\tanh函数。它们的导数分别为:

σ(z)=y=11+ezσ(z)=y(1y)tanh(z)=y=ezezez+eztanh(z)=1y2\begin {aligned}\sigma(z)&=y=\frac1{1+e^{-z}}\\\sigma'(z)&=y(1-y)\\\tanh(z)&=y=\frac{e^z-e^{-z}}{e^z+e^{-z}}\\\tanh'(z)&=1-y^2\end{aligned}

LSTM需要学习的参数共有8组,分别是遗忘门的权重矩阵WfW_f和偏置项bfb_f,输入门的权重矩阵WiW_i和偏置项bib_i,输出门的权重矩阵WoW_o和偏置项bob_o,以及计算单元状态的权重矩阵WcW_c和偏置项bcb_c。权重矩阵的两部分在反向传播中使用不同的公式,因此每个权重矩阵将以h,xh,x角标区分。

tt时刻,LSTM的输出值为ht\mathbf h_t。定义tt时刻的误差项δt\delta_t

δt=Eht\delta_t=\frac{\partial E}{\partial \mathbf h_t}

注意,和以往不同,这里假设误差项是损失函数对输出值的偏导数,而不是对加权输入nettlnet_t^l的导数

netf,t=Wf[ht1,xt]+bf=Wfhht1+Wfxxt+bfneti,t=Wi[ht1,xt]+bi=Wihht1+Wixxt+binetc,t=Wc[ht1,xt]+bc=Wchht1+Wcxxt+bcneto,t=Wo[ht1,xt]+bo=Wohht1+Woxxt+boδf,t=Enetf,tδi,t=Eneti,tδc,t=Enetc,tδo,t=Eneto,t\begin{aligned} \textbf{net}_{f,t} &= W_f[\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_f \\ &= W_{fh} \mathbf{h}_{t-1} + W_{fx} \mathbf{x}_t + \mathbf{b}_f \\[8pt] \textbf{net}_{i,t} &= W_i[\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_i \\ &= W_{ih} \mathbf{h}_{t-1} + W_{ix} \mathbf{x}_t + \mathbf{b}_i \\[8pt] \textbf{net}_{ c ',t} &= W_c[\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_c \\ &= W_{ch} \mathbf{h}_{t-1} + W_{cx} \mathbf{x}_t + \mathbf{b}_c \\[8pt] \textbf{net}_{o,t} &= W_o[\mathbf{h}_{t-1}, \mathbf{x}_t] + \mathbf{b}_o \\ &= W_{oh} \mathbf{h}_{t-1} + W_{ox} \mathbf{x}_t + \mathbf{b}_o \\[12pt] \delta_{f,t} &= \frac{\partial E}{\partial \textbf{net}_{f,t}} \\ \delta_{i,t} &= \frac{\partial E}{\partial \textbf{net}_{i,t}} \\ \delta_{ c ',t} &= \frac{\partial E}{\partial \textbf{net}_{ c ',t}} \\ \delta_{o,t} &= \frac{\partial E}{\partial \textbf{net}_{o,t}} \end{aligned}

误差项沿时间的反向传递

沿时间反向传递误差项,就是要计算出t1t-1时刻的误差项δt1\delta_{t-1}

δt1T=Eht1=Ehththt1=δtThtht1\begin{aligned} \delta_{t-1}^T &= \frac{\partial E}{\partial \mathbf{h}_{t-1}} \\ &= \frac{\partial E}{\partial \mathbf{h}_t} \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}} \\ &= \delta_t^T \frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}} \end{aligned}

htht1\frac{\partial \mathbf{h}_t}{\partial \mathbf{h}_{t-1}}是一个雅可比矩阵。如果隐藏层hh的维度是NN的话,那么它就是一个N×NN\times N矩阵。已知

ht=ottanh(ct)ct=ftct1+itct\begin{aligned}\mathbf h_t&=\mathbf o_t\circ\tanh(\mathbf c_t)\\\mathbf c_t&=\mathbf f_t\circ \mathbf c_{t-1}+\mathbf i_t\circ\mathbf c'_t\end{aligned}

其中,ot,ft,it,ct\mathbf o_t,\mathbf f_t,\mathbf i_t,\mathbf c'_t都是ht1\mathbf h_{t-1}的函数。因此,

δtThtht1=δo,tTneto,tht1+δf,tTnetf,tht1+δi,tTneti,tht1+δc,tTnetc,tht1\delta_t^T\frac{\partial\mathbf h_t}{\partial \mathbf h_{t-1}}=\delta_{o,t}^T \frac{\partial \text{net}_{o,t}}{\partial \mathbf{h}_{t-1}} + \delta_{f,t}^T \frac{\partial \text{net}_{f,t}}{\partial \mathbf{h}_{t-1}} + \delta_{i,t}^T \frac{\partial \text{net}_{i,t}}{\partial \mathbf{h}_{t-1}} + \delta_{ c ',t}^T \frac{\partial \text{net}_{ c ',t}}{\partial \mathbf{h}_{t-1}}

其中,

htot=diag[tanh(ct)]htct=diag[ot(1tanh(ct)2)]ctft=diag[ct1]ctit=diag[ct]ctct=diag[it]\begin{aligned}\frac{\partial \mathbf h_t}{\partial\mathbf o_t}&=\text{diag}[\tanh(\mathbf c_t)]\\\frac{\partial \mathbf h_t}{\partial \mathbf c_t}&=\text{diag}[\mathbf o_t\circ(1-\tanh(\mathbf c_t)^2)]\\\\ \frac{\partial \mathbf c _t}{\partial \mathbf{f}_t} &= \mathrm{diag}[\mathbf c _{t-1}] \\ \frac{\partial \mathbf c _t}{\partial \mathbf{i}_t} &= \mathrm{diag}[{\mathbf c '}_t] \\ \frac{\partial \mathbf c _t}{\partial {\mathbf c '}_t} &= \mathrm{diag}[\mathbf{i}_t] \end{aligned}

因为

ot=σ(neto,t)neto,t=Wohht1+Woxxt+boft=σ(netf,t)netf,t=Wfhht1+Wfxxt+bfit=σ(neti,t)neti,t=Wihht1+Wixxt+bict=tanh(netct)netct=Wchht1+Wcxxt+bc\begin{aligned} \mathbf{o}_t &= \sigma(\text{net}_{o,t}) \\ \text{net}_{o,t} &= W_{oh} \mathbf{h}_{t-1} + W_{ox} \mathbf{x}_t + \mathbf{b}_o \\[10pt] \mathbf{f}_t &= \sigma(\text{net}_{f,t}) \\ \text{net}_{f,t} &= W_{fh} \mathbf{h}_{t-1} + W_{fx} \mathbf{x}_t + \mathbf{b}_f \\[10pt] \mathbf{i}_t &= \sigma(\text{net}_{i,t}) \\ \text{net}_{i,t} &= W_{ih} \mathbf{h}_{t-1} + W_{ix} \mathbf{x}_t + \mathbf{b}_i \\[10pt] \mathbf c '_t &= \tanh(\text{net}_{\mathbf c '_t}) \\ \text{net}_{\mathbf c '_t} &= W_{ch} \mathbf{h}_{t-1} + W_{cx} \mathbf{x}_t + \mathbf{b}_c \end{aligned}

所以

otneto,t=diag[ot(1ot)]neto,tht1=Wohftnetf,t=diag[ft(1ft)]netf,tht1=Wfhitneti,t=diag[it(1it)]neti,tht1=Wihctnetct=diag[1ct2]netctht1=Wch\begin{aligned} \frac{\partial \mathbf{o}_t}{\partial \text{net}_{o,t}} &= \mathrm{diag}[\mathbf{o}_t \circ (1 - \mathbf{o}_t)] \\ \frac{\partial \text{net}_{o,t}}{\partial \mathbf{h}_{t-1}} &= W_{oh} \\[10pt] \frac{\partial \mathbf{f}_t}{\partial \text{net}_{f,t}} &= \mathrm{diag}[\mathbf{f}_t \circ (1 - \mathbf{f}_t)] \\ \frac{\partial \text{net}_{f,t}}{\partial \mathbf{h}_{t-1}} &= W_{fh} \\[10pt] \frac{\partial \mathbf{i}_t}{\partial \text{net}_{i,t}} &= \mathrm{diag}[\mathbf{i}_t \circ (1 - \mathbf{i}_t)] \\ \frac{\partial \text{net}_{i,t}}{\partial \mathbf{h}_{t-1}} &= W_{ih} \\[10pt] \frac{\partial \mathbf c '_t}{\partial \text{net}_{\mathbf c '_t}} &= \mathrm{diag}[1 - \mathbf c '^2_t ] \\ \frac{\partial \text{net}_{\mathbf c '_t}}{\partial \mathbf{h}_{t-1}} &= W_{ch} \end{aligned}

将以上全部代入得:

δt1=δo,tTneto,tht1+δf,tTnetf,tht1+δi,tTneti,tht1+δctTnetctht1=δo,tTWoh+δf,tTWfh+δi,tTWih+δctTWch\begin{aligned} \delta_{t-1} &= \delta_{o,t}^T \frac{\partial \text{net}_{o,t}}{\partial \mathbf{h}_{t-1}} + \delta_{f,t}^T \frac{\partial \text{net}_{f,t}}{\partial \mathbf{h}_{t-1}} + \delta_{i,t}^T \frac{\partial \text{net}_{i,t}}{\partial \mathbf{h}_{t-1}} + \delta_{c'_t}^T \frac{\partial \text{net}_{c'_t}}{\partial \mathbf{h}_{t-1}} \\[6pt] &= \delta_{o,t}^T W_{oh} + \delta_{f,t}^T W_{fh} + \delta_{i,t}^T W_{ih} + \delta_{c'_t}^T W_{ch} \end{aligned}

根据δo,t,δf,t,δi,t,δc,t\delta_{o,t},\delta_{f,t},\delta_{i,t},\delta_{c',t}的定义可知

δo,tT=δtTtanh(ct)ot(1ot)δf,tT=δtTot(1tanh(ct)2)ct1ft(1ft)δi,tT=δtTot(1tanh(ct)2)ctit(1it)δctT=δtTot(1tanh(ct)2)it(1ct2)\begin{aligned} \delta_{o,t}^T &= \delta_t^T \circ \tanh(\mathbf c _t) \circ \mathbf{o}_t \circ (1 - \mathbf{o}_t) \\[6pt] \delta_{f,t}^T &= \delta_t^T \circ \mathbf{o}_t \circ (1 - \tanh(\mathbf c _t)^2) \circ \mathbf c _{t-1} \circ \mathbf{f}_t \circ (1 - \mathbf{f}_t) \\[6pt] \delta_{i,t}^T &= \delta_t^T \circ \mathbf{o}_t \circ (1 - \tanh(\mathbf c _t)^2) \circ \mathbf c '_t \circ \mathbf{i}_t \circ (1 - \mathbf{i}_t) \\[6pt] \delta_{c'_t}^T &= \delta_t^T \circ \mathbf{o}_t \circ (1 - \tanh(\mathbf c _t)^2) \circ \mathbf{i}_t \circ (1 - \mathbf c '^2_t) \end{aligned}

δo,tT\delta_{o,t}^T为例进行推导:
定义输出门的误差项为:

δo,t=Eneto,t\delta_{o,t}=\frac{\partial E}{\partial \text{net}_{o,t}}

Step 1:LSTM 输出定义

ht=ottanh(ct)\mathbf{h}_t = \mathbf{o}_t \circ \tanh(\mathbf c _t)

Step 2:链式法则求导
设:

δt=Eht\delta_t = \frac{\partial E}{\partial \mathbf{h}_t}

根据链式法则:

Eot=Ehthtot=δttanh(ct)\frac{\partial E}{\partial \mathbf{o}_t}= \frac{\partial E}{\partial \mathbf{h}_t} \circ \frac{\partial \mathbf{h}_t}{\partial \mathbf{o}_t}= \delta_t \circ \tanh(\mathbf c _t)

Step 3:激活函数导数(sigmoid)

ot=σ(neto,t)otneto,t=ot(1ot)\mathbf{o}_t = \sigma(\text{net}_{o,t})\Rightarrow\frac{\partial \mathbf{o}_t}{\partial \text{net}_{o,t}} = \mathbf{o}_t \circ (1 - \mathbf{o}_t)

Step 4:合并得到最终结果

δo,t=δttanh(ct)ot(1ot)\delta_{o,t} = \delta_t \circ \tanh(\mathbf c _t) \circ \mathbf{o}_t \circ (1 - \mathbf{o}_t)

上四式就是将误差沿时间反向传播一个时刻的公式。可以写出将误差项向前传递到任意时间kk时刻的公式:

δkT=j=kt1(δo,jTWoh+δf,jTWfh+δi,jTWih+δcjTWch)\delta_k^T = \prod_{j = k}^{t-1} \left( \delta_{o,j}^T W_{oh} + \delta_{f,j}^T W_{fh} + \delta_{i,j}^T W_{ih} + \delta_{c'_j}^T W_{ch} \right)

将误差项传递到上一层

假设当前层为ll,定义l1l-1层的误差项是误差函数对l1l-1层的加权输入的导数,即:

δtl1=Enettl1\delta_t^{l-1}=\frac{\partial E}{\partial \mathbf{net}_t^{l-1}}

本次输入xtx_t由下面公式计算:

xtl=fl1(nettl1)\mathbf x_t^l=f^{l-1}(\mathbf {net}_t^{l-1})

其中,fl1f^{l-1}表示第l1l-1层的激活函数。
因为 netf,tl,neti,tl,netc,tl,neto,tl\text{net}^{l}_{f,t}, \text{net}^{l}_{i,t}, \text{net}^{l}_{\mathbf c ',t}, \text{net}^{l}_{o,t} 都是 xt\mathbf{x}_t 的函数,而 xt\mathbf{x}_t又是 nettl1\text{net}^{l-1}_t 的函数,因此要求出 EEnettl1\text{net}^{l-1}_t的导数,就需要使用全导数公式:

Enettl1=Enetf,tlnetf,tlxtlxtlnettl1+Eneti,tlneti,tlxtlxtlnettl1+Enetc,tlnetc,tlxtlxtlnettl1+Eneto,tlneto,tlxtlxtlnettl1=δf,tTWfxf(nettl1)+δi,tTWixf(nettl1)+δc,tTWcxf(nettl1)+δo,tTWoxf(nettl1)=(δf,tTWfx+δi,tTWix+δc,tTWcx+δo,tTWox)f(nettl1)\begin{aligned} \frac{\partial E}{\partial \text{net}_t^{l-1}} &= \frac{\partial E}{\partial \text{net}_{f,t}^{l}} \cdot \frac{\partial \text{net}_{f,t}^{l}}{\partial \mathbf{x}_t^{l}} \cdot \frac{\partial \mathbf{x}_t^{l}}{\partial \text{net}_t^{l-1}} + \frac{\partial E}{\partial \text{net}_{i,t}^{l}} \cdot \frac{\partial \text{net}_{i,t}^{l}}{\partial \mathbf{x}_t^{l}} \cdot \frac{\partial \mathbf{x}_t^{l}}{\partial \text{net}_t^{l-1}} \\ &\quad + \frac{\partial E}{\partial \text{net}_{\mathbf c ',t}^{l}} \cdot \frac{\partial \text{net}_{\mathbf c ',t}^{l}}{\partial \mathbf{x}_t^{l}} \cdot \frac{\partial \mathbf{x}_t^{l}}{\partial \text{net}_t^{l-1}} + \frac{\partial E}{\partial \text{net}_{o,t}^{l}} \cdot \frac{\partial \text{net}_{o,t}^{l}}{\partial \mathbf{x}_t^{l}} \cdot \frac{\partial \mathbf{x}_t^{l}}{\partial \text{net}_t^{l-1}} \\[8pt] &= \delta_{f,t}^T W_{fx} \circ f'(\text{net}_t^{l-1}) + \delta_{i,t}^T W_{ix} \circ f'(\text{net}_t^{l-1}) + \delta_{\mathbf c ',t}^T W_{cx} \circ f'(\text{net}_t^{l-1}) + \delta_{o,t}^T W_{ox} \circ f'(\text{net}_t^{l-1}) \\[8pt] &= \left( \delta_{f,t}^T W_{fx} + \delta_{i,t}^T W_{ix} + \delta_{\mathbf c ',t}^T W_{cx} + \delta_{o,t}^T W_{ox} \right) \circ f'(\text{net}_t^{l-1}) \end{aligned}

权重梯度的计算

Wfh,Wih,Wch,WohW_{fh},W_{ih},W_{ch},W_{oh}的权重梯度是各个时刻梯度之和,首先求出它们在tt时刻的梯度。

已经求得了误差项δo,t,δf,t,δi,t,δc,t\delta_{o,t},\delta_{f,t},\delta_{i,t},\delta_{c',t},则可以求出:

EWoh,t =Eneto,tneto,tWoh,t =δo,tht1TEWfh,t =Enetf,tnetf,tWfh,t =δf,tht1TEWih,t =Eneti,tneti,tWih,t =δi,tht1TEWch,t =Enetc,tnetc,tWch,t =δc,tht1T\begin{aligned} \frac{\partial E}{\partial W_{oh,t}}  &= \frac{\partial E}{\partial \text{net}_{o,t}} \cdot \frac{\partial \text{net}_{o,t}}{\partial W_{oh,t}}  = \delta_{o,t} \mathbf{h}_{t-1}^T \\[10pt] \frac{\partial E}{\partial W_{fh,t}}  &= \frac{\partial E}{\partial \text{net}_{f,t}} \cdot \frac{\partial \text{net}_{f,t}}{\partial W_{fh,t}}  = \delta_{f,t} \mathbf{h}_{t-1}^T \\[10pt] \frac{\partial E}{\partial W_{ih,t}}  &= \frac{\partial E}{\partial \text{net}_{i,t}} \cdot \frac{\partial \text{net}_{i,t}}{\partial W_{ih,t}}  = \delta_{i,t} \mathbf{h}_{t-1}^T \\[10pt] \frac{\partial E}{\partial W_{ch,t}}  &= \frac{\partial E}{\partial \text{net}_{\mathbf c ',t}} \cdot \frac{\partial \text{net}_{\mathbf c ',t}}{\partial W_{ch,t}}  = \delta_{\mathbf c ',t} \mathbf{h}_{t-1}^T \end{aligned}

那么将各个时刻的梯度加在一起,就可以得到最终的梯度:

EWoh=j=1tδo,jhj1TEWfh=j=1tδf,jhj1TEWih=j=1tδi,jhj1TEWch=j=1tδcjhj1T\begin{aligned} \frac{\partial E}{\partial W_{oh}} &= \sum_{j=1}^{t} \delta_{o,j} \, \mathbf{h}_{j-1}^T \\[6pt] \frac{\partial E}{\partial W_{fh}} &= \sum_{j=1}^{t} \delta_{f,j} \, \mathbf{h}_{j-1}^T \\[6pt] \frac{\partial E}{\partial W_{ih}} &= \sum_{j=1}^{t} \delta_{i,j} \, \mathbf{h}_{j-1}^T \\[6pt] \frac{\partial E}{\partial W_{ch}} &= \sum_{j=1}^{t} \delta_{c'_j} \, \mathbf{h}_{j-1}^T \end{aligned}

偏置项bf,bi,bc,bo\mathbf b_f,\mathbf b_i,\mathbf b_c,\mathbf b_o的梯度,也是将各个时刻的梯度加在一起:

Ebo=j=1tδo,jEbi=j=1tδi,jEbf=j=1tδf,jEbc=j=1tδcj\begin{aligned} \frac{\partial E}{\partial \mathbf{b}_o} &= \sum_{j=1}^{t} \delta_{o,j} \\[6pt] \frac{\partial E}{\partial \mathbf{b}_i} &= \sum_{j=1}^{t} \delta_{i,j} \\[6pt] \frac{\partial E}{\partial \mathbf{b}_f} &= \sum_{j=1}^{t} \delta_{f,j} \\[6pt] \frac{\partial E}{\partial \mathbf{b}_c} &= \sum_{j=1}^{t} \delta_{c'_j} \end{aligned}

对于Wfx,Wix,Wcx,WoxW_{fx},W_{ix},W_{cx},W_{ox}的权重梯度:

EWox=δo,txtTEWfx=δf,txtTEWix=δi,txtTEWcx=δc,txtT\begin{aligned} \frac{\partial E}{\partial W_{ox}} &= \delta_{o,t} \, \mathbf{x}_t^T \\[6pt] \frac{\partial E}{\partial W_{fx}} &= \delta_{f,t} \, \mathbf{x}_t^T \\[6pt] \frac{\partial E}{\partial W_{ix}} &= \delta_{i,t} \, \mathbf{x}_t^T \\[6pt] \frac{\partial E}{\partial W_{cx}} &= \delta_{c',t} \, \mathbf{x}_t^T \end{aligned}

以上。