循环神经网络(吴恩达深度学习笔记)
介绍循环神经网络RNN,包括基础的符号表示,正向传播与反向传播过程。RNN中的梯度消失导致的长期记忆效果不佳。门控循环单元(GRU)和LSTM的使用
目录
6.长时期记忆单元LSTM(long short term memory unit)
1.序列模型
(1)简介
- 序列模型(sequence models),在语音识别、自然语言处理等领域有重要作用。
(2)应用
- 语音识别,给定了一个输入音频片段 x,并要求输出对应的文字记录 y。这个例子里输入和输出数据都是序列(x是一个按时播放的音频片段,输出y是一系列单词)。
- 音乐生成问题,这个例子中只有输出数据y是序列,而输入数据可以是空集,也可以是个单一的整数,这个数可能指代你想要生成的音乐风格,也可能是你想要生成的那首曲子的头几个音符。
- 在DNA序列分析时,DNA可以用A、C、G、T四个字母来表示。所以给定一段DNA序列,你能够标记出哪部分是匹配某种蛋白质的吗?
- 机器翻译,输入句子,然后要求输出另一种语言的翻译结果。
- 视频行为识别,输入一系列视频帧,然后要求识别其中的行为。
- 命名实体识别,给定一个句子,识别出句中的人名。
2.符号定义
(1)符号表示
- 建立一个序列模型用于识别人名,它的输入语句是这样的:“Harry Potter and Herminoe Granger invented a new spell.”。这是一个命名实体识别问题,这常用于搜索引擎。

- 输入数据x,输出y,每个单词对应一个输出值,表示是否是人名的一部分。用<t>来表示一个样本中的元素,比如在上面的输入中:
x<2>表示输入中的第二个元素,图中Potter
x<3>图中and
y<t>表示输出中的第五个元素
T_x:输入序列的长度,在这里T_x=9,
T_y:输出序列的长度,在这里T_y=T_x=9
x(1)<2>表示第一个样本中的第二个单词
(2)单词的表示
- Aaron,and这些单词怎么表示?

- 定义一个词典,跟我们日常用的词典类似,a是第一个单词,Aaron是第二个单词,,and出现在367这个位置上……
- 然后用one-hot表示法来表示词典里的每个单词,如图中所示:x<1>表示Harry这个单词,它就是一个第4075行是1(在词典的位置是4075),其余值都是0的向量;
- 所以这种表示方法中,x<t>指代句子里的任意词,它是个one-hot向量,只有一个值是1,其余值都是0,所以会有9个one-hot向量来表示这个句中的9个单词,向量的维度对应你词典的大小,如果你的词典大小是10,000的话,那么这里的每个向量都是10,000维的。
3.循环神经网络(RNN)
- 实现这种序列输入x和y的映射,如果用标准网络实现,如下图

- 把这9个单词(可能是9个one-hot向量)输入到一个标准神经网络中,经过一些隐藏层,最终会输出9个取值为0或1的项(表明每个输入单词是否是人名的一部分)
- 两个问题:一是在不同例子中输入和输出数据可以有不同的长度。二是单纯的神经网络结构并不共享从文本的不同位置上学到的特征。对序列数据而言,我们希望有类似将部分图片里学到的内容快速推广到图片的其他部分的效果。
- 这时就要用到循环神经网络
(1)循环神经网络两个特点
- 训练神经网络是一种将x按时间步**逐渐输入,并逐渐输出y**的结构。
- 并且x的输入会结合上一时间步的输出值(激活值)。
(2)RNN示例

-
如上图所示,要开始整个流程,在零时刻构造一个激活值a<0>,通常是零向量。使用零向量作为零时刻的伪激活值是最常见的选择,因此我们把它输入神经网络。
-
从左到右的顺序读这个句子,我们将第一个单词x<1>输入第一个神经网络的隐藏层,神经网络预测输出y<1>,判断这是否是人名的一部分。当它读到第二个单词x<2>时,它不仅用x<2>就预测出y<2>,他也会输入一些来自时间步1的信息。具体而言,时间步1的激活值就会传递到时间步2。然后,在下一个时间步,循环神经网络依然这样,一直到最后一个时间步。
-
在每一个时间步(time step)中,循环神经网络传递一个激活值到下一个时间步中用于计算。
-
另一种表示方式:在一些研究论文中或是一些书中这类神经网络也用这样的图形来表示(上图最右侧图像所示),表示循环连接时会画个圈,表示输回网络层;一个黑色方块来表示在这个黑色方块处会延迟一个时间步。
(3)超参数

- 3个超参数,如上图红色标记:
Wax:表示从x<t>到隐藏层的连接的一系列参数,每个时间步使用的都是相同的参数
Waa:水平联系是由参数Waa决定的,同样每一个时间步都使用相同的参数
Wya:输出参数
(后面Wax和Waa会合并成一个参数Wa,Wya也简写为Wy) - 2个偏置参数:ba,by
(4)RNN正向传播
# 第一步计算a<t>,常用的激活函数是tanh,有时候也会用ReLU。
a<t>=g(Wax * x<t>+Waa * a<t-1>+ba)
# 第二步计算y<t>,通过输出y选择激活函数,是一个二分类问题,那么可以用sigmoid函数;如果是k类别分类,可以选用softmax。
y<t>=g(Wya * a<t>+by)
- 我们可以将Waa和Wax并列水平放置,压缩为一个矩阵:例如之前的例子,如果a是100维的,x是10,000维的,那么Waa就是个(100,100)维的矩阵,Wax就是个(100,10000)维的矩阵,因此如果将这两个矩阵堆起来,Wa就会是个(100,10100)维的矩阵。
- 然后RNN计算公式可简写为:
a<t>=g(Wa* [x<t>, a<t-1>]+ba)
y<t>=g(Wy * a<t>+by)
(5)RNN反向传播
- RNN中的反向传播,它还有个很别致的名字:叫做通过(穿越)时间反向传播(backpropagation through time)

- 正向传播(上图蓝色箭头所指方向)。而对于反向传播(上图红色箭头所指方向)。计算反向传播,还需要一个损失函数。我们先定义一个元素的损失函数,和一开始一样,使用标准逻辑回归损失函数:

- 整个序列的损失函数:

- 最后计算相关导数,用梯度下降更新
4.RNN中的梯度消失问题
- 有两个句子:“The cat, which ate ……, was full.”和“The cats, which ate ……, were full.”它们都有长期的依赖(was,were),前面的单词对句子后面的单词有影响。但是基本的RNN模型,不擅长捕获这种长期依赖效应,这是梯度消失引起的问题。
- 事实上梯度消失在训练RNN时是首要的问题,接下来会介绍GRU(门控循环单元),这个网络可以有效地解决梯度消失的问题
5.GRU(Gated Recurrent Unit)
(1)简介
- GRU(门控循环单元)
- GRU改变了RNN的隐藏层,使其可以更好地捕捉深层连接,并改善了因梯度消失导致长期记忆效果不佳的问题。
(2)作用原理
-
GRU的作用原理:相当于设置一个参数c贯穿始终(贯穿整个网络),在需要的时候更新它。

-
如上图,之前RNN的计算,我们在时间t处,按右边公式计算激活值。这张图就是RNN隐藏层的单元的可视化呈现。

-
如上图,运用GRU单元时,会有个新的变量称为c,代表细胞(cell),即记忆细胞(memory cell)。记忆细胞提供了记忆的能力。
-
GRU作用原理:我们在一开始设置这个c的初始值,c相当于决定这个句子是单数还是复数,这样在经过每个隐藏层时都会判断一下是否更新c(更新公式下面说),直到遍历到the cat的时候,c会更新,然后就使得后面变成was。
-
GRU单元中c的更新分为3步:
-
首先知道两个参数:c,Γu(gamma u)(Γu是一个更新门,用于决定c更不更新)
-
更新步骤如下:

-
第一步:计算候选值 c~<t> (tanh函数)
-
第二步:计算Γu (sigmoid函数,结果基本趋近于0或1,使用时看成0或1就行)
-
第三步:更新c
Γu = 1,c<t>=c~<t> -> 更新
Γu = 0,c<t>=c<t-1> -> 不更新 -
这就是GRU单元,从左到右扫描一个句子,通过门决定是否要更新某个记忆细胞还是不更新(中间一直为0,表示一直不更新),直到你真的需要使用记忆细胞的时候再更新。
-
在这个例子中的作用过程:①于是记忆细胞c^(t)被设定为0或者1,这取决于你考虑的单词在句子中是单数还是复数,这里单数情况我们假定为1,复数情况为0。②GRU单元会一直记住记忆细胞c<t>的值。③门Γ_u的作用就是决定什么时候会更新这个值,特别是当你看到词组the cat,即句子的主语猫,这就是一个时机去更新这个值。然后当你使用完它的时候,“The cat, which already ate…, was full.”,然后你就可以忘记它了。
(3)注意
-
在GRU中,c<t> = a<t>,但是LSTM中,这两个是不同的值,所以还是分开表示
-
上面演示的是简化的GRU单元,对于完整的GRU单元,在我们计算的第一个式子中给记忆细胞的新候选值加上一个新的门Γ_r(相关门),r代表相关性(relevance),表示下一个记忆细胞c的候选值跟上一个记忆细胞c有多大相关性。

6.长时期记忆单元LSTM(long short term memory unit)
(1)简介
- LSTM是一个比GRU更加强大和通用的版本。
- LSTM中,c<t>!= a<t>的情况,两者分开。同时不仅由更新门Γu,还有遗忘门Γf,输出门Γo,共三个门
(2)作用原理

- 使用a<t-1>和x<t>一起来计算遗忘门、更新门和输出门的值,然后更新c,最后输出a

- 如上图,它们按照时间次序连接起来,这里输入x<1>、x<2>和x<3>,看红色直线,这条线显示了只要你正确地设置了遗忘门和更新门,LSTM是相当容易把c的值一直往下传递到右边,使得c<3>=c<0>,这就是为什么LSTM和GRU非常擅长于长时间记忆某个值。
(3)GRU 与 LSTM
-
GRU的优点:GRU是个更加简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性上也运行得更快,然后它可以扩大模型的规模。它更容易适应规模更加大的问题。
-
LSTM的优点:三个门使得LSTM更加强大和灵活,更通用。
更多推荐

所有评论(0)