连接时序分类 CTC 是什么?不用对齐也能训练语音识别
连接时序分类(Connectionist Temporal Classification,CTC)是一种训练序列模型的损失函数和建模方法,由 Alex Graves 等人在 2006 年提出。它专门解决一类问题:输入序列和输出序列长度不同,而且不知道两者之间是怎么一一对应的。语音识别就是典型例子:一段 2 秒的语音可能有 200 个音频帧,对应的文字只有“你好”两个字,但我们并不知道哪几帧对应“你”、哪几帧对应“好”。
没有 CTC 时的麻烦
在 CTC 出现之前,训练语音识别模型通常需要“对齐”好的数据:人工或用其他工具事先标出每个字、每个音素对应音频里的哪个时间段,再让模型逐帧学习。这种对齐既费时费力,又容易出错,而且依赖复杂的流水线。
CTC 怎么做
CTC 让模型在每一个输入帧上输出一个概率分布,候选项包括所有可能的字符,外加一个特殊的“空白”符号。然后它规定了一种把逐帧输出“折叠”成最终文字的规则:先合并相邻的重复字符,再删掉所有空白。比如逐帧输出“你你_空白_好好好”,折叠后就是“你好”。空白符号的作用之一,是区分真正的重复字母,比如英文里的“hello”中两个 l。
训练时,CTC 不要求知道哪一种逐帧输出是对的,而是把所有能折叠成正确答案的逐帧路径的概率加起来,作为目标去最大化。因为可能的路径数量非常多,CTC 用动态规划(前向-后向算法)来高效地计算这个总和。这样,只要有“一段音频对应一句文字”这样的配对数据,就能直接训练模型,不需要逐帧对齐。
应用和影响
CTC 让端到端的语音识别成为可能,被广泛用于语音识别、手写文字识别、场景文字识别(比如经典的 CRNN 模型)、手语和动作识别等领域。它的一个假设是各帧的输出相互独立,因此常和语言模型配合使用,或者与基于注意力的方法结合,以弥补这一不足。如今在语音识别中,CTC 仍然常被用作辅助损失,或者用于对齐和生成时间戳。