文章目录
RNN概述
循环神经网络(RNN)是用于处理序列数据的神经网络,该序列在时刻 t(从1 到 τ)包含向量 x ( t ) x^{(t) } x(t)。典型的网络结构如下图所示:
RNN每个时间步都需要将 x 值的输入序列映射到输出值 o 的对应序列。其中 o 是未归一化的对数概率,并且在损失函数 L 内部计算 y ^ = s o f t m a x ( x ) \hat y = softmax(x) y^=softmax(x)。损失函数 L 用于衡量每个 o 与相应的训练目标 y 的距离。
RNN输入到隐含单元的连接由权重矩阵 U 参数化,隐含单元与隐含单元连接由权重矩阵 W 参数化,隐含单元到输出节点的连接由权重矩阵 V 参数化。从上面的图中也可以看出,与CNN类似,在RNN中同样有参数共享的思想(共享了参数 W , U , V W,U,V W,U,V等)。这使得模型的泛化能力更强,因为模型不会依赖于特定位置上的输入 x x x。例如考虑这两句话:“I went to Nepal in 2009’’ 和 “In 2009, I went to Nepal.” ,他们表达的意思完全相同,但是时间2009出现在不同的地方,RNN的参数共享机制可以更有效的提取到这个时间信息。参数共享也允许模型泛化到没有见过的序列长度,并且训练模型所需的训练样本远远少于不带参数共享的模型。
当训练循环网络根据过去的信息去预测未来的信息时,网络通常要使用隐含状态 h (t) 来表示时刻 t 之前的序列信息:
h ( t ) = g ( t ) ( x ( t ) , x ( t − 1 ) , x ( t − 2 ) , … , x ( 2 ) , x ( 1 ) ) = f ( h ( t − 1 ) , x ( t ) ; θ ) . \begin{aligned} h^{(t)} &=g^{(t)}(x^{(t)},x^{(t-1)},x^{(t-2)},\dots,x^{(2)}, x^{(1)}) \\ & = f(h^{(t-1)}, x^{(t)} ; \theta) . \end{aligned} h(t)=g(t)(x(t),x(t−1),x(t−2),…,x(2),x(1))=f(h(t−1),x(t);θ).
函数 g ( t ) g^{(t)} g(t)将过去的序列 ( x ( t ) , x ( t − 1 ) , x ( t − 2 ) , … , x ( 2 ) , x ( 1 ) ) (x^{(t)},x^{(t-1)}, x^{(t-2)},\dots,x^{(2)}, x^{(1)}) (x(t),x(t−1),x(t−2),…,x(2),x(1))作为输入来生成当前的隐含状态 h ( t ) h(t) h(t)。实际上,我们可以递归调用函数 f f f来完成隐含状态的计算。这么做主要有两个优点:
- 无论序列的长度如何,模型始终具有相同的输入数据。因为它只关注给定输 x ( t ) x^{(t)} x(t)后,从一种状态 h ( t − 1 ) h(t-1) h(t−1)到另一种状态 h ( t ) h(t) h(t)的转移, 而不是在可变长度的历史输入数据 x ( t − 1 ) , x ( t − 2 ) , … , x ( 2 ) , x ( 1 ) x^{(t-1)},x^{(t-2)},\dots,x^{(2)}, x^{(1)} x(t−1),x(t−2),…,x(2),x(1)上的操作。
- 我们可以在每个时间步( t t t时刻)使用相同参数的状态转移函数 f f f。
在不同的NLP场景中,h(t) 需要保存的信息也不同。例如在词性标注任务中,h(t) 更多的是要保存前一个单词的信息;而在机器翻译任务中,则需要保存输入序列的所有信息。
前向传播公式
上面的图中没有指明激活函数,假设使用 t a n h tanh tanh作为激活函数,并且假设输出值是离散的,例如用于预测类别。一种表示离散变量的方式是:把输出 o 作为离散变量每种可能值的非标准化对数概率。然后,我们可以应用 softmax 函数获得标准化后概率的输出向量 y ^ \hat y y^。
RNN从特定的初始状态 h (0) 开始前向传播。从 t = 1 到 t = τ 的每个时间步,我们应用以下更新方程:
a ( t ) = b + W h ( t − 1 ) + U x ( t ) h ( t ) = tanh ( a ( t ) ) o ( t ) = c + V h ( t ) \begin{aligned} &\mathbf a^{(t)} = \mathbf b + \mathbf W \mathbf h^{(t-1)} + \mathbf U \mathbf x^{(t)} \\ &\mathbf h^{(t)} = \tanh(\mathbf a^{(t)}) \\ &\mathbf o^{(t)} = \mathbf c + \mathbf V \mathbf h^{(t)} \\ \end{aligned} a(t)=b+Wh(t−1)+Ux(t)h(t)=tanh(a(t))o(t)=c+Vh(t)
y ^ ( t ) = s o f t m a x ( o ( t ) ) = e o ( t ) ∑ t = 1 τ e o ( t ) \hat {\mathbf y} ^{(t)} = softmax(\mathbf o^{(t)}) = \frac{e^{o^{(t)}}}{\sum_{t=1}^\tau e^{o^{(t)}}} \\ y^(t)=softmax(o(t))=∑t=1τeo(t)eo(t)
其中的参数的偏置向量 b 和 c 连同权重矩阵 U、V 和 W,分别对应于输入到隐藏单元、
隐藏单元到输出和隐藏单元到隐藏单元的连接。这个循环网络将一个输入序列映射到相同长度的输出序列。与 x 序列配对的 y 的总损失就是所有时间步的损失之和,例如定义损失L为所有时间步的负对数似然函数:
L ( { x ( 1 ) , … , x ( τ ) } , { y ( 1 ) , … , y ( τ ) } ) = ∑ t L ( t ) = − ∑ t log P m o d e l ( y