CTC 的工作原理


CTC 的工作原理

 
 

Fig. 1. How CTC  combine a word (source: https://distill.pub/2017/ctc/)

這篇文章主要解釋CTC 的工作原理。

Motivation

CTC 的全稱是Connectionist Temporal Classification. 這個方法主要是解決神經網絡label 和output 不對齊的問題(Alignment problem). 這種問題經常出現在scene text recognition, speech recognition, handwriting recognition 這樣的應用里。  比如 Fig. 1 中的語音識別, 就會識別出很多個ww, 很多個r,  如果不做處理, 就會變成wworrrlld 我忽略了空白blank).  有一種簡單粗暴的方法就是把重復的都當做一個字母。 但是這樣 就會出現不識別單詞 happy 這樣的單詞。 這個時候, 空白的作用就非常大了, 在這里他把同一個字母隔開,  比如happy, 就會變成和hhh aaaa ppp ppp yyyy --> happy. 

用數學的表達式來說, 這個是一個mapping,  X-> Y 而且是一個 monotonic mapping (單調映射), 同時多個X 會映射到同一個Y.  最后一個特性就比較讓人頭疼, 就是Y 的長度不能 長於X 的長度。 想必用過tensorflow tf.nn.ctc_loss  應該都知道這樣的 error message 把

“No valid path found, Loss: inf ”

出現這個warning/Error message 的原因就是 Y 的長度大於X 的長度, 導致CTC 無法計算。 解決方案就是檢查訓練集 中的label 和 實際內容是否相符。 比如, 對於 scene text recognition, 圖像中是 hello, how are you doing。 而label  是 hello.  這樣的訓練集肯定會出問題的。 

與傳統方法做對比

 
 

Source:  Ref [1]

這個圖解釋了 framewise 的方法和CTC  的方法。 Framewise 的方法需要做每個音素的標記 (independent labelling of each time-step or frame of the input sequence) 而CTC 沒有這個需要。 CTC  只是預測了一系列 峰值 (spikes) 緊接着 一些 可能空白 (blanks)用來區分字母。  但是  Framewise  基於的方法出現了 mis allignling segment boundaries error. 就是說兩個 label 的概率分布圖太近了, 比如 在發音 dh, dh 和ax 有明顯重疊而CTC 的方法卻沒有。

CTC  Loss 的計算

CTC Loss 的計算比較復雜,參考鏈接有比較詳細的推到過程。 所以這邊的解釋主要通過截圖論文 [1] 公式加以解釋。 以下公式和圖片都來自於論文 [1].

CTC 的計算包含一個softmax output layer, 而且也會多一個label (blank).

一個路徑path 的概率計算如下。

 
 
 
 

這里, x 是輸入數據, y 是輸出數據, 都是序列。 L  是 序列標簽的label, L‘ 是序列標簽+blank.  其中公式(2), 解釋了 給定一個輸入, 從時間t=1 到T  每個時間點的概率相乘, 最后就得到了對應的路徑的概率。

接下來就是定義 多對1 映射的概率計算了 (many-to-one mapping ), 論文中的內容截圖如下

 
 

這里邊B 就是映射, 把所有多對一的映射的集合。 這樣就算出來對應一個真正的sequence label (L) 的概率了。 這里是求和。 求和的原因就是 aab 和abb 都是對應成ab,  所以 aab 的概率+abb 的概率  才是生成ab 的概率。 這個只是一個簡單的例子。

接下來就是 生成分類器。 這里主要有兩種 分類方法 (decoding method.)

Best path decoding.  按照正常分類問題, 那就是概率最大的sequence 就是分類器的輸出。 這個就是用每一個 time step的輸出做最后的結果。 但是這樣的方法不能保證一定會找到最大概率的sequence.

prefix search decoding.  這個方法據說給定足夠的計算資源和時間, 能找到最優解。 但是復雜度會指數增長 隨着輸入sequence 長度的變化。  這里推薦用有限長度的prefix search decode 來做。 但是具體考慮多長的sequence 做判斷 還需具體問題具體分析。 這里的理論基礎和就是 每一個node  都是condition 在上一個輸出的前提下  算出整個序列的概率。 下面截圖解釋了。

 
 

CTC  forward-backward 算法

這里CTC loss 是作為 神經網絡的loss , 而且ctc的優化過程是算最大似然 (maximum likelihood), 這個和神經網絡本身的訓練過程是一致的

這個CTC 計算過程類似 forward-backward algorithm for HMM,  雖然我也不知道這個算法。 但是我可以學啊。  下面就是這個算法的推導過程, 依舊是論文截圖+解釋。

 
 

截圖中的定義很清楚, 但是a_{t-1}(s) and a_{t-1}(s-1) 和 a_t(s) 的關系 也不那么好看出來,好在后面給了解釋。

這段截圖給了具體的推導過程 關於a_t{s} 的

 
 

這里的公式比較適合用下面的圖來理解, a_1(1) 其實對應的就是下圖中 左上角白色的圓圈。  就是 上來第一個label  是blank 的概率, 而 a_1(2)  是說上來識別 就是一個字母。 這里邊我們假設每個字母之間都插入了 空白, 所以如果識別的是一個字母, 其實他的sequence 是2 (空白+字母)。  然后對於其他 sequence , 在時間是1 的情況下 概率都是 0. 

下面這個圖比較清楚 橫軸是時間 t, 縱軸是 sequence, 這個例子里給的就是cat.

接下來我們分析 遞歸計算 (resursion).  公式6 分情況考慮

第一種情況就是  就是當前的label 是blank, 這個時候他的概率來自於過去t-1 的兩個label 概率, 也就是 a_{t-1} (s) 和 a_{t-1} (s-1) . a_{t-1} (s) 就是說當前的sequence 已經是s  了, 下圖就表現為橫傳, blank -->blank,  而 a_{t-1} (s-1) 是說明當前的字符還不夠,  需要再加一個, 所以就是斜傳 從黑色圓圈到白色圓圈。 仔細觀察下圖, 除了第一排的白色圓圈, 其他白色圓圈都有兩個輸入, 就是上述的兩種情況。    當然判斷blank 的方法也可以是判斷I'_{s-2} = I'_{s}.  這種情況 也是說明I'_{s} 是blank, 因為每一個字符必須用 blank 隔開, 即使是相同字符。

第二章情況  也可以用類似邏輯得出, 只不過當前的狀態s  是黑色圓圈, 有三種情況輸入。

 
 

 

 
 

最終的概率  給定  就如公式8 的計算。  上面的計算 過程 就是 CTC forward algroirthm, 基於 Fig. 3  的左邊的初始條件。但是基於Fig. 3    右邊的初始條件, 我們還是可以計算出一個概率, 那個就是 CTC backward. 這里我就不詳細介紹了, 直接截圖。 

 

 
 

這樣一直做乘法, 數字值越來越小, 很快就到時underflow on diigital computer. 就是說計算機不能精准表達這么小的數值啦。 這個時候就需要做 scaling.

這里會思考, 算出了forward probability  和 backward probability, 有什么用啊, 論文里解釋了。

 
 

就是說 forward probability and backward probability 的乘積, 代表了這個 sequence s at t 的 所有paths 的概率。  這樣的話 我們就計算了 Fig. 3 中的每個圓圈的概率。

最后就是算微分了,  整個推導過程就是加法和乘法,  都可以微分。 考慮到tensorflow 已經帶了這個函數而且自動微分, 具體請讀者去看 ref [1] 啦。

CTC Loss 的局限

CTC 局限呢, 就是假設 每個label  直接是相互獨立, 這樣 概率才可以相乘 來計算conditional probability. 而實際上, 每個label 直接的概率不是相互獨立的。 比如語言, the bird is fly in the sky. 最后一個單詞  根據上下文很容易猜到時sky 的。 這個問題 可以通過beam search , language modeling 來解決。  當然這個也可能不完全是壞事, 比如希望模型能識別多個語言, 那language modelling 可能就不需要了。

原文寫在石墨筆記上

https://shimo.im/docs/rpFiqCPHqfU3DM1P/ 

參考資料

[1] [A. Graves, S. Fernandez, F. Gomez, J. Schmidhuber. Connectionist Temporal lassification: Labeling Unsegmented Sequence Data  with Recurrent Neural Networks. ICML 2006, Pittsburgh, USA,  pp. 369-376.](http://www.cs.toronto.edu/~graves/icml_2006.pdf)

[2] https://distill.pub/2017/ctc/





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM