初探LSTM网络

2020-01-19  本文已影响0人  LiBiscuit

距离上一次更新已经是2019年的事情了~小李懒到现在才来一月的更新!寒假导师布置了任务,抽到签是 商业智能下的精准预测,故最近的文应该会更新一些相关的模型学习。LSTM其实在西瓜书和邱锡鹏的书里面都有接触了,但由于那部分当时开组会不是我负责的,所以现在还是要回过头来学习了 害!


LSTM网络

Long Short Term Mermory network(LSTM:长短时记忆网络)是一种特殊的RNNs,可以解决RNN无法处理长距离的依赖的问题。其实从本质上来看LSTM只是对原来RNN的细胞单元进行了更改,但并没有更改结构。LSTM增加了三个门用来控制信息传递和最后的结果计算,三个门分别教遗忘门、输入门、输出门。
接下来通过图解详细叙述一下:
原始 RNN 的隐藏层只有一个状态,即h,它对于短期的输入非常敏感。
再增加一个状态,即c,让它来保存长期的状态,称为单元状态(cell state)。


按时间维度展开: 在 t 时刻,LSTM 的输入有三个:当前时刻网络的输入值 x_t、上一时刻 LSTM 的输出值 h_t-1、以及上一时刻的单元状态 c_t-1;LSTM 的输出有两个:当前时刻 LSTM 输出值 h_t、和当前时刻的单元状态 c_t.
那么现在有个关键的问题就来了:怎么去控制这个C?

LSTM的处理办法就是加入开关,我们需要三个开关:
①负责控制继续保存长期状态c
②负责控制把即时状态输入到长期状态c;
③负责控制是否把长期状态c作为当前的LSTM的输出。

更关键的问题是:我们要如何去实现这三个开关?

这边就要引入“门”(gate)来实现
Gate 实际上就是一层全连接层,输入是一个向量,输出是一个 0到1 之间的实数向量。


方法:用门的输出向量按元素乘以我们需要控制的那个向量
原理:门的输出是 0到1 之间的实数向量,
当门输出为 0 时,任何向量与之相乘都会得到 0 向量,这就相当于什么都不能通过;
输出为 1 时,任何向量与之相乘都不会有任何改变,这就相当于什么都可以通过。

LSTM过程 图解

那么通过上面层层递推,我们可以得到LSTM在RNN基础上是如何改进,那么其实那三个开关就是在RNN的基础上加入三个门:遗忘门、输入门、输出门。


接下来对整个过程通过图解介绍:
1.LSTM的第一步是确定我们将从单元状态中丢弃哪些信息,这个策略由一个被称为遗忘门的sigmoid层决定。输入ht−1和xt遗忘门对应单元状态Ct-1中每个数输出一个0到1之间的数字。1代表“完全保持”,0表示“完全遗忘”。 W_f 是遗忘门的权重矩阵,[h_t-1, x_t] 表示把两个向量连接成一个更长的向量,b_f 是遗忘门的偏置项,σ 是 sigmoid 函数。
2.下一步将决定我们将在单元状态中保存哪些新信息。 这有两个部分。 首先,称为“输入门层”的sigmoid层决定我们将更新哪些值。 接下来,tanh层创建可以添加到状态的新候选值Ct~的向量。 在下一步中,我们将结合这两个来创建状态更新。

当前输入的单元状态c_t的计算:由上一次的单元状态 c_t-1 按元素乘以遗忘门 f_t,再用当前输入的单元状态 c_t 按元素乘以输入门 i_t,再将两个积加和:这样,就可以把当前的记忆 c_t 和长期的记忆 c_t-1 组合在一起,形成了新的单元状态 c_t。
由于遗忘门的控制,它可以保存很久很久之前的信息,由于输入门的控制,它又可以避免当前无关紧要的内容进入记忆。
现在是时候将旧的单元状态Ct-1更新为新的单元状态Ct。 之前的步骤已经决定要做什么,我们只需要实际做到这一点。我们将旧状态乘以ft,忘记我们之前决定忘记的事情。 然后我们添加* Ct~。 这是新的候选值,根据我们决定更新每个州的值来缩放。
3.最后,我们需要决定我们要输出的内容。 此输出将基于我们的单元状态,但将是过滤版本。 首先,我们运行一个sigmoid层,它决定我们要输出的单元状态的哪些部分。 然后,我们将单元状态设置为tanh(将值推到介于-1和1之间)并将其乘以sigmoid门的输出,以便我们只输出我们决定的部分。

关于gate反向传播和具体原理 这里不作展开
可参考:[深入浅出] LSTM神经网络0
实现参考:LSTM的keras实现


连续学习真的累 回家就想做咸鱼了!寒假快乐!!!

上一篇下一篇

猜你喜欢

热点阅读