1 算法背景

1.1 序列标注问题与对齐困境

序列标注是机器学习中一类重要的任务,其目标是为每个输入时间步预测一个标签,或从输入序列中提取一个较短的输出标签序列。在语音识别手写识别等实际场景中,输入序列(如音频帧、笔迹点)的长度通常远大于输出标签序列(如音素、字符)的长度,且两者之间不存在显式的、逐帧对应的对齐关系。传统方法需要人工设计对齐规则或使用隐马尔可夫模型等工具进行强制对齐,这不仅增加系统复杂度,也限制了模型的泛化能力

1.2 CTC的提出动机

为了解决上述对齐困境,Alex Graves等于2006年提出了连接主义时间分类(Connectionist Temporal Classification,CTC)。CTC的核心思想是在输出层引入一个特殊的“空白”标签(blank),允许模型在每个时间步输出空白或有效标签,从而通过所有可能的对齐路径来间接表示输出序列。利用动态规划算法,CTC能够高效地计算所有路径的总概率,并直接在序列级别上优化模型参数,无需预先知道输入与输出的对齐方式。这一机制使得循环神经网络可以以端到端的方式进行训练,极大地简化了传统的混合系统流水线。

2 数学原理

2.1 输入输出定义

设输入序列为 \( \mathbf{x} = (x_1, x_2, \dots, x_T) \),长度为 \( T \)。输出标签序列为 \( \mathbf{l} = (l_1, l_2, \dots, l_U) \),长度 \( U \leq T \),其中每个标签来自一个有限字母表 \( L \)。CTC引入一个额外的空白标签 \( \text{blank} \)(记为 \( \epsilon \)),因此扩展后的标签集为 \( L' = L \cup \{\epsilon\} \)。对于每个时间步 \( t \),网络输出一个概率向量 \( y_t \in \mathbb{R}^{L'} \),其中 \( y_t(k) \) 表示在时刻 \( t \) 输出标签 \( k \) 的概率,且 \( \sum_{k \in L'} y_t(k) = 1 \)。

2.2 路径与路径概率

2.2.1 对齐路径

一个对齐路径(path)是一个长度为 \( T \) 的序列 \( \pi = (\pi_1, \pi_2, \dots, \pi_T) \),其中每个 \( \pi_t \in L' \)。给定输入 \( \mathbf{x} \),路径 \( \pi \) 的概率定义为各时间步输出概率的乘积:

\[ P(\pi \mid \mathbf{x}) = \prod_{t=1}^{T} y_t(\pi_t). \]

2.2.2 合并操作与标签序列映射

为了将路径映射为最终标签序列,CTC定义了一个合并操作 \( \mathcal{B} \)。该操作首先移除路径中连续重复的标签(保留一个),然后删除所有空白标签。例如,路径“a a b ϵ b”经过合并后得到序列“a b b”。对于给定的标签序列 \( \mathbf{l} \),所有能通过 \( \mathcal{B} \) 映射为 \( \mathbf{l} \) 的路径构成集合 \( \mathcal{B}^{-1}(\mathbf{l}) \)。因此,给定输入 \( \mathbf{x} \) 输出 \( \mathbf{l} \) 的条件概率为:

\[ P(\mathbf{l} \mid \mathbf{x}) = \sum_{\pi \in \mathcal{B}^{-1}(\mathbf{l})} P(\pi \mid \mathbf{x}). \]

2.3 前向-后向算法

直接枚举所有路径是计算上不可行的,因为路径数量随 \( T \) 指数增长。CTC利用动态规划中的前向-后向算法高效计算 \( P(\mathbf{l} \mid \mathbf{x}) \)。

2.3.1 前向变量与递推

定义前向变量 \( \alpha_t(s) \) 为在时刻 \( t \) 到达标签序列 \( \mathbf{l} \) 的第 \( s \) 个位置(考虑空白插入后的扩展序列)的所有路径的概率之和。扩展序列是在原始标签之间和首尾插入空白得到的,长度为 \( 2U + 1 \)。递推公式如下:

  • 初始化:\( \alpha_1(1) = y_1(\epsilon) \),\( \alpha_1(2) = y_1(l_1) \),其余为0。
  • 递推:对于 \( t > 1 \) 和 \( s \) 从1到 \( 2U+1 \):

\[ \alpha_t(s) = y_t(\text{label}(s)) \cdot \begin{cases} \alpha_{t-1}(s) + \alpha_{t-1}(s-1), & \text{若 label}(s) = \epsilon \text{ 或 label}(s) = \text{label}(s-2) \\ \alpha_{t-1}(s) + \alpha_{t-1}(s-1) + \alpha_{t-1}(s-2), & \text{其他情况} \end{cases} \] 其中 \(\text{label}(s)\) 表示扩展序列中位置 \( s \) 对应的标签(空白或有效标签)。

2.3.2 后向变量与递推

类似地,后向变量 \( \beta_t(s) \) 表示从时刻 \( t \) 到结束,从扩展序列的第 \( s \) 个位置出发的所有路径概率之和。递推公式从前向后对称构造。

2.3.3 总概率计算

给定前向和后向变量,总概率可表示为: \[ P(\mathbf{l} \mid \mathbf{x}) = \sum_{s=1}^{2U+1} \alpha_t(s) \beta_t(s) / y_t(\text{label}(s)). \] 实际中常取 \( t = T \) 或利用前向变量的最终值计算:\( P(\mathbf{l} \mid \mathbf{x}) = \alpha_T(2U+1) + \alpha_T(2U) \)。

2.4 损失函数梯度计算

CTC的损失函数定义为负对数似然: \[ \mathcal{L}_{\text{CTC}} = - \ln P(\mathbf{l} \mid \mathbf{x}). \] 为了优化网络参数,需要计算损失对网络输出 \( y_t(k) \) 的梯度。利用前向-后向变量,梯度可解析表达为: \[ \frac{\partial \mathcal{L}_{\text{CTC}}}{\partial y_t(k)} = - \frac{1}{P(\mathbf{l} \mid \mathbf{x})} \sum_{s: \text{label}(s)=k} \alpha_t(s) \beta_t(s) / y_t(k), \] 该梯度通过反向传播算法传递到网络各层。

3 训练与推断

3.1 训练流程

3.1.1 网络结构选择(RNN/LSTM/GRU

CTC通常与循环神经网络(RNN)结合使用,特别是长短期记忆网络(LSTM)或门控循环单元(GRU),以更好地捕获序列中的长程依赖。网络的输入是原始序列特征(如声学特征、图像特征),输出是每个时间步的标签概率分布(包括空白标签)。

3.1.2 损失函数最小化

在训练过程中,使用随机梯度下降或其变体(如Adam)最小化CTC损失。每个训练样本包含输入序列和对应的标签序列(无对齐信息),损失函数自动利用前向-后向算法计算所有对齐路径的总概率,并更新网络参数。训练完成后,网络学习到如何通过插入空白和重复标签来隐式地对齐输入与输出。

3.2 推断方法

推断阶段,给定输入序列,需要找到最可能的标签序列 \( \mathbf{l}^* = \arg\max_{\mathbf{l}} P(\mathbf{l} \mid \mathbf{x}) \)。精确计算最优序列是NP-hard的,因此常用近似方法。

3.2.1 贪心搜索

在每个时间步选择概率最大的标签(包括空白),然后通过合并操作得到最终序列。即 \( \pi_t^* = \arg\max_k y_t(k) \),然后 \( \mathbf{l}^* = \mathcal{B}(\pi^*) \)。该方法计算简单,但可能因忽略路径间的竞争而次优。

3.2.2 束搜索

束搜索维护一个大小为 \( B \) 的候选序列集合(称为束)。在每个时间步,对当前束中的每个序列扩展所有可能的下一标签(包括空白),计算新序列的累积概率,然后保留概率最高的 \( B \) 个序列。搜索结束时,从束中选择概率最高的标签序列(经过合并操作)。束搜索能显著提高质量,但计算量随束宽线性增长。

3.2.3 前缀束搜索

前缀束搜索是对标准束搜索的改进,它直接解码输出标签序列(而非路径),避免路径中空白和重复的冗余。具体地,它维护两个概率:以当前前缀结尾的路径概率,以及以空白结尾的路径概率。通过动态更新这两个概率,可以在束搜索中更准确地评估不同前缀的似然。

4 应用场景

4.1 语音识别

CTC在语音识别中应用最广泛。输入为声学特征(如梅尔频率倒谱系数滤波器组特征)的时间序列,输出为音素或字符序列。模型无需对齐,直接学习从音频到文本的映射。典型系统如Deep Speech系列均采用CTC损失。

4.2 手写识别

在线手写识别中,输入是笔迹坐标点的时间序列,输出是字符序列。CTC能够处理书写速度变化和连笔造成的对齐不确定性问题。离线手写识别也可将图像转化为序列特征(如垂直切片)后应用CTC。

4.3 视频动作识别

在视频动作识别中,输入为视频帧序列,输出为动作类别的时间顺序。CTC用于从连续帧中分割并识别动作,尤其适用于非固定长度的动作片段和背景帧(对应空白标签)。

4.4 OCR(光学字符识别)

对于文字行图像,可将其分割为固定宽度的图像块序列作为输入,CTC用于预测字符序列。与经典基于分割的OCR相比,CTC避免了字符切分这一难题。

5 优缺点分析

5.1 优势

5.1.1 无需预对齐

CTC的最大优势是自动学习输入与输出之间的对齐,无需人工标注对齐位置或使用外部对齐工具。这大大降低了数据标注成本,并简化了系统构建。

5.1.2 端到端训练

CTC将特征提取、序列建模和对齐学习统一在一个网络框架中,通过单个损失函数优化,避免了传统流水线中多个模块的误差累积。

5.2 局限性

5.2.1 条件独立性假设

CTC假设给定网络输出时,各时间步的标签是条件独立的。这意味着它不能直接建模输出标签之间的长程依赖关系(如语法约束)。实际应用常通过外部语言模型来弥补。

5.2.2 标签间无显式依赖建模

CTC的合并操作只处理空白和连续重复,不显式建模标签间的转移概率。对于某些任务,输出序列中标签的局部结构(如音节的组成)可能被忽略,导致次优性能。

6 改进与变种

6.1 RNN-Transducer

RNN-Transducer(RNN-T)在CTC基础上引入一个额外的预测网络来建模输出标签之间的依赖。它由编码器、预测网络和联合网络组成,编码器处理输入序列,预测网络根据历史输出生成隐状态,联合网络融合两者以输出标签概率。RNN-T克服了CTC的条件独立性假设,在语音识别中达到更优效果。

6.2 基于注意力机制的替代方案

注意力机制(如Listen, Attend and Spell, LAS)通过编码器-解码器框架,利用注意力权重动态对齐输入和输出,天然避免了CTC的对齐限制。注意力模型能更好地捕获长程依赖,但训练时通常需要更复杂的正则化策略。CTC则以其计算高效和收敛稳定仍被广泛使用。

6.3 CTC与语言模型结合

CTC可以在解码阶段引入外部语言模型(如n-gram、神经网络语言模型),通过加权将语言模型得分与CTC得分结合,以弥补条件独立性假设的不足。常用的方法有浅融合(shallow fusion)和深度融合(deep fusion)等,显著提升识别准确率。