CTC简记(Sequence Modeling With CTC
Sequence Modeling With CTC——Awni Hannun (2017.11)
在语音识别中,我们的数据集是音频文件和其对应的文本,让模型更有效地收敛。不幸的是,由于人的语速的不同,或者字符间距离的不同,音频文件和文本很难再单词的单位上对齐。
传统语音识别模型中,数据的预处理操作需要人工将标签文本与语音进行严格对齐。很费时间,而且预测的结果不是整个序列的输出结果,还需人工操作。CTC(Connectionist Temporal Classification)是一种避开输入与输出的一种方式,是非常适合语音识别或者OCR这种应用的。
给定一个X,CTC能基于所有可能是准确映射的Y给出输出分布。根据这个分布,我们可以推理最可能的输出,或计算分布内各字符的可能性概率。
![](https://img.haomeiwen.com/i13931179/86d6e30fe8797ed4.png)
CTC算法的输入
和输出
的对齐方式有下列属性:
1、输入与输出的对齐方式是单调的,即如果输入前进到下一时间片,输出会保持不变或者也会移动到下一个时间片段 (本质上就指的是“多对一”)
2、输入与输出是多对一的关系
3、输出的长度不能大于输入
CTC损失函数:
对应标签
,其关于输入
的后验概率可以表示为所有映射为
的路径之和,我们的目标就是最大化
关于
的后验概率
。CTC假设每个时间片的输出是相互独立的,则路径的后验概率是每个时间片概率的累积。
用CTC训练的模型通常用RNN来预测每个时间步长概率
,
表示的是RNN里面的时间步的概念。
乘法表示一条路径
的所有字符概率相乘,
加法表示累加多条路径。
(路径:例如
和
对应的都是“
”,这就是输出的其中两条路径,要将所有的路径相加才是输出的条件概率。)
![](https://img.haomeiwen.com/i13931179/4f7952d113be9f05.png)
对于一个时间片长度为
的
分类任务,所有可能的路径数为
,往往会很大,用来计算Loss不现实。在CTC中采用动态规划的思想来快速计算loss,动态规划算法的核心思想是如果两种路径
、
用相同步长映射到同一输出,那它们就能被合并。
![](https://img.haomeiwen.com/i13931179/c34c9cb8d07db558.png)
下图中,横轴的单位是
的时间片,纵轴单位是
插入
后的序列
。例如对单词“ZOO”,现在每个字符之间,还有字符串的首位插入空白占位符
后为:
假定输入有9个时间片,标签内容是“ZOO”。根据CTC的对齐方式的三个特征,
的所有可能的合法路径如下图
![](https://img.haomeiwen.com/i13931179/a522ca7d66206b5b.png)
上图分成两种情况,设
为相同对齐路径合并后的CTC得分(概率) ,更准确的说,
是输入时间步
后子序列
的得分(概率)。可以发现,如果要获得
,我们可以从
最后那个时间步长开始计算。只要能算出最后时间步长时
的值,我们就能得到
。
Case1:
1)
=
,则
只能由前一个空格
或者上一个时间步的其本身
得到,
2)
不等于
,但是
为连续字符的第二个,即
,(比如“ZOO”中的第二个O),则
只能由前一个空格
,或其本身
得到,而不能由前一个字符得到,因为这样做会将连续的两个字符合并成一个(例如连续字符
中间不用
隔开的话,
就会合并成
)
表示在时刻t输出字符
的概率,
表示上图中坐标为(s,t)节点的概率。
即
=(第t-1个输入时间步后对齐路径的CTC得分和)
(第t个输入时字符
的概率)
Case2:
如果
为Case1中的情况,则
可以由
,
以及
得来,可以表示为:
从上图可以发现,合法路径有两个起始点,两个终止点。合法路径的总概率
是两个最终节点(final nodes)的概率
之和。
现在,我们已经可以高效的计算损失函数,下一步是工作便是计算梯度用于训练模型。由于
的计算只涉及加法和乘法,因此CTC损失函数对于每个时间步长输出概率是可微的,进而我们可以使用梯度下降优化模型。
对于训练数据集
,模型参数先要调整以使负对数似然值最小化,而不是直接使似然值最大化。
预测:
训练好模型后,我们就需要根据给定输入
计算可能的输出,也就是计算
求解大概率输出有两种方案,一种是贪心搜索(Greedy Search),一种是集束搜索(beam search)
关于两种搜索可参照:seq2seq 模型(机器翻译模型、集束搜索、贪心搜索)简记,其中贪婪搜索没有考虑到一个输出可能对应多个路径。我们使用集束搜索的一种变形来解决这个问题。
对于贪婪搜索没有考虑单个输出可能有多个对齐,可以举个例子。假设输出[a, a, ϵ]和[a, a, a]的概率比[b,b,b]低,但它们的概率之和高于后者。在这种情况下,启发式方法会给出Y=[b]这样的错误结论,因为它忽视了[a, a, ϵ]和[a, a, a]可以折叠为一个输出,而真正的答案应该是Y=[a]。
![](https://img.haomeiwen.com/i13931179/dca3d881c84cd36c.png)
变形集束搜索:(去重,去
,多对一映射,一对多扩展)
如果要处理多个对齐映射到同一输出这种情况,我们可以修改原始集束搜索,即不保留束中的对齐列表,而是存储折叠重复字符并移除ϵ后的输出前缀。在搜索的每一步,我们都会基于映射到给定前缀的所有对齐为该前缀累计分数(概率)。
T=3,出现[b,a,a]映射[b,a]的去重操作;T=2,出现[a,
]映射[a]的去
操作;T=2,时有多个对齐映射同一输出的操作,[a]、[a,
]同时映射[a]
![](https://img.haomeiwen.com/i13931179/0d151c4f7883a17e.png)
当出现重复字符时,提议扩展可以映射到两个输出,如下图T=3, 其中红'a'是前缀蓝[a]的提议扩展,对该扩展而言,[a]和[a, a]都是有效输出。
因为连续字母中间必须有若干
,否则会被合并,所以当我们将[a]扩展为[a, a]时,我们只需统计之前以空白标记
结尾的所有路径的概率(位于连续字符中间的
也要统计)。同样的,如果是扩展到[a],那我们计算的就是不以
结尾的所有路径概率。
鉴于此,我们需要跟踪当前输出在搜索树中前两处输出。无论是以
结尾还是不以
结尾,如果我们在剪枝时为每一种假设做好得分排序,我们就能在计算中使用组合分数。
![](https://img.haomeiwen.com/i13931179/8fd42ae621e2cd4e.png)
CTC的不足之处:
1、条件独立:模型假设对给定输入而言,每个输出与其他输出条件独立,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。
2、单调对齐:CTC的另外一个约束是输入
与输出
之间的单调对齐,在OCR和语音识别中,这种约束是成立的。但是在一些场景中例如机器翻译,这个约束便无效了。
3、多对一映射:CTC的又一个约束是输入序列
的长度大于标签数据
的长度,但是对于 的长度大于
的长度的场景,CTC便失效了。