CTC算法讲解

CTC是什么,有什么用?

CTC(Connectionist Temporal Classification),用来解决输入序列和输出序列难以一一对应的问题。

在语音识别中,我们希望音频中的音素和翻译后的字符可以一一对应。但是对齐是一个很困难的事,有人说话快,有人说话慢,每个人说话快慢不同,手动对齐太耗时。
在OCR中,使用RNN时,RNN的每一个输出要对应字符图像中的每一个位置,要手工做这样的标记工作量太大,而且图像中的字符数量不同,字体样式不容,大小不同,导致输出不一定能和每一个字符一一对应。

CTC基本原理

假设一个RNN,用r表示RNN的参数,则RNN可以表示为一个函数: y = N w ( x ) y = N_w(x)
定义输入x的时间步长为T,每个时间步长的特征维度记作m,表示m维特征。
x = ( x 1 , x 2 , . . . , x T ) x = (x^1 , x^2, ... , x^T) x t = ( x 1 t , x 2 t , . . . , x m t ) x^t = (x^t_1 , x^t_2, ... , x^t_m)
输出时间步也为T,和输入可以一一对应,每个时间步的输出维度作为n,表示n维的输出,实际上是n个概率。
y = ( y 1 , y 2 , . . . , y T ) y = (y^1 , y^2, ... , y^T) y t = ( y 1 t , y 2 t , . . . , y m t ) y^t = (y^t_1 , y^t_2, ... , y^t_m)
假设要对26个英文字符进行识别,考虑到有些位置没有字符,定义一个 blank(用 - 代替) 作为空白符加入到字符集合中, L = { a , b , c , . . . , z } { } = L { } L'= \{a, b, c, ... , z\} \cup \{-\} = L \cup \{-\} ,那么对于RNN而言每个
时间步长的输出维度n就是27,表示27个字符在时间步长上输出的概率。
如果根据这些概率进行选取,每个时间步选取一个元素,就可以得到输出序列,其输出空间可以记作 L T L'^T
定义一个转换函数B,对RNN的输出序列进行变换,变换成真实的输出,把连续的相同字符删减为1个并删去空白符。如下:
B ( π 1 ) = B ( s t t a t e ) = s t a t e B(\pi^1)=B(--stta-t---e)=state B ( π 2 ) = B ( s s t a a a t e e ) = s t a t e B(\pi^2)=B(sst-aaa-tee-)=state B ( π 3 ) = B ( s t t a a t e e ) = s t a t e B(\pi^3)=B(--sttaa-tee-)=state B ( π 4 ) = B ( s s t a a t e ) = s t a t e B(\pi^4)=B(sst-aa-t---e)=state
其中 π \pi 表示RNN的一种输出序列。当我们在优化RNN时,需要最大化以下概率,即给定输入x的情况下,输出为l的概率,l表示真实的输出,对下式取负号,就可以使用梯度下降求最小。
p ( l x ) = B ( π ) = l p ( π x ) p(l|x)=\sum^{}_{B(\pi)=l }{p(\pi|x)} 假设时间步之间输出独立,那么对任意一个输出序列 π \pi 的概率计算如下: p ( π x ) = t = 1 T y π t t p(\pi|x)=\prod_{t=1}^T{y^t_{\pi_t}} 其中下标 π t \pi_t 表示的是,输出序列在t时间步选取元素对应的索引,比如该序列在第一时间步选取的元素是a,那么的到值就是1,。选取的是z,那么得到的值就是26,。选取的是空白符,那么得到的值就是27。
对于某一个真实的输出,如state,是有过个RNN输出序列通过B转换得到,这些序列都是我们想要的结果,我们要给定x,这些输出序列的概率加起来最大。如果逐条遍历,时间复杂度使指数级,因为有T个位置,每个位置有n种选择(字符集合的大小),那么就有 n T n^T 种可能,因此CTC使用HMM中的前向-后向算法来计算。

CTC中的前向后向算法

由于真实输出 l l 是一个序列,序列可以通过一个路径图中的一条路径来表示,我们也称输出序列 l l 为路径 l l 。定义路径 l l' 为:在路径 l l 每两个元素之间以及头尾插入空白符。如下: l = s t a t e l=state l = s t a t e l'=-s-t-a-t-e- 对某个时间步长的某个字符求导(这里用k表示字符集合中的某个字符或者字符索引)恰好是与概率 y k t y^t_k 相关的路径。 p ( l x ) y k t = B ( π ) = l , π t = k p ( π x ) y k t \frac{\partial p(l | x)}{\partial y_{k}^{t}}=\frac{\partial \sum_{B(\pi)=l, \pi_{t}=k} p(\pi | x)}{\partial y_{k}^{t}} 以前面的 π 1 , π 2 , π 3 , π 4 \pi^{1}, \pi^{2}, \pi^{3}, \pi^{4} 为例子,简单绘制如下示意图:
在这里插入图片描述
4条路径都在t=6时经过了字符a,观察4条路径,可以得到如下式子。
π 1 = b = b 1 : 5 + a 6 + b 7 : 12 π 2 = r = r 1 : 5 + a 6 + r 7 : 12 π 3 = b 1 : 5 + a 6 + r 7 : 12 π 4 = r 1 : 5 + a 6 + b 7 : 12 \begin{aligned} &\pi^{1}=b=b_{1: 5}+a_{6}+b_{7: 12}\\ &\pi^{2}=r=r_{1: 5}+a_{6}+r_{7: 12}\\ &\pi^{3}=b_{1: 5}+a_{6}+r_{7: 12}\\ &\pi^{4}=r_{1: 5}+a_{6}+b_{7: 12} \end{aligned} p ( π 1 , π 2 , π 3 , π 4 x ) = y 1 y 2 y 3 y 4 + y 5 t y 6 y 7 y 8 + y 9 y 10 y 11 y 12 e + y 1 s y 2 s y 3 t y 4 y 5 y 6 y 7 a y 8 y 9 t y 10 y 11 e y 12 + y 1 y 2 y 3 y 4 + y 5 t 5 y 6 y 7 y 8 y 9 t 9 y 10 y 11 e y 12 + y 1 s y 2 x 3 s 3 y 4 + y 5 t 5 + y 6 a 7 y 7 y 8 y 9 t 9 y 10 y 11 e y 12 + y 1 s y 2 s y 3 t y 4 y a 5 y 6 y 7 y 8 9 y 10 y 11 y 12 e \begin{aligned} p\left(\pi^{1}, \pi^{2}, \pi^{3}, \pi^{4} | x\right) &=y^{1}-\cdot y^{2}-\cdot y^{3} \cdot y^{4}+y^{5} t \cdot y^{6} \cdot y^{7}-\cdot y^{8}+y^{9}-y^{10}-y^{11}-y^{12} e \\ &+y^{1} s \cdot y^{2} s \cdot y^{3} t \cdot y^{4}-y^{5} \cdot y^{6} \cdot y^{7} a \cdot y^{8}-y^{9} t \cdot y^{10} \cdot y^{11} e \cdot y^{12} \\ &+y^{1}-\cdot y^{2}-\cdot y^{3} \cdot y^{4}+y^{5} t^{5} \cdot y^{6} \cdot y^{7} \cdot y^{8}-y^{9} t^{9} \cdot y^{10} \cdot y^{11} e^{-y^{12}}-\\ &+y^{1} s \cdot y^{2}-x^{3} s^{3} \cdot y^{4}+y^{5} t^{5}+y^{6} a^{7} \cdot y^{7} \cdot y^{8}-y^{9} t^{9} \cdot y^{10} \cdot y^{11} e \cdot y^{12}-\\ &+y^{1} s \cdot y^{2} s \cdot y^{3} t \cdot y^{4}-y^{5}_{a} \cdot y^{6} \cdot y^{7}-y^{8} \cdot^{9}-y^{10}-y^{11}-y^{12} e \end{aligned}

相关文章
相关标签/搜索