本文学习循环神经网络(RNN)以及相关的项目,首先会介绍 RNN 经典的结构,以及它的几个变体 。 接着将在 TensorFlow 中使用经典的结构实现一个有趣的项目: CharRNN。 Char RNN 可以对文本的字符级概率进行建模,从而生成各种类型的文本 。
一、RNN 的原理
1、经典 RNN 的结构
RNN 的英文全称是 Recurrent Neural Networks,即循环神经网络, 是一种对序列型数据进行建模的深度模型。在实际应用中有很多序列形的数据,例如:自然语言处理问题、语言处理、时间序列问题。序列形的数据不太好用原始的神经网络处理 。
(1)隐状态h的计算
为了处理建模序列问题 , 引入了隐状态 h ( hidden state )的概念,h 可以对序列形的数据提取特征,接着再转换为输出。
在计算时,每一步使用的参数 U、W、b 都是一样的,即每个步骤的参数都是共享的,这是 RNN 的重要特点。图中的 U、 W是参数矩阵,b是偏置项参数,f是激活函数,在经典的RNN结构中,通常使用 tanh 作为激活函数 。
(2)输出y的计算
目前的 RNN 还没有输出,得到输出值的方法是直接通过 h 进行计算。一个箭头表示对相应的向量做一次类似于f(Wx+b)的变换。
V 和 c 是新的参数,通常处理的是分类问题,因此使用 Softmax 函数将输出转换成各个类别的概率。此处的箭头表示对 hi 进行一次变换,得到输出 Yi。这就是经典的RNN结构,输入和输出序列必须是要等长的。由于输入和输出序列必须是要等长的,经典RNN的适用范围比较小 ,但也有一些问题适合用经典的RNN结构建模,如:计算视频中每一帧的分类标签;输入为字符 ,输出为下一个字符的概率。这是著名的 Char RNN 。
(3)经典RNN数学定义
设输入为 X1,X2,... ,对应的隐状态为 h1,h2,... , 输出为 Y1,Y2 ... ,则经典RNN的运算过程表示为
其中, U,V,W,b,c均为参数,而 f 表示激活函数,一般为 tanh 函数。
2、N VS 1 RNN的结构
若问题的输入是一个序列,输出是一个单独的值而不是序列,此时应该如何建模呢?只在最后一个 h 上进行输出变换就可以了。这种结构通常用来处理序列分类问题 。如输入一段文字判别所属的类别,输入一个句子判断其情感倾向,输入一段视频并判断它的类别等等。
(1)结构
(2)数学定义
设输入为 X1,X2,... ,对应的隐状态为 h1,h2,... ,输出为y,那么运算过程为:,输出时对最后一个隐状态做运算即可:
。
3、1 VS N RNN的结构
输入不是序列而输出为序列的情况怎么处理?
(1)结构
可以只在序列开始进行输入计算。
还有一种结构是把输入信息X作为每个阶段的输入。