LSTM网络

http://colah.github.io/posts/2015-08-Understanding-LSTMs/

https://www.jianshu.com/p/9dc9f41f0b29

机器学习面试100题: https://blog.csdn.net/T7SFOKzorD1JAYMSFk4/article/details/78960039

 https://www.julyedu.com/question/topic_list/26

 

RNN 是包含循环的网络,允许信息的持久化。

当相关信息和当前预测位置之间的间隔不断增大时,RNN 缺乏学习到如此远的信息的能力。

RNN前向传导公式

其中:

链式法则:

$s_t = \phi(Ux_t + Ws_{t-1} ) = \phi(W'_{(w)}, s_{{t-1}(w)}) = \phi(U'_{(u)}, s_{{t-1}(u)})$

$\frac{\partial{s_t}}{\partial{w}}  =  \frac{\partial{s_t}}{\partial{s_{t-1}}} \frac{\partial{s_{t-1}}}{\partial{w}} + \frac{\partial{s_t}}{\partial{w'}}$

上面的$W'_{(w)} = w$。反向传播计算时,都是实际数值代入计算。

对于 [公式] 求偏导不存在依赖问题;但是对于 [公式] 求偏导的时候,由于时间序列,存在长期依赖的情况(t时刻的隐层状态依赖于之前的每一个状态及输入),($s_t$与$s_{t-1}$),链式法则,导致rnn梯度消失或梯度爆炸

假设初始状态 [公式]为0, [公式] 有三段时间序列时,由 ① 带入②可得到

[公式] 各个状态和输出

[公式]

状态:[公式]

输出: [公式]

[公式]

状态: [公式]

输出: [公式]

[公式]

状态: [公式]

输出:

[公式]

现在只对 [公式] 时刻的 [公式] 求偏导,由链式法则得到:

[公式] [公式] ③

[公式] ④

 [公式] ⑤

可以简写成:

[公式]

[公式]

观察③④⑤式,可知,对于 [公式] 求偏导不存在依赖问题;但是对于 [公式] 求偏导的时候,由于时间序列长度,存在长期依赖的情况(主要是中间隐层状态偏导连乘导致)。【公式4,5中间一项少了一步】

 

https://zhuanlan.zhihu.com/p/53405950  【见该回答】

http://blog.sina.com.cn/s/blog_4c9dc2a10102xa00.html 

https://www.zhihu.com/question/44895610  【见第二个回答】

 

LSTM避免梯度消失的原因: https://weberna.github.io/blog/2017/11/15/LSTM-Vanishing-Gradients.html#fn:3

通过调整$f_t$的值来避免梯度消失或梯度爆炸

  

Long Short Term 网络(LSTM)是一种 RNN 特殊的类型,可以学习长期依赖信息。

所有 RNN 都具有一种重复神经网络模块的链式的形式。在标准的 RNN 中,这个重复的模块只有一个非常简单的结构,例如一个 tanh 层。

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

 

上图中相应图标的含义:

 

LSTM 的关键就是记忆单元,水平线在图上方贯穿运行。

记忆单元类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。 

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择性通过的方法。他们包含一个 sigmoid 神经网络层和一个按位的乘法操作

 

LSTM中结构分析

输入门$i_t$, 遗忘门$f_t$, 输出门$o_t$:输入门控制当前计算的新状态以多大程度更新到记忆单元中;遗忘门控制前一步记忆单元中的信息有多大程度被遗忘掉,输出门控制当前的输出有多大程度上取决于当前的记忆单元。

更新细胞状态:

输出信息:

 

LSTM各模块使用的激活函数:

sigmoid函数的输出在0~1之间,符合门控的物理定义,且当输入较大或较小时,其输出会非常接近0或1,从而保证该门开或关。

tanh函数,用在了状态和输出上,是对数据的处理,其输出在-1~1之间,与大多数场景下特征分布是0中心的吻合,此外,tanh函数在输入为0附近相比sigmoid函数有更大的梯度,通常使模型收敛更快。用其他激活函数或许也可以【

参见A Critical Review of Recurrent Neural Networks for Sequence Learning的section4.1】

 

LSTM变体

1、让门层接受记忆单元的输入 

 

2、取消输入门,用遗忘门的补替代。

3、Gated Recurrent Unit (GRU): 

与LSTM对比:

1、GRU只有两个门:reset gate $r_t$ 和 update gate $z_t$

2、如果reset gate为1,而update gate为0的话,则GRU完全退化为一个传统RNN

3、在实践中,一般认为LSTM和GRU之间并没有明显的优胜者。因为GRU具有较少的参数,所以训练速度快,而且所需要的样本也比较少。而LSTM具有较多的参数,比较适合具有大量样本的情况,可能会获得较优的模型。在Andrew的课程中表示,如果只能选择一个模型,那么LSTM是大家的default RNN。

 

LSTM输入输出:https://mp.weixin.qq.com/s/aV9Rj-CnJZRXRm0rDOK6gg

1、input_shape=(13, 5), 在NLP中可以理解为一个句子是 13个词,所以LSTM神经网络在时间上展开是 13个框, 每个词对应的词向量是 5 维,即每个时刻的输入$X_t$是 5 维的向量.

2、keras中的model.add(LSTM(10))中,  10 代表LSTM的hidden state $h_t$ 是 10维, 

 

sequence to sequence模型: https://zhuanlan.zhihu.com/p/25366912

RNN Encoder-Decoder结构,包含两部分,一个负责对输入的信息进行Encoding,将输入转换为向量形式。然后由Decoder对这个向量进行解码,还原为输出序列。

而RNN Encoder-Decoder结构就是编码器与解码器都是使用RNN算法,一般为LSTM。

LSTM的优势在于处理序列,它可以将上文包含的信息保存在隐藏状态(细胞状态)中,这样就提高了算法对于上下文的理解能力。

Encoder与Decoder各自可以算是单独的模型,一般是一层或多层的LSTM。

上图中,LSTM Encoder是一个LSTM神经元,Decoder是另一个,Encoder自身运行了`3`次,Decoder运行了`4`次。

可以看出,Encoder的输出会被抛弃,我们只需要保留隐藏状态(即图中EN状态)作为下一次ENCODER的状态输入。

Encoder的最后一轮输出状态会与Decoder的输入组合在一起,共同作为Decoder的输入。

而Decoder的输出会被保留,当做下一次的的输入。注意,这是在说预测时时的情况,一般在训练时一般会用真正正确的输出序列内容,而预测时会用上一轮Decoder的输出。

给Decoder的第一个输入是`<S>`,这是我们指定的一个特殊字符,它用来告诉Decoder,你该开始输出信息了。

而最末尾的`<E>`也是我们指定的特殊字符,它告诉我们,句子已经要结束了,不用再运行了。

 

Trick

虽然LSTM能避免梯度消失问题,但是不能对抗梯度爆炸问题(Exploding Gradient)。

为了对抗梯度爆炸,一般会对梯度进行裁剪。

梯度裁剪的方法一般有两种,一种是当梯度的某个维度绝对值大于某个上限的时候,就剪裁为上限。

另一种是梯度的L2范数大于上限后,让梯度除以范数,避免过大。

 

posted @ 2019-01-15 16:11  合唱团abc  阅读(570)  评论(0编辑  收藏  举报