逐步理解RNN

逐步理解RNN循环神经网络:

先了解一下最基本的单层网络,它的结构如图:

逐步理解RNN_第1张图片

输入是x,经过变换Wx+b和激活函数f得到输出y。

前面状态输出会影响后面状态输出的情况有下面几种:

  • 自然语言处理问题。x1可以看做是第一个单词,x2可以看做是第二个单词,依次类推。
  • 语音处理。此时,x1、x2、x3……是每帧的声音信号。
  • 时间序列问题。例如每天的股票价格等等

为了建模序列问题,RNN引入了隐状态h(hidden state)的概念,h可以对序列形的数据提取特征,接着再转换为输出。先从h1的计算开始看:

逐步理解RNN_第2张图片

  • 圆圈或方块表示的是向量。
  • 一个箭头就表示对该向量做一次变换。如上图中h0和x1分别有一个箭头连接,就表示对h0和x1各做了一次变换。

每一步使用的参数U、W、b都是一样的,也就是说每个步骤的参数都是共享的,这点非常重要。

逐步理解RNN_第3张图片

逐步理解RNN_第4张图片

依次计算(使用相同的参数U、W、b)

逐步理解RNN_第5张图片

对h1进行一次变换,得到输出y1

逐步理解RNN_第6张图片

同样使用相同的V和c得到y2、y3、y4

模型构造完成,输入x1,…,xn,输出y1,…,yn,输入和输出序列等长。

时间步time_steps问题的理解:

执行一次call方法,就进行一步转化,从h0->h1:

cell = tf.nn.rnn_cell.BasicRNNCell(num_units=128) 调用一次call方法

使用tf.nn.dynamic_rnn一次执行多步(参数中用到时间步time_steps):

输入数据的格式为(batch_size, time_steps, input_size) time_steps为时间步,表示序列本身的长度,长度为10的句子对应的time_steps就等于10,这样就可以直接输入x1,...,x10,得到h1,...,h10

outputs, state = tf.nn.dynamic_rnn(cell, inputs, initial_state=initial_state)

得到的outputs就是time_steps步里所有的输出。它的形状为(batch_size, time_steps, cell.output_size)。state是最后一步的隐状态,它的形状为(batch_size, cell.state_size)。

堆叠RNNCell

单层RNN的能力有限,我们需要多层的RNN。将x输入第一层RNN的后得到隐层状态h,这个隐层状态就相当于第二层RNN的输入,第二层RNN的隐层状态又相当于第三层RNN的输入,以此类推。在TensorFlow中,可以使用tf.nn.rnn_cell.MultiRNNCell函数对RNNCell进行堆叠

def get_a_cell():

    return tf.nn.rnn_cell.BasicRNNCell(num_units=128)  #每层128个状态

# 用tf.nn.rnn_cell MultiRNNCell创建3层RNN

cell = tf.nn.rnn_cell.MultiRNNCell([get_a_cell() for _ in range(3)]) # 3层RNN

 

你可能感兴趣的:(深度学习算法的学习)