zoukankan      html  css  js  c++  java
  • 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$ 函数 $)$, 进行计算。

    参考:

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

  • 相关阅读:
    centos查看apache用的是哪个httpd.conf
    window下安装composer and yii2
    安装xampp后,出现“Apache 2 Test Page powered by CentOS“
    PHP高效率写法
    银联接口(注意项&备忘)
    多行文本溢出
    javascript数据基本定义以及对象{}和数组[]的含义和使用
    用CSS3的animation轻松实现背景动画:漂浮的云
    巧妙使用CSS媒体查询(Media Queries)和JavaScript判断浏览器设备类型的好方法
    NBA篮球足球在线直播插件下载
  • 原文地址:https://www.cnblogs.com/100-rzsyztd/p/15507755.html
Copyright © 2011-2022 走看看