经典论文阅读---LSTM
- 记录下LSTM
本文解决了什么问题
- 在摘要中提到了,传统的BPTT或RTRL会出现,误差(就是梯度)消失、爆炸的问题;梯度消失会导致更新过慢,甚至不能学习,梯度爆炸会导致权重震荡
- RNN和Lstm的不同之处,在于改进了RNN的梯度爆炸、消失问题
- 本文利用lstm的结构,改进了这个问题,整个结构使得恒定的error flow,不会梯度爆炸、消失(感觉是吹的)
BPTT
BPTT是back propagation throught time,是梯度沿时间通道传播的算法
假设在时间$t$,真实值(文中说的
target
)是$d_{k}(t)$,$k$指第$k$个值;预测值为$y^{k}$- 有一说一,原论文的公式写得太简洁了
- 如果损失函数是mse,即
- 那么第$k$的单元的误差就是,对第$k$个神经元求导,即$\frac{\partial \text{loss}}{\partial net_k(t)} = \vartheta_{k}(t)$
- 文中把这个叫做$k’s$ error signal,误差信号
- 文中用了vartheta这个符号来表示这个梯度
- 其中$y^{i}(t)=f_{i}\left(n e t_{i}(t)\right)$,$n e t_{i}(t)=\sum_{j} w_{i j} y^{j}(t-1)$
- 即$f_i$是激活函数,$w_{ij}$是单元$i$到单元$j$的权重连接,也就是我们需要更新的参数
- 而中间层的误差为,即对$j$个神经元求导,有$\frac{\partial \text{loss}}{ \partial net_j (t)} =\sum_l \frac{\partial \text{loss}}{ \partial y_l(t+1)} \frac{ \partial y_l(t+1)}{ \partial net_j(t) }$
Hochreiter’s analysis
- 现在关注下神经元$u$到神经元$v$的误差流向($v$在模型的底层,$u$在上层,所以反传的时候,是)
这里有两个概念,第一个是时间$t$,神经元$u$
任意一个神经元$u$,在时间$t$,产生的误差,都会反传回去,假设反传了$q$个step,即$q$个时间,到达神经元$v$,
- 这一章的符号看得一愣一愣的,完全不知道在说啥
- 但是提出了一个观点,即增加神经元的个数,不一定能增加error flow
constant error flow
- 前面一节太难了,符号太麻烦了
- 这一节讲怎么得到常数级别的误差
模型结构
- 本文构建了一种模型,有常数级别的error flow,这些error可以传递过特殊的、自连接的神经元,而且又没有上面方法的缺点
这里扩展了constant error carrousel
- constant error carrousel的意思
- carrousel应该翻译成旋转木马
输入门:保护存储在$j$上的记忆,个人认为是特征,避免被不想关的信息给扰动
- 输出门:文中用了multiplicative来形容,是用来保护存储在当前$j$中的,不相关的记忆
- 记忆门:每一个记忆门的神经元,都是建立在中心的线性神经元之上,而且有固定的self-connection,这是什么意思
为啥要用gate units:避免输入权重的冲突,模型使用输入门来决定,保留还是重写记忆门中的$c_j$,
输出门的$out_j$决定什么时候获取$c_j$
- abuse problem:在学习(训练)的开始阶段,可能还没有存储信息就已经缩减了误差,那么模型就倾向于滥用memory cells,可能需要很长时间才能释放这些滥用的memory cells。
- 有两种方式来解决这个问题:sequential network construction,即无论误差是否已经停止下降了,都可以加memory cell进去;output gate的bias设置成负值,来促进memory cell激活值趋于零,在实验中表明,这些数值
- internal state漂移的问题:如果memory cell的输入,大多都是正(负)数,那么internal state会倾向于随着时间漂移(感觉就是发散了,不集中在中间),一阶导就会容易倾向于变成小的数值,然后梯度就会消失。
- 解决的方法是:选择合适的激活函数;初始化输入门的bias为0,这里是个trade off问题
- 文中提到,使用sigmoid激活函数之后,就不需要来微调bias
实验部分
- 首先,任务应该要足够复杂,不能被简单的解决掉,言下之意就是,不能通过随机猜权重就解决了