Chapter1-6_Speech_Recognition(RNN-T Training)
文章目錄
- 1 一個(gè)alignment概率的計(jì)算
- 2 所有alignments概率的計(jì)算
- 3 Training
- 4 Inference
- 5 小結(jié)
本文為李弘毅老師【Speech Recognition - RNN-T Training (optional)】的課程筆記,課程視頻youtube地址,點(diǎn)這里👈(需翻墻)。
下文中用到的圖片均來(lái)自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
文章索引:
上篇 - 1-5 Alignment of HMM, CTC and RNN-T
下篇 - 1-7 Language Modeling
總目錄
1 一個(gè)alignment概率的計(jì)算
不管是HMM,還是CTC,還是RNN-T,它們計(jì)算得到某一個(gè)alignment的概率的方法是一致的。下面以RNN-T為例,來(lái)說(shuō)一下計(jì)算的方法。
如下圖所示,我們現(xiàn)在來(lái)計(jì)算h=?c??a?t??h=\phi c \phi \phi a \phi t \phi \phih=?c??a?t??的概率,寫成公式就是
P(h∣X)=P(?∣X)P(c∣X,?)P(?∣X,?c)?P(h|X)=P(\phi | X)P(c | X,\phi)P(\phi | X,\phi c) \cdots P(h∣X)=P(?∣X)P(c∣X,?)P(?∣X,?c)?
那么這個(gè)結(jié)合模型到底是怎么算出來(lái)的呢?在decode的時(shí)候,RNN-T會(huì)有兩個(gè)RNN,一個(gè)RNN_1(上半圖)會(huì)吃一個(gè)“<BOS><BOS><BOS>“這樣的起始符,然后吐出一個(gè)l0l_0l0?,這個(gè)l0l_0l0?和encoder吐出的h1h_1h1?會(huì)一起喂給另一個(gè)RNN_2(下半圖),RNN_2會(huì)生成一個(gè)概率分布p1,0p_{1,0}p1,0?表示著這個(gè)time step由h1h_1h1?和l0l_0l0?生成的字典中每個(gè)字符和"?\phi?"的概率,最后我們從中找到”?\phi?“對(duì)應(yīng)的概率是多少,就得到了我們的P(?∣X)P(\phi | X)P(?∣X)。
由于我們這次計(jì)算的是"?\phi?",根據(jù)RNN-T的特性,我們不會(huì)去計(jì)算RNN_1,而是把新的h2h_2h2?和舊的l0l_0l0?塞進(jìn)RNN_2當(dāng)中,吐出一個(gè)由h2h_2h2?和l0l_0l0?生成的概率分布p2,0p_{2,0}p2,0?,從這個(gè)p2,0p_{2,0}p2,0?中找到字符"c"的概率,就得到了P(c∣X,?)P(c | X,\phi)P(c∣X,?)。
又因?yàn)镽NN-T的特性,在沒(méi)有遇到"?\phi?“不會(huì)喂給RNN_2新的hhh,而RNN1RNN_1RNN1?需要重新計(jì)算一個(gè)得到l1l_1l1?,于是由h2h_2h2?和l1l_1l1?生成概率分布p2,1p_{2,1}p2,1?,從中找到”?\phi?"的對(duì)應(yīng)概率,就得到了P(?∣X,?c)P(\phi | X,\phi c)P(?∣X,?c)。
依此類推,一致計(jì)算下去,直到算完整個(gè)hhh。然后把得到的概率值,全都乘起來(lái),就得到了我們的P(h∣X)P(h|X)P(h∣X)。
2 所有alignments概率的計(jì)算
P(h∣X)P(h|X)P(h∣X)會(huì)算了,接下來(lái),我們要來(lái)算一下P(Y∣X)P(Y|X)P(Y∣X)。得益于RNN-T有兩個(gè)結(jié)構(gòu)上不影響的RNN,我們?cè)谟?jì)算pi,jp_{i,j}pi,j?的時(shí)候,不管前面的輸出順序如何,其結(jié)果都是保持不變的。比如,在計(jì)算p4,2p_{4,2}p4,2?時(shí),不管前面的輸出序列是"?c??a\phi c \phi \phi a?c??a",還是“c??a?c \phi \phi a \phic??a?",還是“???ca\phi \phi \phi c a???ca",我們的l2l^2l2和h4h^4h4是打死不變的,所以p4,2p_{4,2}p4,2?是不會(huì)變的。
不過(guò)這里我其實(shí)有一個(gè)疑惑,雖然l2l^2l2和h4h^4h4是不會(huì)變的,但是生成p4,2p_{4,2}p4,2?的這個(gè)RNN的記憶不會(huì)因?yàn)榍懊娈a(chǎn)生token的順序不同而變化嗎?存疑。(疑惑已解,生成p4,2p_{4,2}p4,2?的是簡(jiǎn)單的DNN,不是RNN,黃色方塊沒(méi)有橫向的傳播)
現(xiàn)在我們就認(rèn)為pi,jp_{i,j}pi,j?是不會(huì)變化的,然后來(lái)看一下下面這個(gè)表格。然后我們會(huì)用和HMM中的forward algorithm差不多的方法來(lái)計(jì)算P(Y∣X)P(Y|X)P(Y∣X)。
首先我們定義αi,j\alpha_{i,j}αi,j?表示讀取了第iii個(gè)聲音訊號(hào)的特征并且輸出了第jjj個(gè)token時(shí),所有alignments的概率之和。比如α4,2\alpha_{4,2}α4,2?就表示輸出了”ccc“和"aaa",且用到h4h_4h4?時(shí),所有alignments的概率之和。
而α4,2\alpha_{4,2}α4,2?只可能從α4,1\alpha_{4,1}α4,1?或者α3,2\alpha_{3,2}α3,2?過(guò)來(lái),所以有
α4,2=α4,1p4,1(a)+α3,2p3,2(?)\alpha_{4,2} = \alpha_{4,1}p_{4,1}(a)+ \alpha_{3,2}p_{3,2}(\phi) α4,2?=α4,1?p4,1?(a)+α3,2?p3,2?(?)
按照這個(gè)辦法,我們就可以把這整個(gè)表格填滿,而右下角最后一個(gè)格子的概率,就是P(Y∣X)P(Y|X)P(Y∣X)。
3 Training
而以上的這些步驟,都只是一個(gè)forward的過(guò)程,我們還沒(méi)有到training這一步。我們先要有一個(gè)一組參數(shù)θ\thetaθ可以輸出Pθ(Y^∣X)P_{\theta}(\hat{Y}|X)Pθ?(Y^∣X),然后我們?cè)儆锰荻认陆档姆椒ㄈ?yōu)化參數(shù),使得給定一段聲音訊號(hào)XXX,模型輸出標(biāo)簽Y^\hat{Y}Y^的概率是最大的。
θ?=argmax?θlogPθ(Y^∣X)\theta^* = \underbrace{argmax}_{\theta} log P_{\theta}(\hat{Y}|X) θ?=θargmax??logPθ?(Y^∣X)
在梯度下降時(shí),我們當(dāng)然要先求解一下偏微分
?P(Y^∣X)?θ\frac{\partial P(\hat{Y}|X)}{\partial \theta}?θ?P(Y^∣X)?
而這里的P(Y^∣X)=∑h∈align(Y^)P(h∣X)P(\hat{Y}|X) = \sum_{h \in align(\hat{Y})}P(h|X)P(Y^∣X)=∑h∈align(Y^)?P(h∣X)是一堆和p1,0(?)p_{1,0}(\phi)p1,0?(?),p2,0(c)p_{2,0}(c)p2,0?(c),p2,1(?)p_{2,1}(\phi)p2,1?(?),?\cdots?這些相關(guān)的連乘和連加。故
?P(Y^∣X)?θ=?p4,1(a)?θP(Y^∣X)?p4,1(a)+?\frac{\partial P(\hat{Y}|X)}{\partial \theta} = \frac{\partial p_{4,1}(a)}{\partial \theta} \frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)}+\cdots?θ?P(Y^∣X)?=?θ?p4,1?(a)??p4,1?(a)P(Y^∣X)?+?
我們以?p4,1(a)?θP(Y^∣X)?p4,1(a)\frac{\partial p_{4,1}(a)}{\partial \theta} \frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)}?θ?p4,1?(a)??p4,1?(a)P(Y^∣X)?為例,先來(lái)算一下?p4,1(a)?θ\frac{\partial p_{4,1}(a)}{\partial \theta}?θ?p4,1?(a)?。這個(gè)部分就和正常的RNN神經(jīng)網(wǎng)絡(luò)反向傳播(BPTT)一致,這里不做說(shuō)明。示意圖如下所示。
而在計(jì)算P(Y^∣X)?p4,1(a)\frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)}?p4,1?(a)P(Y^∣X)?時(shí),我們就可以把P(Y^∣X)P(\hat{Y}|X)P(Y^∣X)拆分成
P(Y^∣X)=∑hwithp4,1(a)P(h∣X)+∑hwithoutp4,1(a)P(h∣X)P(\hat{Y}|X) = \sum_{h\ with\ p_{4,1}(a)} P(h|X)+\sum_{h\ without\ p_{4,1}(a)} P(h|X) P(Y^∣X)=h?with?p4,1?(a)∑?P(h∣X)+h?without?p4,1?(a)∑?P(h∣X)
這里的第二項(xiàng)和p4,1(a)p_{4,1}(a)p4,1?(a)沒(méi)有關(guān)系,故求偏導(dǎo)為0,可直接忽略,前一項(xiàng)可以寫成
∑hwithp4,1(a)P(h∣X)=∑hwithp4,1(a)p4,1(a)×others\sum_{h\ with\ p_{4,1}(a)} P(h|X) = \sum_{h\ with\ p_{4,1}(a)} p_{4,1}(a) \times others h?with?p4,1?(a)∑?P(h∣X)=h?with?p4,1?(a)∑?p4,1?(a)×others
故
P(Y^∣X)?p4,1(a)=∑hwithp4,1(a)others=∑hwithp4,1(a)P(h∣X)p4,1(a)=1p4,1(a)∑hwithp4,1(a)P(h∣X)\frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)} = \sum_{h\ with\ p_{4,1}(a)} others=\sum_{h\ with\ p_{4,1}(a)} \frac{P(h|X)}{p_{4,1}(a)}=\frac{1}{p_{4,1}(a)}\sum_{h\ with\ p_{4,1}(a)}P(h|X) ?p4,1?(a)P(Y^∣X)?=h?with?p4,1?(a)∑?others=h?with?p4,1?(a)∑?p4,1?(a)P(h∣X)?=p4,1?(a)1?h?with?p4,1?(a)∑?P(h∣X)
那么問(wèn)題來(lái)了,這個(gè)∑hwithp4,1(a)P(h∣X)\sum_{h\ with\ p_{4,1}(a)}P(h|X)∑h?with?p4,1?(a)?P(h∣X)該怎么算呢?這里,我們就要引進(jìn)HMM中的backward algorithm。這個(gè)和之前的forward algorithm很類似,我們定義一個(gè)參數(shù)βi,j\beta_{i,j}βi,j?表示從輸入第iii個(gè)聲音訊號(hào),輸出第jjj個(gè)token的位置開始,一致走到終點(diǎn)的所有alignments的概率之和。
而這個(gè)βi,j\beta_{i,j}βi,j?也是和αi,j\alpha_{i,j}αi,j?一樣,整個(gè)表格是可以事先填滿的。
那么根據(jù)αi,j\alpha_{i,j}αi,j?和βi,j\beta_{i,j}βi,j?的定義,我們有
∑hwithp4,1(a)P(h∣X)=α4,1p4,1(a)β4,2\sum_{h\ with\ p_{4,1}(a)}P(h|X) = \alpha_{4,1} p_{4,1}(a)\beta_{4,2} h?with?p4,1?(a)∑?P(h∣X)=α4,1?p4,1?(a)β4,2?
那么就有
P(Y^∣X)?p4,1(a)=α4,1β4,2\frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)} = \alpha_{4,1} \beta_{4,2} ?p4,1?(a)P(Y^∣X)?=α4,1?β4,2?
示意圖如下所示。
4 Inference
現(xiàn)在假設(shè)我們已經(jīng)train好了一個(gè)模型,然后輸出XXX和YYY就可以計(jì)算出P(Y∣X)P(Y|X)P(Y∣X)這個(gè)概率,那么我們要做的就是找到一個(gè)Y?Y^*Y?使得P(Y?∣X)P(Y^*|X)P(Y?∣X)最大。
Y?=argmax?YP(Y∣X)Y^*=\underbrace{argmax}_{Y}P(Y|X) Y?=Yargmax??P(Y∣X)
雖然有演算法可以做到這點(diǎn),但還是太過(guò)復(fù)雜,實(shí)際情況下,我們不會(huì)那么去做。我們會(huì)去找一個(gè)近似的解。而這個(gè)求近似解的方法,就是取每一個(gè)pi,jp_{i,j}pi,j?中概率最大的那一個(gè)就可以了。這個(gè)也被稱為greedy decoding。
如果希望更精確一些,也可以用Beam Search。greedy decoding可以說(shuō)是beam search的一種特殊情況,就是beam=1的時(shí)候的情況。在遍歷每個(gè)time step的時(shí)候,我會(huì)會(huì)一直保留一個(gè)大小為beam的候選集,候選集中是多個(gè)長(zhǎng)度相等,但不同的字符串,每個(gè)字符串有一個(gè)score,也就是其概率大小。
比如我們有一個(gè)非常簡(jiǎn)單的輸出矩陣為,其中#就是空白符?\phi?
我們用beam search取找其最優(yōu)組合的過(guò)程為
要注意的是,每次得到的新的字符串可能來(lái)自于不同的beam,要把他們的概率都加起來(lái)。beam越大,最終輸出的結(jié)果就越準(zhǔn),但相應(yīng)的計(jì)算成本也就更高。一般情況下,我們都是greedy search來(lái)做的,沒(méi)必要用這個(gè),僅作為了解。其實(shí)現(xiàn)可見(jiàn)[這里]。(https://github.com/githubharald/CTCDecoder/blob/master/ctc_decoder/beam_search.py)
5 小結(jié)
最后,我們來(lái)比較一下LAS,CTC以及RNN-T這三者的異同。在decoder這部分,LAS和RNN-T是依賴于之前的輸出的,而CTC是不管的;CTC和RNN-T是需要對(duì)結(jié)果做alignment的,而LAS是輸出什么就是什么的;LAS的training就是硬train一發(fā),而CTC和RNN-T由于需要alignment,會(huì)復(fù)雜一些;LAS是無(wú)法做到句子還沒(méi)念完就輸出預(yù)測(cè)結(jié)果的,但是CTC和RNN-T是可以的。
總結(jié)
以上是生活随笔為你收集整理的Chapter1-6_Speech_Recognition(RNN-T Training)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: LeetCode 1829. 每个查询的
- 下一篇: conda安装pytorch1.10.1