首页 > 人工智能(Artificial Intelligence) > 循环神经网络

LSTM(Long Short Term Memory, 长短期记忆网络)

长短期记忆网络–通常叫做”LSTMs”–是一种特殊的RNNs, 它能够学习长期依赖。LSTM由Hochreiter&Schmidhuber(1997)引入,后来在很多人的努力下变得越来越精炼和流行。它们在大量的问题上有惊人的效果,现在被广泛的使用。 

LSTM介绍

长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。

基于 LSTM 的系统可以学习翻译语言、控制机器人、图像分析、文档摘要、语音识别图像识别、手写识别、控制聊天机器人、点击率和股票、合成音乐等等任务。

LSTM结构

所有的递归神经网络都有重复神经网络本身模型的链式形式。

v2-2795bc16b012322f7767cd4d940ba2e3_r.jpg

首先,我们要首先适应一下我们将会使用的符号表示方法。

v2-1aed12786463eade9585fd20d894f49c_r.jpg

在上图中,每条线表示一个向量,从一个输出节点到其他节点的输入节点。这个粉红色圆圈表示逐点式操作,就像向量加法。黄色的盒子是学习好的神经网络的层。线条合表示联结,相反,线条分叉表示内容被复制到不同位置

LSTM核心思想

LSTM的核心之处就是它的神经元状态,如下图中所示,上面那条贯穿整个结构的水平线。 

神经元状态就像是一个传送带。它的线性作用很小,贯穿整个链式结构。信息很容易在传送带上传播,状态却并不会改变。

v2-1c663cbd3de24a90a0a94011fda6defd_hd.png

LSTM有能力删除或者增加神经元状态中的信息,这一机制是由被称为门限的结构精心管理的。 

门限是一种让信息选择性通过的方式,它们是由Sigmoid神经网络层和逐点相乘器做成的。

v2-6ba1445193a5731e297922efdde6559f_hd.png

Sigmod层输出0~1之间的数字,描述了一个神经元有多少信息应该被通过。输出“0”意味着“全都不能通过”,输出“1”意味着“让所有都通过”。 

一个LSTM有三个这样的门限,去保护和控制神经元状态。

LSTM遗忘门

遗忘门(forget gate)顾名思义,是控制是否遗忘的,在LSTM中即以一定的概率控制是否遗忘上一层的隐藏细胞状态。遗忘门子结构如下图所示:

v2-4035f737ddf1b26add27f4f69ccc1483_hd.png

图中输入的有上一序列的隐藏状态 $h^{(t-1)}$ 和本序列数据$x^{(t)}$,通过一个激活函数,一般是sigmoid,得到遗忘门的输出$f^{(t)}$。由于sigmoid的输出$f^{(t)}$在[0,1]之间,因此这里的输出$f^{(t)}$代表了遗忘上一层隐藏细胞状态的概率。用数学表达式即为:

$f^{(t)} = \sigma(W_fh^{(t-1)} + U_fx^{(t)} + b_f)$

其中$W_f, U_f, b_f$为线性关系的系数和偏倚,和RNN中的类似。σ为sigmoid激活函数。

LSTM输入门

输入门(input gate)负责处理当前序列位置的输入,它的子结构如下图:

v2-5a460ea6f112de7332ca9584300c6e9c_hd.png

决定我们要在神经元细胞中保存什么信息,这包括两个部分。首先,一个被称为“输入门层”的Sigmod层决定我们要更新的数值。然后,一个tanh层生成一个新的候选数值,Ct˜,它会被增加到神经元状态中。在下一步中中,我们会组合这两步去生成一个更新状态值。 

LSTM细胞状态更新

前面的遗忘门和输入门的结果都会作用于细胞状态$C_{(t)}$。我们来看看从细胞状态$C_{(t-1)}$如何得到$C_{(t)}$。如下图所示:

v2-830f08d8fff0c45ff6350c8c473b50ba_hd.png

我们给旧的状态乘以一个$f_t$,遗忘掉我们之前决定要遗忘的信息,然后我们增加$i{_t}∗Ct˜$。这是新的候选值,是由我们想多大程度上更新每个状态的值来度量的。 

LSTM输出门

有了新的隐藏细胞状态$C_(t)$,我们就可以来看输出门了,子结构如下:

v2-c3c06077f1a4e436ac442e0623ac284e_hd.png

输出是建立在我们的神经元状态的基础上的,但是有一个滤波器。首先,我们使用Sigmod层决定哪一部分的神经元状态需要被输出;然后我们让神经元状态经过tanh(让输出值变为-1~1之间)层并且乘上Sigmod门限的输出,我们只输出我们想要输出的。 

LSTM前向传播算法

LSTM模型有两个隐藏状态$h^{(t)}, C^{(t)}$,模型参数几乎是RNN的4倍,因为现在多了$W_f, U_f, b_f, W_a, U_a, b_a, W_i, U_i, b_i, W_o, U_o, b_o$这些参数。

前向传播过程在每个序列索引位置的过程为:

1)更新遗忘门输出:

$f^{(t)} = \sigma(W_fh^{(t-1)} + U_fx^{(t)} + b_f)$

2)更新输入门两部分输出:

$i^{(t)} = \sigma(W_ih^{(t-1)} + U_ix^{(t)} + b_i)$

$a^{(t)} = tanh(W_ah^{(t-1)} + U_ax^{(t)} + b_a)$

3)更新细胞状态:

$C^{(t)} = C^{(t-1)} \odot f^{(t)} + i^{(t)} \odot a^{(t)}$

4)更新输出门输出:

$o^{(t)} = \sigma(W_oh^{(t-1)} + U_ox^{(t)} + b_o)$

$h^{(t)} = o^{(t)} \odot tanh(C^{(t)})$

5)更新当前序列索引预测输出:

$\hat{y}^{(t)} = \sigma(Vh^{(t)} + c)$

 

关闭
感谢您的支持,我会继续努力!
扫码打赏,建议金额1-10元


提醒:打赏金额将直接进入对方账号,无法退款,请您谨慎操作。