一、本文参考
根据重要性排名
【Learning Notes】CTC 原理及实现_MoussaTintin的博客-CSDN博客_ctc实现
白话CTC(connectionist temporal classification)算法讲解_罗罗可爱多的博客-CSDN博客_ctc 算法
二、CTC的作用概述
-------------------------------------------------------新版解读方式----------------------------------------------------
特征x经过DNN之后,再经过softmax层,得到后验概率y矩阵,维度为m*T(m为车牌总字符数,T为车牌长度)。
假设知道每一时刻的车牌标签,即训练样本x和z’
如果z=[nihao],则z’=[nnniiihhhaaaooo]
于是目标函数为:
上式对求导,发现当
时有值,其他均为0。所以在每一时刻t,目标只与
是相关的。
如果训练数据每个t都标记过则训练过程简单很多,但实际上每个t标记过的数据非常稀少。CTC可以做到不用逐个t标记来为数据做训练。
L表示所有车牌字符集合
Π=(π1, π2, … , πn)表示一条由L中元素组成的长度为T的路径
B表示简单的压缩(连续相同的字符归一)
如果一条路径π有B(π)=(n, I, h, a, o),则认为是正确的车牌。
每一条路径π的概率:
在车牌没有对齐的情况下,目标函数为多条π(B(π)=z)的路径概率之和,即:
CTC的训练过程是通过调整w使得值最大。
因为:
所以只要得到即可反向传播得到
对于两条路径q和r,在每一个点上路径只能向右或向下移动。假设有两条路径均经过这点,则在目标函数的连加项中,可以剔除掉与
无关的项。
设q和r为与相关的两条路径,用A1与B1分别表示q在
之前和之后的部分,用A2与B2分别表示r在
之前和之后的部分。可以发现A1
B2和A2
B1也是可得到的两条路径。
这四条路径的概率:
A1OB1+A1OB2+A2OB1+A2OB2
=A1O(B1+B2)+A2O(B1+B2)
=(A1+A2)O(B1+B2)
所以可以发现,该值为(前置项) (后置项),则:
定义α14(h)=(前置项)yh14,可以发现α14(h)可由α13(h)或α13(i)递推得到。
α14(h)=(α13(h) +α13(i)) yh14.
即每个值都可由上一时刻的一个或两个值得到。
同理,β14(h)=(β15(h) +β15(a)) yh14.
所以,
所以,
得到此值后,即可根据反向传播进行训练。
-------------------------------------------------------旧版解读方式----------------------------------------------------
CTC(connectionist Temporal Classification)连接时序分类。
以语音识别为例,以一段”你好”的语音为例,经过MFCC特征提取后产生30帧,每帧含有12个特征,即。经过DNN后得到后验概率
,矩阵里面每一列之和为1(softmax之和为1)。
我们希望在最后的softmax矩阵中使得生成”nihao”的所有路径的概率最大。
因此在音素没有对齐的情况下,目标函数应该为中所有元素的概率之和。即:
其中z为目标音素的扩展版字符集。
CTC的训练过程是通过调整w值使得值最大,计算过程如下:
因此,只要得到,即可根据反向传播,得到。
解读如下:
正向:输入的x经过神经网络后得到y,计算p(z|y)的值
反向:p(z|y)对上一层的输出y求导,然后y再对x求导就得到了w的值
三、CTCLoss原理
1、aligh-free变长映射
ocr或者语音序列学习任务一般是多对多的映射关系,语音识别中好几帧对应若干音节或者字符,并且每个输入和输出之间也没有清楚的对应关系。
CTC引入一个特殊blank字符解决多对一映射问题。
扩展原始词表 L 为 L′=L∪{blank}L′=L∪{blank}。对输出字符串,定义操作 B:
1)合并连续的相同符号;
2)去掉 blank 字符
2、定义
(1)表示在第t个时间,类别为k的softmax值。
神经网络层最终输出的为softmax矩阵,也即后验概率矩阵y
(2)表示路径集合,l为路径字符集
(3)和大多数有监督学习一样,CTC使用最大似然标准进行训练
在给定输入情况下,输出路径的概率为:
所有路径,我们的目标是p(l|x)越大越好。
在t点k类别时。
3、前向-后向的缘由
假设有2条路径在t时刻经过k类别,如下所示:
定义F1为从第1时间点到t时间点的路径概率积的值,F1‘为从第1时间点到t-1时间点的路径概率积的值。,类似的B1定义为:
为什么不直接定义F1为从第1点到第t-1点的概率之积?因为此时F1没有固定唯一的终点,从没有固定的起点到没有固定的终点,是不能这么定义的,定义时至少有一个明确的起点或者终点。
此时通过以上2条路径可以衍生出4条路径:
对t时刻k类别的p(l|x)继续计算如下:
用 α 来表示forward的部分, β 表示backward的部分,上式继续计算如下:
最后得到:
反向传播求导如下:
除法的求导公式如下:
于是:
因为中包含
,所以对其求导后再乘以
,就又得到了
。
L中可能包含多个k字符,它们计算的梯度要进行累加
优化似然函数取对数,于是:
4、forward和backward的递推关系
都有对应的初始化值和递推关系如下:
末尾带有blank和不带有blank都是正确的,最后可以得到似然 p(l|x)=αT(|l′|)+αT(|l′|−1)。
四、解码
训练好的模型用新的样本输入来预测对应的输出字符串,这个过程是解码的过程。
按照最大似然准则,最优的解码结果为:
求该解可用贪心搜索算法和束搜索算法。
1、贪心搜索
贪心搜索就是每个时间t中都选择概率最高的那个分类组成最后的路径。
2、束搜索
贪心搜索只能找出局部最优的一条路径,而束搜索是找出局部最优的N条路径,N是束宽(beam size)。
假如取beam size为2,
第1个时间点找到最优的两个是AC
第2个时间点,通过A遍历所有类别,通过C遍历所有类别,在上述2个类别的值中找到最优的两个是AB和CE
第3个时间点,通过AB遍历所有类别,通过CE遍历所有类别,在上述2个类别的值中找到最优的两个是ABD和CED。
计算时间复杂度,假如beam size为k,时间段为T,类别为N,则时间复杂度为:T*N*k