LSTM为何如此有效?

公众号关注 “ML_NLP”

设为 “星标”,重磅干货,第一时间送达!

 

来自 | 知乎

地址 | https://www.zhihu.com/question/278825804/answer/402634502

作者 | 天雨粟

编辑 | 机器学习算法与自然语言处理公众号

本文仅作学术分享,若侵权,请联系后台删文处理


 

做过一点类似的工作,说说个人理解。

 

LSTM处理序列问题有效的关键就是在于Gate。

 

拿一个简单的情感分类问题为例:

 

 

比如这句话,我们去除停用词,最后做Word Embedding喂给DNN。这句话里面正面词汇有2个“好”和1个“喜欢”,负面词汇有1个“没有”和1个“不”,由于正面词汇更多,DNN则会更加倾向判断积极情感;实际上这句话是个negative的情感,句子中两个”好“前面都有”没有“否定,”喜欢“前面也有”不“否定,但是DNN不存在隐层结点之间的序列学习,所以捕捉不到这种信息;

而如果我们用一个LSTM:

 

 

由于LSTM存在cell state的传递,如图中LSTM中链接的箭头所示,它能够捕捉到这种否定关系,从而输出正确的情感系数。

 

从LSTM的公式来看(不考虑peephole),forget gate是一个经过sigmoid函数激活的单元,数值在0-1

而我们的cell state更新公式为:

 

当forget gate越接近0时,意味着对历史信息(t-1时刻)信息的丢失;而forget gate越接近于1,意味着对历史信息的更多保留。

 

正如题主所说,forget gate里面大多数位置都是0,少数为1,这部分1就是它要在网络中持续保留的信息,我这里也很同意题主所说,这里gate有点类似于attention,对于我所需要的信息,我就给予高attention(对应为1),对于无用信息,我就选择不attention(对应为0)。同理,如果在某个时刻下信息较为重要,那么它对应的forget gate位置会一直保留在接近于1的数值,这样就可以让这个时刻的信息一直往下传递下去而不至于被丢失,这也是为什么LSTM能够处理长序列的原因之一。

 

再说Bi-RNN,Bi-RNN我觉得从直觉上更好理解。比如我们人在看一句话时:这个人虽然很努力,但是他实在没有什么成绩。如果按照LSTM来看,它是从前往后学习,读完前半句我们可以提取的信息是:这个人很努力,看似是一个积极信息,但只有往下读才知道这句话的重点在于后面说他做不出什么成绩。而Bi-RNN很好的模拟了人的行为,即先读完整句话。Bi-RNN倒序进行信息的传递,那么当Bi-RNN读完“这个人虽然很努力”时,它的反向序列已经捕捉到了后半句的内容信息,因此能够做出更准确的判断。

 

补充:

 

应评论区@Herry同学提问,再说下GRU。简单来说,GRU比LSTM结构更加简单,只有2个gate,LSTM有3个gate,需要训练的参数更少,具体实现上也更快一点;另外,GRU中只有一个state,它把LSTM中的cell state和activation state视为了一个state。

 

 

而LSTM中这个forget gate是单独出来的,跟update gate没太大关系,这里只能说GRU做了合理简化,减少了一定计算量,性能上并没有牺牲太多。

 

再者上面说到的,GRU里面只需要控制一个状态,它的cell state是等于activation state的,而LSTM中控制两个状态,cell state是要经过output gate以后才能得到activation state。

 

最后关于它两具体的性能表现上,目前我做的模型上,基本看不出太大差别,性能都算OK。但是我一般首选LSTM,可能我先接触的LSTM的缘故吧。GRU就是相对快一点,结构简单,适合快速开发模型原型。

 

关于他两性能的比较,建议可以看下论文[1412.3555] Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling

 

 

重磅!忆臻自然语言处理-学术微信交流群已成立

可以扫描下方二维码,小助手将会邀请您入群交流,

注意:请大家添加时修改备注为 [学校/公司 + 姓名 + 方向]

例如 —— 哈工大+张三+对话系统。

号主,微商请自觉绕道。谢谢!

 

 

 

 

 

 

推荐阅读:

PyTorch Cookbook(常用代码段整理合集)

通俗易懂!使用Excel和TF实现Transformer!

深度学习中的多任务学习(Multi-task-learning)——keras实现