CTC(连接时序分类)
要解决的问题:对齐
序列识别(语音、手写、文本行 OCR)里,输入是长度 T 的帧序列(如 CNN 输出的 T 个特征列),输出是长度 U 的标签序列(如 U 个字符),且 T≫U、二者无逐帧对齐标注——我们只知道「这张图是 cat」,不知道哪几帧对应 c、哪几帧对应 a。传统方法需要帧级对齐标注,代价极高。CTC(Graves 2006)让模型无需对齐即可端到端训练。
核心机制
- 引入 blank 符号 ∅:扩充字符表,∅ 表示「此帧不输出字符/字符间隔」。
- 逐帧输出分布:网络(如 crnn 的 BiLSTM)对每帧输出一个在「字符∪∅」上的概率分布,得到 T×(C+1) 的概率矩阵。
- 多对一映射 B:一条长度 T 的帧级路径先合并连续重复字符、再删除所有 ∅,得到最终标签。例如 c,c,∅,a,a,t → cat;c,∅,a,t 也 → cat。因此一个目标标签对应指数级多条路径。用 ∅ 隔开是为了能输出「重复字符」(如 “hello” 的两个 l,需 l,∅,l)。
- 对所有对齐路径求和:目标标签 y 的概率 = 所有映射到 y 的路径概率之和 P(y|x)=Σ_{π∈B⁻¹(y)} P(π|x)。训练最小化 −log P(y|x)。
前向-后向算法
直接枚举路径是指数级的。CTC 用类似 HMM 的**动态规划(前向-后向算法)**在多项式时间内高效计算这个求和及其梯度,是它可训练的关键。
解码
- 贪心(best path):每帧取最大概率字符,再过 B 映射。快但非最优。
- beam search(可选配语言模型):更准,考虑多条路径的概率和。
假设与局限
- 条件独立假设:CTC 假定各帧输出相互独立(给定输入),不建模输出 token 间的依赖,故常配外部语言模型。这也是后来 attention/AR 解码(trocr、seq2seq)想改进之处。
- 要求输出长度 ≤ 输入帧数(T≥U)。
- 单调对齐,适合语音/文本行这类顺序不倒置的任务,不适合乱序或重排输出。
地位
Graves 2006 提出,是语音识别与 OCR 文本行识别(crnn CRNN=CNN+BiLSTM+CTC)的经典解码/损失方案。在 OCR-2.0 的生成式/AR 解码(got-ocr2、trocr)兴起前长期是行识别主力,至今仍因简单高效被广泛使用。