循环神经网络概览
Last updated
Was this helpful?
Last updated
Was this helpful?
动态系统的经典形式:
$s$ 代表了某一个时序下的状态变量, $\theta$ 代表函数的参数。
这一个函数表达的系统的状态变更不受外部输入影响。在这个基础上添加外部输入$x^{(t)}$,使每一次的状态变更受外部变量的影响:
将其展开成计算图的形式后可以得到如下的表达(式中 $x^{(t)}$ 换做 $h^{(t)}$ 表示以代表隐藏层):
每一个循环都是根据上一个状态 $h^{(t)}$ 、输入 $x^{(t)}$ ,经过函数 $f$ 及其内部的参数 $\theta$ ,最终生成下一个状态 $h^{(t+1)}$ 。这个展开还没有包括输出,通常RNN还需要根据状态 $h^{(t)}$ 来生成一系列的输出。 这样展开之后,同时还有利于反向传播算法的应用,称为通过时间反向传播(back-propagation through time, BPTT)。
通常来说这一个过程一定是有损的,因为我们将一个任意长度的序列 $(x^{(t)},x^{(t-1)}, x^{(t-2)},\dots,x^{(2)}, x^{(1)})$ 映射到了一个固定长度对的向量 $h^{(t)}$ 。 所以,我们希望状态中只记录下有利于我们最终产生输出的信息,而忽略掉一些没必要的部分。
展开上面的一个循环迭代的过程的意义在于: 1. 这样一个模型中,整一个输入序列的长度是可变的,而每一个时序的输入还是定长的,实现了对于不定长输入的处理。 2. 每一个时间步都使用相同的状态转移函数 $f$ ,即我们可以应用单一的深度学习模型去解决这个问题。
在上面的铺垫之后,基于上面重要的参数共享思想,就更容易理解循环神经网络。参数共享和图展开使得模型能处理不定长输入,同时减少了参数量,训练难度更低。 一个典型的循环神经网络的结构如下:
$o^{(t)}$ 为模型产生的输出值, $L^{(t)}$ 代表了损失,根据输出结果和标签 $y^{(t)}$ 产生。 $U$ , $W$ , $V$ 均为转化计算时采用的权重参数。
对于这样子的一个循环神经网络,一个可供参考的参数更新公式如下:
时序模型还有其他的一些结构,一般有下列几种:
每一步都有输出,连接建立在隐藏单元之间。(即上面图中的模型)
每一步都有输出,连接建立在上一步的结果和当前的隐藏单元之间,
只有在模型的最后有一个输出,连接建立在隐藏单元之间(也只能这样,因为中间没输出了)。
所有模型的结构如下:
模型1
模型2
模型3
上面给出的模型。
和之前的连接建立在上一次的输出值上,显然能够保留的信息会更少,没有上一个模型强大,但是训练更容易。
只在结束时产生一个输出。
对于模型2,我们可以应用一种名为导师驱动过程的训练方式:由于理想的输出结果 $y^{(t)}$ 是已知的,所以在时刻 $t+1$ 就可以接受 $y^{(t)}$ 作为输入。 这样的做法可以使得时间步之间解耦,BPTT由于每一步不再依赖于上一步的输出,所以被打断了。由于不再有前后计算的依赖,所以这样的训练可以并行。
导师驱动过程的示意图。它是一种训练技术,应用在输出和下一步的隐藏状态存在连接的RNN模型。