隐藏层是在从输入到输出的路径上(以观测角度来理解)的隐藏的层, 而隐藏状态则是在给定步骤所做的任何事情(以技术角度来定义)的输入, 并且这些状态只能通过先前时间步的数据来计算。
循环神经网络(Recurrent neural network ,RNN)是具有隐藏状态的神经网络,其通过使用带自反馈的神经元,能够处理任意长度的时序数据。
普通的CNN只能单独的处理一个个的输入,前一个输入和后一个输入是完全没有关系的。但是,某些任务需要能够更好的处理序列的信息,即前面的输入和后面的输入是有关系的。RNN对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。
首先一个简单的循环神经网络由输入层、隐藏层和输出层组成。当前时间步t 的隐藏状态Ht 将参与计算下一时间步t+1的隐藏状态Ht+1。 而且Ht还将送入全连接输出层, 用于计算当前时间步的输出Ot。
计算公式如下:
实践中证明RNN并不能很好的处理较长的序列。一个主要的原因是,RNN在训练中很容易发生梯度爆炸和梯度消失,这导致训练时梯度不能在较长的序列中一直传递下去,从而使RNN无法捕捉到长距离的影响。
处理梯度消失问题的方法:
合理的初始化权重值。初始化权重,使每个神经元尽可能不要取极大或极小值,以躲开梯度消失的区域。
使用ReLu代替sigmoid和tanh作为激活函数。
使用其他结构的RNNs,比如长短时记忆网络(LSTM)和Gated Recurrent Unit(GRU),这是最流行的做法。
长短期记忆(Long short-term memory LSTM)是一种特殊结构的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。简单来说,就是相比于普通的RNN,LSTM能够在更长的序列中有更好的表现。能够解决在RNN网络中梯度衰减的问题。
RNN 会受到短时记忆的影响。如果一条序列足够长,那它们将很难将信息从较早的时间步传送到后面的时间步。 因此,如果你正在尝试处理一段文本进行预测,RNN 可能从一开始就会遗漏重要信息。
在反向传播期间,RNN 会面临梯度消失的问题。 梯度是用于更新神经网络的权重值,消失的梯度问题是当梯度随着时间的推移传播时梯度下降,如果梯度值变得非常小,就不会继续学习。
LSTM中引入了记忆元(memory),或简称为单元(cell),记忆元与隐藏状态具有相同的形状,及设计目的是用于记录附加的信息。为了控制记忆元,加入了 输入门(input gate)、输出门(output gate)和遗忘门(forget gate).
决定应丢弃或保留哪些信息。来自前一个隐藏状态的信息和当前输入的信息同时传递到Sigmoid函数中去,输出值介于 0 和 1 之间,越接近 0 意味着越应该丢弃,越接近 1 意味着越应该保留。
用于更新细胞状态。首先将前一层隐藏状态的信息Ht-1和当前输入的信息X~t传递到 sigmoid 函数中去。将值调整到 0~1 之间来决定要更新哪些信息。0 表示不重要,1 表示重要。
其次还要将前一层隐藏状态的信息Ht-1和当前输入的信息Xt传递到 tanh 函数中去,创造一个新的侯选值向量(候选记忆)。最后将 sigmoid 的输出值It与 tanh 的输出值(候选记忆)相乘,sigmoid 的输出值将决定 tanh 的输出值中哪些信息是重要且需要保留下来的。
输出门用来确定下一个隐藏状态的值,隐藏状态包含了先前输入的信息。首先,我们将前一个隐藏状态Ht-1和当前输入Xt传递到 sigmoid 函数中,然后将新得到的细胞状态Ct传递给 tanh 函数。
最后将 tanh 的输出与 sigmoid 的输出Ot相乘,以确定隐藏状态应携带的信息Ht。再将隐藏状态作为当前细胞的输出,把新的细胞状态Ct和新的隐藏状态Ht传递到下一个时间步长中去。
具体来说,假设隐藏单元个数为,给定时间步
的小批量输入
(样本数为n,输入个数为d)和上一时间步隐藏状态
。三个门的公式如下:
长短期记忆需要计算候选记忆细胞,它的计算与上面三个门类似,但使用了值域在[-1,1]的tanh函数作为激活函数,如下图所示:
候选记忆元将这个阶段的输入有选择性地进行“记忆”。主要是会对Xt进行选择记忆。哪些重要则着重记录下来,哪些不重要,则少记一点。
遗忘⻔控制上⼀时间步的记忆细胞 中的信息是否传递到当前时间步,而输⼊⻔则控制当前时间步的输⼊
通过候选记忆细胞
如何流⼊当前时间步的记忆细胞。如果遗忘⻔⼀直近似1且输⼊⻔⼀直近似0,过去的记忆细胞将⼀直通过时间保存并传递⾄当前时间步。这个设计可以应对循环神经⽹络中的梯度衰减问题,并更好地捕捉时间序列中时间步距离较⼤的依赖关系。
有了记忆细胞以后,接下来我们还可以通过输出⻔来控制从记忆细胞到隐藏状态的信息的流动:
这⾥的tanh函数确保隐藏状态元素值在-1到1之间。需要注意的是,当输出⻔近似1时,记忆细胞信息将传递到隐藏状态供输出层使⽤;当输出⻔近似0时,记忆细胞信息只⾃⼰保留。下图展⽰了⻓短期记忆中隐藏状态的全部计算:
对于RNN来说,对于每一个时间点,memory里的信息都会别覆盖掉,但是LSTM里不一样,它是把原来memory里面的值乘上一个值在加上input的值放到cell里面,它的memory和input是相加的,所以不像RNN在每个时间点都会被覆盖掉,只要前一时刻的信息一被format掉,影响就消失了,但是在LSTM里的影响一直会存在,除非遗忘门Forget Gate把memory里的信息清洗掉。
长短期记忆网络有三种类型的门:输入门、遗忘门和输出门。
长短期记忆网络的隐藏层输出包括“隐状态”和“记忆元”。只有隐状态会传递到输出层,而记忆元完全属于内部信息。
长短期记忆网络可以缓解梯度消失和梯度爆炸。
门控循环神经网络(gated recurrent neural network)是为了更好地捕捉时序数据中间隔较大的依赖关系,门控循环单元(gated recurrent unit ,GRU)是一直常用的门控循环神经网络
循环神经网络的隐含层变量梯度可能出现消失或爆炸,虽然梯度裁剪可以应对梯度爆炸,但是无法解决梯度消失的问题。GRU和LSTM一样是为了解决长期记忆和反向传播中的梯度等问题提出来的。
GRU的输入输出结构与普通的RNN是一样的
输入:t时刻的输入 ,和t-1时刻的隐藏层状态
,这个隐藏层状态包含了之前节点的相关信息。 输出:t时刻隐藏节点的输出
和传递给下一个节点的隐状态
与LSTM内部中的三个门不同,GRU内部只有两个门,重置门和更新门
通过上一个传输下来的状态 和当前节点的输入 Xt来获取两个门控状态。
更新门rt用于控制前一时刻的状态信息被带入到当前状态中的程度,更新门的值越大说明前一时刻的状态信息带入越多, 将前一时刻和当前时刻的信息分别右乘权重矩阵,然后相加后的数据送入更新门,也就是与sigmoid函数相乘,得出的数值在[0, 1]之间。
重置门用于控制前一状态有多少历史信息被写入到当前的候选集
上,重置门越小,前一状态的信息被写入的越少,同更新门的数据处理一样,将前一时刻和当前时刻的信息分别右乘权重矩阵,然后相加后的数据送入重置门,也就是与sigmoid函数相乘,得出的数值在[0, 1]之间。只是两次的权重矩阵的数值和用处不同。
将重置门与上一时间步的隐藏状态
进行计算,得到在时间步t的候选隐状态
,在这里使用的是tanh非线性激活函数来确保候选隐状态中的值保持在区间(-1,1)中。
与
相乘可以减少以往状态的影响。每当重置门
中的项接近与1时,GRU就能恢复成一个普通的循环神经网络。对于重置门
中所有接近0的项,候选隐状态是以
作为输入的多层感知机的结果。因此,任何预先存在的隐状态都会被重置为默认值。
上述的计算结果只是候选隐状态,我们仍然需要结合更新门的效果。 这一步确定新的隐藏状态
在多大程度上来自旧的状态
和 新的候选状态。 更新门仅需要在上一步的隐藏状态 和 候选隐状态之间进行按元素的凸组合就可以实现这个目标。 这就得出了门控循环单元的最终更新公式:
每当更新门接近1时,模型就倾向只保留旧状态。 此时,来自的信息基本上被忽略, 从而有效地跳过了依赖链条中的时间步t。 相反,当
接近0时, 新的隐状态就会接近候选隐状态。 这些设计可以帮助我们处理循环神经网络中的梯度消失问题, 并更好地捕获时间步距离很长的序列的依赖关系。 例如,如果整个子序列的所有时间步的更新门都接近于1, 则无论序列的长度如何,在序列起始时间步的旧隐状态都将很容易保留并传递到序列结束。
重置门决定了如何将新的输入信息与前面的记忆相结合,更新门定义了前面记忆保存到当前时间步的量。
门控循环神经网络可以更好地捕获时间步距离很长的序列上的依赖关系。
重置门有助于捕获序列中的短期依赖关系。
更新门有助于捕获序列中的长期依赖关系。
重置门打开时,门控循环单元包含基本循环神经网络;更新门打开时,门控循环单元可以跳过子序列。
LSTM与GRU二者结构十分相似,不同在于:
新的记忆都是根据之前状态及输入进行计算,但是GRU中有一个重置门控制之前状态的进入量,而在LSTM里没有类似门(其实输入门也有这个意思);
产生新的状态方式不同,LSTM有两个不同的门,分别是遗忘门(forget gate)和输入门(input gate),而GRU只有一种更新门(update gate);
LSTM对新产生的状态可以通过输出门(output gate)进行调节,而GRU对输出无任何调节。
GRU的优点是这是个更加简单的模型,所以更容易创建一个更大的网络,而且它只有两个门,在计算性能上也运行得更快,然后它可以扩大模型的规模。
LSTM更加强大和灵活,因为它有三个门而不是两个。