循环模型(如RNN、LSTM和GRU)逐步处理序列。这种按序处理的特性,尽管对时间序列或语言建模来说很直观,但却对计算并行化带来了基本限制,尤其是在训练阶段。序列依赖性瓶颈任何RNN中的主要操作是计算时间步 $t$ 的隐藏状态 $h_t$,其依据是该时间步的输入 $x_t$ 和前一个时间步的隐藏状态 $h_{t-1}$。这种关系通常表示为:$$ h_t = f(h_{t-1}, x_t) $$其中 $f$ 代表RNN单元执行的变换(可以是简单的RNN更新、LSTM单元或GRU单元)。这个公式清楚地显示了固有的序列依赖性:计算 $h_t$ 需要 $h_{t-1}$ 的结果,而 $h_{t-1}$ 又需要 $h_{t-2}$,依此类推,直到最初的状态 $h_0$。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Arial"]; edge [fontname="Arial"]; splines=line; "x_1" [label="x₁", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; "h_0" [label="h₀", style=filled, fillcolor="#ced4da"]; "f_1" [label="f", shape=circle, width=0.3, height=0.3, fixedsize=true, style=filled, fillcolor="#dee2e6"]; "h_1" [label="h₁", style=filled, fillcolor="#ffec99"]; "x_2" [label="x_2", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; "f_2" [label="f", shape=circle, width=0.3, height=0.3, fixedsize=true, style=filled, fillcolor="#dee2e6"]; "h_2" [label="h_2", style=filled, fillcolor="#ffec99"]; "x_t" [label="x_t", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; "f_t" [label="f", shape=circle, width=0.3, height=0.3, fixedsize=true, style=filled, fillcolor="#dee2e6"]; "h_t" [label="h_t", style=filled, fillcolor="#ffec99"]; "..." [shape=plaintext]; {rank=same; "x_1"; "h_0"} {rank=same; "f_1"} {rank=same; "h_1"; "x_2"} {rank=same; "f_2"} {rank=same; "h_2"; "..."} {rank=same; "x_t"} {rank=same; "f_t"} {rank=same; "h_t"} "x_1" -> "f_1"; "h_0" -> "f_1"; "f_1" -> "h_1"; "x_2" -> "f_2"; "h_1" -> "f_2" [label="依赖关系", fontsize=9, fontcolor="#495057"]; "f_2" -> "h_2"; "h_2" -> "..."[arrowhead=none]; "..." -> "x_t"; "x_t" -> "f_t"; "..." -> "f_t" [label="h_{t-1}", style=dashed, fontsize=9, fontcolor="#495057"]; "f_t" -> "h_t"; }隐藏状态 $h_t$ 的计算按序依赖于前一个状态 $h_{t-1}$。这种依赖关系阻止了在单个序列中跨时间步的并行计算。这种时间上的依赖性造成了瓶颈。现代硬件加速器,例如GPU和TPU,擅长并行执行大规模矩阵运算。然而,在RNN处理的单个序列中,时间步 $t$ 的计算必须等到时间步 $t-1$ 的计算完成后才能开始。单个时间步内部的操作(例如LSTM门内的矩阵乘法)可以并行化,但跨时间步的计算仍然是按序进行的。对训练效率的影响这种限制明显制约了训练期间可获得的加速效果。尽管可以在小批量数据(数据并行)中对不同序列进行RNN训练的并行化,但每个单独序列的处理仍受其长度限制,这是因为前向传播是按序进行的。此外,网络中的反向传播(称为时间反向传播,BPTT)也受到同样的按序处理限制。为了计算损失函数对时间步 $t$ 所用参数的梯度,BPTT需要逐步地将梯度反向传播通过序列。时间步 $t$ 的梯度计算依赖于时间步 $t+1$ 的梯度计算。这反映了前向传播的依赖关系,阻止了梯度计算在时间上的并行化。实际结果是,在非常长的序列上训练RNN变得计算成本高且缓慢。增加序列长度会导致该序列的计算时间大致呈线性增长,并且无法充分发挥并行硬件的性能意味着GPU在部分计算过程中可能未被充分利用。这种限制是促使Transformer等架构出现的原因之一,其目的是捕获序列依赖性而不依赖于按序的循环,从而在训练期间实现更大的并行化。