吴恩达深度学习课程之第五门课 序列模型(Sequence Models) 第一周 循环序列模型

本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai 《深度学习课程 笔记 (V5.7 )》

第一周 循环序列模型( Recurrent Neural Networks )

1.1 为什么选择序列模型?(Why Sequence Models?)

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

在本节课中,学习如何自行创建这些模型。先看一些有效使用了序列模型的例子。

1. 语音识别:例子里输入和输出数据都是序列模型,因为 x是一个按时播放的音频片段,输出 y是一系列单词。所以之后将要学到的一些序列模型,如循环神经网络等等在语音识别方面是非常有用的。

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

3. 处理情感分类输入数据x 是序列,你会得到类似这样的输入:“There is nothing to like in this movie.”,你认为这句评论对应几星?

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

5. 机器翻译输入句:“Voulez-vou chante avecmoi?”(法语:要和我一起唱么?),然后要求输出另一种语言的翻译结果。(翻译方言是不是很困难?)

6. 视频行为识别:你可能会得到一系列视频帧,然后要求你识别其中的行为

7. 命名实体识别:可能会给定一个句子要你识别出句中的人名

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

 1.2 数学符号(Notation)

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

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

此例: 

怎样表示一个句子里单个的词。

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

这个例子中我用了 10,000 个单词大小的词典,这对现代自然语言处理应用来说太小了。对于商业应用来说,或者对于一般规模的商业应用来说 30,000 到 50,000 词大小的词典比较常见,但是 100,000 词的也不是没有,而且有些大型互联网公司会用百万词,甚至更大的词典。许多商业应用用的词典可能是 30,000 词,也可能是 50,000 词。不过我将用 10,000 词大小的词典做说明,因为这是一个很好用的整数。

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

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

 1.3 循环神经网络模型(Recurrent Neural Network Model )

我们讨论一下怎样才能建立一个模型,建立一个神经网络来学习X到Y的映射。

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

 所以在每一个时间步中,循环神经网络传递一个激活值到下一个时间步中用于计算。

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

 所以这样特定的神经网络结构的一个限制是它在某一时刻的预测仅使用了从序列之前的输入信息并没有使用序列中后部分的信息,我们会在之后的双向循环神经网络(BRNN)的视频中处理这个问题。

 RNN 前向传播示意图:

1.4 通过时间的反向传播(Backpropagation through time)

 了解反向传播是怎样在循环神经网络中运行的。 

在编程框架中实现循环神经网络时,编程框架通常会自动处理反向传播。但我认为,在循环神经网络中,对反向传播的运行有一个粗略的认识还是非常有用的,让我们来一探究竟。

在之前你已经见过对于前向传播(上图蓝色箭头所指方向)怎样在神经网络中从左到右地计算这些激活项,直到输出所有地预测结果。而对于反向传播,我想你已经猜到了,反向播地计算方向(上图红色箭头所指方向)与前向传播基本上是相反的。

然后为了计算反向传播,你还需要一个损失函数。我们先定义一个元素损失函数(上图编号 1 所示)

现在我们来定义整个序列的损失函数,将L定义为(上图编号 2 所示)

在这个反向传播的过程中,最重要的信息传递或者说最重要的递归运算就是这个从右到左的运算,这也就是为什么这个算法有一个很别致的名字,叫做“ 通过 ( 穿越 ) 时间反向传播(backpropagation through time)”。取这个名字的原因是对于前向传播,你需要从左到右进行计算,在这个过程中,时刻t 不断增加。而对于反向传播,你需要从右到左进行计算,
就像时间倒流。“通过时间反向传播”。

RNN 反向传播示意图:

 1.5 不同类型的循环神经网络(Different types of RNNs)

1.6 语言模型和序列生成(Language model and sequence generation )

所以什么是语言模型呢?比如你在做一个语音识别系统,你听到一个句子,“the apple and pear (pair ) salad was delicious.”,所以我究竟说了什么?我说的是 “the apple and pair salad”,还是“the apple and pear salad”?(pear 和 pair 是近音词)。

一个语音识别模型可能算出第一句话的概率是:
𝑄(The apple and pair salad) = 3.2 × 10 −13 ,
而第二句话的概率是𝑄(The apple and pear salad) = 5.7 × 10 −10 ,
比较这两个概率值,显然我说的话更像是第二种,因为第二句话的概率比第一句高出1000 倍以上,这就是为什么语音识别系统能够在这两句话中作出选择。
所以语言模型所做的就是,它会告诉你某个特定的句子它出现的概率是多少,根据我所说的这个概率,假设你随机拿起一张报纸,打开任意邮件,或者任意网页或者听某人说下一句话,并且这个人是你的朋友,这个你即将从世界上的某个地方得到的句子会是某个特定句子的概率是多少,例如“the apple and pear salad”。它是两种系统的基本组成部分,一个刚才所说的语音识别系统,还有机器翻译系统,它要能正确输出最接近的句子。

那么如何建立一个语言模型呢?为了使用 RNN 建立出这样的模型,你首先需要一个训练集,包含一个很大的英文文本语料库(corpus)或者其它的语言,你想用于构建模型的语言的语料库。语料库是自然语言处理的一个专有名词,意思就是很长的或者说数量众多的英文句子组成的文本。 

在训练集中得到这么一句话,“Cats average 15 hours of sleep a day.”(猫一天睡 15 小时),你要做的第一件事就是将这个句子标记化,意思就是像之前视频中一样,建立一个字典,然后将每个单词都转换成对应的 one-hot 向量,也就是字典中的索引。

可能还有一件事就是你要定义句子的结尾,一般的做法就是增加一个额外的标记,叫做 EOS(上图编号 1 所示),它表示句子的结尾,这样能够帮助你搞清楚一个句子什么时候结束,我们之后会详细讨论这个。EOS 标记可以被附加到训练集中每一个句子的结尾,如果你想要你的模型能够准确识别句子结尾的话。

完成标识化的过程后,这意味着输入的句子都映射到了各个标志上,或者说字典中的各个词上

下一步我们要构建一个 RNN 来构建这些序列的概率模型。在下一张幻灯片中会看到的一件事就是最后你会将 

1.7 对新序列采样(Sampling novel sequences ) 

在你训练一个序列模型之后,要想了解到这个模型学到了什么,一种非正式的方法就是进行一次新序列采样,来看看到底应该怎么做。

记住一个序列模型模拟了任意特定单词序列的概率,我们要做的就是对这些概率分布进行采样来生成一个新的单词序列。下图编号 1 所示的网络已经被上方所展示的结构训练训练过了,而为了进行采样(下图编号 2 所示的网络),你要做一些截然不同的事情。 

然后再到下一个时间步,无论你得到什么样的用 one-hot 码表示的选择结果,都把它传递到下一个时间步,然后对第三个词进行采样。不管得到什么都把它传递下去,一直这样直到最后一个时间步。

那么你要怎样知道一个句子结束了呢?

1. 方法之一就是,如果代表句子结尾的标识在你的字典中,你可以一直进行采样直到得到 EOS 标识(上图编号 6 所示),这代表着已经抵达结尾,可以停止采样了。

2. 另一种情况是,如果你的字典中没有这个词,你可以决定从 20 个或100 个或其他个单词进行采样,然后一直将采样进行下去直到达到所设定的时间步。不过这种过程有时候会产生一些未知标识(上图编号 7 所示),如果你要确保你的算法不会输出这种标识,你能做的一件事就是拒绝采样过程中产生任何未知的标识,一旦出现就继续在剩下的词中进行重采样,直到得到一个不是未知标识的词。如果你不介意有未知标识产生的话,你也可以完全不管它们。
这就是你如何从你的 RNN 语言模型中生成一个随机选择的句子。 

直到现在我们所建立的是基于词汇的 RNN 模型,意思就是字典中的词都是英语单词(下图编号 1 所示)。 

根据你实际的应用,你还可以构建一个基于字符的 RNN 结构,在这种情况下,你的字典仅包含从 a 到 z 的字母,可能还会有空格符,如果你需要的话,还可以有数字 0 到 9,如果你想区分字母大小写,你可以再加上大写的字母,你还可以实际地看一看训练集中可能会出现的字符,然后用这些字符组成你的字典(上图编号 2 所示)。

使用基于字符的语言模型优点:

就是你不必担心会出现未知的标识,例如基于字符的语言模型会将 Mau 这样的序列也视为可能性非零的序列。而对于基于词汇的语言模型,如果 Mau 不在字典中,你只能把它当作未知标识 UNK。

基于字符的语言模型一个主要缺点:

最后会得到太多太长的序列,大多数英语句子只有 10 到 20 个的单词,但却可能包含很多很多字符。所以基于字符的语言模型在捕捉句子中的依赖关系也就是句子较前部分如何影响较后部分不如基于词汇的语言模型那样可以捕捉长范围的关系,并且基于字符的语言模型训练起来计算成本比较高昂

所以自然语言处理的趋势就是,绝大多数都是使用基于词汇的语言模型,但随着计算机性能越来越高,会有更多的应用。在一些特殊情况下,会开始使用基于字符的模型。但是这确实需要更昂贵的计算力来训练,所以现在并没有得到广泛地使用,除了一些比较专门需要处理大量未知的文本或者未知词汇的应用,还有一些要面对很多专有词汇的应用。 

1.8 循环神经网络的梯度消失(Vanishing gradients with RNNs)

你已经了解了 RNN 时如何工作的了,并且知道如何应用到具体问题上,比如命名实体识别,比如语言模型,你也看到了怎么把反向传播用于 RNN。其实,基本的 RNN 算法还有一个很大的问题,就是梯度消失的问题。 

之前讨论的训练很深的网络,我们讨论了梯度消失的问题。对于有同样问题的 RNN,首先从左到右前向传播,然后反向传播。但是反向传播会很困难,因为同样的梯度消失的问题,后面层的输出误差(上图编号 6 所示)很难影响前面层(上图编号 7 所示的层)的计算。

总结一下,在前面的课程,我们了解了训练很深的神经网络时,随着层数的增加,导数有可能指数型的下降或者指数型的增加,我们可能会遇到梯度消失或者梯度爆炸的问题。加入一个 RNN 处理 1,000 个时间序列的数据集或者 10,000 个时间序列的数据集,这就是一个1,000 层或者 10,000 层的神经网络,这样的网络就会遇到上述类型的问题。梯度爆炸基本上用梯度修剪就可以应对,但梯度消失比较棘手。

1.9 GRU 单元(Gated Recurrent Unit (GRU ))

 

 

 

 这一节不是很懂。。

1.10 长短期记忆(LSTM (long short term memory )unit )

其他类型的单元也可以让你做到这个,比如 LSTM 即长短时记忆网络,甚至比 GRU更加有效,让我们看看。

 

 

LSTM 前向传播图:

LSTM 反向传播计算:
门求偏导

 GRU 的优点是这是个更加简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性上也运行得更快,然后它可以扩大模型的规模。

但是 LSTM 更加强大和灵活,因为它有三个门而不是两个。如果你想选一个使用,我认为 LSTM 在历史进程上是个更优先的选择,所以如果你必须选一个,我感觉今天大部分的人还是会把 LSTM 作为默认的选择来尝试。虽然我认为最近几年 GRU 获得了很多支持,而且我感觉越来越多的团队也正在使用 GRU,因为它更加简单,而且还效果还不错,它更容易适
应规模更加大的问题。

1.11 双向循环神经网络(Bidirectional RNN )

还有两个方法可以让你构建更好的模型,其中之一就是双向 RNN 模型,这个模型可以让你在序列的某点处不仅可以获取之
前的信息,还可以获取未来的信息,我们会在这个视频里讲解。

第二个就是深层的 RNN,1.12讲解。

 

 

1.12 深层循环神经网络(Deep RNNs ) 

目前你学到的不同 RNN 的版本,每一个都可以独当一面。但是要学习非常复杂的函数,通常我们会把 RNN 的多个层堆叠在一起构建更深的模型。如何构建这些更深的 RNN。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Clark-dj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值