RNN和LSTM
简略表示RNN层:长方形节点中包含了矩阵乘积、偏置的和、tanh函数的变换。将下面这个公式表示成一个tanh节点。
LSTM:Long Short-Term Memory(长短期记忆),长时间维持短期记忆。
LSTM与RNN的接口(输入输出)如下图,不同地方在于,LSTM还有路径c 。c称为记忆单元。
记忆单元在LSTM层内部结束工作,不向其他层输出。记忆单元仅在LSTM层内部接收和传递数据。
ct存储了时刻t时LSTM的记忆(保存了从过去到时刻t的所有必要信息)。
LSTM层结构
LSTM层基于记忆单元ct计算隐藏状态ht。
记忆单元ct基于3个输入经过某种计算算出。隐藏状态ht要用更新后的ct计算,对ct的各个元素应用tanh函数,这表明,记忆单元ct和隐藏状态ht的元素个数相同。
Gate
Gate是门的意思。水管阀门的作用就是阻止或者释放水流(数据),Gate用于控制数据的流动。
LSTM中的阀门,可以控制阀门打开的程度(开合程度)来控制水的流量。门的开合程度由0.0 ~ 1.0的实数表示(1.0全开)。门的开合程度也是自动从数据中学习到的(有权重参数用于控制门的开合程度,这些权重参数通过学习被更新)。sigmoid函数用于求门的开合程度。
输出门
之前的隐藏状态ht对记忆单元ct仅用了tanh函数,如果给tanh(ct)加上门,这个门,管理下个隐藏状态ht的输出,称为输出门(output gate)。
输出门的开合程度根据输入xt和上个状态ht-1求出,公式如下。在使用的权重参数和偏置的上标上添加了output的首字母o,公式还用了sigmoid函数,公式的结果就是输出门的输出o。
ht可由o和tanh(ct)的乘积计算出来。这个乘积是对应元素的乘积,也称为阿达玛乘积。也就是说,对tanh(ct)的各个元素,调整它们作为下一时刻的隐藏状态的重要程度。添加输出门的LSTM层就像下面这样。
tanh输出-1.0 ~ 1.0的实数,数值表示被编码的信息的强弱程度,sigmoid函数的输出是0.0 ~ 1.0的实数,表示数据流出的比例。
通常,门使用sigmoid函数作为激活函数;包含实质信息的数据使用tanh函数作为激活函数。
遗忘门
接下来要告诉记忆单元需要忘记什么,也就是在记忆单元ct-1上添加一个遗忘门。
遗忘门开合程度根据输入xt和上个状态ht-1求出,公式如下。
添加了遗忘门的如下图右侧。
在记忆单元中添加新的信息
遗忘门从上一时刻的记忆单元中删除了应该忘记的东西,还需要向记忆单元添加一些应当记住的新信息,也就是要添加新的tanh节点。
tanh节点计算出的结果加到上一时刻的记忆单元上,从而在记忆单元中添加新的信息。
tanh节点作用就是把新信息添加到记忆单元中。tanh节点的计算公式如下,公式的结果g是向记忆单元添加的新信息。将g加到ct-1上,形成新的记忆。
输入门
给上面的g新添加一个输入门,输入门用来判断新增信息的各个元素的价值有多大。
之前直接加上新信息,没有对要添加的信息进行取舍。给g加上输入门,会添加加权后的新信息。
下面的公式结果i表示输出。sigma符号表示输入门。i和g对应元素的乘积将被添加到记忆单元中。
记忆单元的反向传播
通过观察记忆单元c的反向传播,可以知道为什么LSTM结构不会引起梯度消失。
仅关注记忆单元,它的反向传播流过+和×节点。
+节点将上游传来的梯度原样流出,所以梯度没有变化。
×节点是对应元素的乘积(阿达玛积),这里反向传播,进行的是对应元素的乘积计算,而不是矩阵乘积运算,所以不会像RNN一样,由于重复进行多次矩阵乘积运算,导致梯度消失或梯度爆炸。
×节点的计算由遗忘门控制,遗忘门认为应该忘记的记忆单元的元素,梯度会变小,遗忘门认为不该忘记的记忆单元的元素,梯度向过去流动时不会变小。所以,应该长期记住的信息能在不发生梯度消失的情况下传播。因此,记忆单元能够保存(学习)长期的依赖关系。