举例
如下图蓝色框为记忆区,当黄色输入=1时,绿色=1+1=2,橙色输出=2+2=4,同时将绿色框结果存储到蓝色记忆区。
此时蓝色记忆区=2,黄色输入=1时,绿色=1+1+2+2=6,橙色输出=6+6=12,同时将绿色框结果存储到蓝色记忆区。
以此类推,输入输出序列如下,故我们可知当输入序列顺序改变时,输出值会产生变化。
1.几个简单分类
- Elman Network:将某时间点的hidden layer存起来,在下个时间点读入
- Jordan Network:将某时间点的output存起来,在下个时间点读入
- Bidirectional RNN(双向的):同时训练一个正向的、逆向的,然后将某时间点的正逆两个结果输出 yt
2.Long Short-term Memory(LSTM)
简单解释:
- 现有一个Memory Cell
- Input Gate决定外界输入能否被保存到Memory Cell中,Output Gate决定外界能否从Memory Cell读出,至于Input Gate、Output Gate是打开/关闭是网络自己学习的
- Forget Gate决定什么时候要把过去记的东西忘掉,也是自己学习的
详细解释:
- 现要被存入Input里面的是 z z z,操控Input Gate的是 z i z_i zi(数值),操控Output Gate的是 z o z_o zo(数值),操控Forget Gate的是 z f z_f zf(数值)
- 三个门的激活函数通常为sigmoid函数,介于0-1,1:开启状态 即可以输入。例如: f ( z i ) = 0 f(z_i)=0 f(zi)=0时, f ( z i ) g ( z ) = 0 f(z_i)g(z)=0 f(zi)g(z)=0也就没有输入了; f ( z f ) = 1 f(z_f)=1 f(zf)=1时, f ( z f ) c = 1 f(z_f)c=1 f(zf)c=1即原来存储什么还是什么,没有被遗忘(针对遗忘门,打开时代表记得,关闭时代表遗忘)
- 新的存在Memory Cell里面的值: c ′ = g ( z ) f ( z i ) + c f ( z f ) c'=g(z)f(z_i)+cf(z_f) c′=g(z)f(zi)+cf(zf)
- 输出门
a
=
h
(
c
′
)
f
(
z
0
)
a=h(c')f(z_0)
a=h(c′)f(z0)
- 对比常规的神经网络,将上述框架看作是一个神经元,所以LSTM本质结构就是无数个上述结构的神经元相连。上文提到有四个输入过程,下图为解释:
3.关于误差
基于RNN的网络,通常不容易被学习,常常出现如下情况:
详细分析如下:
loss可能会发生非常剧烈的振荡,更糟糕的状况例如当处在中间交界处时,之前的梯度都很小 所以将学习率调大,但当调整完后梯度突然增大 再加上学习率变大,整个结果就会崩坏。
为什么会这样:
假设现在有个结构如下的网络,
绿色框中的
w
w
w有十分大的梯度,那么针对这种情况我们需要将学习率设小
黄色框中的
w
w
w有小的梯度,那么针对这种情况我们需要将学习率设小
故,当面对变化频繁的梯度,学习率也需要不断调整
解决方法:LSTM
LSTM可以解决梯度消失问题,即将比较平坦的部分拿掉,但是该方法不会解决梯度爆炸问题。至于为什么会解决梯度消失问题,知乎上排名第一的答案可以参考(问题:LSTM如何来避免梯度弥散和梯度爆炸?)
4.其他应用
输入和输出的长度不一定要相同,例如:
- 输入:序列,输出:向量。如:语义情感分析
- 输入:长序列,输出:短序列。如:语音辨识
- 输入:不确定长度序列,输出:不确定长度序列。如:Machine Translation
(未完)