2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai

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

现在你已经了解了一种RNN结构,它的输入量 T x T_x Tx​等于输出数量 T y T_y Ty​。事实上,对于其他一些应用, T x T_x Tx​和 T y T_y Ty​并不一定相等。在这节课里,你会看到更多的RNN的结构。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

你应该还记得这周第一节课中的介绍,如上图,有很多例子输入 x x x和输出 y y y,有各种类型,并不是所有的情况都满足 T x = T y T_x=T_y Tx​=Ty​。

比如

  • 音乐生成, T x T_x Tx​可以是长度为1甚至为空集。
  • 情感分类,输出 y y y可以是1到5的整数,而输入 x x x是一个序列。
  • 命名实体识别,这个例子中输入长度和输出长度是一样的。

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

所以我们应该修改基本的RNN结构来处理这些问题。

本节课的内容参考了Andrej Karpathy的博客,一篇叫做《RNN的非理性效果》(“The Unreasonable Effectiveness of Recurrent Neural Networks”)的文章,我们看一些例子。

例1 “多对多”(many-to-many) T x = T y T_x=T_y Tx​=Ty​

你已经见过 T x = T y T_x=T_y Tx​=Ty​的例子,也就是我们输入序列 x < 1 > x^{<1>} x<1>, x < 2 > x^{<2>} x<2>,一直到 x < T x > x^{<T_x>} x<Tx​>,我们的RNN这样工作,输入 x < 1 > x^{<1>} x<1>来计算 y ^ < 1 > \hat y^{<1>} y^​<1>, y ^ < 2 > \hat y^{<2>} y^​<2>等等一直到 y ^ < T y > \hat y^{<T_y>} y^​<Ty​>。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

在原先的图里,我会画一串圆圈表示神经元,大部分时候为了让符号更加简单,此处就以简单的小圈表示。这个就叫做“多对多”(many-to-many)的结构,因为输入序列有很多的输入,而输出序列也有很多输出。

例2 “多对一”(many-to-one)

现在我们看另外一个例子。假如说,你想处理情感分类问题。

这里 x x x可能是一段文本,比如一个电影的评论,“These is nothing to like in this movie.”(“这部电影没什么好看的。”),所以 x x x就是一个序列。而 y y y可能是从1到5的一个数字,或者是0或1,这代表正面评价和负面评价,而数字1到5代表电影是1星,2星,3星,4星还是5星。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

所以在这个例子中,我们可以简化NN的结构,输入 x < 1 > x^{<1>} x<1>, x < 2 > x^{<2>} x<2>,一次输入一个单词。如果输入文本是“These is nothing to like in this movie”,那么单词的对应如上图所示。我们不再在每个时间上都有输出了,而是让这个RNN网络读入整个句子,然后在最后一个时间上得到输出,这样输入的就是整个句子,所以这个NN叫做“多对一”(many-to-one)结构,因为它有很多输入,很多的单词,然后输出一个数字。

例3 “一对一”(one-to-one)

为了完整性,还要补充一个“一对一”(one-to-one)的结构。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

这个可能没有那么重要,这就是一个小型的标准的NN,输入 x x x然后得到输出 y y y,我们这个系列课程的前两个课程已经讨论过这种类型的NN了。

例4 “一对多”(one-to-many)

除了“多对一”的结构,也可以有“一对多”(one-to-many)的结构。

一个“一对多”NN结构的例子就是音乐生成。事实上,你会在这个课后编程练习中去实现这样的模型,你的目标是使用一个NN输出一些音符。对应于一段音乐,输入 x x x可以是一个整数,表示你想要的音乐类型或者是你想要的音乐的第一个音符,并且如果你什么都不想输入, x x x可以是空的输入,可设为零向量。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

这个NN的结构,首先是你的输入 x x x,然后得到RNN的输出,第一个值 y ^ < 1 > \hat y^{<1>} y^​<1>。然后就没有输入了,再得到第二个输出 y ^ < 2 > \hat y^{<2>} y^​<2>,接着输出第三个值 y ^ < 3 > \hat y^{<3>} y^​<3>等等,一直到合成这个音乐作品的最后一个音符 y ^ < T y > \hat y^{<T_y>} y^​<Ty​>。这里也可以写上输入 a < 0 > a^{<0>} a<0>。

有一个后面才会讲到的技术细节,当你生成序列时通常会把第一个合成的输出也喂给下一层(上图红色线所示),所以实际的网络结构最终就像上图这个样子。

例5 “多对多”(many-to-many) T x ≠ T y T_x \neq T_y Tx​​=Ty​

我们已经讨论了“多对多”、“多对一”、“一对一”和“一对多”的结构,对于“多对多”的结构还有一个有趣的例子值得详细说一下,就是输入和输出长度不同的情况。

你刚才看过的多对多的例子,它的输入长度 T x T_x Tx​和输出长度 T y T_y Ty​是完全一样的。而对于像机器翻译这样的应用,输入句子的单词的数量,比如说一个法语的句子,和输出句子的单词数量,比如翻译成英语,这两个句子的长度可能不同,所以还需要一个新的网络结构,一个不同的NN。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

首先读入这个句子,读入输入 x < 1 > x^{<1>} x<1>, x < 2 > x^{<2>} x<2>,一直到 x < T x > x^{<T_x>} x<Tx​>,假设你要将法语翻译成英语,读完之后,这个网络就会输出翻译结果 y ^ < 1 > \hat y^{<1>} y^​<1>, y ^ < 2 > \hat y^{<2>} y^​<2>,一直到 y ^ < T y > \hat y^{<T_y>} y^​<Ty​>。

有了这种结构 T x T_x Tx​和 T y T_y Ty​就可以是不同的长度了。同样,你也可以画上这个 a < 0 > a^{<0>} a<0>。

这个网络的结构有两个不同的部分,左边红圈是一个编码器,获取输入,比如法语句子,右边红圈是解码器,它会读取整个句子,然后输出翻译成其他语言的结果。

这就是一个“多对多”结构的例子,到这周结束的时候,你就能对这些各种各样结构的基本构件有一个很好的理解。

“注意力”(attention based)结构

严格来说,还有一种结构,我们会在第四周涉及到,就是“注意力”(attention based)结构,但是根据我们现在画的这些图不好理解这个模型。

总结

总结一下这些各种各样的RNN结构。
2020-10-14 吴恩达DL学习-C5 序列模型-W1 循环序列模型(1.5 不同类型的RNN-一对一/一对多/多对一/多对多2种/注意力结构)

如上图

  • 一排一列,是“一对一”的结构,当去掉时 a < 0 > a^{<0>} a<0>就是一种标准类型的NN。
  • 一排二列,是“一对多”的结构,比如音乐生成或者序列生成。
  • 一排三列,是“多对一”,这是情感分类的例子,首先读取输入,一个电影评论的文本,然后判断他们是否喜欢电影还是不喜欢。
  • 二排一列,是“多对多”的结构,命名实体识别就是“多对多”的例子,其中 T x = T y T_x = T_y Tx​=Ty​。
  • 二排二列,是一种“多对多”结构的其他版本,对于像机器翻译这样的应用, T x T_x Tx​和 T y T_y Ty​就可以不同了。

现在,你已经了解了大部分基本的模块,这些就是差不多所有的NN了,除了序列生成,有些细节的问题我们会在下节课讲解。

我希望你从本节中了解到用这些RNN的基本模块,把它们组合在一起就可以构建各种各样的模型。但是正如我前面提到的,序列生成还有一些不一样的地方,在这周的练习里,你也会实现它,你需要构建一个语言模型,结果好的话会得到一些有趣的序列或者有意思的文本。下节课深入探讨序列生成。

上一篇:ELK Logstash Introduction


下一篇:CodeGen融合核心关系循环扩展