赞
踩
http://blog.csdn.net/pipisorry/article/details/78361778
长短期记忆模型(long-short term memory)是一种特殊的RNN模型,是为了解决RNN模型梯度弥散的问题而提出的;在传统的RNN中,训练算法使用的是BPTT,当时间比较长时,需要回传的残差会指数下降,导致网络权重更新缓慢,无法体现出RNN的长期记忆的效果,因此需要一个存储单元来存储记忆,因此LSTM模型被提出。
LSTM作为有记忆的网络,它的有记忆指的是在一个sequence中(而不是seq间),记忆在不同的timesteps中传播。举个例子,就是你有一篇文章X,分解,然后把每个句子作为一个sample训练对象(sequence),X[i]就代表一句话,而一句话里的每个word各自代表一个timestep时间步,LSTM的有记忆即指的是在一句话里,X[i][0]
第一个单词(时间步)的信息可以被记忆,传递到第5个单词(时间步)X[i][5]
中。
(1)RNN
(2)LSTM
部分图形含义如下:
lstm与RNN区别如上图对比,就是多了cell和门控机制。去掉只留gt就一样了。
(1)理解LSTM的核心是细胞状态“cell state”,也就是上述图中最顶的传送线,也就是信息记忆的地方,随着时间而变化的。如下:
(2)当然,传送带本身是无法控制哪些信息是否被记忆,起控制作用的是控制门(gate)。控制门的结构如下:主要由一个sigmoid函数跟点乘操作组成;sigmoid函数的值为0-1之间,点乘操作决定多少信息可以传送过去,当为0时,不传送,当为1时,全部传送;LSTM中有3个控制门:输入门,输出门,记忆门;
(1)forget gate:选择忘记过去某些信息(通过sigmoid(x,h)控制门忘记一部分cell state):
(2)input gate:记忆现在的某些信息(现在的信息通过tanh(x,h)激活,再通过sigmoid(x,h)控制门忘记一部分):
(3)将过去与现在的记忆进行合并:
(4)output gate:输出
LSTM模型的思想是将RNN中的每个隐藏单元换成了具有记忆功能的cell,即把rnn的网络中的hidden layer小圆圈换成LSTM的block,就是所谓的LSTM了。
lstm的block相当于rnn的隐层,不过这个隐层叫block或者cell之类的。
输入是x, h^t-1,c^t-1, 输出一般表示为output, (h^t, c^t) = lstm(input, (h^t-1,c^t-1))[LSTM]。c和h的维度应该都是hidden_size(unit_size)。
图表示
[Vinyals, et al. Show and tell: Lessons learned from the 2015 mscoco image captioning challenge. TPAMI2017]图中蓝色表示上一个时间步
每个cell的组成如下:
(1)输入节点(gt):与RNN中的一样,接受上一个时刻点的隐藏节点的输出以及当前的输入作为输入,然后通过一个tanh的激活函数;相当于原始RNN中的隐层。
(2)输入门(it):起控制输入信息的作用,门的输入为上一个时刻点的隐藏节点的输出以及当前的输入,激活函数为sigmoid(原因为sigmoid的输出为0-1之间,将输入门的输出与输入节点的输出相乘可以起控制信息量的作用)。
(3)内部状态state节点(st):输入为被输入门过滤后的当前输入以及前一时间点的内部状态state节点输出;也称为Cell或者ct,就是使用内部state参数来记事。
(4)忘记门(ft):起控制内部状态信息的作用,门的输入为上一个时刻点的隐藏节点的输出以及当前的输入,激活函数为sigmoid;control whether to forget the current cell value. 最原始的LSTM在这个位置就是一个值1,即没有忘记门。
(5)输出门(ot):起控制输出信息的作用,门的输入为上一个时刻点的隐藏节点的输出以及当前的输入,激活函数为sigmoid;control whether to output the new cell value.
一般表示
Note:1 公式1 中的Wih应改为Wgh;
2 圆圈⊙表示矩阵元素对应相乘;一般σ is the sigmoid operator, φ is the tanh operator.
3 最后一步有时写成h = φ(s) ⊙ o,即在s外面加一层tanh。
f^t中,Wfx*x=[hidden_units, embed_dim]*[embed_dim, 1]=[hidden_units,1]维度的结果;同样Wfh*H=[hidden_units,hidden_units]*[hidden_units,1]=[hidden_units,1]维度的结果,b=[hidden_units,1]维度;f^t就是[hidden_units,1]维度,这样才可以在后面和[hidden_units,1]的元素s^t-1对应相乘。
拼接表示
上一次的状态 h(t-1)和下一次的输入 x(t) 通过直接拼接结合(concat)起来,比如 x是28位的向量,h(t-1)是128位的,那么拼起来就是156位的向量。
合并表示
实际计算中,g i f o计算的8个矩阵合并成一个提高计算效率。In practice, all eight weight matrices are concatenated into one large matrix for computational efficiency.
LSTM的参数个数为4*((embed_dim+hidden_units)*hidden_units+hidden_units)(不算输出线性层)。
细胞状态st公式中的四个值,均是前面计算得到的结果,因此该过程没有参数需要学习。
Note:
1 双向 rnn/lstm/gru参数数量再乘 2 (当 cell_fw == cell_bw 时)。
2 单层lstm看上去就和单层bert的FNN层参数量一样大小(同等大小hidden)。
分解表示
带H的是一个泛指,因为LSTM的一个重要特点是其灵活性,cell之间可以互联,hidden units之间可以互联,至于连不连都看你(所以你可能在不同地方看到的LSTM公式结构都不一样)所以这个H就是泛指这些连进来的东西,可以看成是从外面连进了的三条边的一部分。
连到了Cell(这里的cell不是指中间那个Cell,而是最下面那个小圆圈,中间的Cell表示的其实是那个状态值S[c][t]):输入层的输入,泛指的输入。(这体现在4.6式中) 再看看中间的那个Cell状态值都有谁连过去了:这次好像不大一样,连过去的都是经过一个小黑点汇合的,从公式也能体现出来,分别是:ForgetGate*上一时间的状态 + InputGate*Cell激活后的值。
可以理解为在计算OG的时候,S[c][t]已经被计算出来了,所以就不用使用上一时间的状态值了。
小黑点,用到了激活后的状态值和Output Gate的结果。
最初 LSTM 被提出时,其训练的方式为“Truncated BPTT”。大致的意思为,只有 Cell 的状态会 BP 多次,而其他部分的梯度会被截断,不 BP 到上一个时刻的 Memory Block。当然,这种方法现在也不使用了。
在"Framewise phoneme classification with bidirectional LSTM and other neural network architectures, 2005"中,作者提出了 Full Gradient BPTT 来训练 LSTM,也就是标准的 BPTT。这也是如今具有自动求导功能的开源框架们使用的方法。
对于 LSTM,有如下公式
模仿 RNN,我们对 LSTM 计算
公式里其余的项不重要,这里就用省略号代替了。可以看出当f^t = 1时,就算其余项很小,梯度仍然可以很好地传导到上一个时刻,此时即使层数较深也不会发生 Gradient Vanish 的问题;当f^t = 0时,即上一时刻的信号不影响到当前时刻,则此项也会为0;f^t 在这里控制着梯度传导到上一时刻的衰减程度,与它 Forget Gate 的功能一致。
[为什么相比于RNN,LSTM在梯度消失上表现更好? - 知乎][RNN vs LSTM: Vanishing Gradients]
from: 深度学习:长短期记忆模型LSTM_-柚子皮-的博客-CSDN博客
ref: [Zachary C. Lipton:A Critical Review of Recurrent Neural Networks for Sequence Learning]*
[A. Graves. Supervised Sequence Labelling with Recurrent Neural Networks. Textbook, Studies in Computational Intelligence, Springer, 2012.]
[当我们在谈论 Deep Learning:RNN 其常见架构]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。