1) 簡(jiǎn)介
先拿語(yǔ)音識(shí)別任務(wù)來說姆打,如果現(xiàn)在有一個(gè)包含剪輯語(yǔ)音和對(duì)應(yīng)的文本良姆,我們不知道如何將語(yǔ)音片段與文本進(jìn)行對(duì)應(yīng),這樣對(duì)于訓(xùn)練一個(gè)語(yǔ)音識(shí)別器增加了難度幔戏。
為了解決上述問題玛追,我們可以先制定一個(gè)規(guī)則,例如“一個(gè)字符對(duì)于是個(gè)語(yǔ)言片段輸入”闲延。對(duì)于不同的人來說痊剖,他們說話的語(yǔ)速也不一樣,這樣導(dǎo)致了上述的定義規(guī)則不可行垒玲。另一個(gè)解決辦法邢笙,手動(dòng)對(duì)齊每個(gè)字符在音頻中的位置。這種方法對(duì)于我們訓(xùn)練模型非常有效侍匙,但是不可否認(rèn)的是這種做法非常耗時(shí)。
上面只是拿語(yǔ)音識(shí)別來舉例叮雳,其實(shí)在其他一些識(shí)別任務(wù)中也會(huì)出現(xiàn)這個(gè)問題想暗,例如手寫字符識(shí)別,上面兩例如下圖所示
Connectionist Temporal Classification (CTC)正適合這種不知道輸入輸出是否對(duì)齊的情況使用算法帘不,所以CTC適合語(yǔ)音識(shí)別和手寫字符識(shí)別的任務(wù)
為了方便下面的描述说莫,我們做如下定義,輸入(如音頻信號(hào))用符號(hào)序列X=[x1,x2,...,xT]
表示寞焙,對(duì)應(yīng)的輸出(如對(duì)應(yīng)的標(biāo)注文本)用符號(hào)序列Y=[y1,y2,...,yU]储狭,為了方便訓(xùn)練這些數(shù)據(jù)我們希望能夠找到輸入X與輸出Y之間精確的映射關(guān)系互婿。
在使用有監(jiān)督學(xué)習(xí)算法訓(xùn)練模型之前,有幾個(gè)難點(diǎn):
X和Y都是變長(zhǎng)的
X和Y的長(zhǎng)度比也是變化的
X和Y相應(yīng)的元素之間沒有嚴(yán)格的對(duì)齊(即xt與yu不一定對(duì)齊)
使用CTC算法能克服上述問題辽狈。到這里可以知道CTC就是可以解決輸入輸出對(duì)應(yīng)問題的一種算法慈参。
這里我們首先需要明確的是,還拿語(yǔ)音識(shí)別來說刮萌,現(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猜绣,字典中不同字的個(gè)數(shù)為N,那么RNN輸出的維度為T×N敬特。根據(jù)這個(gè)概率輸出分布掰邢,我們就能得到最可能的輸出結(jié)果。在接下來的討論中可以把RNN+CTC看成一個(gè)整體擅羞,當(dāng)然也可以將RNN替換成其他的提取特征算法
損失函數(shù)的定義: 對(duì)于給定的輸入X尸变,我們訓(xùn)練模型希望最大化Y的后驗(yàn)概率P(Y∣X),P(Y∣X)應(yīng)該是可導(dǎo)的减俏,這樣我們就能利用梯度下降訓(xùn)練模型了召烂。
測(cè)試階段: 當(dāng)我們已經(jīng)訓(xùn)練好一個(gè)模型后,輸入X娃承,我們希望輸出Y的條件概率最高即Y?=argmaxYp(Y∣X)奏夫,而且我們希望盡量快速的得到Y(jié)?值,利用CTC我們能在低投入情況下迅速找到一個(gè)近似的輸出历筝。
2) 算法
CTC算法對(duì)于輸入的X能給出非常多的Y的條件概率輸出(可以想象RNN輸出概率分布矩陣酗昼,所以通過矩陣中元素的組合可以得到很多Y值作為最終輸出),在計(jì)算輸出過程的一個(gè)關(guān)鍵問題就是CTC算法如何將輸入和輸出進(jìn)行對(duì)齊的梳猪。在接下來的部分中麻削,我們先來看一下對(duì)齊的解決方法,然后介紹損失函數(shù)的計(jì)算方法和在測(cè)試階段中找到合理輸出的方法春弥。
3) 對(duì)齊
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è)問題:
- 通常這種對(duì)齊方式是不合理的黄鳍。比如在語(yǔ)音識(shí)別任務(wù)中,有些音頻片可能是無聲的腿准,這時(shí)候應(yīng)該是沒有字符輸出的
2.對(duì)于一些本應(yīng)含有重復(fù)字符的輸出际起,這種對(duì)齊方式?jīng)]法得到準(zhǔn)確的輸出。例如輸出對(duì)齊的結(jié)果為[h,h,e,l,l,l,o]吐葱,通過去重操作后得到的不是“hello”而是“helo”
為了解決上述問題街望,CTC算法引入的一個(gè)新的占位符用于輸出對(duì)齊的結(jié)果。這個(gè)占位符稱為空白占位符弟跑,通常使用符號(hào)?灾前,這個(gè)符號(hào)在對(duì)齊結(jié)果中輸出,但是在最后的去重操作會(huì)將所有的?刪除得到最終的輸出孟辑。利用這個(gè)占位符哎甲,可以將輸入與輸出有了非常合理的對(duì)應(yīng)關(guān)系,如下圖所示
在這個(gè)映射方式中饲嗽,如果在標(biāo)定文本中有重復(fù)的字符炭玫,對(duì)齊過程中會(huì)在兩個(gè)重復(fù)的字符當(dāng)中插入?占位符。利用這個(gè)規(guī)則貌虾,上面的“hello”就不會(huì)變成“helo”了吞加。
回到上面Y=[c,a,t]這個(gè)例子來,下圖中有幾個(gè)示列說明有效的對(duì)齊方式和無效的對(duì)齊方式尽狠,在無效的對(duì)齊方式中舉了三種例子衔憨,占位符插入位置不對(duì)導(dǎo)致的輸出不對(duì),輸出長(zhǎng)度與輸入不對(duì)齊袄膏,輸出缺少字符a
CTC算法的對(duì)齊方式有下列屬性:
輸入與輸出的對(duì)齊方式是單調(diào)的践图,即如果輸入下一輸入片段時(shí)輸出會(huì)保持不變或者也會(huì)移動(dòng)到下一個(gè)時(shí)間片段
輸入與輸出是多對(duì)一的關(guān)系
輸出的長(zhǎng)度小于等于輸入
4) 損失函數(shù)
這里要明確一點(diǎn),對(duì)于一個(gè)標(biāo)定好的音頻片段沉馆,訓(xùn)練該片段時(shí)码党,我們希望的輸出就是標(biāo)定的文本,如下圖所示斥黑,音頻說的一個(gè)hello闽瓢,RNN或者其他模型輸出的是相同數(shù)量的向量,向量里是每個(gè)字母的概率
對(duì)于一對(duì)輸入輸出(X,Y)來說心赶,CTC的目標(biāo)是將下式概率最大化
p(Y∣X)=∑A∈AX,Y∏Tt=1pt(at∣X)
解釋一下,對(duì)于RNN+CTC模型來說缺猛,RNN輸出的就是pt(at∣X)概率缨叫,t表示的是RNN里面的時(shí)間的概念椭符。乘法表示一條路徑的所有字符概率相乘,加法表示多條路徑耻姥。因?yàn)樯厦嬲f過CTC對(duì)齊輸入輸出是多對(duì)一的销钝,例如he?l?lo?與hee?l?lo對(duì)應(yīng)的都是“hello”,這就是輸出的其中兩條路徑琐簇,要將所有的路徑相加才是輸出的條件概率
但是對(duì)于一個(gè)輸出蒸健,路徑會(huì)非常的多,這樣直接計(jì)算概率是不現(xiàn)實(shí)的婉商,CTC算法采用動(dòng)態(tài)規(guī)劃的思想來求解輸出的條件概率似忧,如下圖所示,該圖想說明的是通過動(dòng)態(tài)規(guī)劃來進(jìn)行路徑的合并(看不懂也沒關(guān)系丈秩,下面有詳細(xì)的解釋)
假設(shè)我們現(xiàn)在有輸入音頻X對(duì)應(yīng)的標(biāo)定輸出Y為單詞“ZOO”盯捌,為了方便解釋下面動(dòng)態(tài)規(guī)劃的思想,現(xiàn)在每個(gè)字符之間還有字符串的首位插入空白占位符?蘑秽,得到下面結(jié)果
Z={?,Z,?,O,?,O,?}
為了便于說明饺著,先定義好下圖的橫縱坐標(biāo)軸的含義,橫軸是XXX的時(shí)間片單位為t肠牲,縱軸為ZZZ序列單位為s幼衰。根據(jù)CTC的對(duì)齊方式的三個(gè)特征,輸入有9個(gè)時(shí)間片缀雳,標(biāo)簽內(nèi)容是“ZOO”渡嚣,P(Y∣X)的所有可能的合法路徑如下圖
α表示對(duì)齊結(jié)果合并后(如圖3.png)節(jié)點(diǎn)的概率。αs,t 表示上圖中坐標(biāo)為(s,t)節(jié)點(diǎn)的概率俏险,該點(diǎn)的概率計(jì)算分為下面兩種情況:
Case 1:
1)如果αs,t=?則αs,t只能由前一個(gè)字符αs?1,t?1或者本身αs,t?1得到
2)如果αs,t不等于?严拒,但是αs,t 為連續(xù)字符的第二個(gè),即αs=αs?2
(αs?1=?)竖独,則αs,t只能由一個(gè)空白符αs?1,t?1 或者其本身αs,t?1得到裤唠,而不能由前一個(gè)字符得到。
上述兩種情況中莹痢,αs,t可以由下式算出种蘸,其中pt(zs∣X))表示在時(shí)刻t輸出字符zs的概率。
αs,t=(α(s,t?1)+α(s?1,t?1))?pt(zs∣X)
Case 2:
如果αs,t不等于?竞膳,則αs,t可以由αs,t?1航瞭,αs?1,t?1以及αs?2,t?1得來,可以表示為
αs,t=(α(s,t?1)+α(s?1,t?1)+α(s?2,t?1))?pt(zs∣X)
從圖7中可以看到合法路徑由兩個(gè)起始點(diǎn)坦辟,輸出兩個(gè)終止點(diǎn)刊侯,最后輸出的條件概率為兩個(gè)終止點(diǎn)輸出概率的和。使用這種計(jì)算方法就能高效的計(jì)算損失函數(shù)锉走,下一步的工作表示計(jì)算梯度用于訓(xùn)練模型滨彻。由于P(Y|X)的計(jì)算只涉及加法和乘法藕届,因此是可導(dǎo)的。對(duì)于訓(xùn)練集D\mathcal{D}D亭饵,模型優(yōu)化的目標(biāo)是最小化負(fù)對(duì)數(shù)似然函數(shù)
∑(X,Y)∈D?logp(Y∣X)
5) 預(yù)測(cè)
當(dāng)我們訓(xùn)練好一個(gè)模型后休偶,我們輸入X,我們的目的是計(jì)算下式得到輸出
Y?=argmax Yp(Y∣X)
1.一種方法是貪婪算法辜羊,取RNN每次輸出概率最大的節(jié)點(diǎn)踏兜,計(jì)算方式如下
A?=argmaxA∏Tt=1pt(at∣X)
然后通過去重得到輸出結(jié)果。
通常這種啟發(fā)式的算法很有效八秃,但是這種方法忽略了一個(gè)輸出可能對(duì)應(yīng)多個(gè)對(duì)齊結(jié)果碱妆。例如[a,a,?]各自的概率均小于[b,b,b]的概率,但是他們相加的概率比[b,b,b]概率高喜德。簡(jiǎn)單的啟發(fā)是算法得到結(jié)果為Y=[b山橄,但是結(jié)果為Y=[a]更為合理∩崦酰考慮到這點(diǎn)第二種方式變的更為合理
2.第二種算法是Beam search的一種變形
先來說一下Beam search算法航棱,該算法有個(gè)參數(shù)叫做寬度,假設(shè)寬度設(shè)為3萌衬,在RNN的輸出中饮醇,該算法每個(gè)時(shí)間t輸出時(shí),不同于貪婪算法只找最高的秕豫,而是找最高的三個(gè)概率作為下一次的輸入朴艰,依次迭代,如下圖所示混移,每次t時(shí)間都是基于t-1輸出的最高三個(gè)查找當(dāng)前概率最高的三個(gè)祠墅。(這里也可以看出,當(dāng)寬度設(shè)置為1時(shí)就是貪婪算法)
因?yàn)槲覀冞@里想要結(jié)合多個(gè)對(duì)齊能夠映射到同一輸出的這種情況歌径,這時(shí)每次t時(shí)間的輸出為去重后以及移除?的結(jié)果毁嗦,具體如下圖所示
當(dāng)輸出的前綴字符串遇上重復(fù)字符時(shí),可以映射到兩個(gè)輸出回铛,如圖9所示狗准,當(dāng)T=3時(shí),前綴包含a茵肃,遇上新的a腔长,則[a]和[a,a]兩個(gè)輸出都是有效的。
當(dāng)我們將[a]擴(kuò)展為[a, a]時(shí)验残,我們只需統(tǒng)計(jì)之前以空白標(biāo)記?結(jié)尾的所有路徑的概率(位于字符中間的?也要統(tǒng)計(jì))捞附。同樣的,如果是擴(kuò)展到[a],那我們計(jì)算的就是不以?\epsilon?結(jié)尾的所有路徑概率鸟召。所以每次的輸出只需要記錄空白標(biāo)記?\epsilon?結(jié)尾的所有路徑的概率和不以?結(jié)尾的所有路徑概率來進(jìn)行下一次的概率計(jì)算想鹰。這個(gè)算法的實(shí)現(xiàn),Awni Hannun給出了示例
6) CTC的特征
1.條件獨(dú)立:CTC的一個(gè)非常不合理的假設(shè)是其假設(shè)每個(gè)時(shí)間片都是相互獨(dú)立的药版,這是一個(gè)非常不好的假設(shè)。在OCR或者語(yǔ)音識(shí)別中喻犁,各個(gè)時(shí)間片之間是含有一些語(yǔ)義信息的槽片,所以如果能夠在CTC中加入語(yǔ)言模型的話效果應(yīng)該會(huì)有提升。
2.單調(diào)對(duì)齊:CTC的另外一個(gè)約束是輸入X與輸出Y之間的單調(diào)對(duì)齊肢础,在OCR和語(yǔ)音識(shí)別中还栓,這種約束是成立的。但是在一些場(chǎng)景中例如機(jī)器翻譯传轰,這個(gè)約束便無效了剩盒。
3.多對(duì)一映射:CTC的又一個(gè)約束是輸入序列X的長(zhǎng)度大于標(biāo)簽數(shù)據(jù) YY的長(zhǎng)度,但是對(duì)于XXX的長(zhǎng)度大于YYY的長(zhǎng)度的場(chǎng)景慨蛙,CTC便失效了辽聊。