Why sequence models
序列模型能够应用在许多领域,例如:
-
语音识别
-
音乐发生器
-
情感分类
-
DNA序列分析
-
机器翻译
-
视频动作识别
-
命名实体识别
这些序列模型基本都属于监督式学习,输入x和输出y不一定都是序列模型。如果都是序列模型的话,模型长度不一定完全一致。
Notation
下面以命名实体识别为例,介绍序列模型的命名规则。示例语句为:
Harry Potter and Hermione Granger invented a new spell.
该句话包含9个单词,输出y即为1 x 9向量,每位表征对应单词是否为人名的一部分,1表示是,0表示否。很明显,该句话中“Harry”,“Potter”,“Hermione”,“Granger”均是人名成分,所以,对应的输出y可表示为:
y=[1 1 0 1 1 0 0 0 0]
一般约定使用y表示序列对应位置的输出,使用Ty表示输出序列长度,则1≤t≤Ty。
对于输入x,表示为:
[ x < 1 > x < 2 > x < 3 > x < 4 > x < 5 > x < 6 > x < 7 > x < 8 > x < 9 > ] [x^{<1>} x^{<2>} x^{<3>} x^{<4>} x^{<5>} x^{<6>} x^{<7>} x^{<8>} x^{<9>}] [x<1>x<2>x<3>x<4>x<5>x<6>x<7>x<8>x<9>]
同样,x表示序列对应位置的输入,Tx表示输入序列长度。注意,此例中,Tx=Ty,但是也存在Tx≠Ty的情况。
如何来表示每个x呢?方法是首先建立一个词汇库vocabulary,尽可能包含更多的词汇。例如一个包含10000个词汇的词汇库为:
该词汇库可看成是10000 x 1的向量。值得注意的是自然语言处理NLP实际应用中的词汇库可达百万级别的词汇量。
然后,使用one-hot编码,例句中的每个单词x都可以表示成10000 x 1的向量,词汇表中与x对应的位置为1,其它位置为0。该x为one-hot向量。值得一提的是如果出现词汇表之外的单词,可以使用UNK或其他字符串来表示。
对于多样本,以上序列模型对应的命名规则可表示为:X(i),y(i),T(i)x,T(i)y。其中,i表示第i个样本。不同样本的T(i)x或T(i)y都有可能不同。
Recurrent Neural Network Model
对于序列模型,如果使用标准的神经网络,其模型结构如下:
使用标准的神经网络模型存在两个问题:
第一个问题,不同样本的输入序列长度或输出序列长度不同,即T(i)x≠T(j)x,T(i)y≠T(j)y,造成模型难以统一。解决办法之一是设定一个最大序列长度,对每个输入和输出序列补零并统一到最大长度。但是这种做法实际效果并不理想。
第二个问题,也是主要问题,这种标准神经网络结构无法共享序列不同x之间的特征。例如,如果某个x即“Harry”是人名成分,那么句子其它位置出现了“Harry”,也很可能也是人名。这是共享特征的结果,如同CNN网络特点一样。但是,上图所示的网络不具备共享特征的能力。值得一提的是,共享特征还有助于减少神经网络中的参数数量,一定程度上减小了模型的计算复杂度。例如上图所示的标准神经网络,假设每个x扩展到最大序列长度为100,且词汇表长度为10000,则输入层就已经包含了100 x 10000个神经元了,权重参数很多,运算量将是庞大的。
标准的神经网络不适合解决序列模型问题,而循环神经网络(RNN)是专门用来解决序列模型问题的。RNN模型结构如下:
序列模型从左到右,依次传递,此例中,Tx=Ty。 x < t > x^{<t>} x<t>到 y < t > y^<t> y<t>之间是隐藏神经元。a会传入到第t+1个元素中,作为输入。其中, a < 0 > a^{<0>} a<0>一般为零向量。
RNN模型包含三类权重系数,分别是 W a x W_{ax} Wax, W a a W_{aa} Waa, W y a W_{ya} Wya。且不同元素之间同一位置共享同一权重系数。
RNN的正向传播(Forward Propagation)过程为:
a < t > = g ( W a a ⋅ a < t − 1 > + W a x ⋅ x < t > + b a ) a^{<t>}=g(W_{aa}⋅a^{<t−1>}+W_{ax} ⋅ x^{<t>}+ba) a<t>=g(Waa⋅