赞
踩
1. 为什么需要RNN?
在这之前,我们已经学习了基础的神经网络,它们可以当做是能够拟合任意函数的黑盒子,只要训练数据足够,给定特定的x,就能得到希望的y;但基础的神经网络只在层与层之间建立了权连接,也就是说,他们都只能单独的去处理一个个的输入,前一个输入和后一个输入是完全没有关系的。而在实际应用中某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。RNN最大的不同之处就是在层之间的神经元之间也建立的权连接,相比一般的神经网络来说,他能够处理序列变化的数据。比如某个单词的意思会因为上文提到的内容不同而有不同的含义,RNN就能够很好地解决这类问题。
2. RNN的结构
RNN的一般形式如下图所示
其中,x为当前状态下数据的输入,h表示接收到的上一个节点的输入。y为当前节点状态下的输出,h’为传递到下一个节点的输出。其中σ为激活函数,一般来说会选择tanh函数,通常后面还会加一个b作为偏置。
通过上图的公式可以看到,输出 h’ 与 x 和 h 的值都相关。而 y 则常常使用 h’ 投入到一个线性层(主要是进行维度映射)然后使用softmax进行分类得到需要的数据。
这里的y如何通过 h’ 计算得到往往看具体模型的使用方式。
通过序列输入,我们就可以得到以下形式
以上是RNN的标准结构,然而在实际中这一种结构并不能解决所有问题,它还有单输入序列输出、序列输入单输出、序列输入序列输出(分等长和不等长)等一系列结构,在此不过多叙述。
3. RNN存在的问题及解决办法
由梯度消失引起的短期记忆问题是RNN的痛点,RNN的特点本来就是能“追根溯源“利用历史数据,但由于梯度消失,RNN不会跨时间步骤学习远程依赖性。关于梯度消失的问题,我们在之前的神经网络中已经学习过,在循环神经网络中,我们可以将其中的每个时间步骤视为一个层。为了训练一个递归神经网络,我们使用一种称为通过时间反向传播的方法,梯度值在每个时间步长传播时将呈指数级收缩。梯度值将用于在神经网络权重中进行调整,从而允许其学习,小的渐变意味着小的调整,这将导致最前面的层没有优化。而这种梯度消失,就会引起短期记忆问题,下面用一个例子来说明什么是短期记忆和长期记忆
有时候,我们仅仅需要知道先前的信息来执行当前的任务。例如,我们有一个语言模型用来基于先前的词来预测下一个词。如果我们试着预测 “the clouds are in the sky” 最后的词,我们并不需要任何其他的上下文 —— 因此下一个词很显然就应该是 sky。在这样的场景中,相关的信息和预测的词位置之间的间隔是非常小的,RNN 可以学会使用先前的信息。
但是同样会有一些更加复杂的场景。假设我们试着去预测“I grew up in France… I speak fluent French”最后的词。当前的信息建议下一个词可能是一种语言的名字,但是如果我们需要弄清楚是什么语言,我们是需要先前提到的离当前位置很远的 France 的上下文的。这说明相关信息和当前预测位置之间的间隔就肯定变得相当的大。
不幸的是,在这个间隔不断增大时,RNN 会丧失学习到连接如此远的信息的能力。
为了解决梯度消失,我们通常可以采用两种办法
1. 为什么要引出LSTM
如上文所述,长短期记忆(Long short-term memory, LSTM)是对RNN结构的一种改进,主要是为了解决长序列训练过程中的梯度消失问题,让循环神经网络具备更强更好的记忆性能。简单来说,就是相比普通的RNN,LSTM能够在更长的序列中有更好的表现。
2. LSTM与RNN结构的对比
如下图一是RNN的结构,下图二是LSTM的基本结构
可以看到,相比RNN,LSTM整体上除了h在随时间流动,细胞状态c也在随时间流动,细胞状态c就代表着长期记忆。接下来,我们就详细分析一下LSTM的结构
3. 详细分析LSTM的结构
LSTM内部主要有三个阶段:忘记阶段、选择记忆阶段和输出阶段。而这三个阶段都是用来增加或减少细胞状态中的信息的,所以,我们首先先来看一下细胞状态。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互,信息在上面流传保持不变会很容易。
def LSTMCELL(prev_ct,prev_ht,input):
combine = prev_ht + input
ft = forget_layer(combine)
candidate = candidate_layer(combine)
it = input_layer(combine)
ct = prev_ct * ft + candidate * it
ot = output_layer(combine)
ht = ot * tanh(ct)
return ht,ct
ct = [0,0,0]
ht = [0,0,0]
for input in inputs:
ct,ht = LSTMCELL(ct,ht,input)
1.首先,我们将先前的隐藏状态和当前的输入连接起来,这里将它称为 combine;
2.其次将 combine 丢到遗忘层中,用于删除不相关的数据;
3.再用 combine 创建一个候选层,候选层中包含着可能要添加到细胞状态中的值;
4.combine 同样要丢到输入层中,该层决定了候选层中哪些数据需要添加到新的细胞状态中;
5.接下来细胞状态再根据遗忘层、候选层、输入层以及先前细胞状态的向量来计算;
6.再计算当前细胞的输出;
7.最后将输出与新的细胞状态逐点相乘以得到新的隐藏状态。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。