Advertisement

Long short-term memory 论文小记

阅读量:

这是Hochreiter(1997)的一篇老论文,我为了一睹lstm的原创遗风而读。本来想看看最朴素最正宗的lstm模型,结果却发现在本文中作者并未提出一种特有的模型。文章很长,并不打算翻译。下面是我的一些总结和见解,纯粹小菜鸟的个人观点,大家多多指正,非常欢迎~

首先是这篇文章的动机。作为一篇长文,什么支撑着作者进行这么多的实验,以及这篇文章的重要性有多大,取决于动机。在这里,总结成一句话就是:Old activation and scaled current input always perturb stored information so that information can’t last for long term.By adding a higher order unit can soften the problem a bit but can’t generalize.就是之前的激活函数还有直接对输入进行变换并不能存储信息,尤其是长时间的信息。通过加一些高阶的单元可以缓解这个问题,但是并不能每个模型都手动加,所以这个方法不能推广。

而当前的需求是:More realistic tasks require either many free parameters or high weight precision, such that guessing becomes completely infeasible.现实生活中的问题要么需要很多的参数,要么需要很高的精度,这都无法通过随机猜得到(指随机初始化)

基于这两点,作者想找到一种方法能够存储长时信息,而且不需要很多参数。

于是作者进行了一段时间的研究,发现之前的RNN也好,前馈也好,之所以不能存储长时信息,是因为:

  1. 所有的输入都被接收了,传入到了网络中覆盖了之前的信息
  2. BP的过程是一个迭代累乘的过程,随着时间步长变长,信息会衰减。每一步的衰减因子就是前一步的f’(z).*W,这个无论如何都没办法等于1,所以会导致梯度消失或者梯度爆炸。具体的数学推导过程见原文。我是一个数学盲,就不展开说了。

所以针对以上两点,作者巧妙地设计出了门(Gate)的概念。以及在一个LSTMcell中,信息的更新和传输是以加的方式进行的。这两者就是这篇长文的核心!

先说说门(gate),门是由一个sigmod之类的激活函数生成的,主要作用就是生成一个值[0,1]之间掩模(mask),然后拿这个掩模去作用于输入或者输出。值为1表示允许该输入进入(输出出去),为0则把该输入屏蔽(输出被关上)。门可以作用于很多地方,根据作用不同,有输入门,输出门,后来人们还加了忘记门。关于门,作者说了两句很费解的话:The input gate learns when to release errors, the output gates learns which errors to trap in its CEC.CEC 就是下面说到了一个LSTM cell 的更新机制。

然后就是在每个LSTM cell中状态的更新。Sc(t)表示t时刻的状态的话,那么
Sc(t)=Sc(t-1)+fin(net(x(t)))g(net(c(t))
其中fin就是输入门,g是一个规整函数,可以是tanh或其他。x(t)是输入。net()是表示一个权重网络。可以看出,这里更新是以加的方式进行的,而不是直接输入一个权重网络,以乘的方式进行。这样的话求导的时候,本来衰减因子是f’(z).*W,而这里没有W,或者说W=1,而f’(z)之间也不是相乘的关系,而是加的关系。
例如,RNN展开之后是这样的:
delta(t-q)=K(t-q+1)*K(t-q+1)*...*K(t-1)*delta(t)
而LSTM展开之后就是这样的:
delta(t-q)=A(t)+B(t)+C(t)=(A(t-1)+C(t-1)+D(t-1))+B(t)+C(t)= A(t-q)+...+B(t)+C(t)
因此,LSTM不存在衰减或者爆炸的问题。另外可以看出,RNN的误差仅由t时刻的delta决定,存储的只是t时刻当前信息,而LSTM存储了从t-q到t这q个时刻的信息。

然后就到了实验部分,这部分并没有怎么看。因为仅实验所用的样例lstm的结构我都没有看懂,设计得相当复杂。更可怜的是,连每个实验要做什么我也没有看懂。看懂的大牛快来解答一下,欢迎留言探讨 (md怎么没有字体发亮变色功能)
前面也说了,只是提出了门和cell的更新传递方式,并没有规定组合。用作者原话是根据实际需要user define。在样例里,作者用了两个lstm block,每个block有两个cell,它们共用一个输出门和输出门。至于它们的数据是怎么传递的呢,我看到输入不仅流入了两个输入门,还直接流入cell里还有输出门。相当凌乱的样子。而输出层的每个神经元只与block1的两个cell相连,注意是cell不是输出门!而block2,我并不知道它用来干嘛,因为只有输入流没有输出流~

全部评论 (0)

还没有任何评论哟~