2017年12月18日 星期一

.如何用 RNN 實現語音辨識?

什麼是 LSTM RNN 循環神經網絡 (深度學習)? What is LSTM in RNN (deep learning)?



Nx Witness v3.0 - 雲端影像平台解決方案 — 


3S Market安全監控不再是只有影像掛帥。延伸的圖像、影像技術應用,如臉型、指紋的生物辨識,還有本文介紹的自然語音辨識技術,都不斷融入到安全監控的應用中……


用行話說,是「算法應用」;用時髦名詞來說,就是—— 加入人工智慧……



循環神經網路(RNN,遞歸(本文譯作循環)神經網絡),已經在眾多自然語言處理中,取得了大量的成功以及廣泛的應用。但是,網上目前關於RNNs的基礎介紹很少,本文便是介紹RNNs的基礎知識,原理以及在自然語言處理任務中是如何實現的。文章內容根據雷鋒網AI研習社線上分享影片整理而成。

在近期雷鋒網AI研習社的線上分享會上,來自平安科技的人工智能實驗室的算法研究員羅冬日,為大家普及了RNN的基礎知識,分享內容包括其基本機構,優點和不足,以及如何利用LSTM網路實現語音辨識。

羅冬日,目前就職於平安科技人工智能實驗室,曾就職於百度、大眾點評,擔任算法研究員;中國科學院研究生院碩士,主要研究方向為語音辨識,自然語言處理。

分享主題:循環神經網路(RNN)基礎

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

主要内容:

  • 普通RNN結構
    普通RNN的不足
    LSTM單元
    GRU單元
    採用LSTM實現語音辨識的例子

RNN和CNN的區別
普通卷積神經網路(CNN)處理的是「靜態」數據,樣本數據之間獨立,沒有關係。

循環神經網路(RNN)處理的數據是「序列化」數據。 訓練的樣本前後是有關聯的,即一個序列的當前的輸出,與前面的輸出也有關。比如語音辨識,一段語音是有時間序列的,說的話前後是有關係的。

總結:在空間或局部上,有關聯圖像數據,適合卷積神經網路來處理;在時間序列上,有關聯的數據適合用循環時間網絡處理。但目前也會用卷積神經網路處理語音問題, 或自然言語理解問題,其實也是把卷積神經網路的計算方法用到這上面。

RNN 的基本結構和結構展開示意圖:

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

普通RNN的不足之處

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

首先是神經網路裡面的計算,可以大致分為三類:函數合成,函數相加,加權計算。

在計算過程中,經常會用到啟動函數,比如Sigmoid啟動函數。殘差在往前傳播的過程中,每經過一個Sigmoid函數,就要乘以一個Sigmoid函數的導數值,殘差值至少會因此消減為原來的0.25倍。神經網路每多一層,殘差往前傳遞的時候,就會減少至少3/4。如果層數太多,殘差傳遞到前面已經為0,導致前層網路中的參數無法更新,這就是梯度消失。

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结
LSTM單元和普通RNN單元的區別
主要大的區別是,採用一個叫「細胞狀態(state)」的通道貫穿了整個時間序列。

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结


透過精心設計的稱作「門」的結構,來去除或增加資訊到細胞狀態的能力。

「忘記門」

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

「輸入門」的打開關閉,也是由當前輸入和上一個時間點的輸出決定的。

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

「輸出門」,控制輸出多少,最終僅僅會輸出確定輸出的那部分。

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结
所有的公式匯總:

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结
增加peephole的LSTM單元

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

讓幾個「門」的輸入數據除了正常的輸入數據,和上一個時刻的輸出以外,再接受「細胞狀態」的輸入。

GRU單元

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

它是各種變種之一,將「忘記門」和「輸入們」合成了一個單一的「更新門」,同時還混合了細胞狀態和隱藏狀態。

接下來用RNN做一個實驗,給大家介紹一個簡單的語音辨識例子:

關於LSTM+CTC背景知識

2015年,百度公開發佈的採用神經網路的LSTM+CTC模型大幅度降低了語音辨識的錯誤率。採用這種技術在安靜環境下的標準國語的辨識率接近97%。

CTC是Connectionist Temporal Classification 的縮寫,詳細的論文介紹見論文「Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks」

CTC的計算實際上是計算損失值的過程,就像其他損失函數一樣,它的計算結果也是評估網路的輸出值和真實差多少。

聲音波形示意圖

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

在開始之前,需要對原始聲波進行數據處理,輸入數據是提取過聲學特徵的數據,以幀長25ms、幀移10ms的分幀為例,一秒鐘的語音數據,大概會有100幀左右的數據。

採用MFCC提取特徵,默認情況下一幀語音數據,會提取13個特徵值,那麼一秒鐘大概會提取100*13個特徵值。用矩陣表示是一個100行13列的矩陣。

把語音數據特徵提取完之後,其實就和圖像數據差不多了。只不過圖像數據把整個矩陣,作為一個整體輸入到神經網路裡面處理,序列化數據是一幀一幀的數據放到網路處理。

 如果是訓練英文的一句話,假設輸入給LSTM的是一個100*13的數據,發音因素的種類數是26(26個字母),則經過LSTM處理之後,輸入給CTC的數據要求是100*28的形狀的矩陣(28=26+2)。其中100是原始序列的長度,即多少幀的數據,28表示這一幀數據在28個分類上的各自概率。在這28個分類中,其中26個是發音因素,剩下的兩個分別代表空白和沒有標籤。

設計的基本網路機構

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结

原始的wav文件經過聲學特徵提取變成N*13,N代表這段數據有多長,13是每一幀數據有多少特徵值。N不是固定的。然後把N*13矩陣輸入給LSTM網路,這裡涉及到兩層雙向LSTM網路,隱藏節點是40個,經過LSTM網路之後,如果是單向的,輸出會變成40個維度,雙向的就會變成80個維度。再經過全連接,對這些特徵值分類,再經過softmax計算各個分類的概率。後面再接CDC,再接正確的音素序列。

真實的語音辨識環境要複雜很多。實驗中要求的是標準國語和安靜無噪聲的環境。

如果對代碼講解(詳細代碼講解請點擊影片)感興趣的話,可以複製鏈接中的代碼:https://github.com/thewintersun/tensorflowbook/tree/master/Chapter6

運行結果如下:

平安科技罗冬日:如何用RNN实现语音识别?| 分享总结
                                                                                                                                                                                                                            

沒有留言:

張貼留言