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}

相關文章
相關標籤/搜索