循环神经网络(RNN)的前向传播过程
字数 1917 2025-10-26 22:25:39

循环神经网络(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\) 逐步计算隐藏状态和输出。以下是详细步骤:

  1. 初始化隐藏状态
    在第一个时间步开始前,隐藏状态初始化为零向量:

\[ \mathbf{h}^{(0)} = \mathbf{0} \quad (\text{维度 } d_h \times 1) \]

此步骤为网络提供初始记忆(无先验信息时设为0)。

  1. 时间步 \(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)} $ 既作为当前时间步的输出传递至下一层,也作为记忆传递至下一时间步。
  1. 时间步 \(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层。

  1. 序列遍历完成
    重复步骤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\),则具体计算可代入矩阵乘法验证维度匹配。
循环神经网络(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 \),则具体计算可代入矩阵乘法验证维度匹配。