前沿
距离上次在Coursera平台上课已经有几个月了,当时本以为自己会用不到RNN的东西,所以就没有继续学下去。然而最近参加了一些面试,发现掌握RNN还是非常有必要的,序列模型在生活中的应用还是挺广的,在金融量化投资领域尤其重要,所以趁着最近有点迷茫,又决定好好学一学RNN,达到至少懂一些的程度。
1.1 为什么选择序列模型
序列模型在生活中的应用非常广泛:
1.2 Notation
对于自然语言处理问题(NLP),怎样表示每个单词呢?
首先需要建立一个包含常用词汇的语料库(例如小的语料库可能包含约1万个常用词汇),然后对预料库中的词汇进行排序,最后句子中的每一单词都可以用它在语料库中的位置表示。
每个单词的位置都采用独热编码(One-hot)表示,这样每个单词都是一个长度为1万的向量。
对于序列结构的数据为什么不直接采用标准的神经网络模型?
原因包括以下几个方面:
同一训练集,不同样本之间的输入和输出的长度都不相同;
不能共享其它位置学到的特征;
对于自然语言处理,输入的长度可能超过上百万,这样会导致模型的参数变得巨大,模型几乎无法学习。
1.3 Recurrent Nueral Networks
循环神经网络(RNN)的结构:
RNN在计算t时刻的输出时,不仅用到了t时刻的输入,还会用到前一些时刻的信息。
需要强调的一点是上图所用到的都是同一个
,
,
。
为了表示方便,中间有些项可以合并,但实际计算结果是一样的:
1.4 RNN的正向和反向传播
在RNN的正向传播过程中,同一套参数(
,
,
,
)分别用在每一个时刻;每一个时刻的损失函数用交叉熵损失表示,整个样本的损失值为所有时刻的损失求和;反向传播时,需要根据损失梯度反馈到每一个节点。
1.5 不同类型的RNN结构
上面我们提到的只是比较常见的一种RNN结构,事实上,针对不同的任务类型,可以发展其它结构的RNN, 如下:
1.6 语言模型和序列生成
我们用语言模型来判断一个句子出现的概率
利用RNN来训练一个语言模型,所采用的训练集常为大量文本材料。
RNN所做的实际上是针对一个句子,计算在前面词汇出现的情况下,下一个出现单词的概率。
1.7 对新序列采样
当训练完一个语言模型后,我们可以采用对新序列进行采样的方法去了解该模型的学习情况。
采样过程:对于首词,我们可以针对所有词汇出现在首个位置的概率随机选取一个单词;接下来针对前一个单词出现的情况下,针对下一个单词出现的概率随机选取一个单词;直至取到,或者句子的总词汇数量到达设定最大值。
同样可以在字母水平训练模型,并在字母水平对新序列采样。
1.8 RNN中的梯度消失问题
在之前的学习中,我们已经了解到普通深度学习模型很容易出现梯度消失或梯度爆炸的问题。同样的,简单的RNN模型在处理长的序列数据时也常出现梯度消失的问题,表现在模型很难记忆早期学习到的特征,如以下例子中的单复数。
1.9 GRU
GRU: Gated Recurrent Unit
GRU单元能够帮助RNN模型记忆前期远距离的特征,最基本的RNN单元如下:
基础版本的GRU单元结构如下:
它的特殊之处在于增加了一个新的变量
,理解为“门”的意思,发挥一个开关的作用。
的值经常处于1或者0,当
的值取0时,继续保持之前记忆的特征,当
的值取1时,覆盖之前的记忆。
完整的GRU结构如下:
1.10 LSTM
LSTM: Long Short Term Memory
GRU 和LSTM的机构分别如下,LSTM有三道门——更新门、忘记门、输出门。
LSTM的三道门都同时基于
,
。
相当而言GRU的结果更简单一些,因此更容易构建深度RNN模型。但是LSTM还是非常受欢迎,对于新的项目,吴老师建议先尝试LSTM。
1.11 Bidirectional RNN
对于有些序列任务,如果只是基于前期的信息,仍然无法做出准确的预测;而加上未来的信息才能做出正确的预测。这就是接下来要讲的双向RNN模型的特点:基于两个方向的信息。
BRNN的每次预测都用到了两个方向的信息流。
1.12 Deep RNNs
与普通深度神经网络模型一样,我们也可以构建深度RNN模型。
由于深度RNN模型很难训练,所以我们很少见到非常深的RNN模型。
注:如无特殊说明,以上所有图片均截选自吴恩达在Coursera开设的神经网络系列课程的讲义。