循环神经网络(RNN)的前向传播过程
题目描述
假设我们有一个简单的循环神经网络(RNN),其隐藏层激活函数为tanh,输出层为线性层。给定输入序列 \(\mathbf{x}^{(1)}, \mathbf{x}^{(2)}, \dots, \mathbf{x}^{(T)}\)(每个时间步的输入向量维度为 \(d_x\)),初始隐藏状态 \(\mathbf{h}^{(0)} = \mathbf{0}\),参数为权重矩阵 \(\mathbf{W}_{hh}\)(隐藏层到隐藏层,维度 \(d_h \times d_h\))、\(\mathbf{W}_{xh}\)(输入到隐藏层,维度 \(d_h \times d_x\))、\(\mathbf{W}_{hy}\)(隐藏层到输出层,维度 \(d_y \times d_h\)),以及偏置向量 \(\mathbf{b}_h\)(维度 \(d_h\))、\(\mathbf{b}_y\)(维度 \(d_y\))。请逐步推导该RNN在时间步 \(t\) 的前向传播计算过程。
解题过程
我们将按时间步顺序,从 \(t=1\) 到 \(t=T\) 逐步计算隐藏状态和输出。以下是详细步骤:
- 初始化隐藏状态
在第一个时间步开始前,隐藏状态初始化为零向量:
\[ \mathbf{h}^{(0)} = \mathbf{0} \quad (\text{维度 } d_h \times 1) \]
此步骤为网络提供初始记忆(无先验信息时设为0)。
- 时间步 \(t\) 的隐藏状态计算
对于每个时间步 \(t\)(从1到T):- 线性变换:将当前输入 \(\mathbf{x}^{(t)}\)(维度 \(d_x \times 1\))和前一隐藏状态 \(\mathbf{h}^{(t-1)}\) 分别与权重矩阵相乘,并加上偏置:
\[ \mathbf{z}^{(t)} = \mathbf{W}_{hh} \mathbf{h}^{(t-1)} + \mathbf{W}_{xh} \mathbf{x}^{(t)} + \mathbf{b}_h \]
这里 $ \mathbf{z}^{(t)} $ 是未激活的隐藏状态(维度 $ d_h \times 1 $),$ \mathbf{W}_{hh} \mathbf{h}^{(t-1)} $ 捕捉历史信息,$ \mathbf{W}_{xh} \mathbf{x}^{(t)} $ 融合当前输入。
- 非线性激活:对 \(\mathbf{z}^{(t)}\) 应用tanh函数,得到当前隐藏状态:
\[ \mathbf{h}^{(t)} = \tanh(\mathbf{z}^{(t)}) \]
tanh将值压缩到(-1,1),确保梯度稳定并引入非线性。此时 $ \mathbf{h}^{(t)} $ 既作为当前时间步的输出传递至下一层,也作为记忆传递至下一时间步。
- 时间步 \(t\) 的输出计算
使用当前隐藏状态 \(\mathbf{h}^{(t)}\) 生成输出(例如用于预测下一个词或序列值):
\[ \mathbf{y}^{(t)} = \mathbf{W}_{hy} \mathbf{h}^{(t)} + \mathbf{b}_y \]
其中 \(\mathbf{y}^{(t)}\) 是输出向量(维度 \(d_y \times 1\))。若需概率输出(如分类),可对 \(\mathbf{y}^{(t)}\) 添加softmax层。
- 序列遍历完成
重复步骤2-3直至处理完所有时间步 \(T\)。最终隐藏状态 \(\mathbf{h}^{(T)}\) 编码了整个输入序列的信息。
关键点说明
- 参数共享:所有时间步共享相同的 \(\mathbf{W}_{hh}, \mathbf{W}_{xh}, \mathbf{W}_{hy}\),使模型能处理任意长度序列。
- 信息流动:\(\mathbf{h}^{(t)}\) 依赖 \(\mathbf{h}^{(t-1)}\) 和 \(\mathbf{x}^{(t)}\),形成序列依赖关系,适合处理时序数据。
- 计算示例:假设 \(d_x=3, d_h=2, d_y=1\),输入 \(\mathbf{x}^{(1)}=[1,0,1]^T\),则具体计算可代入矩阵乘法验证维度匹配。