参考博客

Class 5: 序列模型Sequence Models

Week 1: 循环神经网络RNN (Recurrent)

目录

本课程将教你如何建立自然语言,音频和其他序列数据的模型。 由于深入的学习,序列算法的运行速度远远超过两年前,这使得语音识别,音乐合成,聊天机器人,机器翻译,自然语言理解等许多令人兴奋的应用成为可能。

通过本课程你将学到

  • 了解常见的序列模型是如何创建的
  • 能够知道如何选择常见的序列模型,并知道如何训练他们
  • 知道如何将序列模型应用在常见的应用上,如:文本的翻译,自然语言处理,文本的合成等等

序列模型-循环神经网络

1.序列模型的应用

循环神经网络(RNN)之类的模型在语音识别、自然语言处理和其他领域中引起变革。

  • 语音识别:将输入的语音信号直接输出相应的语音文本信息。无论是语音信号还是文本信息均是序列数据。
  • 音乐生成:生成音乐乐谱。只有输出的音乐乐谱是序列数据,输入可以是空或者一个整数。
  • 情感分类:将输入的评论句子转换为相应的等级或评分。输入是一个序列,输出则是一个单独的类别。
  • DNA序列分析:找到输入的DNA序列的蛋白质表达的子序列。
  • 机器翻译:两种不同语言之间的想换转换。输入和输出均为序列数据。
  • 视频行为识别:识别输入的视频帧序列中的人物行为。
  • 命名实体识别:从输入的句子中识别实体的名字
    DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
  • 在进行语音识别时,给定了一个输入音频片段 ,并要求输出对应的文字记录 。这个例子里输入和输出数据都是序列模型,因为 是一个按时播放的音频片段,输出 是一系列单词。所以之后将要学到的一些序列模型,如循环神经网络等等在语音识别方面是非常有用的。
  • 音乐生成问题是使用序列数据的另一个例子,在这个例子中,只有输出数据 是序列,而输入数据可以是空集,也可以是个单一的整数,这个数可能指代你想要生成的音乐风格,也可能是你想要生成的那首曲子的头几个音符。输入的 可以是空的,或者就是个数字,然后输出序列 。
  • 在处理情感分类时,输入数据 是序列,你会得到类似这样的输入:“There is nothing to like in this movie.”,你认为这句评论对应几星?
  • 序列模型在DNA序列分析中也十分有用,你的DNA可以用A、C、G、T四个字母来表示。所以给定一段DNA序列,你能够标记出哪部分是匹配某种蛋白质的吗?
  • 在机器翻译过程中,你会得到这样的输入句:“Voulez-vou chante avecmoi?”(法语:要和我一起唱么?),然后要求你输出另一种语言的翻译结果。
  • 在进行视频行为识别时,你可能会得到一系列视频帧,然后要求你识别其中的行为。
  • 在进行命名实体识别时,可能会给定一个句子要你识别出句中的人名。

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

2.数学符号

本节先从定义符号开始一步步构建序列模型。
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

比如说你想要建立一个序列模型,它的输入语句是这样的:“Harry Potter and Herminoe Granger invented a new spell.”,(这些人名都是出自于J.K.Rowling笔下的系列小说Harry Potter)。假如你想要建立一个能够自动识别句中人名位置的序列模型,那么这就是一个命名实体识别问题,这常用于搜索引擎,比如说索引过去24小时内所有新闻报道提及的人名,用这种方式就能够恰当地进行索引。命名实体识别系统可以用来查找不同类型的文本中的人名、公司名、时间、地点、国家名和货币名等等。
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
现在给定这样的输入数据,假如你想要一个序列模型输出,使得输入的每个单词都对应一个输出值,同时这个能够表明输入的单词是否是人名的一部分。技术上来说这也许不是最好的输出形式,还有更加复杂的输出形式,它不仅能够表明输入词是否是人名的一部分,它还能够告诉你这个人名在这个句子里从哪里开始到哪里结束。比如Harry Potter(上图编号1所示)、Hermione Granger(上图标号2所示)。

更简单的那种输出形式:

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

输出数据也是一样,我们还是用、、等等一直到来表示输出数据。同时我们用来表示输入序列的长度,这个例子中输入是9个单词,所以。我们用来表示输出序列的长度。在这个例子里,上个视频里你知道和可以有不同的值。

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

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

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

接下来我们讨论一下怎样表示一个句子里单个的词。想要表示一个句子里的单词,第一件事是做一张词表,有时也称为词典,意思是列一列你的表示方法中用到的单词。这个词表(下图所示)中的第一个词是a,也就是说词典中的第一个单词是a,第二个单词是Aaron,然后更下面一些是单词and,再后面你会找到Harry,然后找到Potter,这样一直到最后,词典里最后一个单词可能是Zulu。
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
因此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表示法来表示词典里的每个单词。

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

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

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

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

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

那么还剩下最后一件事,我们将在之后的视频讨论,如果你遇到了一个不在你词表中的单词,答案就是创建一个新的标记,也就是一个叫做Unknow Word的伪造单词,用作为标记,来表示不在词表中的单词,我们之后会讨论更多有关这个的内容。

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

3.循环神经网络模型

传统标准的神经网络

对于学习X和Y的映射,我们可以很直接的想到一种方法就是使用传统的标准神经网络。也许我们可以将输入的序列X以某种方式进行字典编码以后,如one-hot编码,输入到一个多层的深度神经网络中,最后得到对应的输出Y。如下图所示:
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
但是,结果表明这种方法并不好,主要是存在下面两个问题:

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

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

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

循环神经网络作为一种新型的网络结构,在处理序列数据问题上则不存在上面的两个缺点。在每一个时间步中,循环神经网络会传递一个**值到下一个时间步中,用于下一时间步的计算。如下图所示:

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
这里需要注意在零时刻,我们需要编造一个**值,通常输入一个零向量,有的研究人员会使用随机的方法对该初始**向量进行初始化。同时,上图中右边的循环神经网络的绘制结构与左边是等价的。

循环神经网络是从左到右扫描数据的,同时共享每个时间步的参数。

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

上述循环神经网络结构的缺点:每个预测输出y^t仅使用了前面的输入信息,而没有使用后面的信息。Bidirectional RNN(双向循环神经网络)可以解决这种存在的缺点。

循环神经网络的前向传播

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

RNN前向传播示意图:
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

4.穿越时间的反向传播

之前我们已经学过了循环神经网络的基础结构,在本节视频中我们将来了解反向传播是怎样在循环神经网络中运行的。和之前一样,当你在编程框架中实现循环神经网络时,编程框架通常会自动处理反向传播。但我认为,在循环神经网络中,对反向传播的运行有一个粗略的认识还是非常有用的,让我们来一探究竟

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

5.不同类型的RNN

对于RNN,不同的问题需要不同的输入输出结构。

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

6.语言模型和序列生成

在自然语言处理中,构建语言模型是最基础的也是最重要的工作之一,并且能用RNN很好地实现。

什么是语言模型

对于下面的例子,两句话有相似的发音,但是想表达的意义和正确性却不相同,如何让我们的构建的语音识别系统能够输出正确地给出想要的输出。也就是对于语言模型来说,从输入的句子中,评估各个句子中各个单词出现的可能性,进而给出整个句子出现的可能性。
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

7.新序列采样

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

8.RNN的梯度消失

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

9.GRU单元

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

10.LSTM

GRU能够让我们在序列中学习到更深的联系,长短期记忆(long short-term memory, LSTM)对捕捉序列中更深层次的联系要比GRU更加有效。
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

11. 双向RNN

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络
DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络

12.深层RNN

DeepLearning.ai 提炼笔记(5-1)-- 循环神经网络