您的位置:首页 > 其它

吴恩达《深度学习-序列模型》1 --循环序列模型

2018-03-01 22:39 447 查看

1. why sequence models?

序列模型是监督学习的一种,也就是其输入数据是带标签的。



如图给出了几个典型的序列模型的应用,如语音识别、音乐生成(输入可以为空,输出是时序的)、情感分析、DNA序列分析、机器翻译、视频行为识别、人名实体识别等,其特点是输入或输入或者输入输出是时序的。

2. Notation数学符号

下面以一个人名实体识别为例讲述表示符号,给出一句话X,识别里面所有的人名,为了使说明简单,这里的输出Y只简单标识每个单词是否为人名,这种表示方式并不是很好,有一些复杂的输出方式可以指出一个人名从哪里开始到哪里结束。



上图输入中有9个单词,那么第一步就是要把单词划分开,表示如下:

x<t>x<t> :表示第t个单词;

TxTx:表示输入的单词总数,这里Tx=9Tx=9;

y<t>y<t>:为第t个单词的输出;

TyTy:为输出总数,,这里Ty=9Ty=9;

以上是对单个样本的表示,若有i个样本的话,第i个样本表示如下:

x(i)<t>x(i)<t>: 表示第i个样本的第t个单词;

T(i)xTx(i):表示第i个样本的输入的单词总数;

y(i)<t>y(i)<t>:为第i个版本的第t个单词的输出;

T(i)yTy(i):为第i个样本的输出总数;

如何表示一个单词?

1. 首先建立一个词汇表vocabulary,也就是将表示方法中所有要用到的词列成一列

如下图,建立一个长度为10,000的词表,这对实际中的NLP来说太小了,商用中的词表有的三五万,也有的几十万甚至百万,这里仅用作说明的例子;

2. 用one-hot向量来表示单词

也就是每个单词用一个和词表长度一样的向量来表示,向量中除了这个单词所在位置为1,其余都为0,所以称之为one-hot。





如果遇到不在词表中的词,那么可以创建一个新的标记,叫做unknown Word,用UNK表示,之后会详细讨论这个问题。

3.Recurrent Neural Network Model循环序列模型

1)为什么不用标准神经网络?

实验发现用标准神经网络效果不好,主要原因有两点:

输入和输出在不同的样本中可以有不同的长度,即使能找到输入输出的最大值,对某个样本来说填充来使他达到最大长度,但是这种表示方式依然不够好;

标准神经网络不能讲从文本不同位置学习到的特征共享,比如在第一个位置学习到了Harry是一个人名,如果Harry再次出现在其他位置的时候,不能自动识别它是一个人名,还需要重新识别

2)什么是循环神经网络?

首先,将第一个单词x<1>x<1>输入神经网络,并预测 y^<1>y^<1>;

然后,将第二个单词x<2>x<2>输入神经网络,同时将第一步计算的激活值a<1>a<1>也输入到神经网络,共同作用并预测y^<2>y^<2>;

重复第二步,直至把所有单词都训练完毕。



注意,由于在第一步之前没有任何输入,所以一般人为设置一个a<0>a<0>和x<1>x<1>一起输入到神经网络中,a<0>a<0>最常见的初始化为0,不过也有人任意初始化。

在这个结构中输入和输出数目相等,如果输入和输出不等的话,网络结构还需要改变。

参数:

循环神经网络中的参数是共享的,从输入到隐藏层的参数表示为waxwax,水平方向激活值向下一层输入的参数表示为waawaa,从隐藏层到输出的残水表示为wyawya

前向传播:



其中参数waawaxwaawax两个参数可以合并为wawa,若waawaa为(100,100),waxwax为(100,10000),wawa为(100,10100),如下图:



所以可以表示为:

a<t>=g(wa[a<t−1>,x<t>]+ba)a<t>=g(wa[a<t−1>,x<t>]+ba)

y^<t>=g(wya<t>+by)y^<t>=g(wya<t>+by)

关于激活函数,两步的激活函数可以相同也可以不同,一般求a<t>a<t>采用tanh或ReLU,求y^<t>y^<t>则根据输出的个数选择sigmoid或者softmax。

4. Backpropagation through time时间反向传播

上一节讲了RNN正向传播,本节讲RNN反向传播,虽然开源框架通常都会自动计算反向传播,但是了解其原理还是很有帮助的。

损失函数:

这里损失函数采用标准逻辑回归的损失函数,又叫交叉熵损失函数,具体如下:



穿越时间的反向传播



5. Different types of RNN

之前将的RNN是建立在输入和输出数目相等的情况下,我们也讲过了,在循环神经网络中,输入和输出数目可以不等,那么这种情况下的RNN结构应该是什么样呢?这一节我们就来讨论RNN的各种不同的结构。

1) one to one

标准神经网络就是这种类型



2) one to many (music generation音乐生成)

输入为空,或有较少的输入,产生很多输出



3) many to one (setiment classification情感分类)

输入为文本,输出为整数



4)many to many

这里又分两类,一类是输入和输出数目相同,一类是输入和输出数目不同。

输入和输出数目相同

这种就是之前将的多个输入产生多个输出的结构,如图:



输入和输出数目不同

如machine translation



此结构中输入的部分,也就是x<1>−x<Tx>x<1>−x<Tx>通常被称作encoder,输出部分,也就是y^<1>−y^<Tx>y^<1>−y^<Tx>通常被称为decoder。

5)attention based architecture注意力结构

这部分将在第四周讲

6 Language model and sequence generation语言模型和序列生成

1)什么是语言模型

语言模型定义一句话发生的可能性。

比如两句发音一样的话,那么应该是哪句呢?



如图,上面两个句子发音一样,我们根据语义理解知道第二个是正确的,那么对于语音识别来说,需要通过语言模型计算两句话的可能性,然后做出选择。

语言模型就是输入一个文本序列,估计这一特定序列各单词出现的可能性。

2)RNN语言模型

训练集:需要很大的对应语言(如英语)的语料库

获得训练集之后,训练RNN步骤如下:

(1)首先,应该切分词tokenize,然后对照词汇表获得每个词的索引,如one-hot向量;

(2)其次,如果需要模型能准确的识别句尾,那么需要为每一句话,在句尾加一个结束符‘‘(end of sentence);

如果遇到一个不在词汇表的词,那么可以删除这个词,代之以’’(unknown Word)

(3)建立RNN model

以如下样本为例:cats average 15 hours of sleep of a day.



第一个输入为0向量,然后经过RNN,由一个softmax分类器来预测第一个单词可能会是什么,即计算词汇表中所有单词在这里出现概率,出现概率最高的那个即是这里输出的词,y^<1>=catsy^<1>=cats,这里softmax输出个数与词汇表个数相同;

然后,将y^<1>y^<1>赋值给x<2>x<2>,再次输入RNN,获得在y^<1>=catsy^<1>=cats的情况下y^<2>y^<2>的预测值;

接着,将y^<2>y^<2>赋值给x<3>x<3>,再次输入RNN,获得在y^<1>=cats,y^<2>=averagey^<1>=cats,y^<2>=average的情况下y^<3>y^<3>的预测值,重复此步直至句尾。

损失函数:



7. Sampling novel sequence新序列采样

有一个训练好的序列模型,若想知道这个模型学到了什么,应该怎么办,一种非正式的做法就是进行新序列采样,让模型生成一个随机选择的句子,具体做法如下:



和语言模型的RNN类似,但是在softmax分类器之后,对其结果进行了采样,获得采样后的y^<1>y^<1>,采样的numpy命令是np.random.choice,然后将采样后的y^<1>y^<1>传给下一时间步,重复直至最后一个时间步。

判断句子是否结束的两种方法:

在句尾加上结束符“”;

设定需要采样的词数,如20个,或者设置采样时间,时间到了就结束采样。

在之一过程中会产生一些未识别标识,如果希望算法不输出未识别标识,那么可以拒绝对预测的未识别标识进行采样,一旦出现未识别标识,就在剩下的词汇表中重采样,直到得到一个不是未识别标识的词。

基于字符的RNN语言模型 character level RNN

上面讲的都是基于单词的RNN语言模型,也可以建立基于字符的RNN语言模型。

字典:观察数据集,将所有可能出现的字符加入字典,如a~z的字符,也可以包括空格,标点符号,数字0~9,如果需要区分大小写,也可以加上大写字符A~Z。



优点:不用担心出现未知标识;

缺点:得到的序列通常很长很多;不善于捕捉句子中的关系,捕捉范围也比基于单词的RNN短;计算成本较高。

下面是两个新序列采样的例子,可以看出基于新闻训练的模型,其产生的句子会更加像新闻,用莎士比亚作品训练的模型,其产生的句子更莎士比亚化。



8. Vanishing gradients with RNN梯度消失

有如下两句:

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

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

系动词需要根据主语是单数还是复数来决定,这个句子主语和系动词距离比较远,即后面的词对前面的词有长期的依赖关系,而目前所看到的RNN并不擅长捕捉这种长期依赖关系,因为由于梯度消失或梯度爆炸的问题,两个间隔很远的隐藏层很难互相影响,通常一个隐藏层主要受其附近的一些影藏层的影响,前向传播受其之前几层的影响,后向传播受其之后几层的影响。

梯度爆炸

对于RNN 来说梯度爆炸也会发生,梯度爆炸其参数值会变得很大甚至出现数值溢出,变成了一个非数字,所以很容易发现。

解决方法:

梯度修剪,也叫最大值修剪,即观察梯度向量,一旦其超过某个阈值,就对其进行缩放,以保证其不会过大

梯度消失

梯度消失是RNN面临的首要问题,其解决也较为复杂,主要的解决方案有:

- GRU

- LSTM

后面将会讨论详细的各个解决方法。

Gated Recurrent Unit(GRU)门控循环单元

GRU改变了RNN隐藏层单元使其更好的捕捉深层连接,并改善了梯度消失问题。

相比于普通的RNN隐藏层单元,GRU增加了一个C(memory cell)记忆细胞,以增加记忆功能。

普通RNN单元:



GRU单元:





c<t>c<t>:记忆细胞的在t时间步的值,表示是否要记忆此处的信息,GRU中c<t>=a<t>c<t>=a<t>

c^<t>c^<t>:重写记忆细胞的候选值,是否采用这个值来更新c<t>c<t>取决于ΓuΓu

ΓrΓr:相关门,表示c<t−1>c<t−1>跟新的候选值c^<t>c^<t>之间的相关性。

ΓuΓu:更新门,u=update,决定什么时候更新记忆细胞,取值范围在0~1,0表示不更新记忆细胞即保持之前的值,1表示更新记忆细胞为候选值。



这里依旧举上一节的例子,根据主语单复数来确定系数。

首先c<0>=a<0>=0⃗ c<0>=a<0>=0→,第一个单词不需要记忆,Γu=0,c<1>=c<0>Γu=0,c<1>=c<0>;

第二个单词cat需要记忆信息,所以Γu=1,c<2>=c^<2>=1Γu=1,c<2>=c^<2>=1;

第三个词which不需要记忆,Γu=0,c<3>=c<2>=1Γu=0,c<3>=c<2>=1;

一直到单词was,需要更新,Γu=1,c<t>=c^<t−1>=0Γu=1,c<t>=c^<t−1>=0

10. LSTM(Long short term memory) Unit长短时记忆单元

LSTM比之GRU更加有效。注意:LSTM中c<t>c<t>和a<t>a<t>将不再相等。



ΓuΓu:更新门(update)

ΓfΓf:遗忘门(forget)

ΓoΓo:输出门(output)

peephole connection窥视孔连接,将c<t−1>c<t−1>加入到对门的计算中,也就是门由c<t−1>,a<t−1>,x<t>c<t−1>,a<t−1>,x<t>共同决定。

GRU和LSTM比较:

GRU结构更简单,更有利于构建深层的RNN,LSTM功能更强大。

11. Bidirectional RNN双向循环神经网络

此网络结构使得在序列的某点,既可以获得之前的信息,也可以获得之后的信息。

以一个人名实体识别的例子来说明,下面两句话,判断Teddy是不是一个人名,只有前面的信息是不足够的。





图中最下面x<1> x<4>x<1> x<4>表示输入的前四个单词,紫色框表示的是正向循环层,绿色框是反向循环层,正向循环和反向循环构成一个无环图,都属于正向传播,各值计算顺序如下:

a⃗ <1>−a⃗ <2>−a⃗ <3>−a⃗ <4>−a←<4>−a←<3>−a←<2>−a←<1>a→<1>−a→<2>−a→<3>−a→<4>−a←<4>−a←<3>−a←<2>−a←<1>

所有的激活值都计算完毕之后,就可以计算预测值了:

y^<t>=g(wy[a⃗ <t>,a←<t>]+by)y^<t>=g(wy[a→<t>,a←<t>]+by)

[其中各单元可以是标准RNN单元,也可以是GRU单元、LSTM单元,对于NLP问题来说基于LSTM单元的BRNN用的比较多。

BRNN缺点:需要完整序列的数据才能预测。对于语音识别来说,也就是必须等到讲话的人讲完,才能预测,这并不能满足我们的需求,所以语音识别通常用其他更复杂的模型,而BRNN较广泛的应用于NLP问题。

12. Deep RNN

对于RNN来说一般很少像CNN那样堆叠很多层,3层对RNN来说就已经非常庞大了。如果需要堆叠多层,一般会删去水平连接。



某个RNN单元可以是标准RNN单元,也可以是GRU单元、LSTM单元甚至BRNN单元,可以自由设置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息