循环神经网络
对于序列问题为什么不选择标准的神经网络,是因为序列问题的输入和输出在不同的例子有不同的长度,不是所有的例子都有同样的输入长度或者同样的输出长度。即使每个句子有最大长度可以通过zero padding使每个输入语句达到最大长度,但看起来仍然不是一个好的表达方式。
而且,一个单纯的神经网络结构,它并不共享从文本不同位置上学到的特征。和卷积网络学到的类似,用一个更好的表达方式也能够让你减少模型中参数数量。若一个单词用10000维one-hot向量表示,那么总的输入就是最大单词数*10000,这就会有巨大的参数量。
图2-1-1 循环神经网络手画结构图
图2-1-2 循环神经网络结构图
循环神经网络结构图如上所示,其中 是零时刻的激活值,一般用初始化为0。 表示对应t时刻的输入,每个时间步的参数是共享的,每个时间步使用的都是相同的参数 等。这样的结构,使得在预测 时不仅用到了 的信息,还要使用到 和 的信息。
这个循环神经网络的一个缺点就是它只使用了这个序列中之前的信息来做出预测,而没有用到之后的信息,而之后的双向循环神经网络可以解除这个问题。
循环神经网络的激活函数通常选用tanh,虽然有时也会用Relu,但tanh是更常见的选择。如果这是个二分类问题则可以选择sigmoid,多分类则可以选择softmax。
循环神经网络的损失函数
在单个时间步上的损失函数如下所示:
整个序列的损失函数就定义为从t=1开始一直到tx 的损失值之和
不同类型的循环神经网络
Many-to-Many结构:多对多结构有很多输入,而输出序列也有很多输出。
图2-1-3 Many-to-Many结构图
Many-to-one结构:输入有很多个,但输出只有一个。比如情感分类问题,x可能是一个文本,比如一段电影评论,而y可能就是一个数字,代表正面评价或负面评价,也可代表分数等。
图2-1-4 Many-to-one结构图
One-to-Many结构:一个输入,多个输出。比较典型的例子就是音乐生成,输出一些音符,对应一段音乐,输入的x可以是一个整 数,表示你想要的音乐类型,或者是你想要的音乐第一个音符。通常会把第一个合成的输出也输入到下一层。
图2-1-4 One-to-Many结构图
Many-to-Many结构(输入输出数不同):之前的一个Many-to-Many结构是输入和输出的数量是相同的,但是当输入输出数量不同时就是以下的一种结构,常用于机器翻译等应用。
图2-1-5 Many-to-Many(输入和输出数量不同)结构图
新序列采样
在你训练一个序列模型之后,要想了解这个模型学到了什么,一种非正式的方法就是进行一次新序列采样。
一个序列模型模拟了任意特定单词序列的概率,我们要做的就是对这个概率分布进行采样来生成一个新的单词序列。第一步要做的就是对你想要模型生成的第一个词进行采样。输入 和 均为0,经过softmax层得到的所有单词的概率,然后根据这个softmax的分布进行随机采样,可以使用np.random.choice来根据向量中这些概率的分布进行采样,然后继续下一个时间步,并将前一步采样得到的结果作为输入,如此重复执行,直至出现结尾标识<EOS>。当采样结果得到<UNK>时,可以不处理,也可以重采样。
根据你实际的应用,你还可以构建一个基于字符的RNN结构,在这种情况下,你的字典仅包含从a到z的字母,可能还会有空格符、标点符号等其他字符。比起基于词汇的语言模型,优点是你不必担心会出现未知的标识。不过其一个主要的缺点是你最后会得到更多、更长的序列,在捕捉句子中的依赖关系不如基于词汇的语言模型那样可以捕捉长范围的关系。并且基于字符的语言模型训练起来计算成本比较高昂,所以目前绝大多数都是使用基于词汇的语言模型,但随着计算性能越来越高,可能会有更多的应用使用基于字符的语言模型。
梯度消失
基本的RNN算法有一个很大的问题就是梯度消失的问题。基本的RNN模型不擅长捕获这种长期依赖效应。是因为在反向传播中,后面时刻的输出误测很难影响前面层的计算。所有基本的RNN模型会有很多局部影响,输出值受附近的输入值影响较大。
同时,梯度爆炸也是可能会出现的,但是梯度爆炸很明显,因为指数级别的梯度会让你的参数变得极其大,以至于你的网络参数崩溃,所以很容易发现。一个解决方法是使用梯度修剪,观察你的梯度向量,如果它大于某个阈值,则缩放梯度向量,保证它不会太大。这是相对比较鲁棒的梯度爆炸解决方法。
GRU单元
Gated Recurrent Unit改变了RNN隐藏层使其更好地捕捉深层连接,并改善了梯度消失的问题。
图2-1-6 简化GRU结构图
C为记忆cell,可见当 为1时就会更新C的值,但其为0时,就会保留原来的c值。这样通过引入一个 门控,就可以将信息保留直至经过很长的序列。
完整版的GRU单元表达式如下所示,添加了一个门 ,可以认为r代表相关性。 相当于告诉你计算出的 跟 有多大的相关性。
LSTM
The long short term memory units甚至比GRU更有效,它是一个更加强大和通用的版本。LSTM的一个新特性是不只有一个更新门控制,将会有两个不同的项来代替----更新门和遗忘门。表达式如下
图2-1-6 LSTM结构图
而加入偷窥孔的LSTM表达式有所不同,但基本类似。
双向RNN网络
Bidirectional RNNs这个模型可以让你的序列的某点处不仅可以获取之前的信息,还可以获取未来的信息。其结构图如下所示。
图2-1-7 Bi-RNN结构图(a)
图2-1-8 Bi-RNN结构图(b)
通过这些改变,用RNN或GRU或LSTM构建的模型能够预测任意位置,即使在句子中间,因为模型能够结合整个句子的信息。这 个双向RNN网络模型的缺点就是你需要完整的数据序列,你才能预测任意位置。