RNN-循环神经网络-吴恩达读书笔记

参考博文:http://www.ai-start.com/dl2017/html/lesson5-week1.html#header-n114


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

什么是序列模型:

序列模型也就是处理与时间有关系的数据的模型,这些数据前后是有相互依存的关系的。比如音频片段歌曲、语言),是一个按照时间播放的序列。

序列模型在机器翻译、文本生成、DNA碱基序列分析、音频识别、文本分类中都有用。

卷积神经网络处理图像时,图像的像素点之间没有时间的关联关系,所以只是将文本交给CNN简单处理,会将词向量当做是独立的个体,从而训练效果不好。


2、数学符号(Notation)

假如你想要建立一个能够自动识别句中人名位置的序列模型,那么这就是一个命名实体识别问题,这常用于搜索引擎,比如说索引过去24小时内所有新闻报道提及的人名,用这种方式就能够恰当地进行索引。命名实体识别系统可以用来查找不同类型的文本中的人名、公司名、时间、地点、国家名和货币名等等。

 

在文本处理的自然语言问题中,输入是单词的序列。如x(0)是Harry。那么怎样表示一个序列里单独的单词,你会怎样表示像Harry这样的单词

这里需要一个词典,收罗尽可能多的词。a是第一个单词,Aaron是第二个单词,在这个词典里,and出现在367这个位置上,Harry是在4075这个位置,Potter在6830,词典里的最后一个单词Zulu可能是第10,000个单词。

 


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

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

循环神经网络用的激活函数经常是tanh,不过有时候也会用ReLU,但是tanh是更通常的选择,我们有其他方法来避免梯度消失问题,我们将在之后进行讲述。

选用哪个激活函数是取决于你的输出,如果它是一个二分问题,那么我猜你会用sigmoid函数作为激活函数,如果是类别分类问题的话,那么可以选用softmax作为激活函数。不过这里激活函数的类型取决于你有什么样类型的输出,对于命名实体识别来说只可能是0或者1,那我猜这里第二个激活函数可以是sigmoid激活函数。


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

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


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

我们已经讨论了“多对多”、“多对一”、“一对一”和“一对多”的结构,对于“多对多”的结构还有一个有趣的例子值得详细说一下,就是输入和输出长度不同的情况。你刚才看过的多对多的例子,它的输入长度和输出长度是完全一样的。而对于像机器翻译这样的应用,输入句子的单词的数量,比如说一个法语的句子,和输出句子的单词数量,比如翻译成英语,这两个句子的长度可能不同,所以还需要一个新的网络结构,一个不同的神经网络(上图编号2所示)。首先读入这个句子,读入这个输入,比如你要将法语翻译成英语,读完之后,这个网络就会输出翻译结果。有了这种结构和就可以是不同的长度了。同样,你也可以画上这个。这个网络的结构有两个不同的部分,这(上图编号5所示)是一个编码器,获取输入,比如法语句子,这(上图编号6所示)是解码器,它会读取整个句子,然后输出翻译成其他语言的结果。


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

 

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

一个语音识别模型可以算出第一句话的概率第二句话的概率比较这两个概率值显然我说的话更像是第二种,因为第二句话的概率比第一句高出1000倍以上,这就是为什么语音识别系统能够在这两句话中作出选择。

所以语言模型所做的就是,它会告诉你某个特定的句子它出现的概率是多少,还有机器翻译系统,它要能正确输出最接近的句子

那么如何建立一个语言模型呢?

为了使用RNN建立出这样的模型,你首先需要一个训练集,包含一个很大的英文文本语料库(corpus)或者其它的语言,你想用于构建模型的语言的语料库建立一个字典,然后将每个单词都转换成对应的one-hot向量,

下一步我们要构建一个RNN来构建这些序列的概率模型。


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

在你训练一个序列模型之后,要想了解到这个模型学到了什么,一种非正式的方法就是进行一次新序列采样,来看看到底应该怎么做。记住一个序列模型模拟了任意特定单词序列的概率,我们要做的就是对这些概率分布进行采样来生成一个新的单词序列。

采样的意思就是:你随机输入一其实字符或者单词给 a(0) 和x(0),让他们在刚刚已经训练完的RNN语言模型中,根据概率值的大小,自动生成一段随机的文本。

第一步要做的就是对你想要模型生成的第一个词进行采样,于是你输入,,现在你的第一个时间步得到的是所有可能的输出是经过softmax层后得到的概率,然后根据这个softmax的分布进行随机采样。Softmax分布给你的信息就是第一个词a的概率是多少,第一个词是aaron的概率是多少,第一个词是zulu的概率是多少,还有第一个词是UNK(未知标识)的概率是多少,这个标识可能代表句子的结尾,然后对这个向量使用例如numpy命令,np.random.choice(上图编号3所示),来根据向量中这些概率的分布进行采样,这样就能对第一个词进行采样了。

然后继续下一个时间步,记住第二个时间步需要作为输入,而现在要做的是把刚刚采样得到的放到(上图编号4所示),作为下一个时间步的输入,所以不管你在第一个时间步得到的是什么词,都要把它传递到下一个位置作为输入,然后softmax层就会预测是什么。举个例子,假如说对第一个词进行抽样后,得到的是TheThe作为第一个词的情况很常见,然后把The当成,现在就是,现在你要计算出在第一词是The的情况下,第二个词应该是什么(上图编号5所示),然后得到的结果就是,然后再次用这个采样函数来对进行采样。

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

也可以是字符级的采样,过程和性能,有所区别。

下面是根据不同的训练语料库,随机采样生成的文本:


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

基本的RNN算法还有一个很大的问题,就是梯度消失的问题

例子中的句子有长期的依赖,最前面的单词对句子后面的单词有影响。但是我们目前见到的基本的RNN模型(上图编号3所示的网络模型),不擅长捕获这种长期依赖效应。

讲很深的神经网络时,我们也提到了梯度爆炸,我们在反向传播的时候,随着层数的增多,梯度不仅可能指数型的下降,也可能指数型的上升。

事实上梯度消失在训练RNN时是首要的问题,尽管梯度爆炸也是会出现,但是梯度爆炸很明显,因为指数级大的梯度会让你的参数变得极其大,以至于你的网络参数崩溃。所以梯度爆炸很容易发现,因为参数会大到崩溃,你会看到很多NaN,或者不是数字的情况,这意味着你的网络计算出现了数值溢出。

如果你发现了梯度爆炸的问题,一个解决方法就是用梯度修剪。梯度修剪的意思就是观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大,这就是通过一些最大值来修剪的方法。所以如果你遇到了梯度爆炸,如果导数值很大,或者出现了NaN,就用梯度修剪,这是相对比较鲁棒的,这是梯度爆炸的解决方法。

梯度爆炸基本上用梯度修剪就可以应对,但梯度消失比较棘手。我们下节会介绍GRU门控循环单元网络,这个网络可以有效地解决梯度消失的问题,并且能够使你的神经网络捕获更长的长期依赖。


GRU单元(Gated Recurrent Unit(GRU))

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值