序列模型
在实际的生活中,很多东西都是序列信号,例如语音信号、音乐产生、情感分类、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)中,循环神经网络会传递一个激活值到下一个时间步中,用于下一时间步的计算。
图1
a<0>是一个需要编造一个激活值,通常输入一个零向量,有的研究人员会使用随机的方法对该初始激活向量进行初始化。各个参数的计算公式如图2所示。
图2
这是一个简化版本的公示形式。实际上Wa=[Waa|Wax]。
循环神经网络-反向传播
RNN的前向传播和反向传播结构图如图3所示。定义的损失函数与逻辑回归中的损失函数相同,在此不再累述。
图3
下面简单列举下几种不同类型的RNN模型:
图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>也就是下图右边的公式,能以左图的形式可视化呈现:
图7
简化的GRU 单元:我们以时间步从左到右进行计算的时候,在GRU单元中,存在一个新的变量称为c,(代表cell),作为“记忆细胞”,其提供了长期的记忆能力。GRU的可视化实现如图8所示。
图8
完整公式如图9所示。
图9
第一个式子是指在每一个时间步上,给定一个候选值c˜<t>,用以替代原本的记忆细胞c<t>;
第二个式子是代表更新门,是一个0-1的值,用以决定是否对当前时间步的记忆细胞用候选值更新替代;
第三个式子是以定每个时间步的候选值;
第四个式子是记忆细胞的更新规则,门控值处于0-1之间,根据跟新公式能够有效地缓解梯度消失的问题;
第五个式子实际上记忆细胞输出的是在t时间步上的激活值a。
3.3 LSTM
GRU能够让我们在序列中学习到更深的联系,长短期记忆(long short-term memory, LSTM)对捕捉序列中更深层次的联系要比GRU更加有效。LSTM的公式以及可视化图如图10所示。
图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是基于字母的采样模型。
图5
图6
但是基于字符的语言模型,一个主要的缺点就是我们最后会得到太多太长的输出序列,其对于捕捉句子前后依赖关系,也就是句子前部分如何影响后面部分,不如基于词汇的语言模型那样效果好;同时基于字符的语言模型训练代价比较高。所以目前的趋势和常见的均是基于词汇的语言模型。但随着计算机运算能力的增强,在一些特定的情况下,也会开始使用基于字符的语言模型。
6. Bidirectional RNN
双向RNN则可以解决单向RNN存在的弊端。在BRNN中,不仅有从左向右的前向连接层,还存在一个从右向左的反向连接层。
图11
其中,预测输出的值预测结果即有前向的信息,又有反向的信息。在NLP问题中,常用的就是使用双向RNN的LSTM。