循环神经网络RNN和长短时记忆网络LSTM
循环神经网络RNN
循环神经网络(Recurrent Neural Network,RNN)是一个非常经典的面向序列的模型,可以对自然语言句子或是其他时序信号进行建模,RNN网络结构如 图5 所示。
图5:循环神经网络结构
不同于其他常见的神经网络结构,循环神经网络的输入是一个序列信息。假设给定任意一句话
,其中每个 都代表了一个词,如“我,爱,人工,智能”。循环神经网络从左到右逐词阅读这个句子,并不断调用一个相同的RNN Cell来处理时序信息。每阅读一个单词,循环神经网络会先将本次输入的单词通过embedding lookup转换为一个向量表示。再把这个单词的向量表示和这个模型内部记忆的向量 融合起来,形成一个更新的记忆。最后将这个融合后的表示输出出来,作为它当前阅读到的所有内容的语义表示。当循环神经网络阅读过整个句子之后,我们就可以认为它的最后一个输出状态表示了整个句子的语义表示。
听上去很复杂,下面我们以一个简单地例子来说明,假设输入的句子为:
“我,爱,人工,智能”
循环神经网络开始从左到右阅读这个句子,在未经过任何阅读之前,循环神经网络中的记忆向量是空白的。其处理逻辑如下:
- 网络阅读单词“我”,并把单词“我”的向量表示和空白记忆相融合,输出一个向量 ,用于表示“空白+我”的语义。
- 网络开始阅读单词“爱”,这时循环神经网络内部存在“空白+我”的记忆。循环神经网络会将“空白+我”和“爱”的向量表示相融合,并输出“空白+我+爱”的向量表示 ,用于表示“我爱”这个短语的语义信息。
- 网络开始阅读单词“人工”,同样经过融合之后,输出“空白+我+爱+人工”的向量表示 ,用于表示“空白+我+爱+人工”语义信息。
- 最终在网络阅读了“智能”单词后,便可以输出“我爱人工智能”这一句子的整体语义信息。
说明:
在实现当前输入
和已有记忆 融合的时候,循环神经网络采用相加并通过一个激活函数tanh的方式实现:
tanh函数是一个值域为(-1,1)的函数,其作用是长期维持内部记忆在一个固定的数值范围内,防止因多次迭代更新导致数值爆炸。同时tanh的导数是一个平滑的函数,会让神经网络的训练变得更加简单。
长短时记忆网络LSTM
上述方法听上去很有效(事实上在有些任务上效果还不错),但是存在一个明显的缺陷,就是当阅读很长的序列时,网络内部的信息会变得越来越复杂,甚至会超过网络的记忆能力,使得最终的输出信息变得混乱无用。长短时记忆网络(Long Short-Term Memory,LSTM)内部的复杂结构正是为处理这类问题而设计的,其网络结构如 图6 所示。
图6:LSTM网络结构
长短时记忆网络的结构和循环神经网络非常类似,都是通过不断调用同一个cell来逐次处理时序信息。每阅读一个新单词
,就会输出一个新的输出信号 ,用来表示当前阅读到所有内容的整体向量表示。不过二者又有一个明显区别,长短时记忆网络在不同cell之间传递的是两个记忆信息,而不像循环神经网络一样只有一个记忆信息,此外长短时记忆网络的内部结构也更加复杂,如 图7 所示。
图7:LSTM网络内部结构示意图
区别于循环神经网络RNN,长短时记忆网络最大的特点是在更新内部记忆时,引入了遗忘机制。即容许网络忘记过去阅读过程中看到的一些无关紧要的信息,只保留有用的历史信息。通过这种方式延长了记忆长度。举个例子:
我觉得这家餐馆的菜品很不错,烤鸭非常正宗,包子也不错,酱牛肉很有嚼劲。但是服务员态度太恶劣了,我们在门口等了50分钟都没有能成功进去,好不容易进去了,桌子也半天没人打扫。整个环境非常吵闹,我的孩子都被吓哭了,我下次不会带朋友来。
当我们阅读上面这段话的时候,可能会记住一些关键词,如烤鸭好吃、牛肉有嚼劲、环境吵等,但也会忽略一些不重要的内容,如“我觉得”、“好不容易”等,长短时记忆网络正是受这个启发而设计的。
长短时记忆网络的Cell有三个输入:
- 这个网络新看到的输入信号,如下一个单词,记为 , 其中 是一个向量, 代表了当前时刻。
- 这个网络在上一步的输出信号,记为 ,这是一个向量,维度同 相同。
- 这个网络在上一步的记忆信号,记为 ,这是一个向量,维度同 相同。
得到这两个信号之后,长短时记忆网络没有立即去融合这两个向量,而是计算了如下门的权重:
- 输入门: ,控制有多少输入信号会被融合。
- 遗忘门: ,控制有多少过去的记忆会被融合。
- 输出门: ,控制最终输出多少记忆。
- 单元状态:
通过学习这些门的权重设置,长短时记忆网络可以根据当前的输入信号和记忆信息,有选择性地忽略或者强化当前的记忆或是输入信号,帮助网络更好地学习长句子的语义信息:
说明:
事实上,长短时记忆网络之所以能更好地对长文本进行建模,还存在另外一套更加严谨的计算和证明,有兴趣的读者可以翻阅一下引文中的参考资料进行详细研究。
使用LSTM完成情感分析任务
借助长短时记忆网络,我们可以非常轻松地完成情感分析任务。如 图8 所示。对于每个句子,我们首先通过截断和填充的方式,把这些句子变成固定长度的向量。然后,利用长短时记忆网络,从左到右开始阅读每个句子。在完成阅读之后,我们使用长短时记忆网络的最后一个输出记忆,作为整个句子的语义信息,并直接把这个向量作为输入,送入一个分类层进行分类,从而完成对情感分析问题的神经网络建模。
图8:LSTM完成情感分析任务流程