CTC 连接主义时序分类

本文主要参考自Hannun等人在distill.pub发表的文章(https://distill.pub/2017/ctc/),感谢Hunnun等人对CTC的梳理。

简介

在语音识别中,我们的数据集是音频文件和其对应的文本,不幸的是,音频文件和文本很难在单词的单位上对齐。除了语言识别,在OCR,机器翻译中,都存在类似的Sequence to Sequence结构,同样也需要在预处理操作时进行对齐,但是这种对齐有时候是非常困难的。如果不使用对齐而直接训练模型时,由于人的语速的不同,或者字符间距离的不同,导致模型很难收敛。

CTC(Connectionist Temporal Classification)是一种避开输入与输出手动对齐的一种方式,是非常适合语音识别或者OCR这种应用的。

图1:CTC用于语音识别

给定输入序列 以及对应的标签数据 ,例如语音识别中的音频文件和文本文件。我们的工作是找到 到 的一个映射,这种对时序数据进行分类的算法叫做Temporal Classification。

对比传统的分类方法,时序分类有如下难点:

  1. 和 的长度都是变化的;
  2. 和 的长度是不相等的;
  3. 对于一个端到端的模型,我们并不希望手动设计 和 的之间的对齐。

CTC提供了解决方案,对于一个给定的输入序列 ,CTC给出所有可能的 的输出分布。根据这个分布,我们可以输出最可能的结果或者给出某个输出的概率。

损失函数:给定输入序列 ,我们希望最大化 的后验概率 , 应该是可导的,这样我们能执行梯度下降算法;

测试:给定一个训练好的模型和输入序列 ,我们希望输出概率最高的 :

当然,在测试时,我们希望 能够尽快的被搜索到。

算法详解

给定输入 X ,CTC输出每个可能输出及其条件概率。问题的关键是CTC的输出概率是如何考虑 X 和 Y 之间的对齐的,这种对齐也是构建损失函数的基础。所以,首先我们分析CTC的对齐方式,然后我们在分析CTC的损失函数的构造。

1.1 对齐

需要注意的是,CTC本身是不需要对齐的,但是我们需要知道 X 的输出路径和最终输出结果的对应关系,因为在CTC中,多个输出路径可能对应一个输出结果,举例来理解。例如在OCR的任务中,输入 X 是含有"CAT"的图片,输出 Y 是文本[C, A, T]。将 X 分割成若干个时间片,每个时间片得到一个输出,一个最简答的解决方案是合并连续重复出现的字母,如图2.图2:CTC的一种原始对齐策略

这个问题有两个缺点:

  1. 几乎不可能将 X 的每个时间片都和输出Y对应上,例如OCR中字符的间隔,语音识别中的停顿;
  2. 不能处理有连续重复字符出现的情况,例如单词"HELLO",按照上面的算法,输出的是"HELO"而非"HELLO"。

为了解决上面的问题,CTC引入了空白字符 ,例如OCR中的字符间距,语音识别中的停顿均表示为 。所以,CTC的对齐涉及去除重复字母和去除 两部分,如图3。

图3:CTC的对齐策略

这种对齐方式有三个特征:

  1. X与 Y 之间的时间片映射是单调的,即如果 X 向前移动一个时间片, Y保持不动或者也向前移动一个时间片;
  2. X与 Y之间的映射是多对一的,即多个输出可能对应一个映射,反之则不成立,所以也有了特征3;
  3. X的长度大于等于 Y 的长度。

1.2 损失函数

这里要明确一点,对于一个标定好的音频片段,训练该片段时,我们希望的输出就是标定的文本,如下图所示,音频说的一个hello,RNN或者其他模型输出的是相同数量的向量,向量里是每个字母的概率。CTC的时间片的输出和输出序列的映射如图4:

图5:CTC的流程

对于一对输入输出( X , Y ) 来说,CTC的目标是将下式概率最大化

解释一下,对于RNN+CTC模型来说,RNN输出的就是概率,t表示的是RNN里面的时间的概念。乘法表示一条路径的所有字符概率相乘,加法表示多条路径。因为上面说过CTC对齐输入输出是多对一的,例如h e ϵ l ϵ l o ϵ 与h e e ϵ l ϵ l o 对应的都是"hello",这就是输出的其中两条路径,要将所有的路径相加才是输出的条件概率

但是对于一个输出,路径会非常的多,这样直接计算概率是不现实的,CTC算法采用动态规划的思想来求解输出的条件概率,如图6所示,该图想说明的是通过动态规划来进行路径的合并(看不懂也没关系,下面有详细的解释)。

图6:CTC的动态规划计算输出路径

假设我们现在有输入音频X XX对应的标定输出Y YY为单词"ZOO",为了方便解释下面动态规划的思想,现在每个字符之间还有字符串的首位插入空白占位符ϵ ,得到下面结果

为了便于说明,先定义好下图的横纵坐标轴的含义,横轴是X XX的时间片单位为t,纵轴为Z ZZ序列单位为s。根据CTC的对齐方式的三个特征,输入有9个时间片,标签内容是"ZOO",P ( Y ∣ X ) 的所有可能的合法路径如下图。

图7:CTC中单词ZOO的所有合法路径

上图分成两种情况。

值得说明的是,我们用 α 来表示给定节点上合并对齐的分数。 更准确地说,

α_{s, t} 是子序列 Z_{1:s} 在 输入语音的,t时间步骤,之后的ctc得分。

正如我们将看到的,我们将根据最后一个时间步的 α ,来计算最终的 CTC 分数 P(Y∣X)【这个也是动态规划的所谓"出口"】。

根据动态规划的思想,只要我们知道前一时间步的 α 的值,我们就可以计算 α_{s, t}

Case 1:

如果 , 则 只能由前一个空格 或者其本身 得到。如果 不等于 ,但是 为连续字符的第二个,即 ,则 只能由前一个空格 或者其本身 得到,而不能由前一个字符得到,因为这样做会将连续两个相同的字符合并成一个。 表示在时刻t输出字符 的概率。

Case 2:

如果 不等于 ,则 可以由 以及 得来,可以表示为:

从图7中我们可以看到,合法路径有两个起始点,合法路径的概率 P ( Y ∣ X ) 是两个final nodes的概率之和。

现在,我们已经可以高效的计算损失函数,下一步的工作便是计算梯度用于训练模型。由于P ( Y ∣ X ) 的计算只涉及加法和乘法,因此其一定是可导函数,进而我们可以使用SGD优化模型。

对于数据集 D ,模型的优化目标是最小化负对数似然

1.3 预测

当我们训练好一个RNN模型时,给定一个输入序列 X ,我们需要找到最可能的输出,也就是求解

求解最可能的输出有两种方案,一种是Greedy Search,第二种是beam search

每个时间片均取该时间片概率最高的节点作为输出:

这个方法最大的缺点是忽略了一个输出可能对应多个对齐方式.

Beam Search是寻找全局最优值和Greedy Search在查找时间和模型精度的一个折中。一个简单的beam search在每个时间片计算所有可能假设的概率,并从中选出最高的几个作为一组。然后再从这组假设的基础上产生概率最高的几个作为一组假设,依次进行,直到达到最后一个时间片,下图是beam search的宽度为3的搜索过程,红线为选中的假设。

图8:Beam Search

CTC的特征

  1. 条件独立:CTC的一个非常不合理的假设是其假设每个时间片都是相互独立的,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。
  2. 单调对齐:CTC的另外一个约束是输入X 与输出Y 之间的单调对齐,在OCR和语音识别中,这种约束是成立的。但是在一些场景中例如机器翻译,这个约束便无效了。
  3. 多对一映射:CTC的又一个约束是输入序列 X 的长度大于标签数据 Y 的长度,但是对于 的Y长度大于X 的长度的场景,CTC便失效了。

参考文献

1\] Connectionist Temporal Classification : Labelling Unsegmented Sequence Data with Recurrent Neural Networks. Graves, A., Fernandez, S., Gomez, F. and Schmidhuber, J., 2006. Proceedings of the 23rd international conference on Machine Learning, pp. 369--376. DOI: 10.1145/1143844.1143891 \[2\] Sequence Modeling with CTC. Hunnun, Awni, Distill, 2017

相关推荐
uncle_ll8 个月前
李宏毅NLP-4-语音识别part3-CTC
人工智能·自然语言处理·nlp·语音识别·ctc
浪游东戴河9 个月前
电脑基础之excel基础操作
excel·表格·对齐·电脑基础
deephub2 年前
使用‘消除’技术绕过LLM的安全机制,不用训练就可以创建自己的nsfw模型
人工智能·深度学习·大语言模型·对齐
叶庭云2 年前
大语言模型的指令调优:综述
人工智能·微调·大语言模型·对齐·指令调优
njnu@liyong2 年前
JVM-JVM中对象的结构
jvm·对象头·对齐·对象结构
小七de尾巴2 年前
C/C++编译器的字节对齐方式
c语言·开发语言·c++·对齐·pragma·pack
小黄人软件2 年前
模型评估:压力测试 模拟对手 对齐 智能对抗 CAPTCHA(全自动区分计算机和人类的公共图灵测试)
人工智能·压力测试·对齐·对抗
sensor_WU2 年前
【Delphi】开发IOS 程序,TLabel 中英文字对齐(水平),一行代码解决显示对齐问题!
ios·对齐·delphi ios 对齐
William.csj2 年前
Visio——对齐方法的规则
visio·对齐