一句话定义:CTC(Connectionist Temporal Classification,连接时序分类)损失是一种专门为“输入和输出长度不一致、又没有逐帧对齐标注”的序列任务设计的损失函数,最典型的应用是语音识别。
假设你有一段 3 秒的“你好世界”录音,模型每 10 毫秒输出一帧,大约 300 帧;可你手里只有整句文字“你好世界”,不知道“你”对应哪几帧。CTC 的做法是:让模型在每一帧从“你、好、世、界、空(blank)”里选一个,得到一个长度 300 的路径;再定一条压缩规则——先把连续重复的标签合并成一个,然后删掉所有空白符。比如路径“你 你 空 好 好 空 世 界 界 空”,压缩后就是“你好世界”。训练时,CTC 把所有能压缩成“你好世界”的路径的概率加起来,最大化这个总概率。路径太多不能穷举,所以用动态规划(前向-后向算法)来算。这就像老师只要求你最终说出正确的句子,不管你中间怎么停顿、怎么重复,只要按规则压缩后对就行。
那张 blank(空白符)表是 CTC 的代价,也是它的关键。blank 不只是占位,它有两个作用:一是表示“这一帧没有输出”;二是隔开相邻的相同标签——想输出“你你”,必须写成“你 空 你”,否则连续两个“你”会被合并成一个。代价也来自这里:blank 和真实标签会竞争,训练初期模型容易“摆烂”一直输出 blank,需要学习率预热、课程学习等技巧来稳住。
和相邻方案的区别可以看这张表:
| 方案 | 需要逐帧对齐 | 是否需 blank | 输出独立性 | 典型场景 |
|---|---|---|---|---|
| 逐帧交叉熵 | 是 | 否 | 假设各帧独立 | 帧级标注任务 |
| CTC | 否,只需整句标签 | 是 | 假设各帧独立 | 语音识别、手写识别 |
| 注意力 seq2seq | 否 | 否 | 可建模标签依赖 | 机器翻译、语音识别 |
CTC 假设每个时间步输出条件独立,所以它不会自动学到“你好”后面接“世界”这种标签间的依赖,通常要外挂语言模型或 beam search 来补救。另外,它要求输出长度不能超过输入长度(考虑重复和 blank 后的扩展),太短的音频配太长的文本就无能为力。
对从业者,CTC 最大的好处是标注便宜:只要整句转写,不用时间戳,数据门槛低,语音识别、OCR(Optical Character Recognition,光学字符识别)都能用。对普通人,这意味着语音转文字、会议纪要等功能可以用更少的人工标注训出来。具体框架的实现细节和默认参数,以官方页面为准。
