对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的网络结构图:
我们很容易能写出:
注:1. 为激活函数(用于非线性) 2.暂认为 时刻为序列开始。
我们能够发现,在 时刻的输出 与两个量有关,即:
当前时刻的输入数据 和 上一时刻的隐藏层状态 。
而在经过一轮迭代我们不难发现, 时刻的隐藏层 是由 与 决定(本例中为 )。也就是说,历史的数据对当前的输出有影响。
这里我们可以回顾一下记忆(memory)的定义:
记忆(百度百科) 人类思维中信息内容的储备与使用过程。
根据定义,我简单的把记忆分为:
识记:记忆过程的开端,对事物识别和记住。
印象:信息内容的储备。
再认:信息内容的使用。
让我们回到上面的公式,我想将公式中的权值赋予实际意义:
:识记 --- 对当前时刻进行识别和记住。
:印象 --- 将历史时刻的信息储备调用。
:再认 --- 结合印象与当前接受的输入对信息内容进行使用。
这时我们重新看整个模型,就可以动态的、流动的将模型如何处理数据,和其中蕴含的记忆功能理解清楚。
对应于CNN中卷积起到的空域权值共享,RNN中则是一种时域上的权值共享。
LSTM中的memory
首先贴出RNN与LSTM各自的示意图:(图片来自:Understanding LSTM Networks)
对比发现,其实LSTM作为RNN的一个变体,仅是将RNN中的隐藏层cell变得复杂了一些,并使用了一些门(gate)将不同时刻的层间信息与某一时刻的输入信息处理的更加透明。也可以理解为将原本黑匣子似的RNN隐藏层中加入先验知识------输入门、遗忘门、输出门,然他们分工明确,各司其职。
我在这里并不想讨论LSTM基础知识,也不想讨论为什么LSTM能抑制梯度爆炸/消失,若对后文理解不顺推荐阅读YJango的循环神经网络——实现LSTM。
本文探讨的为memory,记忆,在LSTM三个门中遗忘门是对以往的历史信息做处理的机制。LSTM基本公式贴在下面:
其中 为遗忘门,这里的 对应的RNN中的 ,而 对应的为输出 。
我们对比RNN公式不难发现,LSTM只是将RNN上装备了一些各司其职的门,这些门中的权值便是LSTM需要训练的参数。仔细观察公式会发现,其中 与上一时刻的 点乘更新本时刻的 。这里通过训练 对历史时刻选择性“遗忘”,这里的过程可以理解为训练了一层mask,用来dropout与新数据相关性不高的历史信息 。
对于这里所说的相关性,我举个例子:
单词预测: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中是否真的是记忆?
下面为自己的想法,并和几位大大探讨了一番,不一定正确,欢迎讨论。
首先我们还是回顾一下前面用过的式子:
这是上一时刻与这一时刻的隐藏层更新。我们将其写的简单点:
我们再迭代写一组 时刻:
问题1: 开始输出时,上一时刻 的输入对输出影响最大。
注:输出时当前时刻的输入一般为一个约定好的终止符。
这也就是说,不同时刻输入的数据对于输出来说贡献是不相等的,历史输入随着对输出的“距离”越来越远贡献越来越小,而这个现象并不是训练的结果。
问题2:由于上一个输入数据影响较大,若 与输出弱相关甚至不相关,导致遗忘门选择丢弃,是否会将历史有效的“印象”一并丢弃?
举个极端的例子, 时刻出现一次脉冲噪声污染,直接导致遗忘门选择丢弃,那么产生的新 会忘掉以前的历史信息从头开始。而重点是这个遗忘的决定不是历史输入共同决定的,而是上一时刻决定的。
根据YJango大大的指导, 的维度很高,可以理解为存储过历史多个时刻的数据,单一时刻数据有噪声不一定会影响整体,只会影响几个维度而已。
- 对LSTM中M(Memory)的再思考
- tensorflow中对lstm及双向lstm的理解
- LSTM (Short-Term Memory)
- 对Java中递归的再思考
- Long Short-Term Memory(LSTM)
- Python写出LSTM-RNN(Long-Short Term Memory Recurrent Neural Networks )的代码
- 对思考的思考
- Android研发中对String的思考(源码分析)
- 对silverlight中DoubleAnimation的思考
- 对JavaScript开发中困扰的思考
- 对JavaScript开发中困扰的思考
- 对java中random的思考
- 头文件中对extern的思考
- 工作中对“快速阅读”的思考
- 对 Java 中 clone 方法的思考
- 对Java8中distinct()的思考
- LSTM中BPTT的推导
- 时间递归神经网络LSTM(Long-Short Term Memory)
- sentos yum安装mysql
- CentOS安装JDK的三种方法
- Ajax跨域请求后台无法识别session id的解决方式[withCredentials = true]
- jdk安装与环境变量配置、Scala编译器安装、IDEA安装Scala插件
- Leetcode第695题. Max Area of Island
- 对LSTM中M(Memory)的再思考
- 【腾讯TMQ】移动设备管理控制工具(STF)平台的正确搭建方式
- 51nod 1650 穿越无人区 (找规律)
- Java课程学习十一:图片匹配游戏
- Tensor
- 百度NLP架构与应用
- PE文件框架结构图
- LintCode之6 合并排序数组
- DevExpress 下TreeList下的节点复选框的显隐设置