當前位置:
首頁 > 知識 > 看矽谷數據工程師如何使用TensorFlow構建、訓練和改進RNN

看矽谷數據工程師如何使用TensorFlow構建、訓練和改進RNN

在本文中,我們提供了一個用於訓練語音識別的RNN的簡短教程,其中包含了GitHub項目鏈接。

作者:Matthew Rubashkin、Matt Mollison矽谷數據科學公司

在SVDS的深度學習研發團隊中,我們調研了循環神經網路(RNN)在探究時間序列和提升語音識別性能上的應用。現在很多產品依賴帶循環層的深度神經網路,包括谷歌、百度以及亞馬遜等公司的產品。

然而,當我們研發自己的RNN工作流程時,我們沒有發現像語音識別(利用神經網路做序列學習應用)那樣簡單而直接的案例。很多案例雖然功能強大,但是相當複雜,例如在Mozilla公共授權下Mozilla積極發展的DeepSpeech項目,太過簡單抽象,不能用於真實數據。

本文將提供一個簡短的教程,用於訓練語音識別的RNN;教程包含了全部代碼片段,你可以找到相應的 GitHub 項目。

我們正在使用的軟體,就是從這個開源項目的代碼而來。1906 Edison Phonograph advertisement(1906年愛迪生留聲機廣告)上的機器語音識別就是一個例子。

GIF/1.2M

這個視頻包含了聲音振幅的運動軌跡、提取的光譜圖及預測文本

根據以往豐富的python使用經驗,我們選擇用一個經過多年發展且非常成熟完整的軟體包:TensorFlow。開始之前,如果你對RNN還不了解,我們強烈推薦你閱讀Christopher Olah的一篇有關 RNN長短期記憶網路的綜述文章。

語音識別:音頻與轉錄

在2010年之前,語音識別模型最先進的技術是基於語音的方法,包括語音、聲學和語言模型的獨立組件。過去和現在的語音識別均依賴於利用傅里葉變換,將聲波分解成頻率和振幅,產生如下圖所示的聲譜圖。

為傳統語音識別流水線,訓練隱馬爾可夫模型(HMM)的聲學模型,需要語音+文本數據以及從詞到語素的字典。HMM是循序數據生成的概率模型,用於測量字元串差異的字元串度量標準,一般使用 Levenshtein word error distance 進行評估。

這些模型可以簡化,並能夠通過與音素轉錄對齊的語音數據變得更精確,但是這是一個乏味的人工作業。相較於word-level (詞級)副本來說,phoneme-level (音素級)副本不太可能存在大量的語音數據。

如果你想了解更多現存的開源語音識別識別工具和模型的信息,請查看我們的同事Cindi Thompson近期的文章(recent post)。

聯結主義的時序分類(CTC)損失函數

在神經網路做語音識別時,使用允許 character-level (字元級)副本預測的目標函數:聯結主義時序分類 Connectionist Temporal Classification (CTC),我們可以拋棄音素的概念。

簡單來說,CTC能夠計算多序列的概率,這裡的序列是指所有可能的語音樣本 character-level (字元級)副本集合。網路運用目標函數,讓字元序列的可能性最大化(即選擇概率最大的副本),並計算預測結果(相對於實際副本的)誤差來更新network weights(網路權值)。

值得注意的是,CTC損失函數使用的character-level(字元級)誤差不同於傳統語音識別模型通常使用的Levenshtein word error distance。對於字元產生的RNN模型而言,字元與詞的編輯距離在語音語言(例如 Esperonto 和 Croatian)中是相似的,語音語言中不同的聲音有不同的字元。相反,對於非語音語言(例如英語),字元和單詞的誤差會非常不一樣。

如果你想了解更多關於CTC的內容,有很多論文和博文可查。我們將使用TensorFlow的CTC實現,也會繼續研究和改進與CTC相關的各種實現,例如這篇來自百度的文章。為了利用傳統語音識別或者深度學習語音識別模型演算法,我們的團隊為模塊化和快速原型設計搭建了語音識別平台:

數據的重要性

毫無疑問,創建一個語音轉文字表述的系統需要(1)數字音頻文件和(2)文字的副本。因為模型應該適用於解碼任何新的語音樣本,所以系統中我們能夠訓練的樣本越多,模型的表現就會越好。

表格展示了這些數據的具體信息包括總時長,採樣率和注釋

為了方便使用數據源的數據,我們把所有數據存成扁平格式。每個數據的扁平格式都有一個單一的「.wav」文件和「.txt」文件。

例如,你可以在我們的 Github 項目中找到 Librispeech 訓練數據集中的 「211-122425-0059」 數據對應文件:211-122425-0059.wav 和 211-122425-0059.txt。

這些數據文件名稱使用一個數據集對象類載入到 TensorFlow 圖中,這樣會幫助TensorFlow有效載入和處理數據,並且將獨立的分片數據從 CPU 載入到 GPU 內存中。下面展示的是數據集對象中數據領域的一個例子:

特徵表示

為了讓機器識別語音數據,首先必須將這些數據從時域轉化到頻域。這有好幾種方法來創建語音的機器學習特徵,例如通過任意的頻率分級(例如,每100赫茲),或者通過使用人耳能夠聽到的頻率波段分級。

這種典型的以人為中心的語音數據轉換是計算梅爾頻率倒譜係數(MFCC),有13或者26種不同的倒譜特徵,可以作為這種模型的輸入。經過這種轉換,數據被存儲在一個頻率係數(行)隨時間(列)的矩陣中。

因為語音不會孤立地產生,並且也沒有與字元的一一映射,我們可以通過在當前時間之前和之後捕獲聲音的音頻數據重疊窗口(10 毫秒)上訓練網路來捕捉共同作用的影響(一個聲音影響另一個聲音的發音)。下面是如何獲取 MFCC 特徵,和如何創建音頻數據的窗口的示例代碼如下:

對於我們的 RNN 示例來說,我們使用之前的9個時間分片和之後的9個時間分片,每個窗口總攻19個時間點。倒譜係數26的情況下,每 25 毫秒會有 494 個數據點。依賴於數據的採樣率,我們建議對於 16000 赫茲使用 26 個倒譜特徵, 8000 赫茲使用 13 個倒譜特徵。如下是在 8000 赫茲數據上數據載入窗口的示例:

關於 RNN 的語音識別從轉換模擬聲音到數字聲音,如果你想了解更多,可以查看 Adam Geitgey 的機器學習博客。

語音的序列性建模

長短時記憶(LSTM)層是一種循環神經網路(RNN)結構,用來對有長程依賴的數據進行建模。這對時間系列的數據非常重要,因為它們從根本上記住了當前時間點的歷史信息,這個歷史信息影響結果的輸出。

這種上下文對語音識別來說是有效的,因為它的時態特徵。如果你想要知道 TensorFlow 中 LSTM 單元是如何實現的,下面展示了深度語音啟發的雙向神經網路(BiRNN)中 LSTM 層的示例代碼。

關於這種網路結構的詳細信息,有些非常好的關於 RNN 和 LSTM 如何工作的概述。此外,還有關於替代使用 RNN 進行語音識別的研究,如相比 RNN 計算使用卷積層會更加高效。

網路訓練與監控

我們使用Tensorflow訓練網路,這樣既可以顯示計算圖,也可以使用 TensorBoard從web門戶網站上花很少的額外精力來監視訓練 、驗證以及測試性能。運用Dandelion Mane在2017年Tensorflow發展峰會上做的精彩演講(great talk )中提到的技巧,我們使用tf.name_scope來增加節點和層名,並將總結寫到文件中。

這樣做的結果是自動生成的、可理解的計算圖,例如下面的例子——雙向神經網路(BiRNN)。數據在左下方到右上方的不同操作間進行傳遞。為清晰起見,可以為不同的節點做標註,並使用命名空間對節點進行著色。在本實例中,青色的『fc』盒子對應全連接層,而綠色 的 b 和『h』盒子分別對應偏移量和權重。

我們使用TensorFlow提供的 tf.train.AdamOptimizer (Adam優化器)來控制學習率。AdamOptimizer通過使用動量(moving averages of the parameters(參數的移動平均值))在傳統梯度下降法上有了改進,這促進了超參數的有效動態調整。我們可以通過創建標籤錯誤率的摘要標量來跟蹤損失和錯誤率:

怎樣改進RNN

既然我們已經創建了簡單的LSTM RMM網路,那麼,我們怎麼來降低錯誤率呢?對於開源社區來說,幸運的是,很多大公司都公布了他們性能最佳的語音識別模型背後的數學模型。

2016年9月份 ,微軟在 arXiv上發表了一篇論文,該文描述了他們是怎樣在NIST 200 Switchboard數據上獲得6.9%的錯誤率的。他們在卷積+遞歸神經網路頂端使用了幾種不同的聲學和語言模型。微軟團隊和其他研究院在過去4年里所做的幾項關鍵改進包括:

在基於RNNs的字元頂端使用語言模型

使用卷積神經網路(CNNs)從音頻中提取特徵

集合利用多個RNNs的模型

值得注意的是,在過去幾十年的傳統語音識別模型中起先鋒作用的語言模型,再次證明其在深度學習語音識別模型中也是有價值的。

改進來自:A Historical Perspective of Speech Recognition, Xuedong Huang, James Baker, Raj Reddy Communications of the ACM, Vol. 57 No. 1, Pages 94-103, 2014

訓練你的第一個RNN

我們提供了一個 GitHub項目(GitHub repository),該項目的腳本提供了一個用RNNs和CTC損失函數(在TensorFlow中),訓練端到端語音識別系統的簡單易行執行方案。GitHub庫中包含了來自LibriVox 語料庫(LibriVox corpus )示例數據,這些數據被分為如下幾個文件夾:

訓練:train-clean-100-wav(5個示例)

測試:test-clean-wav(2個示例)

Dev: dev-clean-wav (2個示例)

當訓練這幾個示例時,你會很快注意到訓練數據會過度擬合(overfit),使得錯詞率(WER)約為0%,而測試集和Dev數據集的WER大約能達到85%。測試錯誤率之所以不是100%,是因為在29個可能的字元選擇(a-z,省略號,空格鍵,空白),網路將很快學習到:

某些字元(e,a,空格鍵,r, s, t)更常見

輔音-母音-輔音在英語中是一種模式

MFCC輸入聲音特徵增加的信號幅度對應著字元a - z

在GitHub庫中使用默認設置做訓練,運行結果如下圖所示:

如果你想訓練一個高性能模型,你可以在這些文件夾中添加額外的.wav和.txt文件,或者創建一個新的文件夾,並更新`configs/neural_network.ini` 以及文件夾位置。值得注意的是,即使有強大的GPU,在僅僅幾百個小時的音頻上做處理和訓練也需要非常大的計算能力。

本期雷鋒字幕組志願者

雷鋒字幕組志願者是一群有想法的大數據專家、程序員 / 工程師、產品經理、產品運營、IT 諮詢人。

他們來自南卡羅來納大學、早稻田大學、港大、清華、北大、中科院等海內外高校研究所及 IBM、AVL、Royal bank of canada、阿里巴巴等知名企業。

新人福利

【超過 1000G 神經網路/AI/大數據、教程、論文!】

福利二:本周內(截止至 7 月 30 日晚 24 點)

本公眾號本周發布的所有文章

在文章底部留言評論,獲得最多贊的社友,

社長將送出花書(《深度學習》Ian Goodfellow)1 本

昨天的獲獎同學是Derek陳

周一社長就會把獎品寄出!

話題討論

你平時的碎片時間都用來幹什麼?

看小說?聽歌?背單詞?

歡迎在評論區交流討論

AI 研習社

點這個,阿法狗已成過去式,來看看 AI 領域的新突破!

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

讓AI給顏值打分?應該是最公正的裁判了!
GAN 的理解與 TensorFlow 的實現
GAN 學習指南:從原理入門到製作生成 Demo,總共分幾步?
CVPR 2017 精彩論文解讀:顯著降低模型訓練成本的主動增量學習
七步即可學會R語言,從此數據分析不再怕!

TAG:唯物 |

您可能感興趣

使用TensorRT集成加速TensorFlow推理
一文詳解如何使用Python和Keras構建屬於你的AlphaZero AI
一文詳解如何使用Python和Keras構建屬於你的「AlphaZero AI」
使用CoreRT將.NET Core發布為Native應用程序
CodeWarrior IDE使用Tips-使用burner將elf文件轉換生成HEX和BIN文件的方法和步驟詳解
Windows、macOS和Linux三大操作系統使用體驗比較
NET Core使用swagger進行API介面文檔管理
使用Docker和Elasticsearch搭建全文本搜索引擎應用
使用TensorFlow,Kafka和MemSQL進行實時機器學習
使用Visual Studio Code編譯、調試Apollo項目
教程 | 如何使用Docker、TensorFlow目標檢測API和OpenCV實現實時目標檢測和視頻處理
使用 Visual Studio Code 搭建 C/C+開發和調試環境
使用Node、Coinbase、比特幣和Okta構建自己的結賬服務
Arcona使用區塊鏈和AR創建內容,UNLTD聯手Unity打造VR體驗
如何使用TensorFlow中的Dataset API
如何使用Docker、TensorFlow目標檢測API和OpenCV實現實時目標檢測和視頻處理
新版本 Nike Air Presto「The Ten」諜照曝光,設計師使用 Supreme 單品打造沙發 | HB Daily
Python之Sklearn使用教程
AI 框架使用排行:TensorFlow、Scikit Learn、IBM Watson、Spark-MLib、Keras
新版本 Nike Air Presto「The Ten」諜照曝光,設計師使用 Supreme 單品打造沙發