RNN+LSTM

一、RNN

RNN的时间顺序展开图:

RNN的节点内部结构:

其中'MatMul'代表矩阵相乘,'+'代表矩阵相加,'tanh'代表对应的激活函数。Wh为隐状态矩阵,Wx为权重矩阵,其中hprev和x为输入,hnext为输出。公式如下:

$$
oldsymbol{h}_{next}= anh left(oldsymbol{h}_{prev} oldsymbol{W}_{h}+oldsymbol{x}_{next} oldsymbol{W}_{x}+oldsymbol{b} ight)
$$

二、LSTM

如图所示, LSTM 与 RNN 的接口的不同之处在于,LSTM 还有 路径 $oldsymbol{c}_{circ}$ 这个 $oldsymbol{c}$ 称为记忆单元 (或者简称为 “单元” ), 相当于 LSTM 专用 的记忆部门。
记忆单元的特点是, 仅在 LSTM 层内部接收和传递数据。也就是说, 记忆单元在 LSTM 层内部结束工作,不向其他层输出。而 LSTM 的隐藏状 态 $oldsymbol{h}$ 和 $mathrm{RNN}$ 层相同, 会被(向上)输出到其他层。

$ anh$ 的输出是 $-1.0 sim 1.0$ 的实数。我们可以认为这个 $-1.0 sim 1.0$ 的 数值表示某种被编码的 “信息” 的强弱 (程度)。而 sigmoid 函数的 输出是 $0.0 sim 1.0$ 的实数, 表示数据流出的比例。因此, 在大多数情 况下, 门使用 sigmoid 函数作为激活函数, 而包含实质信息的数据 则使用 $ anh$ 函数作为激活函数。

下图为LSTM内部结构图:

 

$$
egin{gathered}
oldsymbol{f}=sigmaleft(oldsymbol{x}_{t} oldsymbol{W}_{x}^{(mathrm{f})}+oldsymbol{h}_{t-1} oldsymbol{W}_{h}^{(mathrm{f})}+oldsymbol{b}^{(mathrm{f})} ight) \
oldsymbol{g}= anh left(oldsymbol{x}_{t} oldsymbol{W}_{x}^{(mathrm{g})}+oldsymbol{h}_{t-1} oldsymbol{W}_{h}^{(mathrm{g})}+oldsymbol{b}^{(mathrm{g})} ight) \
oldsymbol{i}=sigmaleft(oldsymbol{x}_{t} oldsymbol{W}_{x}^{(mathrm{i})}+oldsymbol{h}_{t-1} oldsymbol{W}_{h}^{(mathrm{i})}+oldsymbol{b}^{(mathrm{i})} ight) \
oldsymbol{o}=sigmaleft(oldsymbol{x}_{t} oldsymbol{W}_{x}^{(mathrm{o})}+oldsymbol{h}_{t-1} oldsymbol{W}_{h}^{(mathrm{o})}+oldsymbol{b}^{(mathrm{o})} ight) \
oldsymbol{c}_{t}=oldsymbol{f} odot oldsymbol{c}_{t-1}+oldsymbol{g} odot i \
oldsymbol{h}_{t}=oldsymbol{o} odot anh left(oldsymbol{c}_{t} ight)
end{gathered}
$$

提示:图中的灰色矩形代表缩略图,真正代表仿射变换(指在几何中,一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间),图中的'X'和公式中的'$odot$'代表矩阵元素相乘(阿达玛积)。

 


 

LSTM难以产生梯度消失和梯度爆炸的原因

我们仅关注记忆单元, 此时, 记 忆单元的反向传播仅流过 “$+$" 和 “ $x$ ” 节点。“+”节点将上游传来的梯度 原样流出, 所以梯度没有变化 (退化)。而 “ $x$ ” 节点的计算并不是矩阵乘积, 而是对应元素的乘积 ( 阿达玛 积 $)$ 。顺便说一下, 在之前的 $mathrm{RNN}$ 的反向传播中, 我们使用相同的权重矩 阵重复了多次矩阵乘积计算, 由此导致了梯度消失 (或梯度爆炸 )。而这里 的 LSTM 的反向传播进行的不是矩阵乘积计算, 而是对应元素的乘积计算, 而且每次都会基于不同的门值进行对应元素的乘积计算。这就是它不会发生 梯度消失(或梯度爆炸)的原因。
Cnext到Cprev的 “ $x$ ” 节点的计算由遗忘门控制 (每次输出不同的门值)。遗忘 门认为 “应该忘记” 的记忆单元的元素, 其梯度会变小; 而遗忘门认为 “不能 忘记” 的元素, 其梯度在向过去的方向流动时不会退化。因此, 可以期待记忆 单元的梯度 (应该长期记住的信息) 能在不发生梯度消失的情况下传播。

 


整合 4 个权重进行仿射变换的 LSTM的计算图:

如图所示, 先一起执行 4 个仿射变换。然后, 基于 slice 节点, 取 出 4 个结果。这个 slice 节点很简单, 它将仿射变换的结果 (矩阵 ) 均等地 分成 4 份, 然后取出内容。在 slice 节点之后, 数据流过激活函数 ( sigmoid 函数或 $ anh$ 函数 $)$, 进行计算。

参考:

《深度学习进阶:自然语言处理》

原文地址:https://www.cnblogs.com/100-rzsyztd/p/15507755.html