日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

【深度学习】语音识别之CTC算法原理解释与公式推导

發布時間:2025/3/21 pytorch 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【深度学习】语音识别之CTC算法原理解释与公式推导 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

不搞語音識別得人開這個論文確實有點費勁,結合上圖,思考一下語音識別的場景,輸入是一段錄音,輸出是識別的音素, 輸入的語音文件的長度和輸出的音素個數之間沒有一一對應關系,通常將語音文件「分片」之后,會出現多對一的關系。這個場景在「翻譯問題」和「OCR問題」中也普遍存在。

本文的特點是,提出來一種end-to-end的方法,直接將語音轉問音素。不需要添加規則/后處理等過程。

文章目錄?[隱藏]

  • 1?幾個定義
  • 2?構造分類器
  • 3?解碼方法
    • 3.1?Best path decoding
    • 3.2?prefix search decoding
  • 4?網絡訓練
    • 4.1?前向后向算法
    • 4.2?似然函數
      • 4.2.1?序列的似然
      • 4.2.2?路徑的似然
  • 5?極大似然訓練
  • 6?實現
  • 7?參考資料

幾個定義

損失函數定義為平均編輯距離:

一種路徑的概率為:

?

在現實之中,多個路徑會對應一個正確的序列,并且這個序列長度往往小于路徑長度,那么序列最終的概率可以使用路徑的概率之和表示:

構造分類器

讓我們再確定一下我們的目標,我們的目標是通過輸入序列?x得到輸出序列?y,如果我們可以獲得輸出序列的分布?p(I|x),選擇其中概率最大的那一個作為「輸出序列」即可。這個邏輯可以通過下面公式表示:

解碼方法

這里介紹兩種解碼方法,解碼是對path的分布進行的,輸入為path的分布,輸出為最終的序列。作者也沒有找到比這兩種更好的方法了。

Best path decoding

按照上面思路,需要找到序列?I 的所有路徑的概率,一種簡化的方式是:找到路徑中概率最大的,然后其對應的序列?I 就是最優序列,這個方法被稱為「Best path decoding」。

這個方法相當于是假設,最優序列的最優路徑也是全局最優的(最優表示概率最大),形式化表示為:

prefix search decoding

接著介紹第二種方法,「prefix search decoding」是一種剪枝的算法,剪枝主要在兩個方面,一是同路徑不重復計算,二是不可能狀態不再搜索,下圖中第一層的Y不搜索就是因為同層的X和下層的Y概率都比他高。

這個方法是一種比較好的啟發式搜索的方法。

網絡訓練

上面兩種方式都是在模型已經訓練出來,得到path概率分布之后的解碼過程,那么如何訓練一個網絡,可以更好的預測path分布(即進行編碼)呢?

首先這是一個有監督的過程,我們的輸入是分片之后的語音文件, 輸出是長度沒有限制的音素序列。

前向后向算法

既然要訓練,就要有「損失」,損失是定義預估的Label和正確的Label之間的「距離」,所以我們是希望每一條樣本得到的path都可以有較高的概率生成其對應的Label。

對一條樣本來說,如果給定了path如何確定生成當前樣本的label(最終序列)的概率呢?根據定義,需要窮舉所有可以生成正確label的path的概率,最后加到一起,這個計算量最差情況是「指數」級別的,這里可以使用類似HMM中的動態規劃的方法,將時間復雜度變為?O(T?|L|) ;其中?T 表示輸入序列長度,?|L| 表示輸出Label長度。接下來就是如何巧妙地定義狀態和尋找動態轉移方程。

狀態定義為:

為了實現end-to-end的訓練,空格可能出現在任何兩個音素之間,所以需要將原始的Label中每一個音素之間添加一個「元素」,這個「元素」可以為NULL和空格(blank)。仔細體會這個修改,對理解后面過程很重要。

理解動態轉移方程之前,需要強調幾個點:

  • 我們的目標是根據所有的路徑(path)計算出來一個長度為?2|L|+1 的Label,即?L′生成(解碼)的概率
  • path中每一個片段的內容為:音素、NULL、空格,其中每一個都可以連續出現多個
  • 序列?L′中,也是包含三種內容:「音素、NULL、空格」,但是有一些約束,例如下面模式不能出現:「...,音素x,NULL,音素x,...」,因為相同的音素如果是緊挨著肯定是需要合并的。

狀態轉移方程:

其中虛線的轉移,需要滿足條件,具體為:如果當前狀態label為空格或相鄰兩個音素一樣(中間必有空格),就不能轉移。

似然函數

序列的似然

讓我們回憶一下似然函數的定義,簡單來說就是「觀測到的樣本生成的概率」。在我們現在的場景, 對一條樣本來說,觀測到的是一個序列,如果認為序列中的元素是相互獨立,似然函數可以表示為:

路徑的似然

路徑的似然假設路徑的每一個輸出都是相互「獨立的」,結合似然的定義,似然這里要表達的就是路徑是「合法」的概率(設立合法表示可以推導到標注序列的中間狀態),可以表示為:

極大似然訓練

這里介紹一種快速計算,如果保證t時刻生成?ls?,那么整個label生成的概率是多少?首先理解一下下面式子的物理意義:

用一個圖形象表示一下,可以表示為:

這里就容易推導出來,表示整個樣本生成的概率公式了,窮舉所有可切割位置,將他們加和到一起即可:

整個似然函數對softmax未歸一化之前的變量求偏導數得到(下面有鏈接詳細介紹這個推導過程):

梯度反向傳播的過程如下圖:

詳細的推導:CTC最后一個公式推導

實現

tensorflow 中的ctc層:https://www.tensorflow.org/versions/r0.11/api_docs/python/nn/conectionist_temporal_classification__ctc_

參考資料

https://zhuanlan.zhihu.com/p/21775142 第一次下的論文是錯誤的,這里有說明。

論文:Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks

?

轉自:https://x-algo.cn/index.php/2017/05/31/2345/

總結

以上是生活随笔為你收集整理的【深度学习】语音识别之CTC算法原理解释与公式推导的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。