看了这篇Sequence Modeling with CTC搞懂了CTC,简单的记录一下。
CTC(Connectionist Temporal Classification)是常用于语音识别、手写识别等识别模型的输出结果对齐。
首先,X代表输入序列,a代表X中每个x经过模型得到的输出,Y代表label字符集。
CTC可以简单地理解为:对于给定的X,为任意的一个y分配概率,即P(Y|X),计算这种概率的关键是“CTC如何理解输入X与输出Y的对齐”
为了得到给定输入X时输出y的概率,CTC把二者之间所有可能的对齐方式的概率加起来。
这种对齐方式的缺点:
(1)对于语音识别中类似静音这种情况,无输出,却强制只能输出lable集Y中的字符
(2)对于“hello”这种重复字符,会折叠成“helo”
因此,CTC引入空标识(blank token)。
CTC的特性:
(a)如果输入X前进到下一位,则相应的输出a必须相同或前进到Y中的下一位
(b)X到Y一定是多对一的关系
(c)Y的长度不能大于X的长度
那么,对于一对儿(X,Y)来说,CTC的目标为:
其中,集合AX,Y为所有正确的对齐方式的集合,如下图等:
at表示时间步t上,Xt对应的输出at。
However,这种计算方式较慢,因为需要遍历所有情况并相加。
可以采用动态规划的方式加快计算,这里的动态规划根据性质“在某timestep上若at与at-1的输出相同,可以合并”进行计算。
(下面这段英文说的就很明白,翻译成中文就显得很多余,直接粘过来了)
只要我们知道上一个timestep上的a,就可以计算当前的as,t
两种情况:
Case1、不能跳过Zs-1
“不能跳过”有两种前提,任一满足即可:
a、上一个token是来源于Y,即Zs-1 from Y
b、若上一个token是空格,且在重复字符之间,也不能跳过,即Zs=Zs-2&&Zs-1=blank
Case2、允许跳过Z中Zt的Z中Zt的上一个token Zt-1
该情况的前提:
空格符在不同的字符之间
因此,我们到达Zt有三种方式,如下图
总的来说,以上两种case到达涵盖了有效对齐的所有情况
CTC的反向传播:把直接最大化概率的方式转化为最小化对数:
前向
在训练完模型之后,需要对于给定输入X找到可能性最大的输出,即: