算法概述
连接时序分类(Connectionist Temporal Classification, CTC)是一种用于训练深度神经网络的算法,特别适用于输入与输出序列长度不一致且对齐关系未知的场景,如语音识别和手写识别。CTC通过引入空白标记(ϵ)处理对齐问题,允许模型在不需要精确对齐的情况下学习序列映射关系。
核心原理
对齐机制
CTC通过以下方式处理序列对齐:
- 允许输出包含空白标记(ϵ),该标记在最终输出中被移除
- 有效对齐必须满足单调性和多对一映射特性
- 重复字符间必须插入ϵ以区分连续相同字符(如"hello"与"helo")
损失函数计算
CTC损失函数通过对所有有效对齐路径的概率求和实现: $$p(Y|X) = \sum_{A \in \mathcal{A}{X,Y}} \prod{t=1}^T p_t(a_t|X)$$ 其中动态规划算法将计算复杂度从指数级降低到线性级,通过前向算法计算α值(合并对齐路径得分)。
推理过程
使用改进的束搜索(Beam Search)进行推理:
- 维护两个概率值:以ϵ结尾和不以ϵ结尾的路径概率
- 结合语言模型分数提高准确率
- 支持通过调整束大小平衡计算效率与准确性
技术特性
条件独立性
CTC假设输出字符在给定输入条件下相互独立,这一简化虽然可能影响语言建模能力,但使得:
- 模型更易适应新领域(只需更换语言模型)
- 保持计算效率
- 可与外部语言模型结合提升性能
对齐属性
- 只允许单调对齐(输入顺序与输出顺序一致)
- 多对一映射(多个输入对应一个输出)
- 输出长度不能超过输入长度(考虑重复字符约束)
实现考量
数值稳定性
- 建议在对数空间使用log-sum-exp技巧计算损失函数
- 避免直接计算可能导致数值下溢的概率乘积
实践工具
- 可使用某机构开源的warp-ctc库(C++/CUDA实现)
- 某机构TensorFlow提供CPU版CTC损失和束搜索函数
- 某机构cuDNN v7+提供GPU加速实现
与相关算法对比
与HMM关系
CTC可视为特殊形式的隐马尔可夫模型:
- 使用均匀状态转移概率
- 采用判别式训练直接建模P(Y|X)
- 状态图根据输出序列动态生成
与编码器-解码器模型
- 编码器可使用双向RNN或卷积网络
- 解码器为简单线性变换加softmax层
- 相比注意力模型缺少输出依赖建模能力
应用场景
主要应用于:
- 语音识别(声学模型训练)
- 手写识别(笔迹或图像输入)
- 视频动作识别
- 关键词检测
参考文献
算法由Graves等人在2006年首次提出,后续在大型词汇语音识别、在线手写识别等领域取得突破性成果。最新扩展包括序列传感器(放弃条件独立性假设)和Gram-CTC(n-gram输出建模)等改进版本。
本文基于Distill 2017年出版物《Sequence Modeling with CTC》进行技术解析,保留核心算法细节并去除商业标识。