为什么需要 RNN ?

卷积神经网络 – CNN 和普通的算法大部分都是输入和输出的一一对应,也就是一个输入得到一个输出。不同的输入之间是没有联系的。

在现实生活中,例如对一个演讲进行语音识别,那演讲者每讲一句话的时间几乎都不太相同,而识别演讲者的讲话内容还必须要按照讲话的顺序进行识别。

这就需要有一种能力更强的模型:该模型具有一定的记忆能力,能够按时序依次处理任意长度的信息。这个模型就是今天的主角 “循环神经网络”(Recurrent Neural Networks,简称 RNN)。

RNN 的基本原理

传统神经网络的结构比较简单:输入层 – 隐藏层 – 输出层。如下图所示:

 RNN 跟传统神经网络最大的区别在于每次都会将前一次的输出结果,带到下一次的隐藏层中,一起训练。如下图所示:

 下面用一个具体的案例来看看 RNN 是如何工作的。

假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”我们需要先对这句话进行分词:

然后按照顺序输入 RNN ,我们先将 “what”作为 RNN 的输入,得到输出「01」。

然后,我们按照顺序,将“time”输入到 RNN 网络,得到输出「02」。

这个过程我们可以看到,输入 “time” 的时候,前面 “what” 的输出也产生了影响(隐藏层中有一半是黑色的)。

以此类推,前面所有的输入都对未来的输出产生了影响,大家可以看到圆形隐藏层中包含了前面所有的颜色。如下图所示:

当我们判断意图的时候,只需要最后一层的输出「05」,如下图所示:

但是,RNN 的缺点也比较明显。

通过上面的例子,我们已经发现,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN 存在的短期记忆问题。

RNN 有短期记忆问题,无法处理很长的输入序列。训练 RNN 需要投入极大的成本。

RNN 的优化算法

RNN 到 LSTM – 长短期记忆网络

RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。

LSTM 做的最大的改变就是打破了这个死板的逻辑,而改用了一套灵活了逻辑——只保留重要的信息。一个 LSTM 单元的结构,如下图所示:

从上图可以看出,中间有一个 cell(细胞),这也是 LSTM 用于判断信息是否有用的 “处理器”。同时,cell 旁边被放置了三扇门,分别是输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)。一个信息进入 LSTM 的网络当中,可以根据规则来判断是否有用,只有符合要求的信息才会被留下,不符合的信息则会通过遗忘门被遗忘。 LSTM 巧妙地通过 “门” 的形式,利用开关实现时间上的记忆功能,是解决长期依赖问题的有效技术。在数字电路中,门(gate)是一个二值变量 {0,1},0 代表关闭状态、不允许任何信息通过;1 代表开放状态,允许所有信息通过。而 LSTM 中的 “门” 也是类似,但它是一个 “软” 门,介于(0,1)之间,表示以一定的比例使信息通过。

一听起来就不明觉厉,那它是怎么做到的呢?

我们先来看一下 RNN 按时间展开后的简化图,结构很简单,标准 RNN 中的重复模块只包含单一的层,例如 tanh 层,如下图:

LSTM 有着类似的结构,但是重复的模块拥有一个不同的结构,LSTM 中的重复模块包含四个交互的层,其中输入门(Input Gate)、遗忘门(Forget Gate)和输出门(Output Gate)便在这里面,如下图:

下面介绍一下 LSTM 的工作原理,下面会结合结构图和公式进行介绍,回顾一下最基本的单层神经网络的结构图、计算公式如下,表示输入是 x,经过变换 Wx+b 和激活函数 f 得到输出 y。下面会多次出现类似的公式。(本质y=kx+b)

下面以一个语言模型的例子来进行介绍,这个模型是根据已经看到的词来预测下一个词,例如:

小明刚吃完米饭,现在准备要吃水果,然后拿起了一个()

(1)遗忘门(Forget Gate) 该门的示意图如下,该门会读取 ht-1 和 xt 的信息,通过 sigmoid 层输出一个介于 0 到 1 之间的数值,作为给每个在细胞状态 Ct-1 中的数字,0 表示 “完全舍弃”,1 表示 “完全保留”。

结合上面讲到的语言预测模型例子,“小明刚吃完米饭”,这句话主语是 “小明”,宾语是 “米饭”,下一句话 “现在准备要吃水果”,这时宾语已经变成了新的词 “水果”,那第三句话要预测的词,就是跟 “水果” 有关了,跟 “米饭” 已经没有什么关系,因此,这时便可以利用 “遗忘门” 将 “米饭” 遗忘掉。

(2)输入门(Input Gate) 下一步是确定什么样的新信息被存放在细胞状态中。这里包含两部分: 首先是经过 “输入门”,这一层是决定我们将要更新什么值;然后,一个 tanh 层创建一个新的候选值向量,加入到状态中,如下图:

在这个语言预测模型的例子中,我们希望将新的代词 “水果” 增加到细胞状态中,来替代旧的需要忘记的代词 “米饭”。

现在来更新旧细胞的状态,由 Ct-1 更新为 Ct,更新方式为:(1)把旧状态 Ct-1 与 ft 相乘(回顾一下,ft 就是遗忘门,输出遗忘程度,即 0 到 1 之间的值),丢弃掉需要丢弃的信息(如遗忘门输出 0,则相乘后变成 0,该信息就被丢弃了);(2)然后再加上 it 与候选值相乘(计算公式见上图)。这两者合并后就变成一个新的候选值。

在这个语言预测模型的例子中,这就是根据前面确定的目标,丢弃旧的代词信息(米饭)并添加新的信息(水果)的地方。

(3)输出门(Output Gate) 最后我们要确定输出什么值,首先,通过一个 sigmoid 层来确定细胞状态的哪个部分将要输出出去,接着,把细胞状态通过 tanh 进行处理(得到一个介于 - 1 到 1 之间的值)并将它和 sigmoid 的输出结果相乘,最终将会仅仅输出我们需要的那部分信息。

在这个语言模型的例子中,因为看到了一个新的代词(水果),可能需要输出与之相关的信息(苹果、梨、香蕉……)。

LSTM总结而言为:抓重点!

举个例子,我们先快速的阅读下面这段话:

当我们快速阅读完之后,可能只会记住下面几个重点:

 LSTM 类似上面的划重点,他可以保留较长序列数据中的「重要信息」,忽略不重要的信息。这样就解决了 RNN 短期记忆的问题。

从 LSTM 到 GRU

Gated Recurrent Unit – GRU 是 LSTM 的一个变体。他保留了 LSTM 划重点,遗忘不重要信息的特点,在long-term 传播的时候也不会被丢失。

GRU它将遗忘门和输入门合成了一个单一的更新门,同样还混合了细胞状态和隐藏状态,以及其它一些改动。最终 GRU 模型比标准的 LSTM 模型更简单一些,如下图所示:

相关阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。