CTC 算法詳解之測(cè)試篇

本來想把關(guān)于CTC的所有東西都寫在一篇文章独榴,但后面發(fā)現(xiàn)內(nèi)容太多斋陪,遂拆分成如下幾個(gè)部分:
CTC算法詳解之訓(xùn)練篇
CTC算法詳解之測(cè)試篇
CTC算法詳解之總結(jié)展望篇(待更)

引言

CTC鼻祖論文[1]主要討論了CTC網(wǎng)絡(luò)的訓(xùn)練可微問題迹冤,而對(duì)于怎么測(cè)試, 其本質(zhì)是從網(wǎng)絡(luò)的輸出分布y中搜索得到最優(yōu)序列的問題屏轰,有非常多經(jīng)典的算法能夠完成CTC解碼工作公荧,除了[1]中提供的Best path decoding和Prefix search decoding外,還有Beam Search Decoding微渠,Token Passing等等搭幻。本文先講解[1]中描述的兩種解碼算法,我有時(shí)間了再添加Beam Search Decoding逞盆,Token Passing檀蹋。

譯碼過程就是使輸出標(biāo)簽概率最大化的過程,即h(x)=\text{argmax }p(l|x)云芦,其中標(biāo)簽l的概率定義成所有正確路徑的概率和:p(l|x)=\sum_{\pi\in B^{-1}}p(\pi|x)俯逾,B^{-1}(l)B的逆映射(B的定義見《訓(xùn)練篇》)贸桶,表示所有能映射成l的路徑。因?yàn)?img class="math-inline" src="https://math.jianshu.com/math?formula=B" alt="B" mathimg="1">是many-to-one映射的緣故桌肴,故計(jì)算p(l|x)要涉及到很多路徑\pi窮舉所有的路徑是非常困難的皇筛,其空間復(fù)雜度為O(N^T)N為字典大小坠七,T為路徑長(zhǎng)度水醋,實(shí)際操作中,我們會(huì)通過某些策略來縮小求解范圍灼捂,加快計(jì)算离例。

1.最優(yōu)路徑解碼(best path decoding)

這種解碼方式是最快速的。best path decoding基于一個(gè)假設(shè):概率最大的路徑\pi和概率最大的標(biāo)簽l^*是一一對(duì)應(yīng)的悉稠,把映射B退化成了one-to-one映射宫蛆,那么有h(x)≈B(\pi)\pi=\text{argmax }p(\pi|x)的猛。

best path decoding的實(shí)現(xiàn)非常簡(jiǎn)單耀盗,把每個(gè)時(shí)刻概率最大的類別取出來,拼接得到路徑\pi卦尊,最后通過移除連續(xù)重復(fù)符號(hào)和blank得到標(biāo)簽叛拷。《訓(xùn)練篇》的圖2即為這種解碼方式岂却。

然而best path decoding的前提不一定正確忿薇,比如有1條概率為0.1的路徑可得到標(biāo)簽A,但有10條概率為0.05的路徑可得到概率B躏哩,顯然標(biāo)簽B比標(biāo)簽A更可信署浩。所以這種方法是通過犧牲精度來?yè)Q取速度,但實(shí)際應(yīng)用中這種解碼方式因?yàn)閷?shí)現(xiàn)簡(jiǎn)單扫尺,速度快筋栋,并且精度能夠接受,[1]表明正驻,在精度上bset path decoding解碼僅差Prefix Search Decoding1%弊攘,所以被廣泛使用。

2.Prefix Search Decoding

比起搜索所有可能的標(biāo)簽姑曙,Prefix Search Decoding只搜索最大概率的的前綴襟交,大大減少了搜索空間,然后每一步迭代都拓展這個(gè)前綴直到找出最優(yōu)標(biāo)簽伤靠。

搜索過程如下:

  • 1.每一次迭代中婿着,我們有一個(gè)前綴集合,每個(gè)前綴對(duì)應(yīng)一個(gè)概率。這個(gè)集合的初態(tài)僅包含一個(gè)空字符串竟宋,其概率為1。
  • 2.從前綴集合中找出概率最大的前綴形纺。對(duì)這個(gè)前綴我們可以選擇拓展一個(gè)新符號(hào)或是將其作為最終的解碼標(biāo)簽丘侠。

  • 3.計(jì)算上一步中每種選擇的概率。

  • 4.如果將某前綴作為解碼標(biāo)簽的概率大于該前綴的任何拓展概率逐样,則找到了最優(yōu)解碼標(biāo)簽蜗字。

  • 5.如果上一步不成立,則把拓展后的前綴作為新的前綴脂新,替換老前綴挪捕,并更新前綴概率。

  • 6.重復(fù)2~5争便,直到找出最優(yōu)解碼標(biāo)簽级零。

[1]提供了算法的直觀示意圖:

圖1 Prefix Search Decoding示意圖

如果允許的譯碼時(shí)常T足夠大,前綴搜索是能夠找出真正的最佳結(jié)果的滞乙,但是算法的搜索空間隨著T的增大是指數(shù)型增長(zhǎng)的奏纪,為了解決這個(gè)問題,[1]使用了一種啟發(fā)式策略來加速計(jì)算斩启,把CTC的輸出根據(jù)blank符號(hào)分割成數(shù)個(gè)片段(chunk)序调,每個(gè)片斷獨(dú)立地使用prefix search decoding,最后再拼接起來兔簇。

目前為止我們只是粗略地討論了算法流程发绢,并沒有講到怎么計(jì)算步驟3中的概率,而這垄琐,正好是算法的核心與難點(diǎn)边酒。為計(jì)算前綴相關(guān)的概率,我們要定義一些變量此虑,然后通過動(dòng)態(tài)規(guī)劃算法來計(jì)算甚纲。用\gamma_t(p_n)表示t時(shí)刻譯碼得到前綴p并且最后一個(gè)符號(hào)為非空的概率(n表示non-blank}),用\gamma_t(p_b)表示t時(shí)刻譯碼得到前綴p并且最后一個(gè)符號(hào)為空的概率(b表示blank)朦前。注意介杆,前綴p是由路徑\pi經(jīng)過去重并且移除blank符號(hào)得到的,所以p中并不包含blank韭寸,這里是指p對(duì)應(yīng)的路徑\pi的最后一個(gè)符號(hào)春哨。

所以前綴p作為標(biāo)簽的概率為(終止概率,比如圖1第2行數(shù)字中的0.1):

P(p|x) = \gamma_t(p)=\gamma_T(p_n) + \gamma_T(p_b)\tag{1}

其中T為輸入序列的長(zhǎng)度(最大譯碼長(zhǎng)度)恩伺。接下來我們要定義前綴p的后綴為非空字符串的概率為(拓展概率赴背,比如圖1第2行數(shù)字中的0.7和0.2):

P(p\ldots|x) = \sum_{\ell \ne \varnothing} P(p + \ell | x) \tag2

在定義公式(1)和(2)后我們就可以討論怎么計(jì)算前面說的概率了。

我們來模擬譯碼的過程。首先將前綴集合初始化為P=\{\varnothing\}凰荚,集合中只包含一個(gè)空字符串燃观,用l^*表示譯碼過程中得到的最優(yōu)標(biāo)簽,p^*表示當(dāng)前譯碼時(shí)刻的前綴便瑟,l^*p^*都初始化成空字符串缆毁。選取概率最大的一個(gè)前綴p^*,對(duì)其拓展一個(gè)字符得到p'=p^*+k到涂,k可能是字典中的任意一個(gè)符號(hào)脊框。對(duì)于每一個(gè)可能的k,我們都要計(jì)算新序列作為整個(gè)標(biāo)簽的概率和新序列繼續(xù)作為前綴的概率践啄,即P(p'|x) = P(p^*+k|x)P(p'\ldots|x)浇雹。整個(gè)算法的核心就是通過動(dòng)態(tài)規(guī)劃來計(jì)算這兩個(gè)式子。

公式(1)的計(jì)算

容易有:

\gamma_t(p'_n) = y_t(k) \big(\text{new}(t) + \gamma_{t-1}(p'_n)\big) \\ \gamma_t(p'_b) = y_t(b) \big(\gamma_{t-1}(p'_b) + \gamma_{t-1}(p'_n)\big) \tag3

new(t)表示t時(shí)刻得到某個(gè)非空字符的概率屿讽。

公式(4)說明有兩種方式可以在時(shí)刻t得到新字符k

  • 如果前綴p^*已經(jīng)是以k結(jié)尾的話昭灵,需要t-1時(shí)刻序列pblank結(jié)尾;

  • 否在聂儒,上一時(shí)刻的前綴應(yīng)以非k符號(hào)結(jié)尾虎锚。比如路徑-k-和abk都可以在第3個(gè)時(shí)刻得到新符號(hào)k,但-ka衩婚,kkk等路徑則不行窜护。

公式(3)的第一行表示,當(dāng)路徑不以blank結(jié)尾時(shí)非春,我們不可能得到一個(gè)空的前綴柱徙,因?yàn)槁窂降哪┪惨呀?jīng)包含了一個(gè)non-blank符號(hào),譯碼得到的整個(gè)前綴也肯定非空奇昙。

公式(3)的第二行表示护侮,必須是連續(xù)的t個(gè)blank才可能譯碼得空前綴,我們只需將在將每個(gè)時(shí)刻的blank概率相乘储耐。

接下來討論\gamma_t的初態(tài):\gamma_1(p_n')\gamma_1(p_b')羊初。如果在第一個(gè)時(shí)刻輸出blank符號(hào),就不存在前綴p了什湘,所以\gamma_1(p_b')為不可能事件长赞;而\gamma_1(p'_n)很容易通過CTC的譯碼規(guī)則求出,為第1個(gè)時(shí)刻

的對(duì)應(yīng)符號(hào)的激活概率:

\begin{align*} \gamma_1(p_b')=0 \\ \gamma_1(p'_n) = y_1(k)\end{align*} \tag5

特別的闽撤,對(duì)于空字符串前綴:

\begin{align*} \gamma_t(\varnothing_n) = 0 \\ \gamma_t(\varnothing_b) = \prod_{i=1}^t y_i(b) \end{align*} \tag6

在知道遞推公式(3)和初態(tài)(5)的情況下得哆,我們就可以計(jì)算任意\gamma_t了,然后根據(jù)公式(1)計(jì)算前綴作為標(biāo)簽的概率(終止概率)哟旗。

公式(2)的計(jì)算

我們通過間接方式來計(jì)算拓展概率P(p'\ldots|x)贩据。拓展概率以=前綴概率-終止概率:

P(p'\ldots|x) = P(p'\text{ is a prefix}|x) - P(p'|x)\tag7

比如圖2第2行有(0.7+0.2)=1-0.1

公式(8)中的拓展概率可以被拆解成1~T時(shí)刻的符號(hào)概率之和:

P(p' \text{ is a prefix }|x) = \gamma_1(p'_n) + \sum_{t=2}^T y_t(k) \cdot \text{new}(t)\tag8

迭代

現(xiàn)在我們能夠計(jì)算某個(gè)前綴的拓展概率和終止概率了栋操,每一步迭代如下:

  1. 如果新前綴p'作為標(biāo)簽的概率比最佳標(biāo)簽l^*的概率要高,即P(p'|x)>P(l^*|x)饱亮,則用p'更新l^*矾芙;
  2. 如果p'的拓展概率(未作其它符號(hào)前綴的概率)比最佳標(biāo)簽要高即P(p'\ldots|x) > P(\ell^*|x),則把p'加入前綴集合P中近上。

在完成前綴p*相關(guān)的概率計(jì)算后:

  1. p從前綴集合中刪除*蠕啄;
  2. 根據(jù)最大的P(p^*\ldots|x)找到新前綴,替換老前綴戈锻。

一直迭代下去,知道找不出概率大于最佳標(biāo)簽的前綴(P(p^*\ldots|x) < P(\ell^*|x))和媳,此時(shí)的l^*即為最優(yōu)解碼標(biāo)簽格遭。

整個(gè)算法可用如下偽代碼來描述,圖片摘自[4]:


下載.png

參考資料
[1] Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks
[2] CTC Algorithm Explained Part 2:Decoding the Network(CTC算法詳解之解碼篇)
[3]Speech Recognition with Neural Networks
[4]Supervised Sequence Labeling, Alex Gravessuoyi

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末留瞳,一起剝皮案震驚了整個(gè)濱河市拒迅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌她倘,老刑警劉巖璧微,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異硬梁,居然都是意外死亡前硫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門荧止,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屹电,“玉大人,你說我怎么就攤上這事跃巡∥:牛” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵素邪,是天一觀的道長(zhǎng)外莲。 經(jīng)常有香客問我,道長(zhǎng)兔朦,這世上最難降的妖魔是什么偷线? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮烘绽,結(jié)果婚禮上淋昭,老公的妹妹穿的比我還像新娘。我一直安慰自己安接,他們只是感情好翔忽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布英融。 她就那樣靜靜地躺著,像睡著了一般歇式。 火紅的嫁衣襯著肌膚如雪驶悟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天材失,我揣著相機(jī)與錄音痕鳍,去河邊找鬼。 笑死龙巨,一個(gè)胖子當(dāng)著我的面吹牛笼呆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播旨别,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诗赌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了秸弛?” 一聲冷哼從身側(cè)響起铭若,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎递览,沒想到半個(gè)月后叼屠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绞铃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年镜雨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片憎兽。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡冷离,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出纯命,到底是詐尸還是另有隱情西剥,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布亿汞,位于F島的核電站瞭空,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏疗我。R本人自食惡果不足惜咆畏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吴裤。 院中可真熱鬧旧找,春花似錦、人聲如沸麦牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至魏颓,卻和暖如春岭辣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背甸饱。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工沦童, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叹话。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓偷遗,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親驼壶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子鹦肿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355