# 核心结构与工作原理

RNN 的核心思想是在序列数据处理中,将前一时刻的信息传递给下一时刻,从而实现对序列依赖关系的建模。

# 网络结构

RNN 的每个时间步都接收一个输入,并结合上一时间步的隐藏层状态来计算当前时间步的隐藏层状态和输出。

  • 输入层

    • 输入:通常是独热向量(one-hot vector),表示为 x(t)RVx^{(t)} \in \mathbb{R}^V,其中 VV 是词汇表大小。
    • 词嵌入:将独热向量转换为词向量(word embedding),表示为 e(t)=Ex(t)e^{(t)} = E x^{(t)}
  • 隐藏层

    • 隐藏层状态:隐藏层状态 h(t)h^{(t)} 存储了从序列开始到当前时间步的所有历史信息,其计算公式为:

      h(t)=σ(Whh(t1)+Wee(t)+bh)h^{(t)} = \sigma(W_h h^{(t-1)} + W_e e^{(t)} + b_h)

      其中,σ\sigma 是激活函数,常用的有 tanh\tanhh(t1)h^{(t-1)} 是上一时间步的隐藏层状态,WhW_hWeW_e 是权重矩阵,bhb_h 是偏置项。
  • 输出层

    • 输出:输出层通常使用 softmax 函数将隐藏层状态 h(t)h^{(t)} 转换为一个概率分布,用于预测下一个词。

      y^(t)=softmax(Wyh(t)+by)RV\hat y^{(t)} = \text{softmax}(W_y h^{(t)} + b_y) \in \mathbb{R}^V

      其中,WyW_y 是权重矩阵,byb_y 是偏置项。

# 损失函数与训练

# 损失函数

RNN 的损失函数通常使用交叉熵(Cross-Entropy, CE),用于衡量模型预测的概率分布与真实标签之间的差异。

L=CE(y,y^)=i=1Vyilogy^iL = CE(y, \hat y) = -\sum_{i=1}^{V} y_i \log \hat y_i

其中,yy 是真实标签的独热向量,y^\hat y 是模型的预测概率分布。

# 反向传播

RNN 的训练使用**随时间反向传播(Backpropagation Through Time, BPTT)**算法。该算法将 RNN 在时间维度上展开,然后应用标准的反向传播算法来计算梯度。

  • 梯度计算

    • LtL_tWhW_h 的梯度:计算损失函数 LtL_t 关于权重矩阵 WhW_h 的梯度时,需要将所有时间步的梯度进行累加。

      LtWh=i=1tLtWhi\frac{\partial L_t}{\partial W_h} = \sum_{i=1}^{t} \frac{\partial L_t}{\partial W_h} \bigg|_{i}

  • Softmax 与交叉熵的梯度

    • 在输出层,softmax 函数交叉熵损失结合使用时,可以得到一个简洁的梯度计算公式:

      Lz=y^y\frac{\partial L}{\partial z} = \hat y - y

      其中,z=Wyh(t)+byz = W_y h^{(t)} + b_y

# 优缺点

# 优点

  • 理论上可以捕获长距离依赖关系。
  • 能够处理任意长度的序列输入。
  • 模型大小不随输入序列长度的增加而增大。

# 缺点

  • 梯度消失/爆炸问题:由于 BPTT 算法的链式法则,导致梯度在长序列中快速衰减或爆炸,使得模型难以学习到远距离依赖关系,实际能保留的信息跨度非常有限(大约7个时间步)。
  • 计算效率低:由于其固有的序列依赖性,只能进行串行计算,无法并行化。