做为一个AI老司机,回答这个问题简直义不容辞。
要论系统的介绍,要属Google的RNN深度学习入门视频了,对于英文好的童鞋强烈推荐首先简单回顾下循环神经网络(RNN)的动机和概念。
循
首先简单回顾下循环神经网络(RNN)的动机和概念。
循环神经网络的动机,是用隐藏状态记住一些历史信息,以处理序列化的输入数据。比如,字符识别问题中,单个字符的识别,和前后的字符都是相关的。再比如,处理视频,视频的每一帧,和前后帧也是相关的。
这里给出一些简单的示意代码:
rnn = RNN(D, H)
这里的`D`代表输入序列,`H`代表状态序列。输入序列`D`被转化为状态序列`H`。
h = rnn.next(h0, x)
这里`h0`是初始状态序列,`x`是输入序列。返回的输出`h`为包含时序信息的状态序列。
下一步运算之间使用上一步产生的状态序列:
h = rnn.next(x)
h的具体计算方法为:
h[t] = tanh(Wh(h[t- 1]) + Wx(x[t]) + b)
其中,`Wh`是记录状态之间连接的矩阵,`Wx`是记录输入与状态之间连接的矩阵,`b`是偏置。`tanh`函数的选取是经验的结果,在实践中发现,`tanh`的效果比较好。
我们可以看到,原生RNN中状态的计算方法是比较简单的。这就带来一个问题,如果相关的两个输入,在输入序列中的距离较远,那最终的效果就比较差了。当然,有时候,调整一些参数,可以将距离较远的相关输入(长时依赖关系)联系起来,但大多数时候,这很困难。
因此,我们考虑给我们的循环网络加入长期记忆功能。在状态之外,增加一个结构(不妨把这个结构叫做细胞)。然后,通过某些阀门,控制何时遗忘信息,何时将信息保存到细胞内。
(图片来源:arunmallya.github.io)
这样我们就得到了LSTM(Long Short-Term Memory,长短期记忆网络)。
LSTM和原生循环网络的总体结构是一致的。
lstm = nn.LSTM(D, H)
输入门,决定是否将信息传入细胞
i[t] = sigmoid(ai[t])
遗忘门,决定是否遗忘信息
f[t] = sigmoid(af[t])
输出门,决定细胞状态中哪些信息将被输出
o[t] = sigmoid(ao[t])
使用`tanh`调整输出结果(确保输出值在-1和1之间)
g[t] = tanh(ag[t])
细胞状态既取决于上一个时刻的细胞状态,也取决于输入门和遗忘门的作用
c[t] = f[t] * c[t - 1] + i[t] * g[t]
状态取决于输出门和细胞状态
h[t] = o[t] * tanh(c[t])
我们可以看到,LSTM和原生RNN的基本原理是一样的,LSTM在RNN的基础上增加了一个细胞状态而已。