一文看懂RNN

222 阅读1分钟

我没看过,平坦山丘,怎么触摸,开花沼泽。

在进入RNN之前,我们默认已经掌握了深度学习基础,word2vec等NLP入门知识。RNN的全称是Recurrent Neural Network,也就是循环神经网络。

在RNN诞生之前,普遍的神经网络都是前馈的,也就是仅沿着一条方向传播:输入经过第一层,得到数据再传给下一层,直到到达最后的输出层。这样的网络结构简单,但存在一个重大缺点,就是无法学习时间序列数据中的时间特征。时间序列数据广义上可以理解为相邻的数据存在一定关系的序列,因此NLP中的句子也被视为时序数据(相邻的单词是有语义相关的)。换言之,传统的前馈型网络只能处理序列中数据彼此不相关的情况,而RNN可以解决这样的问题。

RNN的网络结构

我们在网上常见的RNN结构是这样的:

8ba2d9b3bad740b8943a52f7a94328e

对于初次接触循环神经网络的新手来说,这样的结构并不好理解,我们不妨将该网络展开成常见的前馈型网络:

e1ac35ff0d1a905b539a818f656c64f

上图中,(x1x2...xt)(x_1,x_2,...,x_t)是一组序列数据,我们可以看到,x0x_0首先被输入进RNN层,产生对应的输出h0h_0,同时h0h_0的值被复制,和x1x_1一起进入下一层的RNN并产生h1h_1,依次类推,直至产生全部的输出。我们可以看到,网络中的RNN是有两个输入的:hi1h_{i-1}xix_i(第一个RNN虽然图上只输入了x,但实际上我们可以认为也输入了h,只是值为全0),因此RNN层也就对应有两个对应的参数:WhW_hWxW_x。形式上说,每个h的计算公式如下:

hi=tanh(xiWx+hi1Wh+b)h_i=tanh(x_iW_x+h_{i-1}*W_h+b)

W为对应的参数,b为偏置,tanh为变换函数(双曲正切函数)。

另外需要注意的是,我们上面的图中虽然展开成了多层前馈网络,但实际上是只有一层RNN循环计算的(或者说图中的多个RNN中参数是完全一致的),多层只是为了便于理解。