本文解决了什么问题

  • 在摘要中提到了,传统的BPTT或RTRL会出现,误差(就是梯度)消失、爆炸的问题;梯度消失会导致更新过慢,甚至不能学习,梯度爆炸会导致权重震荡
  • RNN和Lstm的不同之处,在于改进了RNN的梯度爆炸、消失问题
  • 本文利用lstm的结构,改进了这个问题,整个结构使得恒定的error flow,不会梯度爆炸、消失(感觉是吹的)

BPTT

  • BPTT是back propagation throught time,是梯度沿时间通道传播的算法

  • 假设在时间t,真实值(文中说的target)是dk(t)k指第k个值;预测值为yk

  • 有一说一,原论文的公式写得太简洁了
  • 如果损失函数是mse,即
loss=tk(dk(t)yk(t))2
  • 那么第k的单元的误差就是,对第k个神经元求导,即lossnetk(t)=ϑk(t)
    • 文中把这个叫做ks error signal,误差信号
    • 文中用了vartheta这个符号来表示这个梯度
ϑk(t)=fk( net k(t))(dk(t)yk(t))
  • 其中yi(t)=fi(neti(t))neti(t)=jwijyj(t1)
  • fi是激活函数,wij是单元i到单元j的权重连接,也就是我们需要更新的参数
  • 而中间层的误差为,即对j个神经元求导,有lossnetj(t)=llossyl(t+1)yl(t+1)netj(t)
ϑj(t)=fj(netj(t))iwijϑi(t+1)

Hochreiter’s analysis

  • 现在关注下神经元u到神经元v的误差流向(v在模型的底层,u在上层,所以反传的时候,是)
  • 这里有两个概念,第一个是时间t,神经元u

  • 任意一个神经元u,在时间t,产生的误差,都会反传回去,假设反传了q个step,即q个时间,到达神经元v

ϑv(tq)ϑu(t)={fv(netv(t1))wuvq=1fv(netv(tq))l=1nϑl(tq+1)ϑu(t)wlvq>1
  • 这一章的符号看得一愣一愣的,完全不知道在说啥
  • 但是提出了一个观点,即增加神经元的个数,不一定能增加error flow

constant error flow

  • 前面一节太难了,符号太麻烦了
  • 这一节讲怎么得到常数级别的误差

模型结构

  • 本文构建了一种模型,有常数级别的error flow,这些error可以传递过特殊的、自连接的神经元,而且又没有上面方法的缺点
  • 这里扩展了constant error carrousel

    • constant error carrousel的意思
    • carrousel应该翻译成旋转木马
  • 输入门:保护存储在j上的记忆,个人认为是特征,避免被不想关的信息给扰动

  • 输出门:文中用了multiplicative来形容,是用来保护存储在当前j中的,不相关的记忆
  • 记忆门:每一个记忆门的神经元,都是建立在中心的线性神经元之上,而且有固定的self-connection,这是什么意思
  • 为啥要用gate units:避免输入权重的冲突,模型使用输入门来决定,保留还是重写记忆门中的cj

    输出门的outj决定什么时候获取cj

  • 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

实验部分

  • 首先,任务应该要足够复杂,不能被简单的解决掉,言下之意就是,不能通过随机猜权重就解决了