针对有序数据,如文本、语音等,使用循环神经网络进行分析相关问题思想是,网络中不同时间的输入之间会存在顺序关系,每个输入和它之前或者之后的输入存在关联,希望通过循环神经网络在时序上找到样本之间的序列相关性。
最常见、最基本的循环神经网络有RNN、LSTM(长短期记忆)和GRU等。其中GRU可看做LSTM的简化版本,在pytorch中提供了这三种循环神经网络结构,可直接调用其函数类。下面将分别介绍这三种常用循环网络的结构和特点。
1.RNN
RNN循环神经网络用torch.nn.RNN()来构建。针对t时刻的隐状态h(t),可以由以下公式来计算:
h(t)=σ(W(ih)x(t)+b(ih)+W(hh)h(t-1)+b(hh)) 【里面的括号为右下角小标】
其中,h(t)是t时刻的隐藏状态;x(t)是t时刻的输入;h(t-1)是t-1时刻的隐藏状态;W(ih)是输入到隐藏层的权重;b(ih)是输入到隐藏层的偏执。b(hh)是隐藏层到隐藏层的偏执;σ表示激活函数,在pytorch中可以使用Tanh或者ReLU激活函数。
虽然在对序列数据进行建模时,RNN对信息有一定的记忆能力,但是单纯的RNN会随着递归次数的增加,出现权重指数级爆炸或消失的问题,从而难以捕捉长时间的关联,并且导致RNN训练时收敛困难,而LSTM网络则通过引入们的机制,使网络具有更强的记忆能力,弥补了RNN网络的一些缺点。
2.LSTM
LSTM(Long Short_Term Memory)网络又叫做长短期记忆网络,是一种特殊的RNN,主要用于解决长序列训练过程中梯度丢失和梯度爆炸问题,相比普通的RNN网络,LSTM能够在更长的序列中获得更好的分析效果。
在LSTM网络中,每个LSTM单元针对输入进行下面函数的计算:
i(t)=σ(W(ii)x(t)+b(ii)+W(hi)h(t-1)+b(hi))
f(t)=σ(W(if)x(t)+b(if)+W(hf)h(t-1)+b(hf))
g(t)=tanh(W(ig)x(t)+b(ig)+W(hg)h(t-1)+b(hg))
o(t)=σ(W(io)x(t)+b(io)+W(ho)h(t-1)+b(ho))
c(t)=f(t)*c(t-1)+i(t)*g(t)
h(t)=o(t)*tanh(c(t))
其中,h(t)是t时刻的隐藏状态(hidden state);c(t)是t时刻的元组状态(cell state);x(t)是t时刻的输入;h(t-1)是t-1时刻的隐藏状态,初始时刻的隐藏状态为0;i(t),f(t),g(t),o(t)分别是输入们、遗忘门、选择门和输出门;σ表示sigmoid激活函数。在每个单元的传递过程中,通常c(t)是上一个状态传过来的c(t-1)加上一些数值,其改变的速度较慢,而h(t)的取值范围这较大,不同的节点往往会有很大的区别。
LSTM在信息处理方面主要分为三个阶段:
(1)以往阶段。这个阶段主要是对上一个节点传进来的输入进行选择性忘记,会“忘记不重要的,记住重要的”。即通过f(t)的值来控制上一状态c(t-1)中哪些需要记住,哪些需要忘记。
(2)选择记忆阶段。这个阶段将输入X(t)有选择地进行“记忆”。哪些重要则着重记录,哪些不重要则少记录。当前单元的输入内容是计算得到的i(t),可以通过g(t)对其进行有选择地输出。
(3)输出阶段。这个阶段将决定哪些会被当成当前状态的输出。主要通过o(t)进行控制,并且要对c(t)使用tanh激活函数进行缩放。
LSTM网络输出y(t)通常可以通过h(t)变化得到。
3.GRU
虽然LSTM通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息,而不像普通的RNN那样只能够有一种记忆叠加,这对很多需要“长期记忆任务”来说效果显著,但是也因多哥们控状态的引入,导致需要训练更多的参数,使得训练难度大大增加。针对这种情况,循环门控单元(Gate Recurrent Unit,GRU)网络被提出,GRU通过将遗忘门和输入们组合在一起,从而减少了门的数量,并且做了一些其他的改变,在保证记忆能力的同时,提升了网络的训练效率。
在该网络中,每个GRU单元针对输入进行下面函数的计算:
r(t)=σ(W(ir)x(t)+b(ir)+W(hr)h(t-1)+b(hr))
z(t)=σ(W(iz)x(t)+b(iz)+W(hz)h(t-1)+b(hz))
n(t)=tanh(W(in)x(t)+b(in)+r(t)*(W(hn)h(t-1)+b(hn)))
h(t)=(1-z(t)*n(t)+z(t)*h(t-1))
其中,h(t)是t时刻的隐藏状态(hidden state);x(t)是t时刻的输入;h(t-1)是t-1时刻的隐藏状态,初试时刻的隐藏状态为0;r(t),z(t),n(t)分别是重置门、更新门和计算候选隐藏层;σ表示sigmoid激活函数。在每个单元的传递过程中,r(t)用来控制需要保留之前的记忆。如果r(t)为0,这n(t)=tanh(W(in)x(t)+b(in)只包含当前输入状态的信息,而z(t)则控制前一时刻的隐藏层忘记的信息量。
循环神经网络根据循环单元的输入和输出数量之间的对应关系,可以将其分为多种应用方式【一对一,多对一,一对多,多对多】。其中,一对多的网络可用于图像描述,即根据输入的一张图像,自动使用文字描述图像的内容;多对一的网络结构可用于文字分类,根据一段描述文字,自动对文本内容归类;多对多的网络结构可用于语言翻译,即针对输入的一种语言,自动翻译为另一种语言。