LSTM架构详解

LSTM 是深度学习中很常见也很有用的一种算法,特别是在自然语言处理中更是经常用到,那么 LSTM 架构中的内部结构又是什么样子的呢?首先我们来看 LSTM 的整体框架:
LSTM
在这幅图中,中间是一个 LSTM 模块,有三个输入分别是: c t − 1 {c^{t - 1}} ct1 h t − 1 {h^{t - 1}} ht1 x t x^t xt,然后经过 LSTM 之后,输出分别是 c t {c^t} ct h t {h^t} ht y t y^t yt,其中 x t x^t xt 表示本轮的输入, h t − 1 {h^{t - 1}} ht1 表示上一轮的状态量输出, c t − 1 {c^{t - 1}} ct1 表示上一轮全局一个信息的载体;然后 y t y^t yt 表示本轮的输出, h t h^t ht 表示本轮的状态量输出, c t c^t ct 表示本轮全局的一个信息载体。这么看来 LSTM 的一个大体框架就明白了。LSTM 的内部构造是什么样子的呢?
首先,我们将 x t x^t xt h t − 1 h^{t-1} ht1 合并成一个向量再乘以一个向量 W W W,外面再包一层 t a n h tanh tanh 函数,得到一个向量 z z z
LSTM
同样的道理,我们将 x t x^t xt h t − 1 h^{t-1} ht1 合并成一个向量,但是我们的激活函数用的是 s i g m o i d sigmoid sigmoid,示意图如下所示:
LSTM
再分别乘以矩阵 W f W^f Wf W i W^i Wi W o W^o Wo 得到 z f z^f zf z i z^i zi z o z^o zo,然后我们可以用这些向量来由 c t − 1 c^{t-1} ct1 求得 c t c^t ct,公式是:
c t = z f ⋅ c t − 1 + z i ⋅ z {c^t} = {z^f} \cdot {c^{t - 1}} + {z^i} \cdot z ct=zfct1+ziz
然后得到 c t c^t ct 之后,我们可以得到 h t h^t ht,公式是:
h t = z o ⋅ tanh ⁡ ( c t ) {h^t} = {z^o} \cdot \tanh ({c^t}) ht=zotanh(ct)
最后我们可以得到本轮的输出 y t y^t yt,公式是:
y t = σ ( W ′ h t ) {y^t} = \sigma (W'{h^t}) yt=σ(Wht)
综上所述,我们可以得到一个完整的 LSTM 的内部结构如下图所示:
LSTM
有了这个结构图,我们就能够清晰直观地看出 LSTM 的内部结构,首先绿色的部分表示本轮的输入 x t x^t xt 和输出 y t y^t yt;蓝色的部分表示上一轮的状态量 h t − 1 h^{t-1} ht1 和本轮输出的状态量 h t h^t ht;红色的部分表示上一轮的信息载体 c t − 1 c^{t-1} ct1 和本轮输出的信息载体 c t c^t ct。这是单个 LSTM 单元,我们可以将多个的 LSTM 单元级联起来就可以成为我们的 LSTM 深度学习网络,示意图如下所示:
LSTM级联
好了,看完 LSTM 的整体架构之后,我们再来分析一下具体的每一个部分。整个LSTM 架构之所以能够记忆长期的信息,主要有 c n c^n cn 这个状态,我们可以看到 c t − 1 c^{t-1} ct1 c t c^t ct 中间只有少量的信息交互,所以能够保持整个网络的信息在 LSTM 间传递,如下是 c t c^t ct 的状态示意图:
LSTM
LSTM 之所以能够记忆长短期的信息,是因为它有 “门” 的结构来去除和增加信息到神经元的能力,“门” 是一种让信息选择性通过的方法。
首先就是遗忘门,在 LSTM 中的第一步是决定我们需要从神经元状态中遗忘哪些信息。如下图所示,两个输入通过一个 s i g m o i d sigmoid sigmoid 函数,所以输出的值在 0 − 1 0-1 01 之间,1表示信息完全保留,0表示信息完全遗忘。通过遗忘门,LSTM 可以选择性遗忘一些无意义的信息。如下图方框内的内容所示,这个部分就是 LSTM 中的遗忘门:
forget
这个部分可以用公式表示成:
z f = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) {z^f} = \sigma ({W_f} \cdot [{h_{t - 1}},{x_t}] + {b_f}) zf=σ(Wf[ht1,xt]+bf)
然后下一步我们需要确认什么样的新信息存放在神经元的状态中,这个部分有两输入,一个 s i g m o i d sigmoid sigmoid 层决定什么值 LSTM 需要更新,一个 t a n h tanh tanh 层创建一个新的候选值向量,这个值会被加入到状态当中,然后我们需要将这两个信息来产生对状态的更新,叫做输入门,过程如下示意图:
LSTM
整个的过程可以用公式表示为:

z i = σ ( W i ⋅ [ h t − 1 , x t ] + b i ) {z^i} = \sigma ({W_i} \cdot [{h_{t - 1}},{x_t}] + {b_i}) zi=σ(Wi[ht1,xt]+bi)
z = tanh ⁡ ( W ⋅ [ h t − 1 , x t ] + b ) z = \tanh (W \cdot [{h_{t - 1}},{x_t}] + b) z=tanh(W[ht1,xt]+b)
确定了需要更新的信息之后,我们就可以更新 c t c^t ct 这个变量,在之前的图中有表示过 c t − 1 c^{t-1} ct1 c t c^t ct 的过程,用公式可以表示成:
c t = z f ⋅ c t − 1 + z i ⋅ z {c^t} = {z^f} \cdot {c^{t - 1}} + {z^i} \cdot z ct=zfct1+ziz
在这个过程中, z f ⋅ c t − 1 {z^f} \cdot {c^{t - 1}} zfct1 表示之前的状态信息 c t − 1 c^{t-1} ct1 遗忘掉部分需要丢弃的信息,然后加上 LSTM 系统新的候选值向量,就是系统新一轮的信息 c t c^{t} ct
说完了更新的信息状态,我们同时也要更新系统的神经元状态 h t h^t ht,整个过程入下图框中所示:
LSTM
这就是控制 LSTM 输出的输出门,系统需要确定输出什么值。这个输出也会基于当前神经元的状态,首先我们用一个 s i g m o i d sigmoid sigmoid 来确定神经元需要将哪些部分进行输出,接着,我们将 LSTM 系统的信息通过一个 t a n h tanh tanh 函数进行处理,最后将他们进行相乘输出,就是 LSTM 新的状态量。这个部分加上一个 s i g m o i d sigmoid sigmoid 就是这一轮的输出 y t y^t yt。用公式可以写成:
z o = σ ( W o ⋅ [ h t − 1 , x t ] + b o ) {z^o} = \sigma ({W_o} \cdot [{h_{t - 1}},{x_t}] + {b_o}) zo=σ(Wo[ht1,xt]+bo)
h t = z o ⋅ tanh ⁡ ( c t ) {h_t} = {z_o} \cdot \tanh ({c^t}) ht=zotanh(ct)
y t = s i g m o i d ( W ′ ⋅ h t ) {y_t} = sigmoid(W' \cdot {h_t}) yt=sigmoid(Wht)
所以整个的 LSTM 可以分成如上所述的这些部分,每一个部分都有着不同的作用,希望这篇博文能够帮助您透彻理解 LSTM 神经网络的结构以及原理。文中如有纰漏,欢迎大家不吝指教;如有转载,也请标明出处,谢谢。

  • 69
    点赞
  • 234
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值