作者:jliang

https://blog.csdn.net/jliang3

 

 

《深度学习工程师-吴恩达》04序列模型--循环序列模型 总结

 

1.重点归纳

1)循环神经网络(RNN)

(1)循环神经网络(RNN)之类的模型在语音识别、自然语言处理和其他领域中一起变革,它属于监督学习,X和Y有时会不一样长,有时候会一样长。

(2)例子:语音识别、音乐生成、文本情感分类、DNA序列分析、机器翻译、视频行为识别、命名实体识别

        

(3)符号说明

  • x<t>代表一个输入序列某个值,y<t>代表输出序列中某个值
  • x(i)<t>代表第i个输入序列中的第t个元素,训练集里不同的训练样本有不同的长度
  • y(i)<t>代表第i样本的输出序列中的第t个元素

(4)在NLP领域,输入单词x<t>使用固定大小(商业领域一般使用3万-5万大小,大型互联网公司甚至使用上百万)字典的onehot向量表示,目的是用这样的表示方式表示X,用序列模型在X和目标输出Y之间学习建立一个映射。如果单词在字典中没有出现,则使用一个叫unknown word(UNK)的伪造单词表示。

2)RNN对比标准神经网络预RNN

(1)标准的神经网络的问题

  • 不同的样本输入和输出数据有不同的长度。使用填充的方式使每个输入语句都达到最大长度,但仍然不是很好的表达方式。
  • 神经网络结构并不共享从文本的不同位置上学到的特征。
    • 例子:已经学习到了在位置1出现Harry可能是人名的一部分,如果Harry出现在其他位置时,它也能够自动识别其为人名的一部分的话就很棒了。
    • 输入序列是onehot向量(如每个值用10000维代表),这会是一个十分庞大的输出层,第一层的权重矩阵就会有着巨量的参数。

(2)RNN没有以上两个问题

  • x<t>代表一个输入序列中的某个元素(字符串中的一个词/字),相当于把输入序列的每个元素逐个输入到模型中,而不是一次把所有元素一次输入。网络结构共享了从文本不同位置上学习到的特征,并且有效的减少了权重矩阵的参数。
  • a<t>为时间步t的激活值,被传递到时间步t+1中。在零时刻a<0>可以随机用其他方法初始化,但是可以使用0初始化是最常见的初始化方法。
  • 在预测y<3>时,不仅要使用x<3>的信息,还要使用x<1>x<2>的信息。

  • 公式

3)通过时间的反向传播

      

(1)正向传播:

(2)损失函数为交叉熵

  • 单个输出的损失:
  • 序列的总损失:

(3)

  • 用梯度下降法来更新参数
  • 反向传播过程中最重要的信息传递是参数a从右到左的运算,这个算法另外一个名字叫通过/穿越时间反向传播

4)不同类型的循环神经网络

(1)one to one网络是一个小型的标准神经网络,输入x,输出y,就是前面讨论的神经网络。

(2)many to many网络中还有一种输入和输出数量不一样的情况,像机器翻译的应用中,输入句子的单词的数量和输出句子的单词数量可能不同。

5)语音模型和序列生成

(1)语言模型的基本工作就是输入一个文本序列,会估计某个句子序列中各个单词出现的可能性。

  • 例子:语音识别系统中,听到的声音可能如下。从语义理解上应该是第二句,使用语言模型的语义识别系统能计算出两句话的可能性。
    • The apple and pair salad.
    • The apple and pear salad.

(2)语言模型训练

  • 需要一个包含很大的文本语料库的训练集。
  • 句子标记化:转换成one-hot向量,如果单词不在预定义字典中,使用UNK来代表
  • 构建一个RNN来构建这些序列的概率模型

(3)RNN模型

        

  • a<0>x<0>初始化为0向量作为输入,经过softmax后输出句子中第1个输出单词的概率
  • 使用上一步得到的a<1>以及训练样本中的第一个词y<1>,经过softmax后输出句子中第2个单词的条件概率p(x | cats)(x代表字典中每个词)
  • 第3个输出是前面两个词出现的前提下的概率p(x|"cates average")
  • RNN的每一步都会考虑前面得到的单词,给出下一个词的分布
  • 代价函数是交叉熵

6)对新序列采样

(1)在训练一个序列模型之后,要想了解这个模型学到了什么,一个非正式的方法就是进行一次新序列采样。

(2)基于字符的语言模型的采样例子

        

  • 左边是使用新闻文章训练的模型,采样得到的内容有点像不太合乎语法的新闻文本。
  • 右边是使用莎士比亚的文章训练的模型,采样得到的内容听起来很像莎士比亚写的东西。

(3)基于字符的RNN结构

  • 字典仅包含从a-z的字母、空格、标点符号、数值0-9、A-Z大写字母(如要区分)
  • 基于字符的语言模型比基于词汇的语言模型,输入输出序列元素都是单独的字符,不会出现未标识的词汇的情况
  • 主要的缺点就是最后会得到太多太长的序列,很难捕捉句子中的依赖关系,训练起来计算成本比较高昂
  • 绝大多数语言模型都是使用基于词汇的语言模型。如需要处理大量未知的文本或未知词汇的应用,或者面对很多专业词汇的场景会使用基于字符的RNN。

7)RNN梯度问题

(1)梯度消失是RNN的一个很大的问题:句子有长期的依赖,最前面的单词对句子后面的单词有影响,基本RNN模型不擅长捕获这种长期依赖效应,

  • RNN从左到右前向传播(在时间步上的传播),然后再从右到左反向传播。类似深层神经网络很难把输出层的梯度传播到前面层,CNN反向传播会很困难,因为同样的梯度消失的问题,后面层的输出误差很难影响前面层的计算。
  • 基本的RNN模型会有很多局部影响,意味着这个输出只会收到最近的输入值影响,而很难受序列比较靠前的输入的影响。
  • 在训练RNN时首要的问题是梯度消失问题,梯度消失更难解决

(2)梯度爆炸问题

  • 在一个很深的网络中,还会遇到梯度爆炸问题,随着层数的增多,梯度不仅可能指数型下降,也可能指数型上升。
  • 梯度爆炸很容易被发现,参数变得极其大以至于网络参数崩溃;会看到很多NaN或者不是数字的情况,意味着计算出现数值溢出。
  • 解决方法就是梯度修剪:观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大。这是相对鲁棒的解决办法。

8) GRU单元

       (1)基本RNN单元

        

(2)简化版GRU单元

        

  • 变量c,代表记忆细胞,提供了记忆的能力。c<t>为替代c<t>的候选值。
  • GRU的真正重要的思想是有一个门Γu或者叫Gu,u代表为更新门,是一个0-1之间的值,使用sigmoid实现。
  • GRU的关键部分是用c更新c等式,然后门决定是否要真的更新它。
  • 公式

  • 只要当取很大的负值时,门值接近0值。当门值很小就没有梯度消失的问题了。因为门值很小,所以可以经过很多时间步后,依然保持c<t>的值,这是缓解梯度消失的问题的关键。
  • c<t>可以是一个向量,如果你有100维的隐藏的激活值,那么c<t>也是100维的向量。c<t>公式中的与门值的乘积用于控制记忆细胞的哪个向量维度在每个时间步中需要做更新,所以可以只改变某些bit的值而保持某些bit不变

(3)完整版的GRU单元

  • 公式

  • 增加一个门Γr,r代表相关性,计算出了下一个c<t>的候选值c<t>c<t-1>有多大的相关性

9)长短期记忆网络(LSTM)

      

(1)简化版公式

(2)LSTM是一个比GRU更加强大和通用的版本,不再有相关门Γr,还有一个遗忘门Γf控制记忆细胞的更新值中c<t>c<t-1>的分量,一个输出门Γo控制a<t>

(3)门值与c<t-1>的关系是一对一的,门值每个维度只会影响c<t-1>对应维度的值,每个bit可以被单独控制。

(4)简化版结构图

        

(5)常用版本的LSTM:门值不仅取决于a<t-1>,x<t>,有时候也可以偷窥一下c<t-1>值(窥视孔连接),门值不仅取决于a<t-1>,x<t>,也取决于上一个记忆细胞的值。

(6)LSTM与GRU

  • LSTM比GRU出现得更早,GRU是LSTM模型中做出的简化
  • GRU的优点是更加简单的模型,更加容易创建一个更大的网络
  • 大部分人会优先选择LSTM

10)双向神经网络可以让序列的某点处不仅可以获取之前时间步的信息,还可以获取未来时间步的信息。

      

(1)所有前向循环单元a连接在一起,数据从左往右流动;所有反向循环单元a连接在一起,数据从右往左流动。

(2)前向循环单元与反向循环单元共同作用于输出值,因此y<t>即包含了t-1之前的所有时间步的信息,也包含了t+1之后的所有时间步的信息。

(3)

(4)这些循环单元不仅仅是标准RNN单元,也可以是GRU单元或者LSTM单元。

(5)NLP问题中如果文本句子都是完整的,需要标定这些句子时,一个有LSTM单元的BRNN模型是不错的首选。BRNN的缺点是需要完整的数据序列,才能预测任意位置。

11)深层循环神经网络

      

(1)学习非常复杂的函数时,通常会把多个RNN层堆叠在一起构建更深的模型

(2)对于普通神经网络可能会很深,甚至超过100层。对于RNN来说,有3层就已经不少了,由于时间的维度,RNN网络会变得相当大。一种常见的做法是把RNN输出层去掉后连接一个很深的非RNN神经网络。

(3)RNN单元不一定是标准的RNN单元,也可以是GRU单元或LSTM单元。

(4)还可以构建一个深层的双向RNN网络。由于深层RNN训练需要很多计算资源,需要很长的时间,尽管看起来没有多少循环层。

2. 为什么选择序列模型

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

2)例子:

(1)在语音识别领域给定一个输入音频片段X,并要求输出片段对应的文字记录Y,这里的输入和输出都是序列数据,因为X是一个按时序播放的音频片段,输出是一系列单词。

(2)音乐生成问题,只有输出数据Y是序列,输入数据可以是空集也可以是单一的整数:指待生成的音乐风格也可能是想要生成的音乐的几个音符。

(3)在处理情感分类时,输入数据X是序列(如文本片段),输出评分。

(4)DNA序列分析中,DNA可以用ACGT四个字母表示,输入一个DNA片段,标记出哪部分是匹配某种蛋白质的。

(5)机器翻译中,输入字符序列,输出另一语音的翻译结果。

(6)视频行为识别时,可能会输入一系列视频帧,输出其中的行为。

(7)在进行命名实体识别时,输入可能是给定一个句子,要识别句中的人名。

3)属于监督学习,X和Y有时会不一样长,有时候会一样长,有时是X和Y中只有一个是序列。

3. 数学符号

1)x<t>代表一个输入序列x<1>x<2>…x<t>x<Tx>中某个值,序列长度为Txy<t>代表输出序列y<1>y<2>…y<t>x<Ty>中某个值,序列长度为Ty

2)x(i)<t>代表第i个输入序列中的第t个元素,训练集里不同的训练样本有不同的长度,Tx(i)为第i个训练样本的输入序列长度。y(i)<t>代表第i样本的输出序列中的第t个元素,Ty(i)为第i个训练样本的输出序列的长度。

3)在NLP领域,输入单词x<t>使用固定大小(商业领域一般使用3万-5万大小,大型互联网公司甚至使用上百万)字典的onehot向量表示,目的是用这样的表示方式表示X,用序列模型在X和目标输出Y之间学习建立一个映射。如果单词在字典中没有出现,则使用一个叫unknown word(UNK)的伪造单词表示。

4. 循环神经网络模型

1)标准的神经网络的问题,使用onehot编码进行输入整个输入序列

(1)不同的样本输入和输出数据有不同的长度。也许句子有最大长度,你能使用填充的方式使每个输入语句都达到最大长度,但仍然不是很好的表达方式。

(2)更严重的问题是一个像这样的单纯的神经网络结构并不共享从文本的不同位置上学到的特征。类似在CNN中看到的你希望将部分图片里学到的内容快速推广到图片的其他部分,我们希望对序列数据也有相似的效果。

  • 例子:已经学习到了在位置1出现Harry可能是人名的一部分,如果Harry出现在其他位置时,它也能够自动识别其为人名的一部分的话就很棒了。
  • 输入序列是onehot向量(如每个值用10000维代表),这会是一个十分庞大的输出层,第一层的权重矩阵就会有着巨量的参数。

2)循环神经网络就没有上面两个问题

(1)x<t>代表一个输入序列中的某个元素(字符串中的一个词/字),相当于把输入序列的每个元素逐个输入到模型中,而不是一次把所有元素一次输入。

(2)当前例子的结构是输入和输出长度一致,每输入一个元素x<t>就输出一个元素y<t>

(3)a<t>为时间步t的激活值,被传递到时间步t+1中。在零时刻a<0>可以随机用其他方法初始化,但是可以使用0初始化是最常见的初始化方法。

(4)训练样本中的每个元素都输入同一个神经网络,图片上显示的多个神经网络是不同元素输入时的展开显示效果,从左向右扫描数据,同时每个时间步的参数是共享的。

(5)在预测y<3>时,不仅要使用x<3>的信息,还要使用x<1>x<2>的信息。

        

(6)单向循环网络的一个缺点就是y<t>没有使用到t时间步之前的信息,后续会介绍双向循环神经网络(BRNN)。

3)公式

(1)

  • 激活函数使用tanh或者Relu,不能使用sigmoid,否则容易梯度消失
  • 简化后表示:

(2)

  • 激活函数依赖于目标结果,如果是二分类问题可以使用sigmoid

5. 通过时间的反向传播

1)正向传播

(1)

(2)输入a<t-1>, x<t>,计算a<t>

(3)使用a<t>计算

2)计算损失函数

(1)损失函数为交叉熵,此处假设二分类

(2)逐个元素计算损失函数:L<1>L<2>L<Ty>

(3)计算整个序列的损失函数:Ly<t>,y<t>

3)反向传播

(1)

(2)然后通过导数相关参数,用梯度下降法来更新参数

(3)在这个反向传播过程中最重要的信息传递是参数a从右到左的运算,这个算法另外一个名字叫通过/穿越时间反向传播。

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

1)one to one网络是一个小型的标准的神经网络,输入x,输出y,就是前面讨论过的神经网络。

2)音乐产生系统就是使用one to many网络

      

3)many to many网络中还有一种输入和输出数量不一样的情况,像机器翻译的应用中,输入句子的单词的数量和输出句子的单词数量可能不同。

7. 语言模型和序列生成

1)语言模型的基本工作就是输入一个文本序列,用y来表示这些序列比用x来表示要更好,语言模型会估计某个句子序列中各个单词出现的可能性

(1)如语音识别系统中,从语音中听到的声音可能是以下两个句子中的一个

  • The apple and pair salad.
  • The apple and pear salad.

(2)从语义上理解更像第二句子

(3)语义识别系统选择第二个句子的方法就是使用一个语言模型,它能计算出这两句话各自的可能性

2)语言模型训练

(1)需要一个包含很大的文本语料库的训练集。语料库是自然语言处理的一个专有名词,意思是很长的或者说数量众多的句子。

(2)将句子标记化。

  • 就是建立一个字典,然后将每个单词都转换成对应的one-hot向量,在句子结束位置增加一个额外的标记EOS来标记句子结束。
  • 如果训练集中一些单词并不在你的字典里,使用UNK来代表未知单词。
  • 完成标记化的过程意味着将输入的句子都映射到了各个标志上,或者说字典中的各个词中。

(3)构建一个RNN来构建这些序列的概率模型。

3)RNN模型

(1)a<0>x<0>初始化为0向量作为输入,经过softmax后输出句子中第1个输出单词的概率(1万个词的字典中就有1万个词的概率)。

(2)然后使用上一步得到的a<1>以及训练样本中的第一个词y<1>,经过softmax后输出句子中第2个单词的条件概率(在第1个词出现的前提下第二个词的概率)p(x | cats),这里的x代表字典中每个词。

(3)第3个输出是前面两个词出现的前提下的概率p(x|"cates average")。

(4)RNN的每一步都会考虑前面得到的单词,给出下一个词的分布,这就是RNN如何学习从左到右地每次预测一个词。

(5)代价函数是交叉熵:

        

8. 对新序列采样

1)在训练一个序列模型之后,要想了解这个模型学到了什么,一个非正式的方法就是进行一次新序列采样。

(1)一个序列模型模拟了任意特定单词序列的概率,我们要做的就是对这个概率分布进行采样,生成一个新的单词序列。

(2)网络已经使用上面的结构训练过了,而为了进行采样(生成一个随机选择的句子),要做的事情是:

  • 对想要模型生成的第一个词进行采样,于是输入a<0>=0, x<1>=0,得到所有可能的输出(softmax后的输出)。
  • 然后根据这个softmax的分布进行随机采样,softmax分布给你的信息就是第一个词是x1, x2,…,xn(字典中的每个词)的概率是多少。
  • 然后对这个向量(使用例如numpy命令的np.random.choice)根据向量中这些概率的分布进行采样,这样就能对第一个词进行采样了。
  • 然后继续下一个时间步,y<1>作为输入,然后softmax层就会预测y<2>是什么。假设y<1>为单词”the”,那就把”the”的onehot编码作为x<2>的输入,然后计算在“the”的情况下第二个词是什么。
  • 一直这样直到到最后一个时间步,停止采样。可以通过句子结尾的标识直到句子结束,也可以通过设定固定大小的时间步(如20、50等)来结束采样。
  • 这个过程中可能会产生一些未知标识,如果你要确保算法不会输出这种未知标识,能做的一件事就是拒绝采样过程中产生任何未知的标识,一旦出现就继续在剩下的词中进行重采样,直到得到一个不是未知标识的词。当然如果你不介意有未知标识产生的话,你也可以不管这些词。

2)基于字符的RNN结构

(1)字典仅包含从a-z的字母、空格、标点符号、数值0-9、A-Z大写字母(如果要区分)

(2)基于字符的语言模型比基于词汇的语言模型,输入输出序列元素都是单独的字符,不会出现未标识的词汇的情况。

(3)主要的缺点就是最后会得到太多太长的序列,大多数英语句子只有10-20个单词,但却可能包含很多很多字符

  • 基于字符的语言模型在捕捉句子中的依赖关系(就是句子较前部分如何影响较后部分)不如基于词汇的语言模型可以捕捉长范围的关系。
  • 基于字符的语言模型训练起来计算成本比较高昂

(4)绝大多数语言模型都是使用基于词汇的语言模型,随着计算机性能越来越高,会有更多的应用在一些特殊的情况下会开始使用基于字符的模型。如需要处理大量未知的文本或未知词汇的应用,或者面对很多专业词汇的场景。

3)基于字符的语言模型的采样例子

(1)左边是使用新闻文章训练的模型,采样得到的内容有点像不太合乎语法的新闻文本。

(2)右边是使用莎士比亚的文章训练的模型,采样得到的内容听起来很像莎士比亚写的东西。

9. 带有神经网络的梯度消失

1)RNN算法的一个很大问题就是梯度消失的问题

(1)例子:输入句子

  • The cat, which …, was full.
  • The cats, which …, were full.

(2)例子中的句子有长期的依赖,最前面的单词对句子后面的单词有影响。

(3)目前见到的基本RNN模型不擅长捕获这种长期依赖效应。

2)基本的RNN模型不擅长捕获长期依赖的原因

(1)一个很深很深的网络(例如100层),对这个网络从左到右(深度上的传播)做前向传播然后再反向传播,输出层的梯度很难传播回去,很难影响前面层的权重。

(2)对于有同样问题的RNN,首先从左到右前向传播(在时间步上的传播),然后再从右到左反向传播,但是反向传播会很困难,因为同样的梯度消失的问题,后面层的输出误差很难影响前面层的计算。

(3)因此很难让一个神经网络能够意识到它要记住上面例子的句子看到是单数名词还是复数名词,然后在后面输出生成依赖单复数形式。

(4)所以基本的RNN模型会有很多局部影响,意味着这个输出只会收到最近的输入值影响,而很难受序列比较靠前的输入的影响。

3)梯度爆炸

(1)在一个很深的网络中,还会遇到梯度爆炸问题,随着层数的增多,梯度不仅可能指数型下降,也可能指数型上升。

(2)尽管梯度爆炸也会出现,但是梯度爆炸很明显,因为指数级大的梯度会让参数变得极其大,以至于网络参数崩溃。所以梯度爆炸很容易发现,你会看到很多NaN或者不是数字的情况,意味着计算出现数值溢出。

(3)一个解决梯度爆炸的方法就是用梯度修剪:观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大。这是相对鲁棒的解决办法。

4)梯度下降在训练RNN时首要的问题是梯度消失问题,梯度消失更难解决。

10. GRU单元

1)门控循环单元改变了RNN的隐藏层,使其更容易捕获深层连接,并改善了梯度消失问题。

以下是基本的RNN单元的可视化

        

2)简化版的GRU单元(门控循环单元)

      

(1)新增一个变量c,代表记忆细胞,提供了记忆的能力。

(2)c<t>代表时间t处的记忆细胞, a<t>为输出的激活值,记忆细胞等于输出的激活值,即c<t>=a<t>

(3)在每个时间步将用一个候选值重写记忆细胞,替代c<t>的候选值为

(4)GRU的真正重要的思想是有一个门Γu或者叫Gu,u代表为更新门,是一个0-1之间的值,使用sigmoid实现。从sigmoid曲线可知道,在大多数的情况下门值都非常接近0或1。

(5)GRU的关键部分是用c更新c等式,然后门决定是否要真的更新它。

         例子:加入c<t>取值0或1,用于记忆cat是单数还是复数。如果是单数则为1,复数则为0。然后GRU单元将会一直记住c的值,直到was/were位置。门值的作用就是决定什么时候你会更新这个c值,当出现cat/cats时更新c值;当使用了c后不需要使用c时就决定忘记它(更新)。

(6)公式

(7)只要当取很大的负值时,门值接近0值。当门值很小就没有梯度消失的问题了。因为门值很小,所以可以经过很多时间步后,依然保持c<t>的值,这是缓解梯度消失的问题的关键。

(8)c<t>可以是一个向量,如果你有100维的隐藏的激活值,那么c<t>也是100维的向量,也是相同的维度,门值Γu也是相同的维度。c<t>公式中的与门值的乘积用于控制记忆细胞的哪个向量维度在每个时间步中需要做更新,所以可以只改变某些bit的值而保持某些bit不变。

  • 例如,用某些bit来控制cat是单数还是复数,用其他bit来理解你正在讨论食物。

3)完整版的GRU单元

       (1)公式

(2)增加一个门Γr,r代表相关性,计算出了下一个c<t>的候选值c<t-1>有多大的相关性。

(3)在一些学术文章中会使用替代c<t>,使用u替代Γu,使用r替代Γr,使用h<t>替代c<t>

4)GRU和LSTM是在神经网络结构中最常用的两个具体实例。

11. 长短期记忆网络(LSTM)

1)GRU能够在序列中学习非常深的连接,LSTM也可以做到,甚至比GRU更有效。

(1)公式

(2)LSTM是一个比GRU更加强大和通用的版本

(3)LSTM不再是a<t>=c<t>

(4)LSTM不再有相关门Γr

(5)LSTM一个新特效是不只有一个更新门Γu来控制c<t>的更新,还有一个遗忘门Γf控制记忆细胞的更新值中c<t>c<t-1>的分量

(6)LSTM还有一个输出门Γo

(7)公式中的所有门以及不再像GRU输入c<t-1>,而是输入a<t-1>

2)LSTM单元结构图(简化版)

(1)输入x<1>,x<2>,…,上一时间步输出的a和c会作为下一时间步的a和c的输入。

(2)上图的红线显示了只要正确地设置了遗忘门和更新门,LSTM是相当容易把c<0>的值一直往下传递,这就是LSTM/GRU非常擅长于长时间记忆某个值(对于存在记忆细胞中的某个值即使过了很长的时间步)。

(3)门值与c<t-1>的关系是一对一的,门值每个维度只会影响c<t-1>对应维度的值。比如有一个100维的向量,隐藏的记忆细胞单元,然后比如第50个c<t-1>的元素只会影响对应的那个门。

3)常用版本的LSTM

(1)门值不仅取决于a<t-1>,x<t>,有时候也可以偷窥一下c<t-1>值,这叫窥视孔连接,意思就是门值不仅取决于a<t-1>,x<t>,也取决于上一个记忆细胞的值。

(2)偷窥孔连接上一个记忆细胞c的值也能影响门值。

4)LSTM比GRU出现得更早,GRU是最近才发明出来的,它可能源于Pavia在更加复杂的LSTM模型中做出的简化。研究者在很多不同问题上尝试了这两种模型,看看在不同的问题哪个算法更好。

(1)GRU的优点是更加简单的模型,更加容易创建一个更大的网络,只有两个门,计算时运行得更快。

(2)LSTM更加强大和灵活,因为它有三个门。

(3)如果要在两者中挑选一个来使用,大部分人会优先选择LSTM。同时也越来越多人使用GRU,因为它更简单,效果还不错,它更容易适应规模更大的问题。

12. 双向神经网络

1)双向神经网络可以让序列的某点处不仅可以获取之前时间步的信息,还可以获取未来时间步的信息。

  • 单向RNN中只能使用前面时间步输入的信息,而不能使用未来时间步的信息,只通过前面的信息无法判断Teddy是否人名。
  • He said, “Teddy bears are on sale!”
  • He said, “Teddy Roosevelt was a great President!”

2)BRNN

(1)a表示前向的循环单元,所有前向循环单元连接在一起,数据从左往右流动。

(2)a表示反向的循环单元,所有反向循环单元连接在一起,数据从右往左流动。

(3)前向循环单元与反向循环单元共同作用于输出值,因此y<t>即包含了t-1之前的所有时间步的信息,也包含了t+1之后的所有时间步的信息。

(4)

(5)y<3>的值从正向循环单元a<1>,a<2>,a<3>中获取了x<1>,x<2>,x<3>的信息,从反向循环单元a<4>,a<3>中获取了x<4>的信息。这样使得时间步为3的预测结果不仅输入了过去的信息、现在的信息,以及未来的信息。

(6)这些循环单元不仅仅是标准RNN单元,也可以是GRU单元或者LSTM单元。

3)很多NLP问题(对于大量有自然语言处理问题的文本),LSTM单元的双向RNN模型被用得最多。NLP问题中如果文本句子都是完整的,需要标定这些句子时,一个有LSTM单元的双向RNN模型是不错的首选。

4)BRNN的缺点是需要完整的数据序列,才能预测任意位置。

如果要构建一个语音识别系统,那BRNN模型需要考虑整个语音表达。如果直接使用BRNN去实现的话,你需要等待人说完话,然后获取整个语音表达才能处理这段语音,并进一步做语音识别。对于实际的语音识别应用,通常会有更加复杂的模块。

13. 深层循环神经网络

1)学习非常复杂的函数时,通常会把多个RNN层堆叠在一起构建更深的模型。

2)[l]代表第l层RNN,[l]<t>代表l层第t时间步,上图是一个有3层隐层RNN的网络

3)例子:计算

4)深度

(1)对于普通神经网络可能会很深,甚至超过100层。对于RNN来说,有3层就已经不少了,由于时间的维度,RNN网络会变得相当大。

(2)一种常见的做法是把RNN输出层去掉后连接一个很深的非RNN神经网络。

5)RNN单元不一定是标准的RNN单元,也可以是GRU单元或LSTM单元。

6)还可以构建一个深层的双向RNN网络。由于深层RNN训练需要很多计算资源,需要很长的时间,尽管看起来没有多少循环层。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐