RNN简介

传统的CNN不能预测序列数据, 而只能对单个数据进行预测, 而RNN提供了序列数据预测的能力.

在RNN中, 一般来说我们将训练集分散为很多有限长的序列, 然后对这个序列进行训练.



图中$s_t$为隐含层,可以认为是记忆单元,即$s_t$概括了$x_0$到$x_{t-1}$的信息,利用$x_t$, $s_t$ 可以预测输出$o_t$. 训练时需要使用$o_t$与真实的输出做比较,即产生一个误差,最小化这个误差就是对这个$RNN$的训练过程。

数学公式如下

$$s_t=f(Ux_t + Ws_{t-1})$$
$$o_t = \mathrm{softmax}(Vs_t)$$
$$cost = \sum_t f_{err}(o_t, \hat o_t)$$

注意这里的参数是$U,V,W$, 每一个单元的$U,V,W$是相同的. 同时$f$是激活函数, 可以是$ReLu, tanh, sigmoid$等. 一般如果是softmax, 用交叉熵损失, 当然也可以用其他的, 只要可求导即可.

应用

  1. 语言建模, 语言预测, 给定一个不完整的句子, 预测可能的填充.

  2. 机器翻译, 给定一个句子预测句子在另外的语言的意思. 这里的输出在外面.



  1. 语音识别.

  2. 生成图片的描述, Generating Image Descriptions, NeuralTalk

  3. 音乐生成. biaxial-rnn-music-composition

扩展

  • 双向RNN



  • 深度(双向)RNN



  • LSTM网络, 与RNN的结构一致, 不同的是计算隐状态的方式不同.

LSTM 简介

RNN的致命缺点是对长序列的预测效果不好, 这是因为RNN的记忆功能不好, 同时存在梯度消失问题, 所以有人引入了LSTM(long short-term memory)长短项记忆.



其不同之处只是在计算隐含层的时候不同, 同时与下一层有两个连接. 一个是记忆记忆单元$c$和遗忘门$f$. 原理就是在RNN的基础上, 利用记忆单元来更好的对长序列进行概括.

$$ i =\sigma(x_tU^i + s_{t-1} W^i)$$
$$ f =\sigma(x_t U^f +s_{t-1} W^f)$$
$$ o =\sigma(x_t U^o + s_{t-1} W^o)$$
$$g =\tanh(x_t U^g + s_{t-1}W^g) $$
$$ c_t = c_{t-1} \circ f + g \circ i $$
$$ s_t =\tanh(c_t) \circ o$$

一般来说序列越长, 记忆的东西就越多, 就越可能过拟合, 同时也会导致训练的困难以及需要的数据增多, 但是太短也会导致欠拟合.

LSTM拓展

LSTM还有很多的拓展, 如GRU, LSTM with peephole connections, 这里有一片很好的综述文章

Reference

Understanding LSTM Networks
RECURRENT NEURAL NETWORKS TUTORIAL
CS231N