3
本文作者: 董飛 | 2016-03-25 18:30 |
按:作者董飛,數(shù)據(jù)科學(xué)家,微信公號“董老師在硅谷”。
2016年3月7日,谷歌首席科學(xué)家,MapReduce、BigTable等系統(tǒng)的創(chuàng)造者,Jeff Dean受邀韓國大學(xué),演講主題《大規(guī)模深度學(xué)習(xí)》,這里部分來自highscalability的文字和筆者Youtube上的聽錄。剛好演講在AlphaGo和李世石比賽之前,觀眾也問了他的預(yù)測,他只是說訓(xùn)練了5個月的機(jī)器跟頂尖高手的差距不好說;還有人問道他喜歡的編程語言(C++愛恨交織,喜歡Go的簡潔,Sawzall才是真愛);在Google作為首席一天是怎么過的(要吃好早飯,到處閑逛閑聊,找到那些每個領(lǐng)域?qū)<乙黄鸸タ穗y題)。
如果你不理解信息中的奧秘,那么你也很難去組織它。
Jeff Dean是Google系統(tǒng)架構(gòu)組院士,在講座:“大規(guī)模深度學(xué)習(xí)構(gòu)建智能計(jì)算機(jī)系統(tǒng)”中提到這句和Google的使命:整合全球信息,使人人皆可訪問并從中受益。早期他們通過收集,清理,存儲,索引,匯報(bào),檢索數(shù)據(jù)完成“整合”的工作,當(dāng)Google完成這個使命,就去迎接下一個挑戰(zhàn)。
理解是什么含義?
看到這張圖,你馬上知道是小寶寶抱著泰迪熊睡覺。而看到下張街景,馬上意識到紀(jì)念品店里面有打折信息。其實(shí)直到最近,計(jì)算機(jī)才可以提取圖片中的信息。
如果想從圖像去解釋物理世界,計(jì)算機(jī)需要去選擇跟那些感興趣的點(diǎn),閱讀文字并去真正理解。
像下面的文字“car parts for sale”,傳統(tǒng)的Google通過關(guān)鍵字匹配來給出結(jié)果,但更好的匹配是第二個。這是一個需求深度理解的過程,而不能停留在字面,要去做一個優(yōu)秀搜索和語言理解產(chǎn)品。
Google跟其他公司的不同是,2011年就開始Google大腦計(jì)劃,當(dāng)時想通過使用神經(jīng)網(wǎng)絡(luò)來提升技術(shù)水準(zhǔn),但并沒有把研究做成像大學(xué)象牙塔那種,而是結(jié)合安卓,Gmail,圖片去改進(jìn)產(chǎn)品解決真正問題。這對其他公司也是很好的借鑒,把研究和員工工作結(jié)合起來。
神經(jīng)網(wǎng)絡(luò)老早就開始研究,上世紀(jì)60年代發(fā)明,在80年代和90年代早期也流行過,后來又不火了。兩個原因:缺少計(jì)算能力去訓(xùn)練數(shù)據(jù)模型,這樣也不能用來做更大規(guī)模的問題;2)缺少大量有效的數(shù)據(jù)集。而Google通過算法的力量,在加上他們強(qiáng)大的基礎(chǔ)架構(gòu),海量數(shù)據(jù)集創(chuàng)造了AI的絕佳溫床。
深度學(xué)習(xí)一開始從少數(shù)的產(chǎn)品組開始,一段時間后反響很好,能解決之前不能做的,就更多的團(tuán)隊(duì)開始采納。使用深度學(xué)習(xí)的產(chǎn)品有:安卓,Apps,藥品發(fā)現(xiàn),Gmail,圖片理解,地圖,自然語言,圖片,機(jī)器人,語音翻譯等。
深度學(xué)習(xí)能應(yīng)用到很多領(lǐng)域原因是那些通用模塊:語音,文字,搜索詞,圖片,視頻,標(biāo)簽,實(shí)體,短語,音頻特性。輸入一類信息,決定你想要的輸出,收集訓(xùn)練數(shù)據(jù)作為你想要計(jì)算的潛在函數(shù),然后就放手不管了。
模型很贊的原因是因?yàn)楣嗔撕芏嘣夹问降臄?shù)據(jù)。你不需要教工程師很多特征點(diǎn),模型的力量在于從觀察一些例子就能自動識別數(shù)據(jù)中的有用信息。
神經(jīng)網(wǎng)絡(luò)就是一些從數(shù)據(jù)提煉的復(fù)雜函數(shù)。從一個空間輸入在轉(zhuǎn)化為另一個空間的輸出。
這里的函數(shù)不是像平方,而是真正復(fù)雜的函數(shù)。當(dāng)你給出一些原始像素,比如貓,而輸出就是對象的類別。
深度學(xué)習(xí)中的“深度”指的是 神經(jīng)網(wǎng)絡(luò)中的層數(shù)。這個系統(tǒng)的良好性質(zhì)是一組簡單的可以訓(xùn)練的數(shù)學(xué)函數(shù)集合。深度神經(jīng)網(wǎng)絡(luò)適用于很多機(jī)器學(xué)習(xí)風(fēng)格。
比如你給輸入一張貓的圖片,輸出是人工標(biāo)記的貓圖片,這是監(jiān)督學(xué)習(xí)。你把很多這樣監(jiān)督樣本給系統(tǒng),讓它去學(xué)習(xí)近似的函數(shù),如同從監(jiān)督樣本中觀察出來的。
還有一種是非監(jiān)督學(xué)習(xí),給出一個圖片,你也不知道里面是啥,系統(tǒng)可以學(xué)習(xí)去尋找在很多圖片中出現(xiàn)的模式。這樣即使不認(rèn)識圖片,它也能識別所有的圖片中都有一只貓。
增強(qiáng)學(xué)習(xí)也適用,這也是AlphaGo用到的技術(shù)。
深度網(wǎng)絡(luò)模型是類似于大腦行為的原理。但不是具體模擬神經(jīng)元如何工作。而是一種簡單抽象的神經(jīng)元版本。
神經(jīng)元有一組輸入。真正神經(jīng)元會有不同的強(qiáng)度的輸入。在人工智能網(wǎng)中試圖去學(xué)習(xí)到這些邊上的權(quán)重,去加強(qiáng)不同輸入的聯(lián)系。真正神經(jīng)元通過輸入和強(qiáng)度的組合去決定要不要生成脈沖。
人工神經(jīng)元不會產(chǎn)生脈沖,但會生成一個數(shù)值。神經(jīng)元的函數(shù)就是通過非線性函數(shù)計(jì)算輸入的加權(quán)乘以權(quán)重之和。
典型的非線性函數(shù)就是整形線性單元(max(0, x)),在90年代很多非線性函數(shù)是很平緩的sigmoid()函數(shù)或者tanh()函數(shù)。但對于神經(jīng)元來說產(chǎn)生的數(shù)值是不是更接近0對優(yōu)化系統(tǒng)更有利。比如如果神經(jīng)元有3個輸入 X1, X1, X3,權(quán)重分別是 -0.21, 0.3, 0.7,計(jì)算就是
y = max(0, -.0.21*x1 + 0.3*x2 + 0.7*x3)。
為了決定圖片到底是貓還是狗,這個圖片要經(jīng)過很多層。這些神經(jīng)元根據(jù)輸入來產(chǎn)生下一步。
最低層的神經(jīng)元會查看像素的小塊。更高層的神經(jīng)元會看下層神經(jīng)元的輸出再決定是否生產(chǎn)。
這個模型也會錯,比如說這里是貓,但事實(shí)上是狗。那么做錯誤決定的信號就會返回到系統(tǒng)中做調(diào)整,讓剩余的模型在下一次查看圖片時候,更可能輸出狗。這就是神經(jīng)網(wǎng)絡(luò)的目標(biāo),通過模型小步調(diào)整邊的權(quán)重讓它更可能去得到正確答案。你可以通過所有樣本去聚合,這樣可以降低錯誤率。
學(xué)習(xí)算法其實(shí)比較簡單,如下:
選擇隨機(jī)訓(xùn)練樣本“(輸入,標(biāo)簽)”,比如上面貓圖和想要的輸出標(biāo)簽,‘貓’
運(yùn)行神經(jīng)網(wǎng)絡(luò),在輸入上去查看它產(chǎn)生的。
調(diào)整邊的權(quán)重讓最后輸出更接近于“標(biāo)簽”上的。
如何調(diào)整邊的權(quán)重去保障輸出更接近于標(biāo)簽?zāi)兀?/span>
反向傳播:積分的鏈?zhǔn)揭?guī)則在決定高層神經(jīng)網(wǎng)絡(luò)中使用,如果選擇是貓而不是狗呢?得想辦法去調(diào)整高層的權(quán)重去讓它更可以決定是“狗”。
根據(jù)箭頭方向和權(quán)重去讓它更可能說是狗。不要步子邁得太大因?yàn)檫@種表面很復(fù)雜,微調(diào)一小步讓它下次更可能給出狗的結(jié)果。通過很多迭代以及查看例子,結(jié)果更可能會是狗。通過這個鏈?zhǔn)椒▌t去理解底層參數(shù)改變是如何影響到輸出的。說白了就是網(wǎng)絡(luò)變化回路反饋到輸入,使得整個模型更適應(yīng)去選擇“狗”。
權(quán)重的微調(diào)
真正神經(jīng)網(wǎng)絡(luò)通過億級的參數(shù)在億級的維度做調(diào)整,去理解輸出網(wǎng)絡(luò)。Google目前有能力如何快速搭建和訓(xùn)練這些海量數(shù)據(jù)上的模型,去解決實(shí)際問題,在快速去不同廣泛的平臺去部署生產(chǎn)模型(手機(jī),傳感器,云端等)。
這就是說神經(jīng)網(wǎng)絡(luò)可以用在很多不同問題上。
文本:萬億級別的英文和其他語言資料。從一個語言翻譯到另一個,從短語到整句。
虛擬化數(shù)據(jù):十億級別的圖譜,視頻。
語音:每天都產(chǎn)生萬小時的資料。
用戶行為: 很多應(yīng)用產(chǎn)生數(shù)據(jù)。比如搜索引擎的查詢,用戶在email中標(biāo)記垃圾。這些都可以學(xué)習(xí)并搭建智能系統(tǒng)。
知識圖譜:十億級別的標(biāo)簽化關(guān)系元組。
如果吸收更多數(shù)據(jù),讓模型變大,結(jié)果也更好。
如果你輸入更多數(shù)據(jù),但沒有把模型變大,模型的能力就會受限在一些數(shù)據(jù)集中的明顯特征。通過增加模型的規(guī)模,讓它不僅記住明顯的,還有一些也許出現(xiàn)很少的細(xì)微特征。
通過更大的模型,更多數(shù)據(jù),計(jì)算需求也更大。Google很多精力花在如何提升計(jì)算量,訓(xùn)練更大的模型。
1、語音識別
第一個部署深度神經(jīng)網(wǎng)絡(luò)的小組。
他們實(shí)現(xiàn)的新模型基于神經(jīng)網(wǎng)絡(luò)而不是隱馬爾可夫模型。這個問題是把從150毫秒的語音去預(yù)測中間10毫秒吞掉的聲音。比如到底是ba還是ka的聲音。你得到一個預(yù)測的序列,再通過語言模型去理解用戶所說。
一開始的版本就把識別錯誤率降低了30%,確實(shí)非常厲害。
后來就研究一些復(fù)雜模型去加強(qiáng)網(wǎng)絡(luò),進(jìn)一步降低錯誤率?,F(xiàn)在當(dāng)你對著電話說話,語音識別比五年前強(qiáng)多了。
2、ImageNet挑戰(zhàn)
ImageNet是6年前公布的。里面有100萬張圖片,算是計(jì)算機(jī)視覺領(lǐng)域最大的。圖片中包含1000種不同分類,每一類有1000張圖片。比如里面有上千張不同的豹子,摩托車等,一個麻煩的是不是所有的標(biāo)簽都是對的。
在神經(jīng)網(wǎng)絡(luò)使用之前,最好的錯誤記錄是26%,2014年 Google錯誤率暴降到6.66%取得冠軍,然后到了2015年錯誤率下降到3.46%。這是什么概念,大家注意到Andrej人類的錯誤率也有5.1%(他還是花了24小時訓(xùn)練后的結(jié)果)。
總之這是個又大又深的模型,每個盒子就像神經(jīng)元的一層去進(jìn)行卷積操作。
3、圖片類別識別
計(jì)算機(jī)在花卉識別上很強(qiáng)大,這是非常好的模型,能夠識別細(xì)微差別。
一般的效果,比如在菜品識別。
計(jì)算機(jī)也有犯錯的時候,關(guān)于錯誤敏感性看一看上面的,比如左邊鼻涕蟲當(dāng)成蛇,右邊也不知道是什么鬼。
4、Google圖片搜索
就是理解圖片中像素的能力,Google圖片團(tuán)隊(duì)開發(fā)了不用標(biāo)簽就可以搜索圖片的功能。比如你可以去找雕像,素描,水,而不需提前標(biāo)注。
5、街景圖像
在街景中如何識別里面的文字。首先要找到文字部分,模型能夠去有效預(yù)測像素中熱點(diǎn)圖,那些含有文字的像素點(diǎn)。訓(xùn)練的數(shù)據(jù)就是包含文字劃分的多邊形。
因?yàn)橛?xùn)練數(shù)據(jù)中包括不同的字符集,這樣在多語言下也沒問題。也要考慮大小字體,遠(yuǎn)近,不同顏色。訓(xùn)練的模型相對容易,就是卷積神經(jīng)網(wǎng)絡(luò)嘗試去預(yù)測每個像素是否包括文字。
6、Google搜索排名中RankBrain
RankBrain 2015年啟動,在搜索排名(前100位排第三),里面難點(diǎn)是搜索排序需要了解模型,要理解為什么要做某個決定。當(dāng)系統(tǒng)發(fā)生錯誤為什么做那個。
調(diào)試工具準(zhǔn)備好,需要足夠的理解能力嵌入模型,去避免主觀。總體上是不想手工調(diào)參數(shù)。你需要嘗試?yán)斫饽P椭械念A(yù)測,去理解訓(xùn)練數(shù)據(jù)是否相關(guān),是否跟問題無關(guān)?你需要訓(xùn)練數(shù)據(jù)并應(yīng)用到別的上面。通過搜索查詢的分布你能得到每天的變化,事件發(fā)生后改變也隨時發(fā)生。你要看分布是否穩(wěn)定,比如語音識別,一般人不會改變音色。當(dāng)查詢和文檔內(nèi)容頻繁變化,你要保證模型是新的。我們要搭建通用工具去理解神經(jīng)網(wǎng)絡(luò)里面發(fā)生了什么,解釋什么導(dǎo)致這個預(yù)測。
序列模型
很多問題都可以映射到從一個序列到另一個序列的規(guī)律。比如語言翻譯,從英語翻譯到法語,就是把英語的序列單詞轉(zhuǎn)化到法語序列單詞。
神經(jīng)網(wǎng)絡(luò)在學(xué)習(xí)復(fù)雜函數(shù)時特別有用,這個模型學(xué)習(xí)從英文到法文的句子。句子以單詞為單位,以結(jié)束符作為信號。訓(xùn)練模型在遇到結(jié)束符時開始產(chǎn)生另一個語言的對應(yīng)句子。而模型函數(shù)就是把語言中語句對作為訓(xùn)練數(shù)據(jù)。
每一步都在詞典表中的單詞產(chǎn)生概率分布。在推理時候通過一些搜索來實(shí)現(xiàn),如果你最大化每個單詞的概率,這樣找的不是最可能的句子。直到找到最大可能的句子找到才結(jié)束搜索。
這個系統(tǒng)在公開翻譯系統(tǒng)中表現(xiàn)出色。大多數(shù)其他翻譯系統(tǒng)需要手工編碼或機(jī)器學(xué)習(xí)的模型只是在一小部分使用,而不是像這種整體的端到端的學(xué)習(xí)系統(tǒng)。
這些領(lǐng)域都是可以歸到序列類的方法。
7、智能回復(fù)
智能回復(fù)是另一個序列類的例子。在手機(jī)上你如何更快回復(fù)郵件,打字很累。
Gmail組開發(fā)了一個系統(tǒng)能夠去預(yù)測郵件回復(fù)。第一步就是訓(xùn)練小量模型去預(yù)測如果消息是某一類的,如何做簡短回復(fù)。如果是一個更大,計(jì)算能力更強(qiáng)的模型會把消息作為一個序列,嘗試預(yù)測序列的反應(yīng)詞。比如對于感恩節(jié)邀請,最可能的三個答復(fù)是“算上我們”,“我們會去的”,“對不起,我們有事沒發(fā)去”
8、看圖說話
把之前開發(fā)的圖片模型與序列類模型結(jié)合一起。圖片模型作為輸入。這里就不是閱讀英文句子了,而是看圖片的像素。
接下來就是訓(xùn)練生成字幕。訓(xùn)練集有5個由不同的人寫的不同的字幕。總共100萬圖片,70萬條語句。效果如下
兩個模型翻譯的都不錯:1)一個小孩緊緊的抱住毛絨玩具;2)一個寶寶在泰迪熊旁邊睡著了。
上面是一些好玩的出錯語句,為啥會錯,其實(shí)你自己看了也明白。
9、機(jī)器視覺和翻譯結(jié)合
翻譯團(tuán)隊(duì)寫了一個app,使用計(jì)算機(jī)視覺來識別鏡頭中文字,再翻譯成文本,最后再圖片本身覆蓋翻譯好的文字。模型足夠小可以運(yùn)行在所有設(shè)備上。
直接在手機(jī)上跑一些模型中的重要方法。智能化將轉(zhuǎn)移到設(shè)備端,這樣不會依賴遠(yuǎn)程云端的大腦。
研究上的努力和成果轉(zhuǎn)化
Google 非常在乎研究轉(zhuǎn)化效率。就是要快速訓(xùn)練模型,理解那些做的好的和不好的,再想下一步實(shí)驗(yàn)。模型應(yīng)該再分鐘或者小時,而不是幾天或者幾周。這樣讓每個人都做研究更高效。
機(jī)器學(xué)習(xí)發(fā)展會更好,更快。Jeff說機(jī)器學(xué)習(xí)社區(qū)發(fā)展得特別快。人們發(fā)布了一篇論文,一周內(nèi)就有很多研究小組跟進(jìn),下載閱讀,理解實(shí)現(xiàn),再發(fā)布他們自己的擴(kuò)展。這跟以前的計(jì)算機(jī)期刊投稿完全不同,等6個月才知道是否被接收,然后再過3個月最后發(fā)表。而現(xiàn)在把時間從一年壓縮到一周,真不得了。
如何快速訓(xùn)練大量模型
模型的并行化
神經(jīng)網(wǎng)絡(luò)有很多固有的并行化,所有不同的神經(jīng)元與其他的也是保持獨(dú)立,特別本地接納的,神經(jīng)元僅僅接受一小部分比它更低的神經(jīng)元作為輸入。
在不同的GPU上和不同機(jī)器上可以做并行。只有邊界上的數(shù)據(jù)需要通信。
數(shù)據(jù)并行化
優(yōu)化的模型參數(shù)集不應(yīng)該在一臺機(jī)器上或者一臺中心服務(wù)器上,應(yīng)該有多個模型拷貝,這樣協(xié)作區(qū)優(yōu)化參數(shù)。
在訓(xùn)練過程中讀取數(shù)據(jù)的不同隨機(jī)部分。每一個拷貝在模型中獲取當(dāng)前的參數(shù)集,讀取在當(dāng)前梯度下的一點(diǎn)數(shù)據(jù),找到想要的參數(shù)調(diào)整,在發(fā)送調(diào)整到中心的參數(shù)服務(wù)器中。這個參數(shù)服務(wù)器會對參數(shù)做調(diào)整。整個過程重復(fù),這個也會在很多拷貝中進(jìn)行。有些使用500份在500臺不同機(jī)器上的拷貝,為了快速優(yōu)化參數(shù)并處理大量數(shù)據(jù)。
一種方式是異步的,每一個都有自己的循環(huán),取得參數(shù),計(jì)算梯度,發(fā)送它們,不需要任何控制和跟其他的同步,不好的是當(dāng)梯度返回到參數(shù)可能在計(jì)算結(jié)束后都被移走了。對有些例子可能有50到100的拷貝。還有一種是同步,一個控制器控制所有的拷貝。
在過去的幾年間,我們已經(jīng)建立了兩代用于訓(xùn)練和部署神經(jīng)網(wǎng)絡(luò)的計(jì)算機(jī)系統(tǒng),并且將這些系統(tǒng)應(yīng)用于解決很多在傳統(tǒng)上來說對計(jì)算機(jī)而言很難的問題。我們對許多這些領(lǐng)域的最新技術(shù)做了很大的改進(jìn)。
第一代系統(tǒng)DistBeliet在可擴(kuò)縮性上表現(xiàn)很好,但在用于研究時靈活性達(dá)不到預(yù)期。對問題空間的更深理解讓我們可以做出一些大幅度的簡化。
這也是第二代系統(tǒng)的研發(fā)動機(jī),用 TensorFlow 表達(dá)高層次的機(jī)器學(xué)習(xí)計(jì)算。它是C++語言編寫的核心,冗余少。而不同的前端,現(xiàn)有Python和C++前端,添加其他語言的前端也不是難題。
計(jì)算可以用一張數(shù)據(jù)流圖來理解。
我們輸入數(shù)據(jù)、權(quán)重、誤差以及標(biāo)簽,在不同節(jié)點(diǎn)進(jìn)行不同的運(yùn)算。
TensorFlow名字的意義
Tensor(張量)意味著N維數(shù)組。1維時就是向量,2維時就是矩陣;通過圖像可以代表更高維的數(shù)據(jù)流,比如,圖像可以用三維張量(行,列,顏色)來表示。
Flow(流)意味著基于數(shù)據(jù)流圖的計(jì)算。有許多運(yùn)算(圖中的節(jié)點(diǎn))應(yīng)用在數(shù)據(jù)流上。
張量從圖象的一端流動到另一端,這就是“TensorFlow”。“邊”代表張量(數(shù)據(jù)),節(jié)點(diǎn)代表運(yùn)算處理。
這是使用張量計(jì)算的示意圖。
這是使用狀態(tài)計(jì)算的示意圖。
這是使用分布式計(jì)算的示意圖。
它能夠在各個平臺上自動運(yùn)行模型:電話上,單個機(jī)器上(CPU或GPU),由成百上千的GPU卡組成的的分布式系統(tǒng)。
如果你還沒想通過深度學(xué)習(xí)網(wǎng)絡(luò)去解決你的數(shù)據(jù)問題,你還是要趕緊考慮。TensorFlow 讓每個人更容易獲取深度學(xué)習(xí)能力。
高度擴(kuò)展的設(shè)計(jì),更快的實(shí)驗(yàn)速度加速研究進(jìn)程
容易分享模型,開發(fā)代碼應(yīng)用到可重用的效果
通過同一個系統(tǒng)把研究工作直接用于生產(chǎn)環(huán)境
最后說一些quora上大家給Jeff Dean大神編的段子,供君一樂:
Jeff Dean當(dāng)初面試Google時,被問到“如果P=NP能夠推導(dǎo)出哪些結(jié)論”,Jeff回答說:“P = 0或者N = 1”。而在面試官還沒笑完的時候,Jeff檢查了一下Google的公鑰,然后在黑板上寫下了私鑰。
編譯器從不警告Jeff Dean,只有Jeff警告編譯器。
Jeff Dean的編碼速度在2000年底提高了約40倍,因?yàn)樗麚Q了USB2.0的鍵盤。
Jeff Dean被迫發(fā)明了異步API因?yàn)橛幸惶焖岩粋€函數(shù)優(yōu)化到在調(diào)用前就返回結(jié)果了。
Jeff Dean曾經(jīng)寫過一個O(n2)算法,那是為了解決旅行商問題。
Jeff Dean的鍵盤只有兩個鍵,1和0。
Jeff Dean失眠的時候,就Mapreduce羊。
參考文章:Jeff Dean on Large-Scale Deep Learning at Google。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。