前馈网络,常见于机器学习中,对每个输入样本进行独立处理。如果你向这类网络输入单词“hot”,然后是单词“dog”,网络没有固有的方式来得知“dog”是跟在“hot”后面的。它将它们视为独立的事件。这在处理序列时是一个主要限制,因为序列中顺序和上下文是基础的。句子、股票价格或音符的意义来自于它们相对于其他部分的相对位置。隐藏状态($h_t$)在这里变得重要。它是允许循环神经网络克服前馈网络记忆限制的主要思想。你可以将隐藏状态视为网络的记忆。在每个时间步 $t$,RNN 不仅处理当前输入 $x_t$;它还会纳入来自前一个隐藏状态 $h_{t-1}$ 的信息。回忆隐藏状态的核心计算:$$h_t = f(W_{hh}h_{t-1} + W_{xh}x_t + b_h)$$请注意这个重要项 $W_{hh}h_{t-1}$。它将前一个隐藏状态 $h_{t-1}$ 中总结的信息(通过权重矩阵 $W_{hh}$ 转换后)直接引入当前隐藏状态 $h_t$ 的计算中。因为 $h_{t-1}$ 本身是使用 $h_{t-2}$ 计算的,$h_{t-2}$ 使用 $h_{t-3}$ 计算,依此类推,所以当前隐藏状态 $h_t$ 成为整个先前输入序列($x_0, x_1, ..., x_t$)的函数。本质上,隐藏状态充当了网络在当前时间步之前“看到”的一切的持续概括或压缩表示。它向前传递上下文信息,使得网络在时间 $t$ 的输出 $y_t$ 不仅受到当前输入 $x_t$ 的影响,还受到之前输入的影响。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="helvetica", color="#495057", fillcolor="#e9ecef", style=filled]; edge [fontname="helvetica", color="#495057"]; subgraph cluster_t_minus_1 { label="时间 t-1"; style=dashed; color="#adb5bd"; ht_minus_1 [label="h(t-1)", shape=ellipse, fillcolor="#d0bfff"]; xt_minus_1 [label="x(t-1)"]; yt_minus_1 [label="y(t-1)", shape=ellipse, fillcolor="#96f2d7"]; xt_minus_1 -> ht_minus_1 [label=" Wxh"]; ht_minus_1 -> yt_minus_1 [label=" Why"]; // 前一步的隐藏状态循环占位符 node [shape=point, width=0, height=0, label=""] phantom_prev; phantom_prev -> ht_minus_1 [style=dashed, label=" Whh", constraint=false]; } subgraph cluster_t { label="时间 t"; style=dashed; color="#adb5bd"; ht [label="h(t)", shape=ellipse, fillcolor="#d0bfff"]; xt [label="x(t)"]; yt [label="y(t)", shape=ellipse, fillcolor="#96f2d7"]; xt -> ht [label=" Wxh"]; ht -> yt [label=" Why"]; } subgraph cluster_t_plus_1 { label="时间 t+1"; style=dashed; color="#adb5bd"; ht_plus_1 [label="h(t+1)", shape=ellipse, fillcolor="#d0bfff"]; xt_plus_1 [label="x(t+1)"]; yt_plus_1 [label="y(t+1)", shape=ellipse, fillcolor="#96f2d7"]; xt_plus_1 -> ht_plus_1 [label=" Wxh"]; ht_plus_1 -> yt_plus_1 [label=" Why"]; // 后一步的隐藏状态循环占位符 node [shape=point, width=0, height=0, label=""] phantom_next; ht_plus_1 -> phantom_next [style=dashed, label=" Whh", constraint=false]; } ht_minus_1 -> ht [label=" Whh"]; ht -> ht_plus_1 [label=" Whh"]; }隐藏状态 $h$ 充当时间步之间的连接。来自输入 $x_t$ 和前一个隐藏状态 $h_{t-1}$ 的信息合并以形成当前隐藏状态 $h_t$,后者随后影响输出 $y_t$ 并传递到下一个时间步 $t+1$。权重矩阵($W_{xh}, W_{hh}, W_{hy}$)决定了这些转换。需要了解的是,这种记忆并非完美或无限。隐藏状态通常是一个固定大小的向量。随着网络处理更长的序列,将所有相关的过去信息概括到这个固定大小的表示中变得具有挑战性。来自遥远过去的信息可能会被稀释或被最近的输入覆盖。这个限制是形成 LSTM 和 GRU 等更高级架构的一个重要因素,我们将在稍后介绍它们。然而,对于许多涉及中短期依赖关系的任务,简单 RNN 的隐藏状态机制提供了前馈网络所缺乏的必要记忆。它是允许 RNN 学习在序列数据中随时间展现的模式和关联的核心组成部分。如果没有隐藏状态在步骤之间传播信息,RNN 实际上会退化为一个标准前馈网络,失去对序列建模的能力。