欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python實現(xiàn)CTC以及案例講解

 更新時間:2021年08月12日 14:23:23   作者:dhj_tsukuba  
這篇文章主要介紹了python實現(xiàn)CTC以及案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

在大多數(shù)語音識別任務(wù)中,我們都缺少文本和音頻特征的alignment,Connectionist Temporal Classification作為一個損失函數(shù),用于在序列數(shù)據(jù)上進行監(jiān)督式學(xué)習,可以不需要對齊輸入數(shù)據(jù)及標簽。

對于輸入序列 X = [ x 1 , x 2 , . . , x T ] X=[x_1, x_2, .., x_T] X=[x1​,x2​,..,xT​] 和 輸出序列 Y = [ y 1 , y 2 , . . . , y U ] Y = [y_1, y_2, ..., y_U ] Y=[y1​,y2​,...,yU​],我們希望訓(xùn)練一個模型使條件概率 P ( Y ∣ X ) P(Y|X) P(Y∣X) 達到最大化,并且給定新的輸入序列時我們希望模型可以推測出最優(yōu)的輸出序列, Y ∗ = a r g m a x Y   P ( Y ∣ X ) Y^*=\underset{Y}{argmax}\space P(Y|X) Y∗=Yargmax​ P(Y∣X),而CTC算法剛好可以同時做到訓(xùn)練和解碼。

損失函數(shù)

語音識別任務(wù)中,大多數(shù)情況下都是輸入序列長度大于文本序列長度,所以CTC算法的alignment方案也是基于將連續(xù)的幾幀輸入合并對應(yīng)到某一個輸出的token,即多對一,同時除了訓(xùn)練數(shù)據(jù)中所有的token集合,CTC還引入了一個空白token,在這里用 ϵ \epsilon ϵ 指代,他沒有實際意義并且在最終輸出序列中被移除,但這個token對生成alignment很有幫助。

CTC算法生成最終token輸出序列步驟如下:
生成和輸入序列長度相同的alignment → 合并相同token → 刪除空白token → token序列

上面步驟準確來講是解碼的步驟,解碼之前我們要訓(xùn)練模型,訓(xùn)練模型就需要損失函數(shù),或者說需要一個被優(yōu)化的目標函數(shù):

以下圖的普通RNN為例, p t ( a t ∣ X ) p_t(a_t|X) pt​(at​∣X) 是每一幀在token集合(含空白token)上的概率分布

通過每一幀的概率分布我們可以得到所有(有效)alignment的概率,最后所有alignment都可以對應(yīng)到一個輸出序列,進而也就得到所有輸出序列的概率分布。我們找到所有能夠合并到 label (Y)序列的 alignment,并將他們的概率分數(shù)相加,再取負對數(shù)就可以得到一對訓(xùn)練數(shù)據(jù)的Loss。

那么對于整個數(shù)據(jù)集,可以得到目標函數(shù) ∑ ( X , Y ) ∈ 訓(xùn) 練 數(shù) 據(jù) 集 − l o g   P ( Y ∣ X ) \sum_{(X,Y)\in 訓(xùn)練數(shù)據(jù)集}-log\space P(Y|X) ∑(X,Y)∈訓(xùn)練數(shù)據(jù)集​−log P(Y∣X),訓(xùn)練中需要將其最小化。

用暴力的方法找出所有alignment并對其概率求和效率很低,常用的算法是通過動態(tài)規(guī)劃對alignment進行合并,準確來講是一個動態(tài)規(guī)劃+DFS的算法:

為了實現(xiàn)這個算法,先引入一個中間序列 Z = ( ϵ , y 1 , ϵ , y 2 . . . , ϵ , y U ) Z=(\epsilon,y_1,\epsilon,y_2...,\epsilon,y_U) Z=(ϵ,y1​,ϵ,y2​...,ϵ,yU​),也就是在label序列的起始,中間和終止位置插入空白token,引入這個中間序列可以說是CTC算法的精髓之一,下面我們以簡單的 Y = ( a , b ) Y=(a,b) Y=(a,b) 輸出序列進行說明:

中間序列 Z = ( ϵ , a , ϵ , b , ϵ ) Z=(\epsilon,a,\epsilon,b,\epsilon) Z=(ϵ,a,ϵ,b,ϵ),長度為 S S S

輸入序列 X = ( x 1 , x 2 , x 3 , x 4 , x 5 , x 6 ) X=(x_1, x_2, x_3, x_4,x_5,x_6) X=(x1​,x2​,x3​,x4​,x5​,x6​),長度為 T T T

遞歸參數(shù) α s , t \alpha_{s,t} αs,t​ 到 t t t 時刻為止中間序列的子序列 Z 1 : s Z_{1:s} Z1:s​獲得的概率分數(shù),也就是在 t t t時刻走到中間序列第 s s s個token時的概率分數(shù)

算法整體流程如下圖所示,和原文中的圖比起來加入了具體數(shù)值,理解起來更加直觀,圖中的紅色路徑表示不能進行跳轉(zhuǎn),因為如果直接從 t = 2 t=2 t=2 的第一個 ϵ \epsilon ϵ 跳到 t = 3 t=3 t=3 時刻的第3個 ϵ \epsilon ϵ,中間的token a a a 會被忽略,這樣后面的路徑不管怎么走都得不到正確的token序列。

其他情況下都可以接受來自上一個時刻的第 s − 2 , s − 1 , s s-2,s-1,s s−2,s−1,s個token的跳轉(zhuǎn),再對圖中的節(jié)點做進一步解釋,以綠色節(jié)點為例,該節(jié)點就是 α 4 , 4 \alpha_{4,4} α4,4​ (下標從1開始),表示前面不管怎么走,在 t = 4 t=4 t=4時刻落到第4個token時獲得的概率分數(shù),也就是把這個時刻能走到 b b b 的所有alignment 概率分數(shù)加起來。那么把最后一幀的2個節(jié)點的概率分數(shù)相加就是所有alignment的概率分數(shù),即 P ( Y ∣ X ) = α S , T + α S − 1 , T P(Y|X)=\alpha_{S,T}+\alpha_{S-1, T} P(Y∣X)=αS,T​+αS−1,T​

下面直接給出dp的狀態(tài)轉(zhuǎn)換公式, p t ( z s ∣ X ) p_t(z_s|X) pt​(zs​∣X) 表示 t t t 時刻第 s s s 個字符的概率:

α s , t = ( α s , t − 1 + α s − 1 , t − 1 ) × p t ( z s ∣ X ) \alpha_{s,t}=(\alpha_{s,t-1}+\alpha_{s-1, t-1})\times p_t(z_s|X) αs,t​=(αs,t−1​+αs−1,t−1​)×pt​(zs​∣X), ( a , ϵ , a ) (a,\epsilon, a) (a,ϵ,a)或者 ( ϵ , a , ϵ ) (\epsilon,a,\epsilon) (ϵ,a,ϵ) 模式

α s , t = ( α s − 2 , t − 1 + α s − 1 , t − 1 + α s , t − 1 ) × p t ( z s ∣ X ) \alpha_{s,t}=(\alpha_{s-2,t-1}+\alpha_{s-1,t-1}+\alpha_{s,t-1})\times p_t(z_s|X) αs,t​=(αs−2,t−1​+αs−1,t−1​+αs,t−1​)×pt​(zs​∣X),其他情況

解碼

解碼問題就是已經(jīng)有訓(xùn)練好的模型,需要通過輸入序列推測出最優(yōu)的token序列,實際上就是解決 Y ∗ = a r g m a x Y   P ( Y ∣ X ) Y^*=\underset{Y}{argmax}\space P(Y|X) Y∗=Yargmax​ P(Y∣X) 這個問題,那么能想到最直接的方法就是取每一幀概率分數(shù)最高的token,連接起來去掉 ϵ \epsilon ϵ 組成輸出序列,也就是貪婪解碼:

這樣做雖然很高效但有時并不是最優(yōu)解,比如幾個概率分數(shù)較小的alignment序列最后都能轉(zhuǎn)換為相同的token序列,那么將這些較小的alignment概率分數(shù)加起來可能會大于貪婪解碼的概率分數(shù)。

常用的算法是改進版的beam search,常規(guī)的beam search是在每一幀都會保存概率分數(shù)最大的前幾個路徑并舍棄其他的,最后會給出最優(yōu)的 b e a m beam beam 個路徑,在此基礎(chǔ)上,我們在路徑搜索的過程中,需要對能映射到相同輸出的alignment進行合并,合并之后再進行beam的枝剪。

和語言模型結(jié)合

CTC最明顯的特點就是前后幀之間的條件獨立假設(shè)

缺點:不適合包括語音識別在內(nèi)的大多數(shù)seq2seq任務(wù),上下文之間的相關(guān)性會被忽略,因此經(jīng)常需要額外引入語言模型。

優(yōu)點:不考慮上下文的相關(guān)性可以使模型泛化能力更強,比如如果不考慮文本之間的相關(guān)性,用于識別日常會話的聲學(xué)模型可以直接用在會議內(nèi)容轉(zhuǎn)錄的場景中。

由于語言模型分數(shù)和CTC的條件概率分數(shù)相互獨立,因此最終的解碼序列可以寫成
Y ∗ = a r g m a x Y   P ( Y ∣ X ) × P ( Y ) α Y^*=\underset{Y}{argmax} \space P(Y|X)\times P(Y)^\alpha Y∗=Yargmax​ P(Y∣X)×P(Y)α, P ( Y ) P(Y) P(Y)表示語言模型的概率分數(shù),可以是bigram也可以是3gram,以bigram為例的話,如果當前時刻序列是 ( a , b , c ) (a,b,c) (a,b,c),計算下一幀跳到 d d d 的概率分數(shù)時,不僅要考慮下一時刻的token概率分布,還要考慮訓(xùn)練文本中 ( c , d ) (c,d) (c,d) 出現(xiàn)的頻次,即 c o u n t ( c , d ) / c o u n t ( c , ∗ ) count(c,d) / count(c,*) count(c,d)/count(c,∗),將這個概率和 d d d出現(xiàn)的概率相乘才是最終的概率分數(shù), α \alpha α 是語言模型因子,需要fine tuning。

代碼實現(xiàn)

損失函數(shù)(動態(tài)規(guī)劃+DFS)
常規(guī)beam search解碼
合并alignment的beam search解碼
加入語言模型的 beam search解碼

到此這篇關(guān)于python實現(xiàn)CTC以及案例講解的文章就介紹到這了,更多相關(guān)python實現(xiàn)CTC內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳細解讀Python的web.py框架下的application.py模塊

    詳細解讀Python的web.py框架下的application.py模塊

    這篇文章主要介紹了Python的web.py框架下的application.py模塊,作者深入分析了web.py的源碼,需要的朋友可以參考下
    2015-05-05
  • python 將numpy維度不同的數(shù)組相加相乘操作

    python 將numpy維度不同的數(shù)組相加相乘操作

    這篇文章主要介紹了python 將numpy維度不同的數(shù)組相加相乘操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python人工智能學(xué)習PyTorch實現(xiàn)WGAN示例詳解

    Python人工智能學(xué)習PyTorch實現(xiàn)WGAN示例詳解

    這篇文章主要為大家介紹了人工智能學(xué)習PyTorch實現(xiàn)WGAN的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2021-11-11
  • python numpy函數(shù)中的linspace創(chuàng)建等差數(shù)列詳解

    python numpy函數(shù)中的linspace創(chuàng)建等差數(shù)列詳解

    numpy.linspace是用于創(chuàng)建一個一維數(shù)組,并且是等差數(shù)列構(gòu)成的一維數(shù)組,下面這篇文章主要給大家介紹了關(guān)于python numpy函數(shù)中的linspace創(chuàng)建等差數(shù)列的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下。
    2017-10-10
  • python合并RepeatMasker預(yù)測結(jié)果中染色體的overlap區(qū)域

    python合并RepeatMasker預(yù)測結(jié)果中染色體的overlap區(qū)域

    這篇文章主要為大家介紹了python合并RepeatMasker預(yù)測結(jié)果中染色體的overlap區(qū)域?qū)崿F(xiàn)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Flask配置四種方式

    Flask配置四種方式

    Flask提供了多種配置方式,可以根據(jù)不同的需求和場景進行選擇,包括配置類方式、配置文件方式、環(huán)境變量方式和實例文件方式,具有一定的參考價值,感興趣的可以了解一下
    2023-11-11
  • Python3批量創(chuàng)建Crowd用戶并分配組

    Python3批量創(chuàng)建Crowd用戶并分配組

    這篇文章主要介紹了Python3批量創(chuàng)建Crowd用戶并分配組,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友可以參考下
    2020-05-05
  • 詳解Python_shutil模塊

    詳解Python_shutil模塊

    這篇文章主要介紹了Python_shutil模塊功能,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-03-03
  • selenium python瀏覽器多窗口處理代碼示例

    selenium python瀏覽器多窗口處理代碼示例

    這篇文章主要介紹了selenium python瀏覽器多窗口處理代碼示例,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Python的類實例屬性訪問規(guī)則探討

    Python的類實例屬性訪問規(guī)則探討

    這篇文章主要介紹了Python的類實例屬性訪問規(guī)則,本文總結(jié)了一些對C++和Java程序員來說不是很直觀的地方來說明Python中的類實例屬性訪問,需要的朋友可以參考下
    2015-01-01

最新評論