從鍋爐工到AI專家(11)(END)

語音識別

TensorFlow 1.x中提供了一個語音識別的例子speech_commands,用於識別經常使用的命令詞彙,實現對設備的語音控制。speech_commands是一個很成熟的語音識別原型,有很高的正確率,除了提供python的完整源碼,還提供了c/c++的示例程序,方便你移植到嵌入設備及移動設備中去。
官方提供了關於這個示例的語音識別教程。不過實際就是一個使用說明,沒有對代碼和原理作過多解釋。
這個程序相對前面的例子複雜了不少,總體結構、代碼、算法均可以當作範本,我以爲我已經沒有資格象前面的講解同樣隨意在代碼中註釋和指手畫腳。所以建議你們把這個例子當作參考資料,有興趣也有能力的,本身去閱讀一下代碼來研究。你碰到最多的困難不會來自機器學習算法,而是程序結構、音頻處理等方面。html

下面結合我學習的過程對官方教程作一個補充,相信會方便你的入手。
建模部分(models.py)是這個示例的主體,create_model()是主要的入口函數,提供了四種算法來創建語音識別模型,分別是:single_fc(全鏈接神經網絡)/ conv(卷積)/ low_latency_conv(低延時卷積)/ low_latency_svdf(低延時二維奇異值分解)。
低延時算法的實現主要是作了一些權衡,好比去掉池化層來加快計算速度。構成模型的大量基礎運算中,咱們只有SVDF算法沒有用到過。
不過SVDF在實現中,也是使用conv1d配合標準的全鏈接fc層運算來實現的。SVD是在音頻降噪算法中常常用到的,中文名字叫作「奇異值分解」。SVDF沒有搜到合適的翻譯名,咱們暫用它的實現原理叫作「二維奇異值分解」吧。從網上搜到的資料看,這種算法對於過濾信號矩陣中噪音數據比較有效。
因此從總體上說,以咱們當前對機器學習的知識,讀懂這個程序問題不大。
input_data.py是屬於下載、解壓縮、預處理、生成訓練集的輔助工具庫,看命名就是TensorFlow的風格:),我以爲在國內學習這個示例最大的難度就在語音樣本庫的下載上,1.49G的壓縮包,通常的FQ手段都不夠用了,但願你好運。
訓練用的主程序是train.py,其中預置了大量的命令行參數進行各類設定,好比數據包路徑、訓練數據保存路徑、採用的識別算法等,大多參數都已經有預設值。若是你的電腦足夠快,直接使用官方的指導直接運行就能夠。我是手工下載數據包,在當前目錄下創建speech_commands_train/ speech_dataset/ retrain_logs/三個文件夾,隨後將數據放入speech_commands_train文件夾。隨後在當前目錄使用下面命令來開始訓練,這樣能夠避免在長時間的運行中意外重啓之類的丟失數據:python

python train.py --summaries_dir=./retrain_logs --train_dir=./speech_commands_train --data_dir=./speech_dataset/

訓練主程序中還用了一個小技巧,程序默認是前15000個批次使用梯度0.001進行訓練,後3000個批次使用梯度0.0001進行訓練,這種方式既保證了精度,又盡力提升了學習速度,仍是很值得參考的。c++

不算數據包下載的時間,訓練模型在16G/8核16線程的服務器(服務器的意思也是指顯卡很渣)上耗費了接近12個小時。最後生成的數據包並不大,只有3.6M。
訓練結束時會在屏幕上顯示一個Confusion Matrix,矩陣的主軸表明對所選擇訓練單詞的擬合度,應當明顯高於矩陣的其它位置元素。這個矩陣每次運行的結果都會特徵一致、取值不一樣,因此這裏就不貼圖了。
train.py還有不少參數值得你提早看一下作一個瞭解,好比下載的語音庫實際上包含不少個經常使用單詞,主要是涵蓋在智能家居範疇。而程序默認識別的只有10個(yes,no,up,down,left,right,on,off,stop,go)。
訓練中,原始的語音庫會解壓在speech_dataset中,每一個單詞一個文件夾,其中放置大量wav文件,每一個文件時長1秒,下載的語音庫原始壓縮包在這個路徑也會被保存一份。最終訓練結果保存在speech_commands_train目錄。另一個則是事件日誌文件,能夠掛上TensorBoard來作模型分析。
由於訓練結果最經常使用的場景是智能家居中,而智能家居方案無論是使用嵌入式電腦仍是手機作控制,都具備頗有限的存儲能力。因此TensorFlow的最終訓練結果會進一步壓縮併合併爲一個文件,實際最終使用一個訓練結果文件和一個標籤文件就能夠工做。因此測試正常後,其它的數據集均可以手工刪除(原始程序默認是在tmp目錄保存數據,可讓系統自動刪除)。壓縮數據文件的方式是:git

python freeze.py --start_checkpoint=speech_commands_train/conv.ckpt-18000 --output_file=./frozen_graph.pb

./frozen_graph.pb就是最終生成的壓縮版文件,大概3.5M。另外注意若是你修改了訓練步長,那上面最終保存的結果文件名也會不一樣,請注意選擇正確的文件。
使用的時候,首先是使用錄製語音成爲wav文件,具體你是用現成的工具錄製仍是本身編程序錄制是你的事情。隨後用下面命令來識別(wav樣例是採用語音庫中隨機選擇了一個文件):程序員

python label_wav.py --graph=frozen_graph.pb --labels=speech_commands_train/conv_labels.txt --wav=speech_dataset/yes/03c96658_nohash_0.wav 
yes (score = 0.98647)
left (score = 0.00962)
_unknown_ (score = 0.00312)

識別結果顯示,是單詞yes的可能性98.6%。
官方還提供了label_wav.cc的c++源程序,能夠應用到更普遍的識別場合。
由於實際上若是你不是作算法研究,對這個程序最大的用途反而是把識別客戶端移植到各個環境,訓練嘛,反正是用戶看不到的後臺,就無所謂了。所以我建議你好好讀讀label_wav.py的代碼,這個程序小巧耐看,加上註釋都沒有超過150行,毫不會有讀不懂的可能。github

機器翻譯

做爲世界上最重視英語的非英語母語大國,機器翻譯在中國的歷史可說久遠,不過惋惜至今,最強大的機器翻譯實現仍然被Google霸佔。Google的在線翻譯已經能夠提供超過100種語言的全文互譯,在多個嚴苛的評測中,其翻譯的可讀性得分也是最高的。
幸福的是,基於TensorFlow的Google翻譯引擎NMT(Neural Machine Translation 神經機器翻譯)也開源了。
官網的文檔對NMT的主線算法Seq2Seq(序列到序列)原理講解比較細緻,在機器學習的實現上較多的採用了LSTM神經網絡,這在上一篇咱們剛剛用過,你確定不陌生。若是讀英文有困難,《如何使用TensorFlow構建本身的神經機器翻譯系統》是一篇優秀的譯文,值得一看。在其中,咱們前面講過的單詞向量化、LSTM對語義模型的理解都逐一用到。
NMT項目的testdata中是使用的示例性訓練數據集,能夠看到在對於原始語素的標註上可說異乎尋常的簡單。前面說過,數據集就是錢啊,機器學習項目最大的投資每每是在數據的獲取上,對標註要求的簡化,就是對項目資金的大量節省。而算法能力的提升,又是達成這種能力的前提。
能夠說人工智能的進步,一個方向是對算法更深刻的研究,另外一個則是對大量數據的掌控。
注意力機制也是這個項目中的一個重點,在這裏有一個注意力算法的實際實現。這種機制在不少機器學習項目中都有應用,是提升機器學習效率和準確率的有效手段之一。
NMT的使用在官方文檔中有介紹,這裏再彙總一下:算法

  1. 下載源碼
git clone https://github.com/tensorflow/nmt/
  1. 下載官方推薦的語料庫樣本,這個語料庫來自於TED演講,是越南語和英文的翻譯語料庫:
cd nmt
mkdir nmt_data
nmt/scripts/download_iwslt15.sh ./nmt_data

這裏跟官方文檔稍有不一樣,官方是下載到tmp目錄,而咱們老是在下載上浪費大量時間,因此下載到當前路徑並保存以供複用。編程

  1. 訓練帶有注意力機制的翻譯模型(官方文檔中的中級部分)
mkdir nmt_model
python -m nmt.nmt \
    --src=vi --tgt=en \
    --vocab_prefix=./nmt_data/vocab  \
    --train_prefix=./nmt_data/train \
    --dev_prefix=./nmt_data/tst2012  \
    --test_prefix=./nmt_data/tst2013 \
    --out_dir=./nmt_model \
    --num_train_steps=12000 \
    --steps_per_stats=100 \
    --num_layers=2 \
    --num_units=128 \
    --dropout=0.2 \
    --metrics=bleu

參數不少,解釋請看官方文檔。
上面語句是從越南文到英文的翻譯,把--src和--tgt的參數互換能夠訓練從英文到越南文的翻譯模型。bash

  1. 用訓練好的模型進行翻譯(算法中叫推理inference)
    首先拷貝一段越南文文本,這裏使用下載的tst2013演講文稿:
cp ./nmt_data/tst2013.vi /tmp/my_infer_file.vi

翻譯:服務器

python -m nmt.nmt \
    --out_dir=./nmt_model \
    --inference_input_file=/tmp/my_infer_file.vi \
    --inference_output_file=./nmt_model/output_infer

查看翻譯的結果:

cat ./nmt_model/output_infer

翻譯的效果其實看訓練過程當中的輸出會更有直觀印象,由於其中是越南文原文、英文對照和NMT的翻譯結果3行對照輸出的,這裏摘兩行例子:

src: Bạn có biết bạn thực hiện bao nhiêu sự lựa chọn trong 1 ngày ?
    ref: Do you know how many choices you make in a typical day ?
    nmt: Do you know how much choices you do in a day ?
    
    src: Có người nói với chúng tôi rằng như bình thường , để xây dựng lên một phần mềm sẽ phải mất ít nhất 2 năm và tiêu tốn khoảng hai triệu đô-la .
    ref: We were told afterward that if that had gone through normal channels , it would have taken at least two years and it would have cost about two million dollars .
    nmt: There 's a man who says to us that as usual , to build the software , to take the least two years , and the cost of the two million dollars .

樣本量所限,翻譯結果也就是有那麼些意思吧。數據才永遠是核心啊。

TensorFlow剩下的那些話題

咱們不斷的重複,機器學習本質就是以數學爲表明的最新成就在計算機算法上的展示,所以TensorFlow也好,Matlab/Octave也好,全部的機器學習軟件包,都具有很是強悍的數學計算能力。
所以除了前面講到的這些,用TensorFlow解決數學問題也很是有優點。
官方提供的教程中,後續還有兩個這方面的應用,由於與本課程的定位相關性比較弱,建議有興趣的讀者去官方的教程學習。喜歡看中文的讀者也能夠參考TensorFlow中文社區的翻譯版本。
TensorFlow中文社區:曼德布洛特(Mandelbrot)集合
TensorFlow中文社區:偏微分方程

此外就是TensorFlow的應用方面的特徵,也就是官方教程中的進階部分。這裏面咱們只講解了很是必須的TensorBoard。
其它的部分,好比隊列、線程、GPU計算,也很是重要。可是在你的學習階段能夠先不關注,等到項目正式成型,進入產品研發的階段,相信隨着原型設計階段對TensorFlow的使用,你已經比較熟悉了,抽上很短的時間看看就能讓你用起來。並且這部分官方的教程已經很好了,我也作不到錦上添花:)

他山之石

TensorFlow的確是很是優秀的機器學習框架,上手很是容易,資源豐富,效率也很是高。
可是其它的競爭軟件包也一直在努力,而且每每有本身的獨到之處。

OpenCV 是我原來常常用的一款軟件包,開源免費,所有由c/c++寫成,效率超高。
OpenCV最初定位是「計算機視覺」,在這方面走的很遠,內置了不少功能能夠直接對照片、視頻、攝像頭等進行處理。這種內置可比python利用第三方軟件包完成的功能更易用,徹底是一體的感受。咱們曾經提到過cv2這個python的擴展包,這實際就是使用python調用OpenCV的接口方式。
因此有一些圖像識別類的算法在OpenCV上的實現更早、更新更快。好比AR中的物品追蹤、人像識別,OpenCV的實現和TensorFlow的實現基本一樣是社區的貢獻,但OpenCV的版本由於更新更快,每每有更強的功能。
例如對某個物體的識別,機器學習的思路咱們應當很熟悉了,須要不少已標註的樣本,通過調優、訓練完成模型,就能夠用來進行識別。可是在不少狀況下,你根本沒有這麼多的樣本。OpenCV一樣可使用「人工智能」的某些非「機器學習」範疇的方式,不用不少樣本也一樣能夠作到物體的識別追蹤。這些其實已經不是TensorFlow不足,而是「機器學習」在這些方面的不足。
與此相似,不少圖像預處理的工做也常常習慣先用OpenCV作一遍。並非說python利用擴展庫沒法完成,而是由於更方便。
在本博中有幾篇博文,展現了使用OpenCV在圖像處理方面的優點,有興趣的也能夠去看看,體驗一下我說的「方便」。

Octave 這個軟件包和它模仿的商業版本Matlab咱們已經一再說起了,非學術界的純粹程序員大多都有點小看它,實際上不少時候,配合上強悍的數學公式,這個軟件包能作到的事情每每出人意料。
我收藏有一個吳恩達介紹的公式,僅用一行代碼解決「雞尾酒會問題」。
這個問題是指,在相似雞尾酒會這種人多、嘈雜的環境下,有兩個麥克風。其中一個麥克風附近,有人在對話;另一個麥克風附近,是一個小提琴手在演奏。
若是是真實的人類的話,大腦會本能的、自動的過濾掉背景嘈雜的聲音,從中選取本身想聽到的資訊。
而「人工智能」處理這個問題就難了不少。不過經過數學家的幫助,如前所述場景,利用兩個麥克風所獲得的聲源中音量的區別,Octave能夠用一行公式把兩個聲音區分出來:

[W,s,v] = svd((repmat(sum(yy.*yy,1),size(yy,1),1).*yy)*yy');

固然這裏僅是示例,上面的公式跑起來,還須要附加處理的配合,諸如音源輸入、預處理、分離以後的音頻輸出等。

還有一些軟件包,是在機器學習還沒有火爆的年代就啓動,作了不少年的研究,專一於解決某一方面的問題而且有很高成就的。好比分離同一個信號源中混雜的多個不一樣頻點的信號(Independent component analysis),已經有成熟的專用軟件包FastICA解決,一樣能夠應用在「雞尾酒會問題」的解決中。

因此這一節想要強調的,「機器學習」以外,實際上還有不少值得關注的技術、算法。千萬不要「手裏有把錘子,看什麼都是釘子。」

其它那些機器學習框架

除了TensorFlow,當前還有不少機器學習框架廣爲應用,或者正在研發中。其中有些重量級的產品你也應當知道。
Caffe: 卷積神經網絡框架,專一於卷積神經網絡和圖像處理,用C++語言寫成的。一個新的由Facebook 支持的Caffe迭代版本稱爲Caffe2,如今正在開發過程當中,即將進行1.0發佈。其目標是爲了簡化分佈式訓練和移動部署,提供對於諸如FPGA等新類型硬件的支持,而且利用先進的如16位浮點數訓練的特性。
Chainer: 一個強大、靈活、直觀的機器學習Python軟件庫,可以在一臺機器上利用多個GPU。是由深度學習創業公司 Preferred Networks 開發;Chainer 的設計基於 define by run 原 則,也就是說,該網絡在運行中動態定義,而不是在啓動時定義。
DMTK: 微軟的DMTK(分佈式機器學習工具集)框架解決了在系統集羣中分佈多種機器學習任務的問題。
CNTK: 微軟研究人員開發的用於深度神經網絡和多GPU加速技術的完整開源工具包。微軟稱CNTK在語音和圖像識別方面,比谷歌的 TensorFlow 等其它深度學習開源工具包更有優點。
Deeplearning4j: 專一於神經網絡的 Java 庫,可擴展並集成 Spark,Hadoop 和其餘基於 Java 的分佈式集成軟件。
Nervana Neo: 是一個高效的 Python 機器學習庫,它可以在單個機器上使用多個GPU。
Theano: 是一個用 Python 編寫的極其靈活的 Python 機器學習庫,用它定義複雜的模型至關容易,所以它在研究中極其流行。
Torch: 是一個專一於 GPU 實現的機器學習庫,獲得了幾個大公司的研究團隊的支持。
Apache Spark MLlib: 看名字就知道,Apache基金會的開源系統,來源於Spark中面向數學和統計用戶的平臺,同Spark的兼容性毋庸置疑。
H2O: 如今已經發展到第三版,能夠提供經過普通開發環境(Python, Java, Scala, R)、大數據系統(Hadoop, Spark)以及數據源(HDFS, S3, SQL, NoSQL)訪問機器學習算法的途徑。H2O是用於數據收集、模型構建以及服務預測的端對端解決方案。
Singa: 是一個Apache的孵化器項目,也是一個開源框架,做用是使在大規模數據集上訓練深度學習模型變得更簡單。Singa提供了一個簡單的編程模型,用於在機器羣集上訓練深度學習網絡,它支持不少普通類型的訓練工做:卷積神經網絡,受限玻爾茲曼機 以及循環神經網絡。 模型能夠同步訓練(一個接一個)或者也異步(一塊兒)訓練,也能夠容許在在CPU和GPU羣集上,很快也會支持FPGA。Singa也經過Apache Zookeeper簡化了羣集的設置。
Turi Create:蘋果公司發佈,能夠幫蘋果幾大操做系統上所運行軟件的開發者,構建用於推薦、對象檢測、圖像分類、圖像類似性以及活動分類的機器學習模型。
CoreML: 一樣是蘋果發佈,針對IOS系統,能夠利用到蘋果內置的機器學習CPU功能,在IOS上作機器學習首選框架。

雲端產品:

亞馬遜的機器學習服務: 不一樣於前面那些,亞馬遜的機器學習主要以服務的形式提供,就相似於它的其它雲服務產品。該服務能夠鏈接到存儲在亞馬遜 S三、Redshift或RDS上的數據,而且在這些數據上運行二進制分類、多級分類或者回歸以構建一個模型。可是,值得注意的是生成的模型不能導入或導出,而訓練模型的數據集不能超過100GB。亞馬遜的深度學習機器圖景包含了許多主要的深度學習框架,包括 Caffe二、CNTK、MXNet和TensorFlow。
微軟的Azure ML Studio: 考慮到執行機器學習所需的大量數據和計算能力,對於機器學習應用雲是一種理想環境。微軟已經爲Azure配備了本身的即付即用的機器學習服務-Azure ML Studio,提供了按月、按小時和免費的版本。(該公司的HowOldRobot項目就是利用這個系統創立的。)你甚至不須要一個帳戶來就能夠試用這項服務;你能夠匿名登陸,無償使用Azure ML Studio最多8小時。
國內的百度、騰訊、阿里,也都有了本身一些機器學習的雲端產品值得你們關注。

機器學習的產品和框架如同雨後春筍般層出不窮,此處確定不能盡列,個人建議是關注大公司產品,通常就能跟上風向。另外就是關注特定設備的特定應用,好比你在iPhone上作研發,那使用CoreML可能就是必要的選擇,不然沒法用到CPU內置的機器學習功能,出來的產品也會更費電、更慢。

其它一些模型

快速發展的機器學習領域常常有一些新的技術或者模型,好比:
加強學習(強化學習):舉一個例子更能說明。好比在一盤圍棋中,盤中的某一步,實際上並不必定表明對於最終結果更優或者更差。
傳統方法是使用大規模的棋譜訓練模型,來對下一步的選擇作出預測。
而加強學習是隨機生成下一步的選擇,而後以綜合全局勝者累計增長1分,敗者累計減去1分,從而在全局的角度上進行學習。
由於電腦運算速度快,可能很快的進行很是大量的模擬棋局,從而讓模型具有較好的棋局預測能力。
最新的AlphaGo Zero就是典型表明,該項目經過隨機的對遊戲進行推演來逐漸創建一棵不對稱的蒙特卡羅樹(Monte Carlo Tree),而後用搜索的方式來推導下一步的落子。但這種模式對於訓練的數據量需求是很是很是龐大的,在沒法自動生成數據集的場景中尚需繼續探索。

遷移學習:這種方法實際一直在應用,只是目前有了一些更規範和更具效果的方法。顧名思義就是就是把已經訓練好的模型參數遷移到新的模型來幫助新模型訓練。
好比在自動駕駛的訓練中,若是咱們一直用白天的視頻進行訓練,若是到了晚上,同一個地點,可能自動駕駛系統的表現就會很是差。
而遷移學習就是利用一樣的數據集,通過各類變換和預處理以及算法的改進,雖然並不能徹底替代用夜晚數據的訓練,但能夠明顯增強不一樣環境下模型的表現,這就是遷移學習。
一般咱們在圖像識別應用中,爲了增長數據集,也會把圖片適當的調整角度、調整位置、調整顏色、增長噪點。這些方法今天來看實際也屬於遷移學習的範疇。

多任務學習:跟上一種模式是比較類似的。在某個模型的訓練中,同時考慮到應用的多個場景,並行的進行訓練,從而讓徹底不一樣的數據集發揮更大的做用,加強模型的適應性。

結束語

很是感謝你讀到最後,這裏咱們也進展到了尾聲。
2017是人工智能的元年,這一點是能夠確認的。
但從此是否是能稱爲人工智能的時代,還言之尚早。人工智能尚處於發展中,不少問題須要研究,不少難點還沒有突破。因此,這是咱們更須要努力的地方。
我的在實踐中的感受,不要隨時都抱着一種試圖「顛覆一切」的心態。
「人工智能」和「機器學習」最大的價值,在於除了傳統的編程模式,又多了一套完整的理論、框架體系,讓咱們有了更多的選擇來解決現實中的實際問題。實踐起來可能更快、更好。
對於發展時間還很短的「機器學習」框架來講,咱們都是初學者。但願咱們能互相幫助、互相促進。
水平有限,錯誤、疏漏在所不免,但願獲得你們的批評指正,多謝。

(END)

引文及參考

深度學習中的注意力機制
VESPCN, SRGAN, DemosaicNet, SVDF, LCNN
加強學習、增量學習、遷移學習

相關文章
相關標籤/搜索