1. 程式人生 > >語音識別 - 損失函數

語音識別 - 損失函數

分幀 學校 混合高斯 dnn 變化 是我 數據 變換 span

  來學校已經快一個月了,看語音識別依然有些吃力,HMM,GMM,DNN似懂非懂,也許多一些實踐和時間,會慢慢好一些。最近終於對一個很小的知識點有一些理解,趕緊寫下來,也算是一個月以來有了一些小小的成果。難免有錯,熱烈歡迎噴我,會及時改正!

  ---------------------------------------------------

  語音識別的模型訓練當中,損失函數是一個經常出現的概念,那麽什麽是損失函數,是用來幹什麽的呢?

  理解一個東西,搞清楚脈絡,對於理解是很有好處的,所以從頭開始說。

  語音識別的大致過程是這樣的(並不是很準確,按照個人理解)。語音信號按照音素識別,因此先對信號分幀,同時加窗處理,然後進行頻域轉換,再提取語音信號的特征,最後將特征輸入識別模型得出結果。

  語音信號是一種短時平穩長時時變的信號,一般的認為語音信號在 20ms - 30ms 左右可以認為變化很小,這樣切分出來的一小段語音,微觀上變化很大,大概就可以標示一個音素,而宏觀上幾乎沒有變化,這一過程就是分幀。我們平時錄音時候看到最多的那種形式是語音信號的時域表現形式,語音識別的單位並不是一個單詞,更多使用的是音素。我們可以按照這種類似於積分的思想來處理語音信號,音素在語音信號中是一段非常短的信號區域。當然分幀並不是簡單的切分,為了保證信號平滑和方便處理,幀與幀之間會有重疊。同時還會對信號進行加窗處理

  時域信號的表現其實並不利於我們的處理並提取需要的信號特征,因此我們利用短時傅裏葉變換,將時域信號抽取頻率特征,轉化成頻域信號

,這一個過程同時也是一個降維過程。至此,信號的特征提取變得比較容易。但是我們對語音信號的識別並不是直接識別語音信號,而是統一的提取信號裏面的一部分特征,這樣不僅降低維度便於處理,而且輸入識別模型的數據是統一的,提取特征的方法一般是MFCC(梅爾倒譜系數),具體內容可以參見網絡上大神帖子,講的非常好,這裏不深究,只需要知道這是一種提取語音信號特征的方法。至此語音信號由一串不規則的波形,變成了一個 M*N 的矩陣,表示提取了 M 種特征,語音信號被分成了 N 幀,每一幀作為矩陣的一列。

  至此語音識別的準備工作就做好了大部分,下面就開始識別模型。模型暫時可以簡單看作是一個函數,把上面的 M*N 矩陣輸入到模型,經過模型的處理,就能輸出結果。當然一般情況下,並不是我們認為的輸入語音信號就直接得出文字,語音模型的輸出一般會是一個概率,模型的輸入假設有 M 個節點,輸出有 K 個節點,每個輸出節點代表一個音素,而節點輸出的值是一個概率,當概率超過一定的閾值,就認為當前節點所代表的的音素被選中。

  那麽問題來了,模型是怎麽來的?模型既然可以看做一個函數,那麽函數裏面的參數又是怎麽來的?模型和模型參數,都是使用大量的訓練數據訓練得來的。

  那麽訓練之前,模型的參數是怎麽來的,他又是怎麽通過訓練,慢慢得到一個合適的參數,用於真正的語音識別呢?這裏就用到的損失函數的概念。

  語音識別的模型有很多,以前很多使用的隱馬爾科夫模型(HMM),混合高斯模型(GMM),現在很火的深度神經網絡(DNN),卷積神經網絡(CNN)等。這些模型裏面都有參數。其實一開始在訓練模型之前,我們只是對參數進行很簡單的隨機初始化。作為訓練數據,數據輸入到模型,我們其實是預先知道應該輸出什麽結果的,而實際上對於一個參數是隨機初始化的模型,輸出結果總是不會完全正確的,那麽實際數據結果和應該輸出的結果之間的差距(或者說距離),就可以看做是一種度量,度量我們的初始化參數是不是合適,這種距離就可以用損失函數來表示。

  所以總結一下,損失函數並不神秘。就像我們一開始學習方程一樣,一開始我們並不知道方程到底是個什麽東西,後來慢慢的知道方程並不神秘,原來方程就是一個等式,只不過這個等式裏面有未知數。損失函數也是這樣,它就是一種度量,用於表示當前參數下的模型與我們理想的模型到底有多大的差距,以便對模型參數進行合適的調整,下一次輸入訓練數據,還會有一個輸出,這個輸出與預計結果的差距仍然用損失函數度量,依據這一次 的損失函數,再一次調整參數大小。經過很多次循環,實際輸出與預計結果的差距不斷縮小,我們的模型也就越來越好,直至可以用於實際,用來識別測試數據。

  

語音識別 - 損失函數