本文只是吴恩达视频课程关于序列模型一节的笔记。
参考资料:
吴恩达本来就是根据这篇博文的内容来讲的,所以 个人认为 认真学习过吴恩达讲的那个课程后可以不用再看那篇博文了,能获得的新的知识不多,另外网上的博文基本也都是根据那篇博文写的。
一、序列模型
我们知道,卷积神经网络(CNN)主要是处理图像的。那么循环神经网络(RNN)呢?主要是用来处理序列的。
那么,什么是序列呢?序列是排成一列的事件或对象,比如一段语音是一个时间序列,某一个时刻点的语音信号的幅值就是这个序列的一个对象;再比如一段视频是一个序列,视频的每一帧就是一个对象;一段话是一个序列,话里的每个单词或每个汉字就是一个对象。序列一个明显的特征是它是有先后顺序的,它是一维的。下图是序列的一些例子(中间一列是输入的序列,右边一列是输出,输出不一定是序列)
二、一个标准的RNN
1、RNN要解决的问题
为什么不用一个标准的神经网络呢?
- 对于全连接网络,输入输出的单元数是固定的。但是实际情况中,输入输出的不同序列长度不一定相同。比如机器翻译,输入的不同句子长度一般是不同的,输出的也一样。 (1)
- 标准的神经网络中,输入序列的不同位置是彼此独立的,不共享特征。(2)
2、一个标准的RNN
注意每个时间步的参数W、b是共享的,也就是说图中的神经网络是循环利用的,只是每次迭代的输入不一样而已。
3、RNN相关问题与解决办法
可以看到,通过将上一个步长的激活值传给下一个时间步,使得序列的不同位置彼此关联,从而解决了问题(2)
但是还存在一个问题是,每一个时刻的输出之和之前的时刻相关,而和之后的时刻无关。这个问题可以通过双向RNN解决。
至于问题(1),可以通过转变RNN的结构解决,这一点可以看视频1.5节,在此略过。
事实上,对于问题(2),RNN并没有完全解决,这里存在一个长期依赖的问题,什么是长期依赖呢?
长期依赖可以理解为一段序列中相隔很远的两个对象间存在的依赖关系。而标准的RNN恰好是不能很好解决这种依赖关系的。
拿机器翻译距离,如果一句话中两个单词离得很近,那么RNN能够将两个单词关联起来,或者说将前一个单词的特征传递给处理后一个单词的网络层。但是如果两个单词离得很远呢?那就说不好了。为什么呢?因为梯度消失,在反向传播的过程中,由于梯度消失的存在,使得相离较远的两个单词间的依赖关系很弱,这是我们不想要的。
那么如何解决这个长期依赖的问题呢?所以LSTM提出来了,而GRU是LSTM的一个简易版的变种。
三、GRU
先看一个标准的RNN单元是如何表示的
我们将这个RNN单元做一些改动:
这里我觉得主要有两个概念,一个是记忆细胞,一个是门函数。在GRU中,所谓的记忆细胞c实际上就是标准RNN中的激活值a,它从左到右依次传递,作用是存储之前的时间步的特征。而门函数我觉得是理解的关键点,门函数是一个sigmoid层,它的输出范围是0~1,门函数决定了是否要更新记忆细胞,1为更新,0为不更新,这一点看公式很容易理解。
个人觉得这种思路和CNN中的ResNet残差网络有异曲同工之处,其核心思想都是通过一种同等映射关系来将前面层与后面层紧密连接起来,而中间的网络层是稀疏的,从而解决梯度消失的问题。
四、LSTM
LSTM比GRU更加复杂,但核心思想还是一样的,毕竟GRU是从LSTM衍生出来的。LSTM和GRU的区别在于它多了两个门,分别是遗忘门和输出门。它用遗忘门代替了GRU的1-更新门。使得记忆细胞的更新过程更加灵活,当然这也意味着需要学习的参数更多。另外添加的输出门增加了一个输出,使得a不再等同于c,同样增添了网络的复杂度。
功能上比较,GRU更简单,更容易搭建网络。LSTM更灵活,更强大。