序列模型

1. Why sequence models?

在实际的生活中,很多东西都是序列信号,例如语音信号、音乐产生、情感分类、DNA序列分析等,这些虽然可以使用一般神经网络去完成,但就如同图像识别一样,那样去做太过于复杂,因此在这里引入了循环神经网络(RNN)。

2. Notation

x:代表输入的语句,例如:Harry Potter and Herminone Granger invented a new spell.并且使用x<t>代表本句中第t个单词。

y:代表输出结果。例如上句中对人名进行定位,则输出结果为“1 1 0 1 1 0 0 0 0 ”。同样的,y<t>代表本句中第t个单词的结果。

Tx,Ty:分别代表输入和输出的长度。

x(i)<t>,y(i)<t>:代表第i个样本的第t个单词以及对其的结果输出。

利用one-hot编码,实现单词与符号的一一对应。每一个x实际上都是一个n维矩阵(n取决于句子的单词和符号数)。

3. Recurrent Neural Network Model

在1中已经提到,SNN(标准神经网络)不适合应用在当前我们要处理的问题,现在将主要存在的问题表述如下:

(1)在不同样本中,输入以及其输出的长度可能不相等;

(2)不能共享从文本不同位置所学习到的特征。

循环神经网络-前向传播

其结构如图1所示。在每一个时间步(Time step)中,循环神经网络会传递一个激活值到下一个时间步中,用于下一时间步的计算。

1520783815405623.jpg

图1

a<0>是一个需要编造一个激活值,通常输入一个零向量,有的研究人员会使用随机的方法对该初始激活向量进行初始化。各个参数的计算公式如图2所示。

2.jpg

图2

 这是一个简化版本的公示形式。实际上Wa=[Waa|Wax]。

循环神经网络-反向传播

RNN的前向传播和反向传播结构图如图3所示。定义的损失函数与逻辑回归中的损失函数相同,在此不再累述。

1520783880826862.jpg

图3

下面简单列举下几种不同类型的RNN模型:

1520783896475712.jpg

图4

梯度消失-GRU和LSTM

3.1 梯度消失

RNN在NLP中具有很大的应用价值,但是其存在一个很大的缺陷,那就是梯度消失的问题。例如下面的例句中:

The cat, which already ate ………..,was full;

The cats, which already ate ………..,were full.

在这两个句子中,cat对应着was,cats对应着were,(中间存在很多很长省略的单词),句子中存在长期依赖(long-term dependencies),前面的单词对后面的单词有很重要的影响。但是我们目前所见到的基本的RNN模型,是不擅长捕获这种长期依赖关系的。

对于梯度消失问题,在RNN的结构中是我们首要关心的问题,也更难解决;虽然梯度爆炸在RNN中也会出现,但对于梯度爆炸问题,因为参数会指数级的梯度,会让我们的网络参数变得很大,得到很多的Nan或者数值溢出,所以梯度爆炸是很容易发现的,我们的解决方法就是用梯度修剪,也就是观察梯度向量,如果其大于某个阈值,则对其进行缩放,保证它不会太大。

3.2 GRU(Gated Recurrent Unit)

RNN 单元:对于RNN的一个时间步的计算单元,在计算a<t>也就是下图右边的公式,能以左图的形式可视化呈现:

1520783936136351.jpg

图7

简化的GRU 单元:我们以时间步从左到右进行计算的时候,在GRU单元中,存在一个新的变量称为c,(代表cell),作为“记忆细胞”,其提供了长期的记忆能力。GRU的可视化实现如图8所示。

1520783958281164.jpg

图8

完整公式如图9所示。

1520783975127265.jpg

图9

第一个式子是指在每一个时间步上,给定一个候选值c˜<t>,用以替代原本的记忆细胞c<t>;

第二个式子是代表更新门,是一个0-1的值,用以决定是否对当前时间步的记忆细胞用候选值更新替代;

第三个式子是以定每个时间步的候选值

第四个式子是记忆细胞的更新规则,门控值处于0-1之间,根据跟新公式能够有效地缓解梯度消失的问题;

第五个式子实际上记忆细胞输出的是在t时间步上的激活值a

3.3 LSTM

GRU能够让我们在序列中学习到更深的联系,长短期记忆(long short-term memory, LSTM)对捕捉序列中更深层次的联系要比GRU更加有效。LSTM的公式以及可视化图如图10所示。

1520783998670206.jpg

10

4. Language model and sequence generation

对于下面的例子:

The apple and pair salad.

The apple and pear salad.

两句话有相似的发音,但是想表达的意义和正确性却不相同,如何让我们的构建的语音识别系统能够输出正确地给出想要的输出。也就是对于语言模型来说,从输入的句子中,评估各个句子中各个单词出现的可能性,进而给出整个句子出现的可能性。

使用RNN来构建语言模型:

所谓训练集(Training Set)就是一大堆语言文本的集合(语料库)。Tokenize:将句子使用字典库标记化。

注意:未出现在字典库中的词使用“UNK”来表示。

第一步:使用零向量对输出进行预测,即预测第一个单词是某个单词的可能性;

第二步:通过前面的输入,逐步预测后面一个单词出现的概率;

训练网络:使用softmax损失函数计算损失,对网络进行参数更新,提升语言模型的准确率。

5. Sampling novel sequences

在完成一个序列模型的训练之后,如果我们想要了解这个模型学到了什么,其中一种非正式的方法就是进行一次新序列采样(sample novel sequences)。

对于一个序列模型,其模拟了任意特定单词序列的概率,如P(y<1>,,y<Ty>),而我们要做的就是对这个概率分布进行采样,来生成一个新的单词序列。

如下面的一个已经训练好的RNN结构,我们为了进行采样需要做的:

首先输入x<1>=0,a<0>=0在这第一个时间步,我们得到所有可能的输出经过softmax层后可能的概率,根据这个softmax的分布,进行随机采样,获取第一个随机采样单词y^<1>;

然后继续下一个时间步,我们以刚刚采样得到的y^<1>作为下一个时间步的输入,进而softmax层会预测下一个输出y^<2>,依次类推;

如果字典中有结束的标志如:“EOS”,那么输出是该符号时则表示结束;若没有这种标志,则我们可以自行设置结束的时间步。

图5是基于单词的一个采样模型,图6是基于字母的采样模型。

1520784086943175.jpg

图5

1520784057122128.jpg

图6

但是基于字符的语言模型,一个主要的缺点就是我们最后会得到太多太长的输出序列,其对于捕捉句子前后依赖关系,也就是句子前部分如何影响后面部分,不如基于词汇的语言模型那样效果好;同时基于字符的语言模型训练代价比较高。所以目前的趋势和常见的均是基于词汇的语言模型。但随着计算机运算能力的增强,在一些特定的情况下,也会开始使用基于字符的语言模型。

6. Bidirectional RNN

双向RNN则可以解决单向RNN存在的弊端。在BRNN中,不仅有从左向右的前向连接层,还存在一个从右向左的反向连接层。

1520784037759136.jpg

图11

    其中,预测输出的值预测结果即有前向的信息,又有反向的信息。在NLP问题中,常用的就是使用双向RNN的LSTM。