摘抄整理自:循环神经网络(RNN, Recurrent Neural Networks)介绍
循环神经网络资料2
循环神经网络(RNNs) 也是深度学习中不可或缺的一部分,由于最近有关于这方面的学习需求,于是在这里先整理了一些RNNs的入门资料
RNNs的特点:相比于普通的神经网络,RNNs可以用来处理那些输入之间前后相关联的问题,即处理序列数据。例如,要预测句子的下一个单词是什么,一般需要用到前面的单词,因为一个句子中前后单词并不是独立的。
RNNs之所以称为循环神经网路,即一个序列当前的输出与前面的输出也有关。具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出
图示
上图将循环神经网络展开成一个全神经网络,例如对一个包含5个单词的语句,那么展开的网络便是一个五层的神经网络,每一层代表一个单词。
其中X为输入,o为输出,中间s为隐藏层的输出,可以看到除了普通神经网络x-s-o的信息流外,还有隐藏层节点之间的信息流,即隐藏层内的节点可以自连也可以互连
对于该网络的计算过程如下:
- xt表示第t,t=1,2,3…t,t=1,2,3…步(step)的输入。比如,x1为第二个词的one-hot向量(根据上图,x0为第一个词);
PS:使用计算机对自然语言进行处理,便需要将自然语言处理成为机器能够识别的符号,加上在机器学习过程中,需要将其进行数值化。而词是自然语言理解与处理的基础,因此需要对词进行数值化,词向量(Word Representation,Word embeding)[1]便是一种可行又有效的方法。何为词向量,即使用一个指定长度的实数向量v来表示一个词。有一种种最简单的表示方法,就是使用One-hot vector表示单词,即根据单词的数量|V|生成一个|V| * 1的向量,当某一位为一的时候其他位都为零,然后这个向量就代表一个单词。缺点也很明显:
- 由于向量长度是根据单词个数来的,如果有新词出现,这个向量还得增加,麻烦!(Impossible to keep up to date);
- 主观性太强(subjective)
- 这么多单词,还得人工打labor并且adapt,想想就恐
- 最不能忍受的一点便是很难计算单词之间的相似性。
现在有一种更加有效的词向量模式,该模式是通过神经网或者深度学习对词进行训练,输出一个指定维度的向量,该向量便是输入词的表达。如word2vec。
总结:
- 将词转换为词向量形式作为计算机能够处理的单位输入(比如one-hot,但是由于维度灾难等各种劣势,现在一般用神经网络训练出的词向量作为输入,例如word2vec)
- 根据下面公式计算当前一步的状态St , U是输入层的权重参数,W是上一个隐藏层给出的信息
St为隐藏层的第t步的状态,它是网络的记忆单元。 根据当前输入层的输出与上一步隐藏层的状态进行计算,这里的f一般都是非线性激活函数,如ReLu tanh - ot为当前一步的输出
- 注意:在传统神经网络中,每一个网络层的参数是不共享的。而在RNNs中,每输入一步,每一层各自都共享参数U,V,W
- 上图中每一步都会有输出,但是每一步都要有输出并不是必须的,RNNs的关键之处在于隐藏层,隐藏层能够捕捉序列的信息。
Rnn的作用:
在NLP中很常见,如词向量表达、语句合法性检查、词性标注,在RNNs中目前使用最广泛最成功的模型便是LSTMs(Long Short-Term Memory,长短时记忆模型)模型,该模型通常比vanilla RNNs能够更好地对长短时依赖进行表达,该模型相对于一般的RNNs,只是在隐藏层做了手脚
如何训练RNNs
对于RNN是的训练和对传统的ANN训练一样。同样使用BP误差反向传播算法,不过有一点区别。如果将RNNs进行网络展开,那么参数W,U,V是共享的,而传统神经网络却不是的。并且在使用梯度下降算法中,每一步的输出不仅依赖当前步的网络,并且还以来前面若干步网络的状态。比如,在t=4时,我们还需要向后传递三步,已经后面的三步都需要加上各种的梯度。该学习算法称为Backpropagation Through Time (BPTT)。需要意识到的是,在vanilla RNNs训练中,BPTT无法解决长时依赖问题(即当前的输出与前面很长的一段序列有关,一般超过十步就无能为力了),因为BPTT会带来所谓的梯度消失或梯度爆炸问题(the vanishing/exploding gradient problem)。当然,有很多方法去解决这个问题,如LSTMs便是专门应对这种问题的。