shartoo +

李宏毅深度学习-八-RNN和GAN

本文总阅读量
欢迎star我的博客

1 生成网络

1.1 生成文本

我们需要知道的是,一个句子由字符或者单词组成。但是中文里面一个单词是一个有意义的单位。使用RNN生成句子时,每次由RNN生成一个字符或单词。

假若我们要基于RNN生成一个句子,生成过程如下:

1.2 生成图像

图像都是由像素组成,可以由RNN每次生成一个像素。图像的二维结构转换为一个像素序列,如下图:

序列处理过程如下:

但是这种方式只有像素值的连续性,没有考虑图像中像素的局部关联性。一种更贴近的方式是下面的图,中间黑色像素块同时受上面的红色块以及左边的粉红色块的影响。

但是要生成这种考虑空间特征的图像,可以使用Grid LSTM。如下图

左下角黑框为一个filter。最开始时输入一个类似BOS的字符,由Grid LSTM生成第一个像素蓝色块,再将蓝色块输入到Grid LSTM(中间图第二个黑色箭头),Grid LSTM会生成第二个红色块,第二个红色像素块在生成时会考虑输入蓝色块和之前的输入信息。

如何产生空间信息,如下图

上图中,注意红色箭头的位置,是一个空间中的第二层。

此方法可以生成 state of art 的图像。

2 基于条件的生成

RNN只能生成一些随机的句子,我们想要基于条件生成想要的文本。比如在 image caption中,看到特定图像能生成对应的文本描述,在chatbot对话中会根据对话者所说的话来生成回应。

2.1 看图说话 image caption

一般使用 CNN+RNN的方式生成,使用cnn来抽取图像特征,再将特征传入RNN即可生成对应描述,如下图示例。

左边的CNN会将抽取出的特征vector传给右边的RNN,如果觉得只在开始的时候传入会导致RNN后续遗忘,可以每次都传入图像特征vector。

2.2 机器翻译

比如,我们想把中文机器学习翻译成对应的英文machine learning,即 机器学习$\Rightarrow$machine learning。此时二者之间毫无关联,但是我们把中文变成一个vector然后传入RNN。

将中文变成vector

同样可以使用RNN来完成,下图将机器学习这四个字用RNN抽取出一个vector代表整个句子的信息。

然后再将抽取出的vector传入给另外一个RNN,如下图:

其中红色的矩形块代表了中文部分抽取出的特征,可以三次重复传入右边的RNN,让右边的RNN分别输出对应的machine,learning以及句号(代表结束)。

比如可以同样将类似的方法来做chatbot,比如我输入一句你好吗,用RNN生成一个vector然后传入右边的RNN,让其生成我很好,类似的对话。

类似的设计在深度学习里面称之为Encoder-Decoder

它们二者可以联合训练。至于左边的encoder和右边的decoder是否一样,可以视情况而定,encoder和decoder可以一样,也可以不一。如果二者一样,可能容易导致过拟合。

3 Attention(Dynamic Conditional Generation)

在上一节里面的机器学习$\Rightarrow$machine learning时,左边的encoder每次传入到右边的decoder都是同样的vector。其实,我们可以使得每次传给右边的vector不一样。比如,我们想要右边的输出为machine时,关注左边的机器即可,此时RNN应该可以更好的掌握

3.1 机器翻译

基于注意力的模型

例如:

现在对所有的RNN的隐藏层输出$h^t$计算与$z^0$的匹配度,然后加个softmax(非必要),得到所有输入词汇的匹配程度,如下:

经过匹配函数match之后,各个输入词汇的在$c^0$中所占比最发生变化,再将输出的$c^0$作为输入传给右边(decoder)的RNN,会使得decoder更加关注此示例中的机器这个单词,更容易学习输出对应的machine,如下图

可以将此步骤右边decoder的rnn的hidden layer的输出$z^1$作为左边encoder的新的匹配函数(当然可以是其他各式各样的方法),来继续下一步的输出。

3.2 语音识别

输入一段音频信号,可以将其抽取为一排vector,每个时间点大概0.01秒用一个vector来表示。神经网络会对所有的vector先计算匹配度,下图的下半部分黑色方格代表匹配度,颜色越深代表越匹配。

如图,使用第一个红色方格标记的部分黑色方格代表此时RNN需要注意的输入,将此输入传入给一个decoder,会得到对应的输出,即左边横轴的音素h,不仅如此,decoder还会产生空白。

我的博客

观点

源码