文章目录

  • 循环神经网络(Recurrent Neural Networks)
  • 1.1 Why Sequence Models?(为什么选择序列模型)
  • 1.2 Notation (符号说明)
  • 1.3 Recurrent Neural Network Model
  • 1.4 Backpropagation Through Time(通过时间的反向传播)
  • 1.5 Different Types of RNNS
  • 1.6 Language Model and Sequence Generation(语言模型和序列生成)
  • 1.7 Sampling Novel Sequences(对新序列采样)
  • 1.8 Vanishing Gradients with RNNS


循环神经网络(Recurrent Neural Networks)

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

我们先看一些例子,这些例子都有效使用了序列模型:

Sequential模型怎么加人迁移学习_循环神经网络

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

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

在本节我们学到适用于不同情况的序列模型

1.2 Notation (符号说明)

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

Sequential模型怎么加人迁移学习_数据_02

这个输入数据是 9 个单词组成的序列,所以最终我们会有 9 个特征集和来表示这 9 个单词,并按序列中的位置进行索引,Sequential模型怎么加人迁移学习_数据_03 等等一直到 Sequential模型怎么加人迁移学习_数据_04来索引不同的位置,我将用Sequential模型怎么加人迁移学习_神经网络_05来索引这个序列的中间位置。t 意味着它们是时序序列,但不论是否是时序序列,我们都将用 t 来索引序列中的位置。

输出数据也是一样,我们还是用 Sequential模型怎么加人迁移学习_循环神经网络_06 等等一直到 Sequential模型怎么加人迁移学习_神经网络_07

同时我们用 Sequential模型怎么加人迁移学习_神经网络_08 来表示输入序列的长度,这个例子中输入是 9 个单词,所以 Sequential模型怎么加人迁移学习_数据_09 。我们用 Sequential模型怎么加人迁移学习_循环神经网络_10 来表示输出序列的长度。在这个例子里 Sequential模型怎么加人迁移学习_循环神经网络_11 , 由上一节可知 Sequential模型怎么加人迁移学习_数据_12

Sequential模型怎么加人迁移学习_数据_13

Sequential模型怎么加人迁移学习_循环神经网络_14

Sequential模型怎么加人迁移学习_数据_15

Sequential模型怎么加人迁移学习_数据_16

怎样表示一个序列里单独的单词:

第一件事是做一张词表,有时也称为词典

Sequential模型怎么加人迁移学习_循环神经网络_17


因此 a 是第一个单词,Aaron 是第二个单词,在这个词典里,and 出现在 367 这个位置上,Harry 是在 4075 这个位置,Potter 在 6830,词典里的最后一个单词 Zulu 可能是第 10,000个单词。所以在这个例子中我用了 10,000 个单词大小的词典,这对现代自然语言处理应用来说太小了。接下来你可以用 one-hot 表示法来表示词典里的每个单词。

Sequential模型怎么加人迁移学习_数据_18


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

如果你遇到了一个不在你词表中的单词,答案就是创建一个新的标记,也就是一个叫做 Unknow Word 的伪造单词,用<UNK>作为标记

1.3 Recurrent Neural Network Model

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

Sequential模型怎么加人迁移学习_神经网络_21


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

  • 输入和输出数据在不同例子中可以有不同的长度,不是所有的例子都有着同样输入长度 Sequential模型怎么加人迁移学习_循环神经网络_22 或是同样输出长度的 Sequential模型怎么加人迁移学习_数据_23
  • 一个像这样单纯的神经网络结构,它并不共享从文本的不同位置上学到的特征。具体来说,如果神经网络已经学习到了在位置 1 出现的 Harry 可能是人名的一部分,那么如果Harry 出现在其他位置,比如 Sequential模型怎么加人迁移学习_神经网络_24

Sequential模型怎么加人迁移学习_循环神经网络_25


如果你以从左到右的顺序读这个句子,第一个单词就是,假如说是 Sequential模型怎么加人迁移学习_神经网络_26 ,我们要做的就是将第一个词输入一个神经网络层,我打算这样画,第一个神经网络的隐藏层,我们可以让神经网络尝试预测输出,判断这是否是人名的一部分。循环神经网络做的是,当它读到句中的第二个单词时,假设是

Sequential模型怎么加人迁移学习_神经网络_27,它不是仅用Sequential模型怎么加人迁移学习_神经网络_27就预测出 Sequential模型怎么加人迁移学习_神经网络_29 ,他也会输入一些来自时间步 1 的信息。具体而言,时间步 1 的激活值就会传递到时间步 2。然后,在下一个时间步,循环神经网络输入了单词

Sequential模型怎么加人迁移学习_数据_30 ,然后它尝试预测输出了预测结果 Sequential模型怎么加人迁移学习_数据_31,等等,一直到最后一个时间步,输入了 Sequential模型怎么加人迁移学习_循环神经网络_32,然后输出了 Sequential模型怎么加人迁移学习_循环神经网络_33 。至少在这个例子中Sequential模型怎么加人迁移学习_神经网络_34,同时如果不相同,这个结构会需要作出一些改变。所以在每一个时间步中,循环神经网络传递一个激活值到下一个时间步中用于计算。

要开始整个流程,在零时刻需要构造一个激活值 Sequential模型怎么加人迁移学习_神经网络_35

在一些研究论文中或是一些书中你会看到这类神经网络,用这样的图形来表示:

Sequential模型怎么加人迁移学习_数据_36


在每一个时间步中,你输入 Sequential模型怎么加人迁移学习_神经网络_05 然后输出 Sequential模型怎么加人迁移学习_神经网络_38。然后为了表示循环连接,有时人们会像这样画个圈,表示输回网络层,有时他们会画一个黑色方块,来表示在这个黑色方块处会延迟一个时间步。

我个人认为这些循环图很难理解,所以在本次课程中,我画图更倾向于使用前面这种分布画法。

Sequential模型怎么加人迁移学习_循环神经网络_39 来表示管理着从 Sequential模型怎么加人迁移学习_神经网络_26 到隐藏层的连接的一系列参数,每个时间步使用的都是相同的参数 Sequential模型怎么加人迁移学习_循环神经网络_39。而激活值也就是水平联系是由参数 Sequential模型怎么加人迁移学习_神经网络_42 决定的,同时每一个时间步都使用相同的参数 Sequential模型怎么加人迁移学习_神经网络_42,同样的输出结果由 Sequential模型怎么加人迁移学习_神经网络_44

Sequential模型怎么加人迁移学习_循环神经网络_45


在这个循环神经网络中,它的意思是在预测 Sequential模型怎么加人迁移学习_数据_31 时,不仅要使用 Sequential模型怎么加人迁移学习_数据_30 的信息,还要使用

来自 Sequential模型怎么加人迁移学习_神经网络_26Sequential模型怎么加人迁移学习_神经网络_27 的信息,因为来自 Sequential模型怎么加人迁移学习_神经网络_26的信息可以通过这样的路径(上图编号 1 所示的路径)来帮助预测 Sequential模型怎么加人迁移学习_数据_31 。这个循环神经网络的一个缺点就是它只使用了这个序列中之前的信息来做出预测,它没有用到Sequential模型怎么加人迁移学习_数据_52, Sequential模型怎么加人迁移学习_神经网络_53

所以这就有一个问题,因为如果给定了这个句子,“Teddy Roosevelt was a great President.”,为了判断 Teddy是否是人名的一部分,仅仅知道句中前两个词是完全不够的,还需要知道句中后部分的信息,这也是十分有用的,因为句子也可能是这样的,“Teddy bears are on sale!”。因此如果只给定前三个单词,是不可能确切地知道 Teddy 是否是人名的一部分,第一个例子是人名,第二个例子就不是,所以你不可能只看前三个单词就能分辨出其中的区别。

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

Sequential模型怎么加人迁移学习_循环神经网络_54

Sequential模型怎么加人迁移学习_数据_55


和我之前提及的一样,一般开始先输入 Sequential模型怎么加人迁移学习_神经网络_35,它是一个零向量。接着就是前向传播过程,先计算激活值 Sequential模型怎么加人迁移学习_数据_57,然后再计算 Sequential模型怎么加人迁移学习_数据_58

Sequential模型怎么加人迁移学习_数据_59

Sequential模型怎么加人迁移学习_神经网络_60

我将用这样的符号约定来表示这些矩阵下标,举个例子 Sequential模型怎么加人迁移学习_循环神经网络_39,第二个下标意味着 Sequential模型怎么加人迁移学习_循环神经网络_39 要乘以某个 x 类型的量,然后第一个下标 a 表示它是用来计算某个 a 类型的变量。同样的,可以看出这里的 Sequential模型怎么加人迁移学习_神经网络_44

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

更一般的情况下,在 t 时刻,Sequential模型怎么加人迁移学习_循环神经网络_64
Sequential模型怎么加人迁移学习_数据_65

实际要将这个符号简化一下:

Sequential模型怎么加人迁移学习_神经网络_66


我们定义 Sequential模型怎么加人迁移学习_循环神经网络_67 的方式是将矩阵 Sequential模型怎么加人迁移学习_数据_68 和矩阵 Sequential模型怎么加人迁移学习_循环神经网络_69 水平并列放置(上图编号 3 所示)。举个例子,如果 a 是 100 维的,然后延续之前的例子,x 是 10,000 维的,那么 Sequential模型怎么加人迁移学习_神经网络_42 就是个 ( 100 , 100 ) 维的矩阵,Sequential模型怎么加人迁移学习_循环神经网络_39 就是个( 100 , 10,000 ) 维的矩阵,因此如果将这两个矩阵堆起来,Sequential模型怎么加人迁移学习_数据_72

用这个符号 Sequential模型怎么加人迁移学习_循环神经网络_73

即,Sequential模型怎么加人迁移学习_数据_74

同样对于这个例子Sequential模型怎么加人迁移学习_数据_65 ,我会用更简单的方式重写Sequential模型怎么加人迁移学习_循环神经网络_76(上图编号 6 所示)。现在 Sequential模型怎么加人迁移学习_数据_77Sequential模型怎么加人迁移学习_神经网络_78 符号仅有一个下标,它表示在计算时会输出什么类型的量,所以 Sequential模型怎么加人迁移学习_数据_77 就表明它是计算 y 类型的量的权重矩阵,而上面的 Sequential模型怎么加人迁移学习_数据_80Sequential模型怎么加人迁移学习_数据_81 则表示
这些参数是用来计算?类型或者说是激活值的。

Sequential模型怎么加人迁移学习_循环神经网络_82

1.4 Backpropagation Through Time(通过时间的反向传播)

Sequential模型怎么加人迁移学习_神经网络_83

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

Sequential模型怎么加人迁移学习_神经网络_84


我们来分析一下前向传播的计算,现在你有一个输入序列,Sequential模型怎么加人迁移学习_数据_03一直到 Sequential模型怎么加人迁移学习_循环神经网络_86,然后用 Sequential模型怎么加人迁移学习_神经网络_26 还有 Sequential模型怎么加人迁移学习_神经网络_35 计算出时间步 1 的激活项 Sequential模型怎么加人迁移学习_数据_57,再用 Sequential模型怎么加人迁移学习_神经网络_27 还有 Sequential模型怎么加人迁移学习_数据_57 计算出 Sequential模型怎么加人迁移学习_数据_92,一直到 Sequential模型怎么加人迁移学习_循环神经网络_93

为了真正计算出 Sequential模型怎么加人迁移学习_数据_57 ,你还需要一些参数,Sequential模型怎么加人迁移学习_循环神经网络_67Sequential模型怎么加人迁移学习_数据_81 ,用它们来计算出 Sequential模型怎么加人迁移学习_数据_57 。这些参数在之后的每一个时间步都会被用到,于是继续用这些参数计算 Sequential模型怎么加人迁移学习_循环神经网络_98

有了 Sequential模型怎么加人迁移学习_数据_57,神经网络就可以计算第一个预测值 Sequential模型怎么加人迁移学习_神经网络_100,接着到下一个时间步,继续计算出 Sequential模型怎么加人迁移学习_神经网络_101等等,为了计算出 Sequential模型怎么加人迁移学习_循环神经网络_102,需要参数 Sequential模型怎么加人迁移学习_数据_77Sequential模型怎么加人迁移学习_神经网络_78,它们将被用于所有这些节点。

Sequential模型怎么加人迁移学习_神经网络_105


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

编号 1 所示):

Sequential模型怎么加人迁移学习_神经网络_106

这是关于单个位置上或者说某个时间步 t 上某个单词的预测值的损失函数。

现在我们来定义整个序列的损失函数,将L定义为(上图编号 2 所示)
Sequential模型怎么加人迁移学习_循环神经网络_107

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

到目前为止,你只见到了 RNN 中一个主要的例子,其中输入序列的长度和输出序列的长度是一样的。在下节课将展示更多的 RNN 架构,这将让你能够处理一些更广泛的应用。

1.5 Different Types of RNNS

Sequential模型怎么加人迁移学习_循环神经网络_108并不一定相等,如 Music Generation 这个例子, Sequential模型怎么加人迁移学习_神经网络_08

还有一些情况,输入长度和输出长度不同,他们都是序列但长度不同,比如机器翻译,一个法语句子和一个英语句子不同数量的单词却能表达同一个意思。

已经见过 Sequential模型怎么加人迁移学习_循环神经网络_11

看另外一个例子,假如说,你想处理情感分类问题(下图编号 2 所示),这里 x 可能是一段文本,比如一个电影的评论,“These is nothing to like in this movie.”,所以 x 就是一个序列,而 y 可能是从 1 到 5 的一个数字,或者是 0 或 1,这代表正面评价和负面评价,而数字 1 到 5 代表电影是 1 星,2 星,3 星,4 星还是 5 星。单词的对应如下图编号 2 所示。我们不再在每个时间上都有输出了,而是让这个 RNN 网络读入整个句子,然后在最后一个时间上得到输出,这样输入的就是整个句子,所以这个神经网络叫做“多对一” (many-to-one)结构,因为它有很多输入,很多的单词,然后输出一个数字。

Sequential模型怎么加人迁移学习_循环神经网络_111


为了完整性,还要补充一个“ 一对一”(one-to-one)的结构(上图编号 3 所示),这个可能没有那么重要,这就是一个小型的标准的神经网络,输入 x 然后得到输出 y 。

Sequential模型怎么加人迁移学习_循环神经网络_112


对于一个“一对多”神经网络结构的例子就是音乐生成(上图编号 1 所示)。对应于一段音乐,输入 x

可以是一个整数,表示你想要的音乐类型或者是你想要的音乐的第一个音符,并且如果你什么都不想输入,x 可以是空的输入,可设为 0 向量。

这样的神经网络的结构,首先是你的输入x,然后得到 RNN 的输出,第一个值,然后就没有输入了,再得到第二个输出,接着输出第三个值等等,一直到合成这个音乐作品的最后一个音符,这里也可以写上输入 Sequential模型怎么加人迁移学习_神经网络_35(上图编号 3 所示)。生成序列时通常会把第一个合成的输出也喂给下一层(上图编号 4 所示),所以实际的网络结构最终就像这个样子。

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

Sequential模型怎么加人迁移学习_神经网络_117

1.6 Language Model and Sequence Generation(语言模型和序列生成)

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

  • 什么是语言模型呢?
    比如你在做一个语音识别系统,你听到一个句子,“the apple and pear (pair ) salad was delicious.”,所以我究竟说了什么?我说的是 “the apple and pair salad”,还是“the apple and pear salad”?(pear 和 pair 是近音词)。你可能觉得我说的应该更像第二种,事实上,这就是一个好的语音识别系统要帮助输出的东西,即使这两句话听起来是如此相似。而让语音识别系统去选择第二个句子的方法就是使用一个语言模型,他能计算出这两句话各自的可能性。

举 个 例 子 , 一 个 语 音 识 别 模 型 可 能 算 出 第 一 句 话 的 概 率 是P(The apple and pair salad) = 3.2 × 10^ −13 , 而 第 二 句 话 的 概 率 是P(The apple and pear salad) = 5.7 × 10 ^−10 ,比较这两个概率值,显然我说的话更像是第二种,因为第二句话的概率比第一句高出 1000 倍以上,这就是为什么语音识别系统能够在这两句话中作出选择。

语言模型做的最基本工作就是输入一个句子,准确地说是一个文本序列,Sequential模型怎么加人迁移学习_神经网络_118一直到Sequential模型怎么加人迁移学习_神经网络_119。对于语言模型来说,用 y 来表示这些序列比 x 好,然后语言模型会估计某个句子序列
中各个单词出现的可能性。

建立一个语言模型首先需要一个训练集,包含一个很大的英文文本语料库(corpus)或者其它的语言。语料库是自然语言处理的一个专有名词,意思就是很长的或者说数量众多的英文句子组成的文本。

Sequential模型怎么加人迁移学习_数据_120


假如说,你在训练集中得到这么一句话,“Cats average 15 hours of sleep a day.”(猫一天睡 15 小时),你要做的第一件事就是将这个句子标记化,one-hot 编码。可能还有一件事就是你要定义句子的结尾,一般的做法就是增加一个额外的标记,叫做 EOS(上图编号 1 所示)。在标记化的过程中,你可以自行决定要不要把标点符号看成标记,在本例中,我们忽略了标点符号。这句话就会有 9 个输入,Sequential模型怎么加人迁移学习_循环神经网络_121

如果你的训练集中有一些词并不在你的字典里,比如说你的字典有10,000 个词,10,000 个最常用的英语单词。现在这个句,“The Egyptian Mau is a bread of cat.”其中有一个词 Mau,它可能并不是预先的那 10,000 个最常用的单词,在这种情况下,你可以把 Mau 替换成一个叫做 UNK 的代表未知词的标志,我们只针对 UNK 建立概率模型,而不是针对这个具体的词 Mau。

Sequential模型怎么加人迁移学习_神经网络_122


继续使用“Cats average 15 hours of sleep a day.”这个句子来作为我们的运行样例,我将会画出一个 RNN 结构。在第 0 个时间步,你要计算激活项 Sequential模型怎么加人迁移学习_数据_57,它是以 Sequential模型怎么加人迁移学习_神经网络_26 作为输入的函数,而 Sequential模型怎么加人迁移学习_神经网络_26会被设为全为 0 的集合,也就是 0 向量。所以 Sequential模型怎么加人迁移学习_神经网络_126

在下一时间步中,仍然使用激活项 Sequential模型怎么加人迁移学习_数据_57,在这步要做的是计算出第二个词会是什么。传给它正确的第一个词,,这就是为什么 Sequential模型怎么加人迁移学习_循环神经网络_128(上图编号 2所示)。

然后再进行 RNN 的下个时间步,现在要计算 Sequential模型怎么加人迁移学习_数据_129 。为了预测第三个词,也就是 15,我们现在给它之前两个词,告诉它 Cats average 是句子的前两个词,所以这是下一个输入,Sequential模型怎么加人迁移学习_循环神经网络_130,输入 average 以后,现在要计算出序列中下一个词是什么,或者说计算出字典中每一个词的概率(上图编号 4 所示),通过之前得到的 Cats 和 average,在这种情况下,正确结果会是 15,以此类推。

一直到最后,你会停在第 9 个时间步,然后把 Sequential模型怎么加人迁移学习_循环神经网络_131 传给它 Sequential模型怎么加人迁移学习_数据_04(上图编号 5 所示),也就是单词 day,最后的得到结果会是 EOS标志,在这一步中,通过前面这些得到的单词,不管它们是什么,我们希望能预测出 EOS 句子结尾标志的概率会很高(上图编号 6 所示)。

定义代价函数。于是,在某个时间步 t,如果真正的词是 Sequential模型怎么加人迁移学习_神经网络_38 ,而神经网络的 softmax 层预测结果值是 Sequential模型怎么加人迁移学习_数据_134 ,那么这(上图编号 8 所示)就是softmax 损失函数,
Sequential模型怎么加人迁移学习_循环神经网络_135
。而总体损失函数(上图编号 9 所示),
Sequential模型怎么加人迁移学习_数据_136
也就是把所有单个预测的损失函数都相加起来。

Sequential模型怎么加人迁移学习_循环神经网络_137


现在有一个新句子,它是 Sequential模型怎么加人迁移学习_循环神经网络_138,为了简单起见,它只包含 3 个词(如上图所示),现在要计算出整个句子中各个单词的概率,方法就是第一个 softmax 层会告诉你 Sequential模型怎么加人迁移学习_数据_58 的概率(上图编号 1 所示),这也是第一个输出,然后第二个 softmax 层会告诉你在考虑 Sequential模型怎么加人迁移学习_数据_58 的情况下 Sequential模型怎么加人迁移学习_神经网络_29 的概率(上图编号 2 所示),然后第三个 softmax 层告诉你在考虑 Sequential模型怎么加人迁移学习_数据_58Sequential模型怎么加人迁移学习_神经网络_29的情况下 Sequential模型怎么加人迁移学习_数据_31

1.7 Sampling Novel Sequences(对新序列采样)

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

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

Sequential模型怎么加人迁移学习_神经网络_145


第一步要做的就是对你想要模型生成的第一个词进行采样,于是你输入Sequential模型怎么加人迁移学习_数据_146

Sequential模型怎么加人迁移学习_循环神经网络_147,现在你的第一个时间步得到的是所有可能的输出是经过 softmax 层后得到的概率,然后根据这个 softmax 的分布进行随机采样。Softmax 分布给你的信息就是第一个词 a 的概率是多少,第一个词是 aaron 的概率是多少,第一个词是 zulu 的概率是多少,还有第一个词是 UNK(未知标识)的概率是多少,然后对这个向量使用例如 numpy 命令, np.random.choice (上图编号 3 所示),来根据向量中这些概率的分布进行采样,这样就能对第一个词进行采样了。

然后继续下一个时间步,记住第二个时间步需要 Sequential模型怎么加人迁移学习_神经网络_100 作为输入,不管你在第一个时间步得到的是什么词,都要把它传递到下一个位置作为输入,然后 softmax 层就会预测 Sequential模型怎么加人迁移学习_循环神经网络_149 是什么。举个例子,假如说对第一个词进行抽样后,得到的是 The,然后把 The 当成 Sequential模型怎么加人迁移学习_神经网络_27,也就是 Sequential模型怎么加人迁移学习_神经网络_100

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

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

Sequential模型怎么加人迁移学习_循环神经网络_152


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

如果你建立一个基于字符的语言模型,比起基于词汇的语言模型,你的序列 Sequential模型怎么加人迁移学习_神经网络_153 在你的训练数据中将会是单独的字符,而不是单独的词汇。所以对于前面的例子来说,那个句子(上图编号 3 所示),“Cat average 15 hours of sleep a day.”,在该例中 C 就是 Sequential模型怎么加人迁移学习_神经网络_100 ,a 就是 Sequential模型怎么加人迁移学习_循环神经网络_149 ,t 就是 Sequential模型怎么加人迁移学习_循环神经网络_156 ,空格符就是 Sequential模型怎么加人迁移学习_数据_157

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

1.8 Vanishing Gradients with RNNS

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

Sequential模型怎么加人迁移学习_数据_158


你已经知道了 RNN 的样子,现在我们举个语言模型的例子,假如看到这个句子(上图编号 1 所示),“The cat, which already ate ……, was full.”,前后应该保持一致,因为 cat 是单数,所以应该用 was。“The cats, which ate ……, were full.”(上图编号 2 所示),cats 是复数,所以用 were。这个例子中的句子有长期的依赖,最前面的单词对句子后面的单词有影响。但是我们目前见到的基本的 RNN 模型(上图编号 3 所示的网络模型),不擅长捕获这种长期依赖效应,解释一下为什么。

你应该还记得之前讨论的训练很深的网络,我们讨论了梯度消失的问题。比如说一个很深很深的网络(上图编号 4 所示),100 层,甚至更深,对这个网络从左到右做前向传播然后再反向传播。我们知道如果这是个很深的神经网络,从输出 Sequential模型怎么加人迁移学习_循环神经网络_102 得到的梯度很难传播回去,很难影响靠前层的权重,很难影响前面层(编号 5 所示的层)的计算。这就意味着,实际上很难让一个神经网络能够意识到它要记住看到的是单数名词还是复数名词。也正是这个原因,所以基本的 RNN 模型会有很多局部影响,意味着这个输出 Sequential模型怎么加人迁移学习_循环神经网络_156主要受附近的值(上图编号 10 所示)的影响。

尽管我们一直在讨论梯度消失问题,但是,你应该记得我们在讲很深的神经网络时,我们也提到了梯度爆炸,我们在反向传播的时候,随着层数的增多,梯度不仅可能指数型的下降,也可能指数型的上升。事实上梯度消失在训练 RNN 时是首要的问题,尽管梯度爆炸也是会出现,但是梯度爆炸很明显,因为指数级大的梯度会让你的参数变得极其大,以至于你的网络参数崩溃。所以梯度爆炸很容易发现。如果你发现了梯度爆炸的问题,一个解决方法就是用梯度修剪。梯度修剪的意思就是观察你的梯度向量,如果它大于某个阈值,缩放梯度向量,保证它不会太大,这就是通过一些最大值来修剪的方法。

总结一下,在前面的课程,我们了解了训练很深的神经网络时,随着层数的增加,导数有可能指数型的下降或者指数型的增加,我们可能会遇到梯度消失或者梯度爆炸的问题。假如一个 RNN 处理1,000 个时间序列的数据集或者 10,000 个时间序列的数据集,这就是一个1,000 层或者 10,000 层的神经网络,这样的网络就会遇到上述类型的问题。梯度爆炸基本上用梯度修剪就可以应对,但梯度消失比较棘手。我们下节会介绍 GRU,门控循环单元网络,这个网络可以有效地解决梯度消失的问题,并且能够使你的神经网络捕获更长的长期依赖。