http://blog.csdn.net/u010754290/article/details/47167979
导言
在Alex Graves的这篇论文《Supervised Sequence Labelling with Recurrent Neural Networks》中对LSTM进行了综述性的介绍,并对LSTM的Forward Pass和Backward Pass进行了公式推导。
这篇文章将用更简洁的图示和公式一步步对Forward和Backward进行推导,相信读者看完之后能对LSTM有更深入的理解。
如果读者对LSTM的由来和原理存在困惑,推荐DarkScope的这篇博客:《RNN以及LSTM的介绍和公式梳理》
一、LSTM的基础结构
LSTM的结构中每个时刻的隐层包含了多个memory blocks(一般我们采用一个block),每个block包含了多个memory cell,每个memory cell包含一个Cell和三个gate,一个基础的结构示例如下图:
一个memory cell只能产出一个标量值,一个block能产出一个向量。
二、LSTM的前向传播(Forward Pass)
1. 引入
首先我们在上述LSTM的基础结构之上构造时序结构,这样让读者更清晰地看到Recurrent的结构:
这里我们有几个约定:
- 每个时刻的隐层包含一个block
- 每个block包含一个memory cell
下面前向传播我们则从Input开始,逐个求解Input Gate、Forget Gate、Cells Gate、Ouput Gate和最终的Output
这里需要申明的一点,推导过程严格按照上述图示LSTM的结构;论文中对相较于该文章的推导过程会有增加一些项,在每一个公式不一致的地方我都会有相应说明。
2. Input Gate(ι) 的计算
Input Gate接受两个输入:
- 当前时刻的Input作为输入:xt
- 上一时刻同一block内所有Cell作为输入:st−1c
该案例中每层仅有单个Block、单个cemory cell,可以忽略∑Cc=1,以下Forget Gate和Output Gate做相同处理。
最终Input Gate的输出为:
这里Input Gate还可以接受上一个时刻中不同block的输出bt−1h作为输入,论文中atι会增加一项∑Hh=1ωhιbt−1h。
3. Forget Gate(ϕ) 的计算
Forget Gate接受两个输入:
- 当前时刻的Input作为输入:xt
- 上一时刻同一block内所有Cell作为输入:st−1c
最终Forget Gate的输出为:
这里Input Gate还可以接受上一个时刻中不同block的输出bt−1h作为输入,论文中atϕ会增加一项∑Hh=1ωhϕbt−1h。
4. Cell(c) 的计算
Cell的计算稍有些复杂,接受两个输入:
- Input Gate和Input输入的乘积
- Forget Gate和上一时刻对应Cell输出的乘积
最终Cell的输出为:
这里Input Gate还可以接受上一个时刻中不同block的输出bt−1h作为输入,论文中atc会增加一项∑Hh=1ωhcbt−1h。
5. Output Gate(ω) 的计算
Output Gate接受两个输入:
- 当前时刻的Input作为输入:xt
- 当前时刻同一block内所有Cell作为输入:stc
这里Output Gate接受“当前时刻Cell的输出”而不是“上一时刻Cell的输出”,是由于此时Cell的结果已经产出,我们控制Output Gate的输出直接采用Cell当前的结果就行了,无须使用上一时刻。
最终Output Gate的输出为:
这里Cell还可以接受上一个时刻中其他gate链接过来的边,论文中atϕ会增加一项∑Hh=1ωhϕbt−1h,这里H是泛指t-1时刻的Cell或三个Gate。
6. Cell Output(c) 的计算
Cell Output的计算即将Output Gate和Cell做乘积即可。
最终Cell Output为:
7. 小结
至此,整个Block从Input到Output整个Forward Pass已经结束,其中涉及三个Gate和中间Cell的计算,需要注意的是三个Gate使用的激活函数是f,而Input的激活函数是g、Cell输出的激活函数是h。
这里读者需要注意,在整个计算过程中,当前时刻的三个Gate均可以从上一时刻的任意Gate中接受输入,在公式中存在体现,但是在图示中并未画出相应的边。我们可以认为只有上一时刻的Cell才和当前时刻的Cell或三个Gate相连。
三、LSTM的反向传播(Backward Pass)
1. 引入
此处在论文中使用“Backward Pass”一词,但其实即Back Propagation过程,利用链式求导求解整个LSTM中每个权重的梯度。
2. 损失函数的选择
为了通用起见,在此我们仅展示多分类问题的损失函数的选择,对于网络的最终输出我们利用softmax方程计算结果属于某一类的概率(此时结果属于k个类别的概率和为1)。
注意,yk对ak的偏导为∂yk′∂ak=ykδkk′−ykyk′(δkk′当k==k′时为1,其他为0)
其中,对于网络输出a1,a2,...对应我们可以得到p(C1|x),p(C2|x),...,即给定输入x输出类别为C1,C2,...的概率。
这样损失函数(Loss Function)就很好定义了:对于k∈1,2,...,K,网络输出的类别为k概率为yk,而真实值zk:
3. 权重的更新
对于神经网络中的每一个权重,我们都需要找到对应的梯度,从而通过不断地用训练样本进行随机梯度下降找到全局最优解,那么首先我们需要知道哪些权重需要更新。
一般层次分明的神经网络有input层、hidden层和output层,层与层之间的权重比较直观;但在LSTM中通过公式才能找到对应的权重,和图示中的边并不是一一对应,下面我将LSTM的单个Block中需要更新的权重在图示上标示了出来:
为了方便起见,这里需要申明的是:我们仅考虑上一时刻的Cell仅和当前时刻的Cell和三个Gate相连。
2. Cell Output的梯度
首先我们计算每一个输出类别的梯度: