对LSTM中M(Memory)的再思考

来源:互联网 发布:android7源码 编辑:程序博客网 时间:2024/06/08 00:22

注:转载需得到作者同意!

知乎地址:https://zhuanlan.zhihu.com/p/28263453

本文动机

最近手上有一个分类任务,由于处理的数据是实时的序列,便考虑使用Long Short-Term Memory(LSTM)网络实现。在现在的深度学习有监督学习的判别模型中,有两大强有力的武器:

1.处理空域数据的卷积神经网络(Convolutional Neural Network,CNN)

2.处理时域数据的循环神经网络(Recurrent Neural Networks,RNN)

RNN由于其网络特性,将上一时刻的隐藏层输出与此时刻的数据一起作为此时刻的输入,使得历史时刻对于当前时刻的输出具有影响。而LSTM正是RNN中的变体,其独特的“门”设计解决了RNN中梯度消失/爆炸问题。

那么,LSTM中是否真的存在memory?若存在,存在的形式是怎样的?这样的形式会带来怎样的优势?又存在着怎样的问题?本文试图探讨这些问题,但由于作者(研究生一枚)水平有限,希望对这个问题同样有兴趣的朋友(无论是大牛或是小白)一起探讨,如有作者表述错误或是理解错误的地方,也请多多指正,谢谢~

先行知识

这里贴出一些书/教程/博客作为本文的先行知识,一些基础的入门知识本文不再赘述。(毕竟自己写也可能不会有这些大大清晰的说)

1. Long Short-term Memory, Neural Computation 9(8):1735-1780,1997 第一篇当然放上LSTM开山论文,1997年发表于Neural Computation论文一共32页,写的很学术严谨,个人觉得论文中图画的有点错综复杂,倒不如后面几篇研究人员画的直白易懂。

2. Long short-term memory wikipedia对于LSTM的解读,详略得当,重点一目了然。

3. YJango的循环神经网络——介绍 来自 YJango 大大的超智能体 · GitBook 一书中对于RNN的讲解。

YJango的循环神经网络——实现LSTM 这是LSTM的讲解,详细易懂,非常推荐。

书中附有实例代码,每句都有注释,理论+实践的方式能快速理解LSTM的工作原理。

另外YJango从自然生物角度出发探讨人工智能的思路也令人眼前一亮。

4. 相关系数_百度百科 这是本文所要探讨的部分数学知识。

...... (写着写着再补充)

RNN中的Memory

首先我们看一张RNN的网络结构图:



我们很容易能写出:

h_t=F(W_{xh}(t)*x_t+W_{hh}(t-1)*h_{t-1}+b )

y_t = F(W_{oh}(t)*h_t+b_{ot})

注:1. F 为激活函数(用于非线性) 2.暂认为 t-1 时刻为序列开始。

我们能够发现,在 t 时刻的输出 y_t 与两个量有关,即:

当前时刻的输入数据 x_t和 上一时刻的隐藏层状态 h_{t-1} 。

而在经过一轮迭代我们不难发现, t-1 时刻的隐藏层 h_{t-1} 是由 x_{t-1} 与 init 决定(本例中为 init )。也就是说,历史的数据对当前的输出有影响。

这里我们可以回顾一下记忆(memory)的定义:

记忆(百度百科) 人类思维中信息内容的储备与使用过程。

根据定义,我简单的把记忆分为:

识记:记忆过程的开端,对事物识别和记住。

印象:信息内容的储备。

再认:信息内容的使用。

让我们回到上面的公式,我想将公式中的权值赋予实际意义:

W_{xh} :识记 --- 对当前时刻进行识别和记住。

W_{hh} :印象 --- 将历史时刻的信息储备调用。

W_{oh} :再认 --- 结合印象与当前接受的输入对信息内容进行使用。

这时我们重新看整个模型,就可以动态的、流动的将模型如何处理数据,和其中蕴含的记忆功能理解清楚。


对应于CNN中卷积起到的空域权值共享,RNN中则是一种时域上的权值共享。


LSTM中的memory

首先贴出RNN与LSTM各自的示意图:(图片来自:Understanding LSTM Networks



对比发现,其实LSTM作为RNN的一个变体,仅是将RNN中的隐藏层cell变得复杂了一些,并使用了一些门(gate)将不同时刻的层间信息与某一时刻的输入信息处理的更加透明。也可以理解为将原本黑匣子似的RNN隐藏层中加入先验知识------输入门、遗忘门、输出门,然他们分工明确,各司其职。

我在这里并不想讨论LSTM基础知识,也不想讨论为什么LSTM能抑制梯度爆炸/消失,若对后文理解不顺推荐阅读YJango的循环神经网络——实现LSTM。

本文探讨的为memory,记忆,在LSTM三个门中遗忘门是对以往的历史信息做处理的机制。LSTM基本公式贴在下面:

其中 f_t 为遗忘门,这里的 c 对应的RNN中的 h ,而 h 对应的为输出 y 。

我们对比RNN公式不难发现,LSTM只是将RNN上装备了一些各司其职的门,这些门中的权值便是LSTM需要训练的参数。仔细观察公式会发现,其中 f_t 与上一时刻的 c_{t-1} 点乘更新本时刻的 c_t 。这里通过训练 f_t 对历史时刻选择性“遗忘”,这里的过程可以理解为训练了一层mask,用来dropout与新数据相关性不高的历史信息c_{t-1} 。

对于这里所说的相关性,我举个例子:

单词预测:The sky is blue, the cloud is ___.

前面的题干部分为模型输入,___划线上的单词为模型输出,正确输出(label)为white。

很明显,最影响输出的应该是cloud,cloud这个单词可以直接决定最终输出为white。我们把cloud与white成为强相关性,用一个范围是[0,1]的数来乘cloud(这里的cloud会在输入的时候处理为词向量),应该选择1,全保留。表示这是模型这次预测中最不应该“遗忘”掉的部分。

the 对于输出来说似乎并没有什么用处,它们为无相关性(有点绝对,只是例子)。我们选择0来乘the,表示可有可无。

剩下部分对于输出都有部分影响,比如is 动词后面接一个名词或者形容词,对于输出范围有约束作用。我们把它称作弱相关性,用0-1之间的数来乘,表示有一些用,但关联没那么大。

这里遗忘门就刻画了这样一种时域相关性,并在输出的时候表现出来。

优势

1. 处理时间序列语言文本序列十分有优势。(信息储存记忆)

2. 非定长数据,相比与CNN的输入十分固定,RNN并不需要一个定长的数据作为输入,这更灵活。

...... 还有很多,随便去翻一篇写LSTM或RNN的论文,方案选择那一节里面就是优势。:)

RNN/LSTM中是否真的是记忆?

下面为自己的想法,并和几位大大探讨了一番,不一定正确,欢迎讨论。

首先我们还是回顾一下前面用过的式子:

h_t=F(W_{xh}(t)*x_t+W_{hh}(t-1)*h_{t-1}+b )

这是上一时刻与这一时刻的隐藏层更新。我们将其写的简单点:

h_t = F(x_t, h_{t-1})

我们再迭代写一组 t-2 时刻:

h_t = F(x_t, F(x_{t-1}, h_{t-2}))

问题1 开始输出时,上一时刻x_{t-1} 的输入对输出影响最大。

注:输出时当前时刻的输入一般为一个约定好的终止符

这也就是说,不同时刻输入的数据对于输出来说贡献是不相等的,历史输入随着对输出的“距离”越来越远贡献越来越小,而这个现象并不是训练的结果。

问题2:由于上一个输入数据影响较大,若 x_{t-1} 与输出弱相关甚至不相关,导致遗忘门选择丢弃,是否会将历史有效的“印象”一并丢弃?

举个极端的例子, x_{t-1} 时刻出现一次脉冲噪声污染,直接导致遗忘门选择丢弃,那么产生的新 h 会忘掉以前的历史信息从头开始。而重点是这个遗忘的决定不是历史输入共同决定的,而是上一时刻决定的。

根据YJango大大的指导, h_{t-1} 的维度很高,可以理解为存储过历史多个时刻的数据,单一时刻数据有噪声不一定会影响整体,只会影响几个维度而已。