CTC是什麼,有什麼用?
CTC(Connectionist Temporal Classification),用來解決輸入序列和輸出序列難以一一對應的問題。
在語音識別中,我們希望音頻中的音素和翻譯後的字符可以一一對應。但是對齊是一個很困難的事,有人說話快,有人說話慢,每個人說話快慢不同,手動對齊太耗時。
在OCR中,使用RNN時,RNN的每一個輸出要對應字符圖像中的每一個位置,要手工做這樣的標記工作量太大,而且圖像中的字符數量不同,字體樣式不容,大小不同,導致輸出不一定能和每一個字符一一對應。
CTC基本原理
假設一個RNN,用r表示RNN的參數,則RNN可以表示爲一個函數:
y=Nw(x)。
定義輸入x的時間步長爲T,每個時間步長的特徵維度記作m,表示m維特徵。
x=(x1,x2,...,xT)
xt=(x1t,x2t,...,xmt)
輸出時間步也爲T,和輸入可以一一對應,每個時間步的輸出維度作爲n,表示n維的輸出,實際上是n個概率。
y=(y1,y2,...,yT)
yt=(y1t,y2t,...,ymt)
假設要對26個英文字符進行識別,考慮到有些位置沒有字符,定義一個 blank(用 - 代替) 作爲空白符加入到字符集合中,
L′={a,b,c,...,z}∪{−}=L∪{−},那麼對於RNN而言每個
時間步長的輸出維度n就是27,表示27個字符在時間步長上輸出的概率。
如果根據這些概率進行選取,每個時間步選取一個元素,就可以得到輸出序列,其輸出空間可以記作
L′T。
定義一個轉換函數B,對RNN的輸出序列進行變換,變換成真實的輸出,把連續的相同字符刪減爲1個並刪去空白符。如下:
B(π1)=B(−−stta−t−−−e)=state
B(π2)=B(sst−aaa−tee−)=state
B(π3)=B(−−sttaa−tee−)=state
B(π4)=B(sst−aa−t−−−e)=state
其中
π表示RNN的一種輸出序列。當我們在優化RNN時,需要最大化以下概率,即給定輸入x的情況下,輸出爲l的概率,l表示真實的輸出,對下式取負號,就可以使用梯度下降求最小。
p(l∣x)=B(π)=l∑p(π∣x)假設時間步之間輸出獨立,那麼對任意一個輸出序列
π的概率計算如下:
p(π∣x)=t=1∏Tyπtt其中下標
πt表示的是,輸出序列在t時間步選取元素對應的索引,比如該序列在第一時間步選取的元素是a,那麼的到值就是1,。選取的是z,那麼得到的值就是26,。選取的是空白符,那麼得到的值就是27。
對於某一個真實的輸出,如state,是有過個RNN輸出序列通過B轉換得到,這些序列都是我們想要的結果,我們要給定x,這些輸出序列的概率加起來最大。如果逐條遍歷,時間複雜度使指數級,因爲有T個位置,每個位置有n種選擇(字符集合的大小),那麼就有
nT種可能,因此CTC使用HMM中的前向-後向算法來計算。
CTC中的前向後向算法
由於真實輸出
l是一個序列,序列可以通過一個路徑圖中的一條路徑來表示,我們也稱輸出序列
l爲路徑
l。定義路徑
l′爲:在路徑
l每兩個元素之間以及頭尾插入空白符。如下:
l=state
l′=−s−t−a−t−e−對某個時間步長的某個字符求導(這裏用k表示字符集合中的某個字符或者字符索引)恰好是與概率
ykt相關的路徑。
∂ykt∂p(l∣x)=∂ykt∂∑B(π)=l,πt=kp(π∣x)以前面的
π1,π2,π3,π4爲例子,簡單繪製如下示意圖:
4條路徑都在t=6時經過了字符a,觀察4條路徑,可以得到如下式子。
π1=b=b1:5+a6+b7:12π2=r=r1:5+a6+r7:12π3=b1:5+a6+r7:12π4=r1:5+a6+b7:12
p(π1,π2,π3,π4∣x)=y1−⋅y2−⋅y3⋅y4+y5t⋅y6⋅y7−⋅y8+y9−y10−y11−y12e+y1s⋅y2s⋅y3t⋅y4−y5⋅y6⋅y7a⋅y8−y9t⋅y10⋅y11e⋅y12+y1−⋅y2−⋅y3⋅y4+y510⋅y11e⋅y12+y1−⋅y2−⋅y3⋅y4+y5t5⋅y6⋅y7⋅y8−y9t9⋅y10⋅y11e−y12−+y1s⋅y2−x3s3⋅y4+y5t5+y1−⋅y2−⋅y3⋅y4+y5t5⋅y6⋅y7⋅y8−y9t9⋅y10⋅y11e−y12−+y1s⋅y2−x3s3⋅y4+y5t5+y6a7⋅y8−y