本書系統的歸納了當前數據挖掘和深度學習技術的應用領域中的不同案例,以實用為導向,深入淺出的介紹了在具體業務中如何運用當前最新的數據技術端到端地解決問題。本書分為四個部分。第一部分主要介紹了一些基本的工程基礎,包括如果搭建自己的深度學習工作站。對于想借助云計算技術的讀者,我們也介紹了幾種目前市場是流行的云計算機器學習系統,并通過案例介紹如何使用云計算系統搭建自己的機器學習服務。第二部分主要介紹了傳統數據挖掘技術的最新應用案例,包括用戶畫像,客戶獲取和留存,推薦系統等。第三部分主要介紹了當前最新的深度學習技術的四個常見應用場景,包括圖像識別,文本情感分析,人機對話系統,時間序列預測等。第四部分引入了智能物聯網的技術,簡要介紹了如何在物聯網中運用機器學習使“物”更加智能化。
《Keras快速上手:基于Python的深度學習實戰》從如何準備深度學習的環境開始,手把手地教讀者如何采集數據,如何運用一些常用,也是目前被認為有效的一些深度學習算法來解決實際問題。覆蓋的領域包括推薦系統、圖像識別、自然語言情感分析、文字生成、時間序列、智能物聯網等。不同于許多同類的書籍,《Keras快速上手:基于Python的深度學習實戰》選擇了Keras作為編程軟件,強調簡單、快速的模型設計,而不去糾纏底層代碼,使得內容相當易于理解。讀者可以在CNTK、TensorFlow和Theano的后臺之間隨意切換,非常靈活。即使你有朝一日需要用更低層的建模環境來解決更復雜的問題,相信也會保留從Keras中學來的高度抽象的角度審視你要解決的問題,讓你事半功倍。
《Keras快速上手:基于Python的深度學習實戰》以實際應用為導向,強調概念的認知和實用性,對理論的介紹深入淺出,對讀者的數學水平要求較低,讀者在學習完畢后能使用案例程序舉一反三地應用到其具體場景中。《Keras快速上手:基于Python的深度學習實戰》覆蓋當前熱門的傳統數據挖掘場景和四個深度學習應用場景,根據我們市場調研,是目前罕有以應用為導向的介紹機器學習和深度學習的專業書籍,具備很高的參考價值和學術價值。
序一
在最近的幾年里,深度學習無疑是一個發展最快的機器學習子領域。在許多機器學習競賽中,最后勝出的系統或多或少都使用了深度學習技術。2016年,基于深度學習、強化學習和蒙特卡洛樹搜索的圍棋程序AlphaGo甚至戰勝了人類冠軍。人工智能的這一勝利比預想的要早了10年,而其中起關鍵作用的就是深度學習。
深度學習已經廣泛應用于我們的生活中,比如市場上可以見到的語音轉寫、智能音箱、語言翻譯、圖像識別和圖像藝術化系統等,其中深度學習都是關鍵技術。同時,由于學術界和工業界的大量投入,深度學習的新模型和新算法層出不窮,要充分掌握深度學習的各種模型和算法并實現它們無疑是一件困難的事情。
幸運的是,基于各行各業對深度學習技術的需求,許多公司和學校開源了深度學習工具包,其中大家比較熟悉的有CNTK、TensorFlow、Theano、Caffe、mxNet和Torch。這些工具包都提供了非常靈活而強大的建模能力,極大地降低了使用深度學習技術的門檻,進一步加速了深度學習技術的研究和應用。但是,這些工具包各有所長、接口不同,而且對于很多初學者這些工具包過于靈活,難以掌握。
由于這些原因,Keras應運而生。Keras可以被看作一個更易于使用、在更高層次上進行抽象、兼具兼容性和靈活性的深度學習框架,它的底層可以在CNTK、TensorFlow和Theano中自由切換。Keras的出現使很多初學者可以很快地體驗深度學習的一些基本技術和模型,并且將這些技術和模型應用到實際問題中。
本書也正是在這樣的背景下產生的。它的目標讀者正是那些剛剛進入深度學習領域、還沒有太多經驗的學生和工程師。本書的作者謝梁、魯穎和勞虹嵐分別在微軟和谷歌這樣的走在深度學習前沿的公司里做大數據和深度學習技術的研發,積累了很多把商業和工程問題轉化成合適的模型并分析模型好壞以及解釋模型結果的經驗。在這本書里,他們把這些經驗傳授給大家,使更多的人能夠快速掌握深度學習,并有效應用到商業和工程實踐中。
這本書比較系統地講解了深度學習的基本知識、建模過程和應用,并以深度學習在推薦系統、圖像識別、自然語言處理、文字生成和時間序列的具體應用作為案例,詳細介紹了從工具準備、數據獲取和處理到針對問題進行建模的整個過程和實踐經驗,是一本非常好的深度學習入門書。
俞棟博士
騰訊AILab副主任,杰出科學家
西雅圖人工智能研究室負責人
2017年6月22日于美國西雅圖
序二
隨著大數據的普及以及硬件計算能力的飛速提升,深度學習在過去的5~6年有了日新月異的發展。在一個又一個領域,深度學習展示了極其強大甚至連人類都難以企及的能力,這包括語音識別、機器翻譯、自然語言識別、推薦系統、人臉識別、圖像識別、目標檢測、三維重建、情感分析、棋類運動、德州撲克、自動駕駛等。伴隨著人工智能廣闊的應用前景,科技巨擎諸如谷歌、微軟、亞馬遜、百度、騰訊、阿里巴巴等紛紛投入巨資,從而進一步推動了這個領域的進步。如今,已經很少有人還對人工智能能達到的高度有任何懷疑態度,取而代之的是對人類如何與機器共存的暢想和機器終有一天取代人類的擔憂。
當然,如果我們現在就開始擔心機器將毀滅人類,那么還是有一些杞人憂天。深度學習現在還只停留在感知(Perception)的階段,即從原始數據進行簡單的感覺和分析,但是遠沒有達到認知(Cognition)的階段,即對事件進行邏輯推理和認識。深度學習的很多原理,還處在研究階段。即使是各領域的專家,對于深度學習為什么如此有效,依然是一知半解。幸運的是,在解決很多實際問題時,其實并不需要我們那么深刻理解它。謝梁、魯穎和勞紅嵐的這本書,就是從非常實用的角度來分享深度學習的一些基本知識,值得一讀。
這本書從如何準備深度學習的環境開始,手把手地教讀者如何采集數據,如何運用一些最常用,也是目前為止被認為最有效的一些深度學習算法來解決實際問題。覆蓋的領域包括推薦系統、圖像識別、自然語言情感分析、文字生成、時間序列、智能物聯網等。不同于許多同類的書籍,這本書選擇了Keras作為編程軟件,強調簡單、快速的模型設計,而不去糾纏底層代碼,使得內容相當易于理解。讀者可以在CNTK、TensorFlow和Theano的后臺之間隨意切換,非常靈活。即使你有朝一日需要用更低層的建模環境來解決更復雜的問題,相信也會保留從Keras中學來的高度抽象的角度審視你要解決的問題,讓你事半功倍。
這一波深度學習的大潮,必將帶來一個新的信息革命。每一次如此巨大的變革,都將淘汰很多效率低下的工作,并發展出新興的職業。在一個如此激動人心的年代,愿這本書帶著讀者啟航!
張察博士
CNTK主要作者之一,美國微軟總部首席研究員
2017年6月于美國西雅圖
前言
2006年,機器學習領域迎來了重要的轉折點。加拿大多倫多大學教授、機器學習領域泰斗GeoffreyHinton和他的學生RuslanSalakhutdinov在《科學》上發表了一篇關于深度置信網絡(DeepBeliefNetworks)的論文。從這篇論文的發表開始至今,深度學習有著迅猛的發展。2009年,微軟研究院語音識別專家俞棟和鄧力博士與深度學習專家GeofferyHinton合作。2010年,美國國防部DARPA和斯坦福大學、紐約大學和NEC美國研究院合作深度學習項目。2011年微軟宣布基于深度神經網絡的識別系統取得成果并推出產品,徹底改變了語音識別原有的技術框架。從2012到2015年,深度學習技術在圖像識別領域取得驚人的效果,在ImageNet評測上將錯誤率從26%一路降到5%以下,幾乎接近甚至超過人類的水平。這些都直接促進了一系列圍繞深度學習技術的智能產品在市場上的出現,比如微軟的認知服務(CognitiveServices)平臺,谷歌的智能郵件應答和谷歌助手等。
在中國,我們同樣欣喜地看到,基于大數據的機器學習和深度學習算法的大規模應用給互聯網行業帶來的巨大變革:淘寶的推薦算法、微軟的小冰聊天機器人、百度的度秘、滴滴的預估時間和車費、餓了么的智能調度等都應運而生。我們有理由相信,未來的物聯網、無人駕駛等也會挖掘出更多深度學習的實用場景。
深度學習對很多科技行業的從業者來說仍有一些神秘感。雖然像谷歌、微軟等互聯網巨頭開源了諸如TensorFlow、CNTK等深度學習平臺,大幅降低了從業者的門檻,但是如何舉一反三,根據實際問題選擇合適的算法和模型,并不容易。作為本書的作者,我們三位在美國谷歌、微軟等頂尖互聯網科技公司從事多年以機器學習和深度學習為基礎的人工智能項目研發,有著豐富的實踐經驗,深感有必要撰寫一本深入淺出的深度學習書籍,分享我們對深度學習的理解和想法,并幫助同行和感興趣的朋友們快速上手,建立屬于自己的端到端的深度學習模型,從而在大數據、深度學習的浪潮中有著更好的職業發展。我們希望本書能起到拋磚引玉的作用,使讀者對深度學習產生更多的興趣,并把深度學習作為一個必備的分析技能。
在本書中,我們選擇Keras這個流行的深度學習建模框架來講解深度學習話題。這主要從三方面的考慮。首先,Keras包括了各種常用的深度學習模塊,可以應用于絕大部分業務環境。其次,從原理上講,它是高度抽象的深度學習編程環境,簡單易學。Keras底層是調用CNTK、TensorFlow或Theano執行計算的。最后,作為應用領域的從業者,我們需要關注的是如何把一個商業或者工程問題轉化成合適的模型,如何準備數據和分析模型的好壞以及如何解釋模型的結果。Keras非常適合這樣的場景,讓使用者脫離具體的矩陣計算和求導,而將重心轉移到業務邏輯上。
本書是目前國內不多的系統講解使用Keras這個深度學習框架進行神經網絡建模的實用書籍,非常適合數據科學家、機器學習工程師、人工智能應用工程師和工作中需要進行預測建模以及進行回歸分析的從業者。本書也適合對深度學習有興趣的不同背景的從業者、學生和老師。
本書分成10章,系統性地講解深度學習基本知識、使用Keras建模過程和應用,并提供詳細代碼,使讀者可以花最少的時間把核心建模知識學到手。其中第1章介紹搭建深度學習環境,是整本書的基礎。第2章介紹如何用網絡爬蟲技術收集數據并使用ElasticSearch存儲數據。因為在很多應用中,數據需要讀者自行從網上爬取和并加以處理和存儲。第3章介紹深度學習模型的基本概念。第4章介紹深度學習框架Keras的用法。第5~9章,是5個深度學習的經典應用。我們會依次介紹深度學習在推薦系統、圖像識別、自然語言處理、文字生成和時間序列的具體應用。在介紹這些應用的過程中會穿插各種深度學習模型和代碼,并和讀者分享我們對于這些模型的原理和應用場景的體會。最后,我們拋磚引玉地把物聯網的概念提出來。我們相信,物聯網和深度學習的結合會爆發出巨大的能量和價值。
限于篇幅,我們無法涉及深度學習的方方面面,只能盡自己所能,和大家分享盡可能多的體會、經驗和易于上手的代碼。
在寫書的過程中,我們得到了大量的幫助和指導。微軟CNTK的作者、國際頂尖深度學習專家俞棟博士和張察博士為本書作序,并給予我們許多支持和鼓勵。微軟研究院的研究員郭彥東博士和高級工程師湯成對本書的部分章節提出了審閱意見。電子工業出版社的張慧敏、葛娜和王靜老師,對書籍的出版和編輯付出了極大努力,才使這本書得以如期問世。在此一并感謝。
最后,我們三位作者希望本書能為中國的深度學習和人工智能的普及,為廣大從業者提供有價值的實踐經驗和快速上手貢獻我們的微薄之力。
謝梁,美國微軟總部首席數據科學家
魯穎,谷歌總部數據科學技術專家
勞虹嵐,美國微軟總部微軟研究院研究工程師
2017年6月于美國西雅圖和硅谷
謝梁
現任微軟云計算核心存儲部門首席數據科學家,主持運用機器學習和人工智能方法優化大規模高可用性并行存儲系統的運行效率和改進其運維方式。具有十余年機器學習應用經驗,熟悉各種業務場景下機器學習和數據挖掘產品的需求分析、架構設計、算法開發和集成部署,涉及金融、能源和高科技等領域。曾經擔任美國道瓊斯工業平均指數獨有保險業成分股的旅行家保險公司分析部門總監,負責運用現代統計學習方法優化精算定價業務和保險運營管理,推動精準個性化定價解決方案。在包括JournalofStatisticalSoftware等專業期刊上發表過多篇論文,擔任JournalofStatisticalComputationandSimulation期刊以及DataMiningApplicationswithR一書的審稿人。本科畢業于西南財經大學經濟學專業,博士畢業于紐約州立大學計量經濟學專業。
魯穎
現任谷歌硅谷總部數據科學家,為谷歌應用商城提供核心數據決策分析,利用機器學習和深度學習技術建立用戶行為預測模型,為產品優化提供核心數據支持。曾在亞ma遜、微軟和迪士尼美國總部擔任機器學習研究科學家,有著多年使用機器學習和深度學習算法研發為業務提供解決方案的經驗。熱衷于幫助中國社區的人工智能方面的研究和落地,活躍于各個大型會議并發表主題演講。本科畢業于復旦大學數學專業,博士畢業于明尼蘇達大學統計專業。
勞虹嵐
現任微軟研究院研究工程師,是早期智能硬件項目上視覺和語音研發的核心團隊成員,對企業用戶和消費者需求體驗與AI技術的結合有深刻的理解和豐富的經驗。曾在Azure和Office365負責處理大流量高并發的后臺云端研究和開發,精通一系列系統架構設計和性能優化方面的解決方案。擁有從前端到后端的豐富經驗:包括客戶需求判斷、產品開發以及最終在云端架構設計和部署。本科畢業于浙江大學電子系,碩士畢業于美國南加州大學(USC)電子和計算機系。
1 準備深度學習的環境 1
1.1 硬件環境的搭建和配置選擇 1
1.1.1 通用圖形處理單元 3
1.1.2 你需要什么樣的 GPU 加速卡 6
1.1.3 你的 GPU 需要多少內存 6
1.1.4 是否應該用多個 GPU 10
1.2 安裝軟件環境 12
1.2.1 所需軟件列表 12
1.2.2 CUDA 的安裝 13
1.2.3 Python 計算環境的安裝 13
1.2.4 深度學習建模環境介紹 15
1.2.5 安裝 CNTK 及對應的 Keras 17
1.2.6 安裝 Theano 計算環境 23
1.2.7 安裝 TensorFlow 計算環境 25
1.2.8 安裝 cuDNN 和 CNMeM 27
2 數據收集與處理 28
2.1 網絡爬蟲 28
2.1.1 網絡爬蟲技術 29
2.1.2 構造自己的 Scrapy 爬蟲 30
2.1.3 構造可接受參數的 Scrapy 爬蟲 35
2.1.4 運行 Scrapy 爬蟲 36
2.1.5 運行 Scrapy 爬蟲的一些要點 38
2.2 大規模非結構化數據的存儲和分析 40
2.2.1 ElasticSearch 介紹 42
2.2.2 ElasticSearch 應用實例 44
3 深度學習簡介 57
3.1 概述 57
3.2 深度學習的統計學入門 58
3.3 一些基本概念的解釋 61
3.3.1 深度學習中的函數類型 62
3.3.2 深度學習中的其他常見概念 65
3.4 梯度遞減算法 67
3.5 后向傳播算法 70
4 Keras 入門 72
4.1 Keras 簡介 72
4.2 Keras 中的數據處理 73
4.2.1 文字預處理 74
4.2.2 序列數據預處理 82
4.2.3 圖片數據輸入 83
4.3 Keras 中的模型 83
4.4 Keras 中的重要對象 86
4.5 Keras 中的網絡層構造 90
4.6 使用 Keras 進行奇異值矩陣分解 102
5 推薦系統 105
5.1 推薦系統簡介 105
5.2 矩陣分解模型 108
5.3 深度神經網絡模型 114
5.4 其他常用算法 117
5.5 評判模型指標 119
6 圖像識別 121
6.1 圖像識別入門 121
6.2 卷積神經網絡的介紹 122
6.3 端到端的 MNIST 訓練數字識別 127
6.4 利用 VGG16 網絡進行字體識別 131
6.5 總結 135
7 自然語言情感分析 136
7.1 自然語言情感分析簡介 136
7.2 文字情感分析建模 139
7.2.1 詞嵌入技術 139
7.2.2 多層全連接神經網絡訓練情感分析 140
7.2.3 卷積神經網絡訓練情感分析 143
7.2.4 循環神經網絡訓練情感分析 144
7.3 總結 146
8 文字生成 147
8.1 文字生成和聊天機器人 147
8.2 基于檢索的對話系統 148
8.3 基于深度學習的檢索式對話系統 159
8.3.1 對話數據的構造 159
8.3.2 構造深度學習索引模型 162
8.4 基于文字生成的對話系統 166
8.5 總結 172
9 時間序列 173
9.1 時間序列簡介 173
9.2 基本概念 174
9.3 時間序列模型預測準確度的衡量 178
9.4 時間序列數據示例 179
9.5 簡要回顧 ARIMA 時間序列模型 181
9.6 循環神經網絡與時間序列模型 186
9.7 應用案例 188
9.7.1 長江漢口月度流量時間序列模型 190
9.7.2 國際航空月度乘客數時間序列模型 203
9.8 總結 209
10 智能物聯網 210
10.1 Azure 和 IoT 210
10.2 Azure IoT Hub 服務 213
10.3 使用 IoT Hub 管理設備概述 215
10.4 使用.NET 將模擬設備連接到 IoT 中心 218
10.5 機器學習應用實例 237
1.1硬件環境的搭建和配置選擇
從事機器學習,一個好的硬件環境是必不可少的。在硬件環境的選擇上,并不是一定選擇最貴的就會有最好的效果,很多時候可能付出了2倍的成本,但是性能的提升卻只有10%。深度學習的計算環境對不同部件的要求不同,因此這里先簡要討論一下硬件的合理搭配。如果您不差錢,則可以跳過本節。另外,雖然目前有一些云服務供應商提供GPU計算能力,并且一鍵部署,聽起來不錯,但是基于云計算的GPU實例受到兩個限制。首先,普通的廉價GPU實例內存稍小,比如AWS的G2實例目前只支持單GPU4GB的顯存;其次,支持較大顯存的實例費用比較高,性價比不高。比如AWS的P2實例使用支持每GPU12GB內存的K80GPU,每小時費用高達0.9美元。但是K80GPU屬于Kepler架構,是兩代前的技術。另外,在實際使用中需要開啟其他服務以使用GPU實例,各種成本加起來每月的開支還是很可觀的,很可能6個月的總開支夠買一臺配置較新GPU的全新電腦了。
在搭配深度學習機器而選擇硬件的時候,通常要考慮以下幾個因素。
(1)預算。這個非常重要。如果預算足夠,當然可以秉承最貴的就是最好的理念來選擇。但是當預算有一定限制的時候,如何搭配部件來最大化性能,盡量減少瓶頸就是很重要的考量了。
(2)空間。這里特指機箱的空間。大部分新的GPU都是雙風扇的,因此對機箱尺寸要求很高。如果你已經有一個機箱了,那么選擇合適尺寸的GPU就成為最優先的考慮;如果新配機箱,那么全尺寸的大機箱是最好的選擇。這是因為大機箱通風好,同時可以為以后添加多個GPU進行升級留有余地;另外,大機箱通常有多個PCIe的背板插槽可以放置多個PCIe設備。一般現在的GPU卡都會占據兩個PCIe的插槽空間,因此背板插槽越多越好。
(3)能耗。性能越好的GPU對能源的要求越高,而且很可能是整個系統里能耗最高的部件。如果已經有一臺機器了,只是要添加一個GPU來做學習用,那么選擇性能一般但是能耗低的GPU卡是比較明智的;如果需要高密度計算,搭配多個GPU并行處理,那么對電源的要求非常高,一般來說,搭配4GPU卡的系統至少需要1600W的電源。
(4)主板。對主板的選擇非常重要,因為涉及跟GPU的接口選擇。一般來說,至少需要一塊支持PCIe3.0接口的主板。如果以后要升級系統到多個GPU,那么還需要支持8+16芯PCIe電源接口的主板,這樣可以連接最多4個GPU進行SLI并聯。對于4個GPU這個限制,是因為目前最好的主板也只支持最多40條PCIe通道(16x,8x,8x,8x的配置)。多個GPU并行加速比并不能達到完美,畢竟還是有些額外開銷的。比如系統需要決定在哪個GPU上進行這個數據塊對應的計算任務。我們后面會提到,CNTK計算引擎的并行加速性很好,在使用多個GPU時值得考慮。
(5)CPU。CPU在深度學習計算中的作用不是非常顯著的,除非使用CPU進行深度學習算法的計算。因此如果你已經有一臺電腦的話,就不用太糾結是否要升級CPU了;但是如果要新搭建系統,那么在CPU的選擇上還是有些考量的,這樣可以使系統利用GPU的能力最大化。首先要選擇一個支持40條PCIe通道的CPU。不是所有的CPU都支持這么多的PCIe通道,比如haswell核心的i5系列CPU就支持最多32條通道。其次要選擇一個高頻率的CPU。雖然系統使用GPU做具體的計算,但是在準備模型階段CPU還是有重要作用的,因此選擇使用在預算內主頻高、速度快的CPU還是比較重要的。CPU的核心數量不是一個很重要的指標,一般來說,一個CPU核心可以支持一塊GPU卡。按照這個標準,大部分現代的CPU都是合格的。
(6)內存。內存容量還是越大越好,以減少數據提取的時間,加快和GPU的交換。一般原則是按照GPU內存容量的至少兩倍來配置主機內存。
(7)存儲系統。對于存儲系統的能力,除要容量大以外,主要體現在計算時不停地提取數據供應GPU進行計算方面。如果做圖像方面的深度學習,數據量通常都非常大,因此可能需要多次提取數據才能完成一輪計算,這個時候存儲系統讀取數據的能力就成為整個計算的瓶頸。因此,大容量的SSD是最好的選擇。現在的SSD讀取速度已經超過GPU從PCIe通道裝載數據的速度。如果使用傳統的機械硬盤,組成RAID5也是一個不錯的選擇。如果數據量不是很大,那么這個考慮就不那么重要了。
(8)GPU。GPU顯然是最重要的選擇,對整個深度學習系統的影響最大。相對于使用CPU進行計算,GPU對于提高深度學習的速度是眾所周知的事情,通常我們能見到5倍左右的加速比,而在大數據集上這個優勢甚至達到了10倍。盡管好處明顯,但是如何在控制性價比的條件下選擇一個合適的GPU卻不是一件簡單的事情。因此,我們在下面的章節中將詳細討論如何選擇GPU。
……