吴恩达深度学习 | (20) 序列模型专项课程第一周学习笔记

课程视频

第一周PPT汇总

吴恩达深度学习专项课程共分为五个部分,本篇博客将介绍第五部分序列模型专项的第一周课程:循环序列模型。

目录

1. 为什么选择序列模型?

2. 数学符号

3. 循环神经网络模型

4. 通过时间的反向传播

5. 不同类型的循环神经网络

6. 语言模型和序列生成

7. 对新序列采样

8. 循环神经网络的梯度消失

9. GRU单元

10. 长短期记忆LSTM

11. 双向循环神经网络

12. 深层循环神经网络


1. 为什么选择序列模型?

在本课程中你将学会序列模型,它是深度学习中最令人激动的内容之一。循环神经网络 (RNN)之类的模型在语音识别、自然语言处理和其他领域中引起变革。在本节课中,你将学会如何自行创建这些模型。我们先看一些例子,这些例子都有效使用了序列模型。

在进行语音识别时,给定了一个输入音频片段 𝑥,并要求输出对应的文字记录 𝑦。这个例子里输入和输出数据都是序列,因为 𝑥是一个按时播放的音频片段,输出 𝑦是一系列单词。所以之后将要学到的一些序列模型,如循环神经网络等等在语音识别方面是非常有用的。

音乐生成问题是使用序列数据的另一个例子,在这个例子中,只有输出数据 𝑦是序列, 而输入数据可以是空集,也可以是个单一的整数,这个数可能指代你想要生成的音乐风格, 也可能是你想要生成的那首曲子的头几个音符。输入的 𝑥可以是空的,或者就是个数字,然后输出序列𝑦。

在处理情感分类时,输入数据𝑥是序列,你会得到类似这样的输入:“There is nothing to like in this movie.”,你认为这句评论对应几星?(输出为情感,如积极、消极或喜欢、还行、讨厌等)。

系列模型在 DNA 序列分析中也十分有用,你的 DNA 可以用 A、C、G、T 四个字母来表示。所以给定一段 DNA 序列,你能够标记出哪部分是匹配某种蛋白质的吗?

在机器翻译过程中,你会得到这样的输入句:“Voulez-vou chante avecmoi?”(法语:要和我一起唱么?),然后要求你输出另一种语言的翻译结果。

在进行视频行为识别时,你可能会得到一系列视频帧,然后要求你识别其中的行为。

在进行命名实体识别时,可能会给定一个句子要你识别出句中的人名。

所以这些问题都可以被称作使用标签数据 (𝑥,𝑦)作为训练集的监督学习。但从这一系列例子中你可以看出序列问题有很多不同类型。有些问题里,输入数据 𝑥和输出数据𝑦都是序列,但就算在那种情况下,𝑥和𝑦有时也会不一样长(语音识别、机器翻译等)。或者像上图编号 1 所示和上图编号 2 的 𝑥和𝑦有相同的数据长度。在另一些问题里,只有 𝑥或者只有𝑦是序列。

 

2. 数学符号

本节先从定义符号开始一步步构建序列模型。

比如说你想要建立一个序列模型,它的输入语句是这样的:“Harry Potter and Herminoe Granger invented a new spell.”,(这些人名都是出自于 J.K.Rowling 笔下的系列小说 Harry Potter)。假如你想要建立一个能够自动识别句中人名位置的序列模型,那么这就是一个命名实体识别问题,这常用于搜索引擎,比如说索引过去 24 小时内所有新闻报道提及的人名, 用这种方式就能够恰当地进行索引。命名实体识别系统可以用来查找不同类型的文本中的人名、公司名、时间、地点、国家名和货币名等等。

现在给定这样的输入数据𝑥,假如你想要一个序列模型输出𝑦,使得输入的每个单词都对应一个输出值,同时这个𝑦能够表明输入的单词是否是人名的一部分。技术上来说这也许不是最好的输出形式,还有更加复杂的输出形式,它不仅能够表明输入词是否是人名的一部分, 它还能够告诉你这个人名在这个句子里从哪里开始到哪里结束。比如 Harry Potter(上图编号 1 所示)、Hermione Granger(上图标号 2 所示)。

更简单的那种输出形式:

这个输入数据是 9 个单词组成的序列,所以最终我们会有 9 个特征集和来表示这9 个单词,并按序列中的位置进行索引,𝑥 <1> 、𝑥 <2> 、𝑥 <3> 等等一直到𝑥 <9> 来索引不同的位置, 我将用𝑥 <𝑡> 来索引这个序列中的位置。𝑡意味着它们是时序序列,但不论是否是时序序列, 我们都将用𝑡来索引序列中的位置。

输出数据也是一样,我们还是用𝑦<1>、𝑦<2>、𝑦<3>等等一直到𝑦<9>来表示输出数据。 同时我们用𝑇x 来表示输入序列的长度,这个例子中输入是 9 个单词,所以𝑇x = 9。我们用𝑇y来表示输出序列的长度。在这个例子里𝑇x = 𝑇y ,上个视频里你知道𝑇x 和𝑇y 可以有不同的值(他们可以不相等)。

你应该记得我们之前用的符号,我们用𝑥(𝑖)来表示第𝑖个训练样本,所以为了指代第𝑡个元素,或者说是训练样本𝑖的输入序列中第𝑡个元素用𝑥(𝑖)<𝑡>这个符号来表示。如果𝑇x 是序列长度, 那么你的训练集里不同的训练样本就会有不同的长度,所以𝑇x(𝑖)就代表第𝑖个训练样本的输入序列长度。同样𝑦(𝑖)<𝑡>代表第𝑖个训练样本中输出的第𝑡个元素,𝑇y(𝑖)就是第𝑖个训练样本的输出序列𝑦的长度。

所以在这个例子中,𝑇x(𝑖) = 9,但如果另一个样本是由 15 个单词组成的句子,那么对于这个训练样本,𝑇x(𝑖) = 15。

既然我们这个例子是 NLP,也就是自然语言处理,这是我们初次涉足自然语言处理,一 件我们需要事先决定的事是怎样表示一个序列里单独的单词,你会怎样表示像 Harry 这样的单词,𝑥<1>实际应该是什么?

接下来我们讨论一下怎样表示一个句子里单个的词。想要表示一个句子里的单词,第一件事是做一张词表,有时也称为词典,意思是列一列你的表示方法中用到的单词。这个词表 (下图所示)中的第一个词是 a,也就是说词典中的第一个单词是 a,第二个单词是 Aaron, 然后更下面一些是单词 and,再后面你会找到 Harry,然后找到 Potter,这样一直到最后, 词典里最后一个单词可能是 Zulu。

因此 a 是第一个单词,Aaron 是第二个单词,在这个词典里,and 出现在 367 这个位置 上,Harry 是在 4075 这个位置,Potter 在 6830,词典里的最后一个单词 Zulu 可能是第 10,000 个单词。所以在这个例子中我用了 10,000 个单词大小的词典,这对现代自然语言处理应用来说太小了。对于商业应用来说,或者对于一般规模的商业应用来说 30,000 到 50,000 词大小的词典比较常见,但是 100,000 词的也不是没有,而且有些大型互联网公司会用百万词, 甚至更大的词典。许多商业应用用到的词典可能是 30,000 词,也可能是 50,000 词。不过我将用这个 10,000 词大小的词典做说明,因为这是一个很好用的整数。

如果你选定了 10,000 词的词典,构建这个词典的一个方法是遍历你的训练集,并且找到前 10,000 个常用词,你也可以去浏览一些网络词典,它能告诉你英语里最常用的 10,000个单词,接下来你可以用 one-hot 表示法来表示词典里的每个单词。

举个例子,在这里𝑥<1>表示 Harry 这个单词,它就是一个第 4075 行是 1,其余值都是 0 的向量(上图编号 1 所示),因为那是 Harry 在这个词典里的位置(4075,向量维度=词典大小)。

同样𝑥<2>是个第 6830 行是 1,其余位置都是 0 的向量(上图编号 2 所示)。

and 在词典里排第 367,所以𝑥<3>就是第 367 行是 1,其余值都是 0 的向量(上图编号 3 所示)。如果你的词典大小是 10,000 的话,那么这里的每个向量都是 10,000 维的。

因为 a 是字典第一个单词,𝑥<7>对应 a,那么这个向量的第一个位置为 1,其余位置都 是 0 的向量(上图编号 4 所示)。

所以这种表示方法中,𝑥<𝑡>指代句子里的任意词,它就是个 one-hot 向量,因为它只有一个值是 1,其余值都是 0,所以你会有 9 个 one-hot 向量来表示这个句中的 9 个单词,目的是用这样的表示方式表示𝑋,用序列模型在𝑋和目标输出𝑌之间学习建立一个映射。我会把它当作监督学习的问题,我确信会给定带有(𝑥, 𝑦)标签的数据。

那么还剩下最后一件事,我们将在之后的视频讨论,如果你遇到了一个不在你词表中的单词,答案就是创建一个新的标记,也就是一个叫做 Unknow Word 的伪单词,用<UNK>作为标记,来表示不在词表中的单词,我们之后会讨论更多有关这个的内容。(不在词典中的单词(如停止词或停用词,统一映射为<unk>对应的索引))

总结一下本节课的内容,我们描述了一套符号用来表述你的训练集里的序列数据𝑥和𝑦, 在下节课我们开始讲述循环神经网络中如何构建𝑋到𝑌的映射。

 

3. 循环神经网络模型

上节视频中,你了解了我们用来定义序列学习问题的符号。现在我们讨论一下怎样才能建立一个模型,建立一个神经网络来学习𝑋到𝑌的映射。

可以尝试的方法之一是使用标准神经网络,在我们之前的例子中,我们有 9 个输入单词。想象一下,把这 9 个输入单词,可能是 9 个 one-hot 向量,然后将它们输入到一个标准神经网络中,经过一些隐藏层,最终会输出 9 个值为 0 或 1 的项,它表明每个输入单词是否是人名的一部分。

但结果表明这个方法并不好,主要有两个问题:

一、是输入和输出数据在不同例子中可以有不同的长度,不是所有的例子都有着同样输入长度𝑇x 或是同样输出长度的𝑇y 。即使每个句子都有最大长度,也许你能够填充(pad)或零填充(zero pad)使每个输入语句都达到最大长度,但仍然看起来不是一个好的表达方式。

二、一个像这样单纯的神经网络结构,它并不共享从文本的不同位置上学到的特征。具体来说,如果神经网络已经学习到了在位置 1 出现的 Harry 可能是人名的一部分,那么如果 Harry 出现在其他位置,比如𝑥<𝑡>时,它也能够自动识别其为人名的一部分的话,这就很棒了。这可能类似于你在卷积神经网络中看到的,你希望将部分图片里学到的内容快速推广到图片的其他部分(局部连接+参数共享),而我们希望对序列数据也有相似的效果。和你在卷积网络中学到的类似, 用一个更好的表达方式也能够让你减少模型中参数的数量。

之前我们提到过这些(上图编号 1 所示的𝑥<1>......𝑥<𝑡>......𝑥<𝑇x >)都是 10,000 维的 one-hot 向量,因此这会是十分庞大的输入层。如果总的输入大小是所有输入序列中最大单词数乘以 10,000,那么第一层的权重矩阵就会有着巨量的参数。但循环神经网络就没有上述的两个问题。

那么什么是循环神经网络呢?我们先建立一个(下图编号 1 所示)。如果你以从左到右的顺序读这个句子,第一个单词就是,假如说是𝑥 <1> ,我们要做的就是将第一个词输入一个神经网络层,我们可以让神经网络尝试预测输出, 判断这是否是人名的一部分。循环神经网络做的是,当它读到句中的第二个单词时,假设是𝑥 <2>,它不是仅用𝑥<2>及预测出\hat{y}<2>,他也会输入一些来自时间步1的信息。具体而言,时间步1的隐层激活值就会传递到时间步2.然后,在下一个时间步,循环神经网络输入了单词𝑥<3>,然后它尝试预测输出了预测结果\hat{y}<3> ,等等,一直到最后一个时间步,输入了𝑥<𝑇x>,然后输出了\hat{y}<Ty>.至少在这个例子中Tx=Ty,同时如果𝑇x 和𝑇y不相同,这个结构会需要作出一些改变(需要使用Seq2Seq)。所以在每一个时间步中,循环神经网络传递一个激活值到下一个时间步中参与计算。

要开始整个流程,在零时刻需要构造一个激活值𝑎<0> ,这通常是零向量。有些研究人员会随机用其他方法初始化𝑎<0> ,不过使用零向量作为零时刻的伪激活值是最常见的选择,因此我们把它输入神经网络。

在一些研究论文中或是一些书中你会看到这类神经网络,用这样的图形来表示(上图编号 2 所示),在每一个时间步中,你输入𝑥<𝑡>然后输出\hat{𝑦}<𝑡>。然后为了表示循环连接有时人们会像这样画个圈,表示输回网络层,有时他们会画一个黑色方块,来表示在这个黑色方块处会延迟一个时间步。我个人认为这些循环图很难理解,所以在本次课程中,我画图更倾向于使用左边这种分布画法(上图编号 1 所示)。不过如果你在教材中或是研究论文中看到了右边这种图表的画法(上图编号 2 所示),它可以在心中将这图展开成左图那样。

循环神经网络是从左向右扫描数据,同时每个时间步的参数也是共享的,所以下页幻灯片中我们会详细讲述它的一套参数,我们用𝑊ax 来表示管理着从输入𝑥<1>到隐藏层的连接的一系列参数,每个时间步使用的都是相同的参数𝑊ax 。而激活值也就是水平联系是由参数𝑊 aa决定的,同时每一个时间步都使用相同的参数𝑊aa ,同样的输出结果由𝑊ya 决定。下图详细讲述这些参数是如何起作用的。

在这个循环神经网络中,它的意思是在预测\hat{y}<3>时,不仅要使用𝑥<3>的信息,还要使用𝑥<1>和𝑥<2>的信息,因为来自𝑥<1>的信息可以通过这样的路径(上图编号 1 所示的绿色路径)来帮助预测\hat{y}<3>。这个循环神经网络的一个缺点就是它只使用了这个序列中之前的信息来做出预测,尤其当预测\hat{y}<3>时,他没有用到x<4>,x<5>,x<6>等等的信息。所以这就有一个问题,因为如果给定了这个句子,“Teddy Roosevelt was a great President.”,为了判断 Teddy 是否是人名的一部分,仅仅知道句中前两个词是完全不够的,还需要知道句中后部分的信息, 这也是十分有用的,因为句子也可能是这样的,“Teddy bears are on sale!”。因此如果只给定前三个单词,是不可能确切地知道 Teddy 是否是人名的一部分,第一个例子是人名,第二个例子就不是,所以你不可能只看前三个单词就能分辨出其中的区别。

所以这样特定的神经网络结构的一个限制是它在某一时刻的预测仅使用了从序列之前的输入信息并没有使用序列中后部分的信息,我们会在之后的双向循环神经网络(BRNN) 的视频中处理这个问题。但对于现在,这个更简单的单向神经网络结构就够我们来解释关键概念了,之后只要在此基础上作出修改就能同时使用序列中前面和后面的信息来预测\hat{y}<3> ,不过我们会在之后的视频讲述这些内容,接下来我们具体地写出这个神经网络计算了些什么。

这里是一张清理后的神经网络示意图,和我之前提及的一样,一般开始先输入𝑎<0> ,它是一个零向量。接着就是前向传播过程,先计算隐层激活值𝑎 <1> ,然后再计算输出层输出\hat{𝑦} <1> 。

我将用这样的符号约定来表示这些矩阵下标,举个例子𝑊ax ,第二个下标意味着𝑊 ax要乘以某个𝑥类型的量,然后第一个下标𝑎表示它是用来计算某个𝑎类型的变量。同样的,可以看出这里的𝑊ya 乘上了某个𝑎类型的量,用来计算出某个𝑦类型的量。

循环神经网络用的激活函数经常是 tanh,不过有时候也会用 ReLU,但是 tanh 是更通常的选择,我们有其他方法来避免梯度消失问题,我们将在之后进行讲述。选用哪个激活函数是取决于你的输出𝑦,如果它是一个二分问题,那么我猜你会用 sigmoid 函数作为激活函数, 如果是𝑘类别分类问题的话,那么可以选用 softmax 作为激活函数。不过这里激活函数的类型取决于你有什么样类型的输出𝑦,对于命名实体识别来说𝑦只可能是 0 或者 1,那我猜这里第二个激活函数(输出层)𝑔可以是 sigmoid 激活函数。

更一般的情况下,在𝑡时刻,

所以这些等式定义了神经网络的前向传播,你可以从零向量𝑎<0>开始,然后用𝑎<0>和x<1>来计算a<1>和\hat{y}<1>,然后用x<2>和a<1>一起算出a<2>和\hat{y}<2>等等,从左到右完成前向传播。

现在为了帮我们建立更复杂的神经网络,我实际要将这个符号简化一下,我在下一张幻灯片里复制了这两个等式(上图编号 1 所示的两个等式)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值