【深度学习】语音识别之CTC算法原理解释与公式推导
不搞語(yǔ)音識(shí)別得人開(kāi)這個(gè)論文確實(shí)有點(diǎn)費(fèi)勁,結(jié)合上圖,思考一下語(yǔ)音識(shí)別的場(chǎng)景,輸入是一段錄音,輸出是識(shí)別的音素, 輸入的語(yǔ)音文件的長(zhǎng)度和輸出的音素個(gè)數(shù)之間沒(méi)有一一對(duì)應(yīng)關(guān)系,通常將語(yǔ)音文件「分片」之后,會(huì)出現(xiàn)多對(duì)一的關(guān)系。這個(gè)場(chǎng)景在「翻譯問(wèn)題」和「OCR問(wèn)題」中也普遍存在。
本文的特點(diǎn)是,提出來(lái)一種end-to-end的方法,直接將語(yǔ)音轉(zhuǎn)問(wèn)音素。不需要添加規(guī)則/后處理等過(guò)程。
文章目錄?[隱藏]
- 1?幾個(gè)定義
- 2?構(gòu)造分類(lèi)器
- 3?解碼方法
- 3.1?Best path decoding
- 3.2?prefix search decoding
- 4?網(wǎng)絡(luò)訓(xùn)練
- 4.1?前向后向算法
- 4.2?似然函數(shù)
- 4.2.1?序列的似然
- 4.2.2?路徑的似然
- 5?極大似然訓(xùn)練
- 6?實(shí)現(xiàn)
- 7?參考資料
幾個(gè)定義
損失函數(shù)定義為平均編輯距離:
一種路徑的概率為:
?
在現(xiàn)實(shí)之中,多個(gè)路徑會(huì)對(duì)應(yīng)一個(gè)正確的序列,并且這個(gè)序列長(zhǎng)度往往小于路徑長(zhǎng)度,那么序列最終的概率可以使用路徑的概率之和表示:
構(gòu)造分類(lèi)器
讓我們?cè)俅_定一下我們的目標(biāo),我們的目標(biāo)是通過(guò)輸入序列?x得到輸出序列?y,如果我們可以獲得輸出序列的分布?p(I|x),選擇其中概率最大的那一個(gè)作為「輸出序列」即可。這個(gè)邏輯可以通過(guò)下面公式表示:
解碼方法
這里介紹兩種解碼方法,解碼是對(duì)path的分布進(jìn)行的,輸入為path的分布,輸出為最終的序列。作者也沒(méi)有找到比這兩種更好的方法了。
Best path decoding
按照上面思路,需要找到序列?I 的所有路徑的概率,一種簡(jiǎn)化的方式是:找到路徑中概率最大的,然后其對(duì)應(yīng)的序列?I 就是最優(yōu)序列,這個(gè)方法被稱(chēng)為「Best path decoding」。
這個(gè)方法相當(dāng)于是假設(shè),最優(yōu)序列的最優(yōu)路徑也是全局最優(yōu)的(最優(yōu)表示概率最大),形式化表示為:
prefix search decoding
接著介紹第二種方法,「prefix search decoding」是一種剪枝的算法,剪枝主要在兩個(gè)方面,一是同路徑不重復(fù)計(jì)算,二是不可能狀態(tài)不再搜索,下圖中第一層的Y不搜索就是因?yàn)橥瑢拥腦和下層的Y概率都比他高。
這個(gè)方法是一種比較好的啟發(fā)式搜索的方法。
網(wǎng)絡(luò)訓(xùn)練
上面兩種方式都是在模型已經(jīng)訓(xùn)練出來(lái),得到path概率分布之后的解碼過(guò)程,那么如何訓(xùn)練一個(gè)網(wǎng)絡(luò),可以更好的預(yù)測(cè)path分布(即進(jìn)行編碼)呢?
首先這是一個(gè)有監(jiān)督的過(guò)程,我們的輸入是分片之后的語(yǔ)音文件, 輸出是長(zhǎng)度沒(méi)有限制的音素序列。
前向后向算法
既然要訓(xùn)練,就要有「損失」,損失是定義預(yù)估的Label和正確的Label之間的「距離」,所以我們是希望每一條樣本得到的path都可以有較高的概率生成其對(duì)應(yīng)的Label。
對(duì)一條樣本來(lái)說(shuō),如果給定了path如何確定生成當(dāng)前樣本的label(最終序列)的概率呢?根據(jù)定義,需要窮舉所有可以生成正確label的path的概率,最后加到一起,這個(gè)計(jì)算量最差情況是「指數(shù)」級(jí)別的,這里可以使用類(lèi)似HMM中的動(dòng)態(tài)規(guī)劃的方法,將時(shí)間復(fù)雜度變?yōu)?O(T?|L|) ;其中?T 表示輸入序列長(zhǎng)度,?|L| 表示輸出Label長(zhǎng)度。接下來(lái)就是如何巧妙地定義狀態(tài)和尋找動(dòng)態(tài)轉(zhuǎn)移方程。
狀態(tài)定義為:
為了實(shí)現(xiàn)end-to-end的訓(xùn)練,空格可能出現(xiàn)在任何兩個(gè)音素之間,所以需要將原始的Label中每一個(gè)音素之間添加一個(gè)「元素」,這個(gè)「元素」可以為NULL和空格(blank)。仔細(xì)體會(huì)這個(gè)修改,對(duì)理解后面過(guò)程很重要。
理解動(dòng)態(tài)轉(zhuǎn)移方程之前,需要強(qiáng)調(diào)幾個(gè)點(diǎn):
- 我們的目標(biāo)是根據(jù)所有的路徑(path)計(jì)算出來(lái)一個(gè)長(zhǎng)度為?2|L|+1 的Label,即?L′生成(解碼)的概率
- path中每一個(gè)片段的內(nèi)容為:音素、NULL、空格,其中每一個(gè)都可以連續(xù)出現(xiàn)多個(gè)
- 序列?L′中,也是包含三種內(nèi)容:「音素、NULL、空格」,但是有一些約束,例如下面模式不能出現(xiàn):「...,音素x,NULL,音素x,...」,因?yàn)橄嗤囊羲厝绻蔷o挨著肯定是需要合并的。
狀態(tài)轉(zhuǎn)移方程:
其中虛線的轉(zhuǎn)移,需要滿足條件,具體為:如果當(dāng)前狀態(tài)label為空格或相鄰兩個(gè)音素一樣(中間必有空格),就不能轉(zhuǎn)移。
似然函數(shù)
序列的似然
讓我們回憶一下似然函數(shù)的定義,簡(jiǎn)單來(lái)說(shuō)就是「觀測(cè)到的樣本生成的概率」。在我們現(xiàn)在的場(chǎng)景, 對(duì)一條樣本來(lái)說(shuō),觀測(cè)到的是一個(gè)序列,如果認(rèn)為序列中的元素是相互獨(dú)立,似然函數(shù)可以表示為:
路徑的似然
路徑的似然假設(shè)路徑的每一個(gè)輸出都是相互「獨(dú)立的」,結(jié)合似然的定義,似然這里要表達(dá)的就是路徑是「合法」的概率(設(shè)立合法表示可以推導(dǎo)到標(biāo)注序列的中間狀態(tài)),可以表示為:
極大似然訓(xùn)練
這里介紹一種快速計(jì)算,如果保證t時(shí)刻生成?ls?,那么整個(gè)label生成的概率是多少?首先理解一下下面式子的物理意義:
用一個(gè)圖形象表示一下,可以表示為:
這里就容易推導(dǎo)出來(lái),表示整個(gè)樣本生成的概率公式了,窮舉所有可切割位置,將他們加和到一起即可:
整個(gè)似然函數(shù)對(duì)softmax未歸一化之前的變量求偏導(dǎo)數(shù)得到(下面有鏈接詳細(xì)介紹這個(gè)推導(dǎo)過(guò)程):
梯度反向傳播的過(guò)程如下圖:
詳細(xì)的推導(dǎo):CTC最后一個(gè)公式推導(dǎo)
實(shí)現(xiàn)
tensorflow 中的ctc層:https://www.tensorflow.org/versions/r0.11/api_docs/python/nn/conectionist_temporal_classification__ctc_
參考資料
https://zhuanlan.zhihu.com/p/21775142 第一次下的論文是錯(cuò)誤的,這里有說(shuō)明。
論文:Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks
?
轉(zhuǎn)自:https://x-algo.cn/index.php/2017/05/31/2345/
總結(jié)
以上是生活随笔為你收集整理的【深度学习】语音识别之CTC算法原理解释与公式推导的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【Python】监控视频中运动目标检测的
- 下一篇: 详解随机神经网络结构搜索 (SNAS)