语音识别2:CTC对齐的算法
一、提要
?
如果現(xiàn)在有一個(gè)包含剪輯語(yǔ)音和對(duì)應(yīng)的文本,我們不知道如何將語(yǔ)音片段與文本進(jìn)行對(duì)應(yīng),這樣對(duì)于訓(xùn)練一個(gè)語(yǔ)音識(shí)別器增加了難度。?
如下圖,存在圖片與文本的對(duì)齊不易,語(yǔ)音聲波對(duì)文本的對(duì)齊不易。
以上構(gòu)成如下事實(shí):
輸入(如音頻信號(hào))用符號(hào)序列?和標(biāo)簽,為了方便訓(xùn)練這些數(shù)據(jù)我們希望能夠找到輸人X與輸出Y 之間精確的映射關(guān)系。
先梳理一下有幾個(gè)難點(diǎn):
使用CTC算法能克服上述問(wèn)題。到這里可以知道CTC就是可以解決輸入輸出對(duì)應(yīng)問(wèn)題的一種算法。
二、算法原理
這里我們首先需要明確的是,還拿語(yǔ)音識(shí)別來(lái)說(shuō),現(xiàn)在使用的CTC常用的場(chǎng)景是RNN后接CTC算法,RNN模型輸入是一個(gè)個(gè)音頻片段,輸出個(gè)數(shù)與輸入的維度一樣,有T個(gè)音頻片段,就輸出T個(gè)維度的概率向量,每個(gè)向量又由字典個(gè)數(shù)的概率組成。例如網(wǎng)絡(luò)輸入音頻個(gè)數(shù)定為T(mén),字典中不同字的個(gè)數(shù)為N,那么RNN輸出的維度為T(mén) × N 。根據(jù)這個(gè)概率輸出分布,我們就能得到最可能的輸出結(jié)果。在接下來(lái)的討論中可以把RNN+CTC看成一個(gè)整體,當(dāng)然也可以將RNN替換成其他的提取特征算法。
?
2.1 損失函數(shù)的定義
對(duì)于給定的輸入X,我們訓(xùn)練模型希望最大化Y 的后驗(yàn)概率P(Y|X),P(Y|X)應(yīng)該是可導(dǎo)的,這樣我們就能利用梯度下降訓(xùn)練模型了。
?
2.2 測(cè)試和驗(yàn)證
當(dāng)我們已經(jīng)訓(xùn)練好一個(gè)模型后,輸入X,我們希望輸出Y 的條件概率最高即?而且我們希望盡量快速的得到?值,利用CTC我們能在低投入情況下迅速找到一個(gè)近似的輸出。
2.3 CTC對(duì)齊算法
????????CTC算法對(duì)于輸入的X能給出非常多的Y的條件概率輸出(可以想象RNN輸出概率分布矩陣,所以通過(guò)矩陣中元素的組合可以得到很多Y值作為最終輸出),在計(jì)算輸出過(guò)程的一個(gè)關(guān)鍵問(wèn)題就是CTC算法如何將輸入和輸出進(jìn)行對(duì)齊的。在接下來(lái)的部分中,我們先來(lái)看一下對(duì)齊的解決方法,然后介紹損失函數(shù)的計(jì)算方法和在測(cè)試階段中找到合理輸出的方法。
????????CTC算法并不要求輸入輸出是嚴(yán)格對(duì)齊的。但是為了方便訓(xùn)練模型我們需要一個(gè)將輸入輸出對(duì)齊的映射關(guān)系,知道對(duì)齊方式才能更好的理解之后損失函數(shù)的計(jì)算方法和測(cè)試使用的計(jì)算方法。
為了更好的理解CTC的對(duì)齊方法,先舉個(gè)簡(jiǎn)單的對(duì)齊方法。假設(shè)對(duì)于一段音頻,我們希望的輸出是Y = [ c , a , t ] 這個(gè)序列,一種將輸入輸出進(jìn)行對(duì)齊的方式如下圖所示,先將每個(gè)輸入對(duì)應(yīng)一個(gè)輸出字符,然后將重復(fù)的字符刪除。
?上述對(duì)齊方式有兩個(gè)問(wèn)題:
通常這種對(duì)齊方式是不合理的。比如在語(yǔ)音識(shí)別任務(wù)中,有些音頻片可能是無(wú)聲的,這時(shí)候應(yīng)該是沒(méi)有字符輸出的
對(duì)于一些本應(yīng)含有重復(fù)字符的輸出,這種對(duì)齊方式?jīng)]法得到準(zhǔn)確的輸出。例如輸出對(duì)齊的結(jié)果為[ h , h , e , l , l , l , o ],通過(guò)去重操作后得到的不是“hello”而是“helo”
為了解決上述問(wèn)題,CTC算法引入的一個(gè)新的占位符用于輸出對(duì)齊的結(jié)果。這個(gè)占位符稱為空白占位符,通常使用符號(hào)? \epsilon?,這個(gè)符號(hào)在對(duì)齊結(jié)果中輸出,但是在最后的去重操作會(huì)將所有的? \epsilon?刪除得到最終的輸出。利用這個(gè)占位符,可以將輸入與輸出有了非常合理的對(duì)應(yīng)關(guān)系,如下圖所示。?
?在這個(gè)映射方式中,如果在標(biāo)定文本中有重復(fù)的字符,對(duì)齊過(guò)程中會(huì)在兩個(gè)重復(fù)的字符當(dāng)中插入? \epsilon?占位符。利用這個(gè)規(guī)則,上面的“hello”就不會(huì)變成“helo”了。
?
回到上面Y = [ c , a , t ] 這個(gè)例子來(lái),下圖中有幾個(gè)示列說(shuō)明有效的對(duì)齊方式和無(wú)效的對(duì)齊方式,在無(wú)效的對(duì)齊方式中舉了三種例子,占位符插入位置不對(duì)導(dǎo)致的輸出不對(duì),輸出長(zhǎng)度與輸入不對(duì)齊,輸出缺少字符a
?
?2.4 CTC算法的對(duì)齊方式有下列屬性:
- 輸入與輸出的對(duì)齊方式是單調(diào)的,即如果輸入下一輸入片段時(shí)輸出會(huì)保持不變或者也會(huì)移動(dòng)到下一個(gè)時(shí)間片段
- 輸入與輸出是多對(duì)一的關(guān)系
- 輸出的長(zhǎng)度小于等于輸入
三、CTC損失函數(shù)
????????這里要明確一點(diǎn),對(duì)于一個(gè)標(biāo)定好的音頻片段,訓(xùn)練該片段時(shí),我們希望的輸出就是標(biāo)定的文本,如下圖所示,音頻說(shuō)的一個(gè)hello,RNN或者其他模型輸出的是相同數(shù)量的向量,向量里是每個(gè)字母的概率。
?對(duì)于一對(duì)輸入輸出( X , Y ) 來(lái)說(shuō),CTC的目標(biāo)是將下式概率最大化:
????????解釋一下,對(duì)于RNN+CTC模型來(lái)說(shuō),RNN輸出的就是概率,t表示的是RNN里面的時(shí)間的概念。乘法表示一條路徑的所有字符概率相乘,加法表示多條路徑。因?yàn)樯厦嬲f(shuō)過(guò)CTC對(duì)齊輸入輸出是多對(duì)一的,例如he?l?lo?與h e e ? l ? l o對(duì)應(yīng)的都是“hello”,這就是輸出的其中兩條路徑,要將所有的路徑相加才是輸出的條件概率.
????????但是對(duì)于一個(gè)輸出,路徑會(huì)非常的多,這樣直接計(jì)算概率是不現(xiàn)實(shí)的,CTC算法采用動(dòng)態(tài)規(guī)劃的思想來(lái)求解輸出的條件概率,如下圖所示,該圖想說(shuō)明的是通過(guò)動(dòng)態(tài)規(guī)劃來(lái)進(jìn)行路徑的合并(看不懂也沒(méi)關(guān)系,下面有詳細(xì)的解釋)
這里有必要將動(dòng)態(tài)規(guī)劃分開(kāi)另外講述:《動(dòng)態(tài)規(guī)劃原理》。?
?四、CTC的特征
- 條件獨(dú)立假設(shè):
????????CTC的一個(gè)非常不合理的假設(shè)是其假設(shè)每個(gè)時(shí)間片都是相互獨(dú)立的,這是一個(gè)非常不好的假設(shè)。在OCR或者語(yǔ)音識(shí)別中,各個(gè)時(shí)間片之間是含有一些語(yǔ)義信息的,所以如果能夠在CTC中加入語(yǔ)言模型的話效果應(yīng)該會(huì)有提升。
- 單調(diào)對(duì)齊:
????????CTC的另外一個(gè)約束是輸入X與輸出Y之間的單調(diào)對(duì)齊,在OCR和語(yǔ)音識(shí)別中,這種約束是成立的。但是在一些場(chǎng)景中例如機(jī)器翻譯,這個(gè)約束便無(wú)效了。
- 多對(duì)一映射:
????????CTC的又一個(gè)約束是輸入序列X的長(zhǎng)度大于標(biāo)簽數(shù)據(jù) Y的長(zhǎng)度,但是對(duì)于X XX的長(zhǎng)度大于Y YY的長(zhǎng)度的場(chǎng)景,CTC便失效了。
參考
CTC算法詳解_Michael’s Blog-CSDN博客_ctc
總結(jié)
以上是生活随笔為你收集整理的语音识别2:CTC对齐的算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 环境调试: RuntimeWarning
- 下一篇: 语音识别1: 音频信号采集、并存入 wa