LSTM神经网络走读

 
0设计概述
RNN梯度爆炸和消失比较严重,RNN隐层只有一个状态h记录短期记忆,增加一个长期记忆状态c似乎就可以解决问题。
按时间维度展开
 
如何控制长期状态c,设计:增加三个开关,控制是否记录前一时刻的长期状态,是否把当前输入记录为长期状态单元 ,是否把当长期状态输出。
 
1前向计算
输入:前一个时刻的状态单元Ct-1,前一时刻的输出Ht-1,当前时刻的输入Xt;
输出:当前时刻的状态单元Ct,当前时刻的最终输出Ht。
1.1遗忘门:上一时刻的状态单元有多少保留到当前时刻
 
 
1.2输入门:当前时刻输入x有多少保留到状态单元 
 
 
1.3当前输入的状态单元 :
 
1.4计算当前时刻状态单元 :
遗忘门*前一时刻状态单元 +输入门*当前输入状态
 
-------------------------------------------------------------------------------------------------------
1.5输出门:控制当前时刻状态单元 对当前输出有多少影响
 
1.6 最终输出:由状态单元和输出门共同决定
 
 
2训练
原理与bp同,每个神经元多了五个参数f,i,c,o,h:
 
LSTM需要学习的参数总共有八组:输入门,遗忘门,输出门和状态单元的权重矩阵W和偏置b
像bp一样,借助netj,不过这里是三个门的netj:
梯度为其中netj为
2.1沿时间维度:
计算t-1时刻的梯度(第一项是t时刻的梯度),主要计算第二项:
由LSTM公式:
 
由全导数公式:
 
可拆开项,求得
 
带入求得:
 
 
带入求得由t时刻传递任意k时刻的误差:
 
2.2沿上一层:
l层与l-1层的梯度关系:
全导数公式:
 
具体过程是分开每项计算:
计算W:  计算偏置b 
 
 
 
3GRU (Gated Recurrent Unit)
相对于LSTM,有两个改动:
     1把遗忘门,输入门和输出门改为两个门:更新门z和重置门r;
     2将单元状态和输出改为一个状态:h
 
 
备注:
激活函数tanh和sigmoid的导函数都是原函数的函数:
 
 
 
参考:相关网络博客及文献

 

posted @ 2017-04-15 22:38  rongyux  阅读(619)  评论(0编辑  收藏  举报