深度学习(19):循环序列模型

引言

在之前我们学习的各种内容中(图像识别啊,分类问题啊),我们的输入在时间上没有先后顺序。然而在语音识别、自然语言处理当中,我们的各项输入是有先后顺序的。(例如句子当中词的先后顺序,声音来源的先后顺序)为了捕获这种时间顺序相关的特征,我们引入循环序列模型。

one hot 表示

在自然语言处理当中,如何对每一个单词进行表示是一个重要问题。在这里我们采用one-hot表示方法。
假如我们训练的模型当中词汇量为3个,那么我们对三个单词分别编码为:
[1, 0, 0]
[0, 1 ,0]
[0, 0, 1]
可以看出,每个编码都是一个长度为3的一维向量,并且向量中有且只有一个位置是1,这就是one- hot
我们可能会想,为什么不直接用0, 1, 2这样进行编码呢?还能省点空间。原因是因为这样编码会导致本来本啥关系的词突然出现了序关系,这会对模型产生影响。(苹果没有道理比鸭梨大,反之亦然)还有一个原因是,直接编码会导致元素之间的距离不再相同(苹果=1, 鸭梨=2, 鸡蛋 = 0, 鸡蛋与苹果之间的距离小于鸡蛋和鸭梨之间的距离),这会给各个词之间添加莫名其妙的关系。

RNN模型

引入RNN的意义就是要利用好上下文的信息。为了简单起见,我们先构造一个RNN模型,使得模型可以利用上文的信息。
一个显然的想法是,既然需要利用上文信息,那么每一个单词X的输出,既要受到自己X的影响,同时也应该收到上一个单词产生的激活函数的影响。
前向传播过程:
一个RNN基本单元如下所示:
深度学习(19):循环序列模型_第1张图片
可以看出,对于每一个时间片激活函数值a,它既受到当前X的影响,又受到上一时间片激活函数值的影响。

反向传播
我们可以知道,每一个时间片的激活函数值,既对自己的输出y有贡献,同时也对后面所有的y都存在贡献。
所以和以往不同,这次的反向传播增加了时间维度的传播。我们需要按照时间顺序进行倒推,逐步计算各个参数的偏导。
深度学习(19):循环序列模型_第2张图片

语言模型和序列生成

这里面仅仅介绍了什么是语言模型,以及如何利用语言模型生成序列。
语言模型的作用是算出一句话是人话的概率。(确定 我 吃 饭, 饭 吃 我哪个更像是人话)

训练一个语言模型:
训练集:我们需要一个大的语料库(里面有一堆句子)

每一个RNN单元:
  输入:单词的one-hot
  输出:下一个单词可能是谁的概率(可能是softmax)

训练过程:
对于每一句话, 我们令每一个单词为yi

  1. 第一步,设置初始x0 ,a0都是0向量,获得y1_hat,这个输出表示在什么都没有的情况下语言模型预测第一个单词的概率
  2. 第二步,输入y1,得到y2_hat,表示明确知道第一个单词是y1的前提下获得第二个单词的概率
  3. 依次进行,直到yi走到最后

对于每一个y和y_hat, 利用交叉熵求出代价函数,对模型进行训练。

利用语言模型生成序列采样

  1. 第一步,设置初始x0 ,a0都是0向量,获得第一个单词的概率分布,利用这个概率分布随机挑选一个单词y进行输出。
  2. 第二步,将上一个输出的y当作输入,以预测下一个单词。
  3. 依次进行,直到预测出终止单词或达到最大输出限制。

梯度消失和梯度爆炸

之前我们深层神经网络的梯度问题主要出在层数过深上,而RNN的梯度问题出现在时间维度上。RNN的梯度消失可以这样理解,第一个单词的激活函数,很难对最后一个单词造成影响,因为时间跨度过大,从而也导致,最后一个单词的偏导数很难反向传递到第一个单词的各项参数。

对于梯度爆炸,我们可以通过设置梯度上限来解决。
然而对于梯度消失,我们就没有太多操作空间了.

我们回想一下深层神经网络是怎么解决的:ResNets创建了可以跨越中间层的连接,变相起到了减少层数的作用(因为被跨越的层数可以比较容易地被忽略),那RNN是不是也可以利用这一点解决梯度消失呢?
答案是可以的,下面的GRU单元和LSTM单元在我看来也是这种思想。下面只简要介绍LSTM

LSTM

深度学习(19):循环序列模型_第3张图片
整体的网络传播逻辑和RNN一致,只不过更换了单元结构。
我们可以看到,每一次的c值和a值都与上一次的输入相关。这个相关性的大小由各个gate来控制,通过合适的gate值,我们就可以让前面某个单词的c值和a值尽可能地保存到后面,提升单元模块的记忆能力。

双向神经网络

之前挖了个坑,每一个单词的输出可能与上文有关,还可能与下文有关,然而我们上面提到的模型都只能利用上文的信息。因此我们引入双向神经网络。
我们构建两个网络,正序跑一遍,逆序跑一边,每一个单词的输出由两个网络的输出共同决定,这样一来就同时利用上下文的信息。
深度学习(19):循环序列模型_第4张图片

深层循环神经网络

我们上面介绍的网络中,每个RNN单元只有一层。实际应用中,RNN单元在空间维度上也可以叠加。
深度学习(19):循环序列模型_第5张图片
但是要注意的是,RNN本身由于时间轴因素已经足够复杂,因此RNN的层数不应该过高。常见的作法是在输出上面套用普通的神经网络以增加层数,提升学习能力。

你可能感兴趣的:(深度学习笔记)