自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Google Brain工程師演講實錄:TensorFlow與深度學習

人工智能 深度學習
Google Brain 的工程師首先跟大家分享深度深入學習的例子,然后再跟大家簡單介紹一下什么是 TensorFlow ,以及 TensorFlow 一些最新特性,包括即將公開甚至還沒有完成一些的特性,最后的時間簡要介紹一下 Google Brain 兩個研究項目。

Google Brain工程師演講實錄:TensorFlow與深度學習

本文是Google Brain工程師周玥楓在QCon上海2017和DevFest 2017上的演講實錄,由GDG整理和發(fā)布。

我的名字叫做周玥楓,我是 Google Brain 的工程師,我現(xiàn)在做 TensorFlow 和 TensorFlow 分布式的開發(fā)以及使用機器學習來優(yōu)化 TensorFlow 的研究項目。

今天首先跟大家分享深度深入學習的例子,然后再跟大家簡單介紹一下什么是 TensorFlow ,以及 TensorFlow 一些***特性,包括即將公開甚至還沒有完成一些的特性,如果有時間的話,我會花一些篇幅著重介紹新的特性。***的時間我會簡要介紹一下 Google Brain 兩個研究項目。

Machine Learning

今天,我們看到機器學習已經(jīng)改變了我們的世界,機器科學家用深度學習的方法來檢測糖尿病和視網(wǎng)膜病變,其中檢測視網(wǎng)膜病變達能到 95% 的準確率,甚至超過眼科專家 91% 的準確率。機器學習實現(xiàn)了機器和人類專家相媲美的準確率。

 

 

同時機器學習也可以用在自動駕駛方向,可以讓交通更加安全和高效。

[[208626]] 

其次,機器學習能夠跨越語言的障礙,實現(xiàn)更加便捷的溝通和交流,我們知道傳統(tǒng)的機器翻譯系統(tǒng)需要把不同語言詞組對應(yīng)起來,通過一些復雜的甚至手寫的規(guī)則,把一種語言轉(zhuǎn)換為一種語言,這種系統(tǒng)非常龐大且不利于維護,而且準確度不夠高,所以最近興起了一種基于神經(jīng)網(wǎng)絡(luò)的方法,我們將其用 TensorFlow 實現(xiàn)出來,用這種方法來縮小機器和人類翻譯的差距,能夠使翻譯更加準確和自然。 

 

同樣的,機器學習還可以給人類帶來愉悅,可以實現(xiàn)自動修改照片、突出人物的前景、背景虛化等功能,我們很快可以在手機上看到這個功能。

 

接下來看看機器學習在工業(yè)界的應(yīng)用,***個例子是 INSTACART ,它是做雜貨當天送貨服務(wù)的,顧客通過網(wǎng)絡(luò)應(yīng)用程序從當?shù)卦S多零售商選出想要的商品并且購買雜貨。這個軟件的客戶非常多??蛻粼谫徺I時面臨一個問題,就是從數(shù)百萬計零售商店或者商品中選出自己想要的物品,所以 INSTACART 為了讓購物者更快地找出想要的商品,用 TensorFlow 建立了一套深度學習模型用來最有效地排序商品列表,這種方法能大大省下購物者尋找商品的時間。

 

第二個例子就是 UBER ,UBER 用 TensorFlow 和基于 TensorFlow 的開源項目來構(gòu)建一個叫做“米開朗基羅”的系統(tǒng),這是一個內(nèi)部使用的機器學習平臺,谷歌希望利用這個平臺讓內(nèi)部使用 AI 就像他們請求乘車一樣的方便。這個系統(tǒng)涵蓋了從數(shù)據(jù)管理、數(shù)據(jù)獲取和模型訓練、評估、部署等方面,而且這個系統(tǒng)不但支持 TensorFlow 深度學習,還支持其他機器學習的模型。

第三個例子是 KEWPIE ,它用 TensorFlow 搭建了人工智能系統(tǒng)用來改善嬰兒食品的質(zhì)量,對食物產(chǎn)品進行人工智能分析,這樣可以識別出產(chǎn)品中可以接受的成分并且剔除產(chǎn)品中不能接受的成分,這樣保證了嬰兒食品的質(zhì)量。

[[208628]] 

What Is TensorFlow 

而實現(xiàn)上述這一切所有的基礎(chǔ)框架就是 TensorFlow.

我們在 2015 年末開源了 TensorFlow ,希望把它做成能夠服務(wù)所有人的機器學習平臺。我們想要將它做成一個快速靈活的、生產(chǎn)環(huán)境就緒的框架。它可以很方便可以做研究,也可以很快部署到生產(chǎn)環(huán)境當中。TensorFlow 本質(zhì)上是一個大規(guī)模的運算框架,它的運算被抽象成一張運算矢量圖。就像在這邊看到一張運算圖一樣,上面的節(jié)點代表運算或者狀態(tài)。當我們完成了一些運算或者結(jié)束了一些狀態(tài)的時候,我們的數(shù)據(jù)就從一個節(jié)點流到另外一個節(jié)點。這個圖可以用任何語言來構(gòu)建,當這張圖構(gòu)建完之后,我們把它傳到 TensorFlow 核心當中進行編譯,進行優(yōu)化然后來執(zhí)行。

 

TensorFlow 也支持很多硬件平臺,從最初的 CPU、GPU ,到即將發(fā)布 CLOUD CPU ,還有對安卓、 iOS 的支持,甚至對嵌入式設(shè)備的支持。

 

我們將 TensorFlow 開源到 Github 上面后,過去兩年興起了許多圍繞 TensorFlow 活躍的開源社區(qū),現(xiàn)在我們有 67,000 多個 star ,有 17,000 多個 Github 項目名字當中包括 TensorFlow. TensorFlow 不斷出現(xiàn)在各種大學課程和在線課程里面,很多大學也正在開發(fā)基于 TensorFlow 的課程,除此之外我們也發(fā)布了 TensorFlow 中文網(wǎng)站,大家把它可以當做入門 TensorFlow 的初級教程,叫做 https://tensorflow.google.cn.

New Feature of TensorFlow

現(xiàn)在我們看一下 TensorFlow 的***特性。首先是 Eager Execution ,Eager Execution 是一種新的編程模式,我在之前一張幻燈片中展示了一個基于 TensorFlow 的靜態(tài)圖。 

 

Eager Execution 解決了靜態(tài)圖中一些問題,解決了什么問題呢?首先它可以少寫很多代碼,就像上圖一樣。其次,通過 Eager Execution 寫代碼可以立刻發(fā)現(xiàn)它的錯誤,相對之前來說可以大大提高編寫代碼查錯的效率。第三是可以用 Tensor 來編寫控制流,就不需要用 TF 來做循環(huán)甚至做判斷。最重要一點是如果用其他語言編寫這張圖的話,再把這圖傳到 TensorFlow 核心中相當于編寫了另外一種代碼??吹竭@個幻燈片就是簡單的例子,充分說了 Eager Execution 的簡單之處。

今年的 Google I/O 大會宣布了第二代 TPU,我們第二代 TPU 既可以做推理也可以作訓練。一個 TPU 可以實現(xiàn)很高的詞典運算。我們甚至可以把很多代 TPU 聯(lián)合起來成為一個就像超級計算機一樣的計算核心。在第二代 TPU 的幫助下,我們可以在 20 小時內(nèi)全部訓練出 RESNET-50 的模型,以前如果只做一個 TPU 的訓練,可能要花一周的時間來訓練這個模型。今天第二代 TPU 即將發(fā)布到 Google Cloud,并且推出供大家使用。

 

下面講一下 TensorFlow 上層 API,除了神經(jīng)網(wǎng)絡(luò)訓練速度,大家還關(guān)注如何更加方便實現(xiàn)用 TensorFlow 上層 API 來創(chuàng)建神經(jīng)網(wǎng)絡(luò)。Keras 是其中一個 API ,它支持很多的后端。相信很多觀眾都用過 Keras ,從本質(zhì)上來講 Keras 更加像一種 API 開發(fā)規(guī)范。TensorFlow 有一個 TF 就是 Keras ,但是它只是 API 規(guī)范實現(xiàn)的一種方式,使用的是一個自定義 TensorFlow 后端,有了這個后端,我們可以讓 Keras 與 Estimators 或者 Secving 整合起來,這樣會對分布式提供更好的支持。

 

還有一個在 TensorFlow 里面介紹的概念,叫做 Estimators ,這是一個比較輕量化,并且在谷歌內(nèi)部生產(chǎn)環(huán)境中廣泛使用的 API ,其中 Estimators 提供了很多模型供大家使用,叫做 Canned Estimator ,他們的關(guān)系是這樣的:Estimators 和 tf.keras 上層封裝了一個 Canned Estimator ,可以用其來封裝成各種模型。

   

 

如果你們習慣于 Keras 的接口的話,我們提供了一個上層 API 轉(zhuǎn)換的工具 ,叫做 model_to_estimator ,一旦你有一個編譯好的 Keras 模型就可以調(diào)用這個 model_to_estimator 來獲取一個 Estimator,從而將 Keras 轉(zhuǎn)換成了 Estimator。 

 

Estimator 還提供了分布式訓練的接口,如果你用 TensorFlow 來做分布式訓練的話,你就可能熟悉我們的分布式模式。我們的 Estimator 很好地提供了對分布式訓練的支持,只要寫一份單機的代碼,它就可以幫你構(gòu)建好在不同機器上的執(zhí)行的程序,訓練的程序只要調(diào)用 Estimator.train 就能完成這一執(zhí)行過程,只要調(diào)用它的 Estimator.evaluate ,整個集群就可以開始訓練了。 

 

 

大家可以看一下這些 API 的文檔:TF, KERAS, TFLAYERS 等等,我們還發(fā)布了一個改進過的程序員指南在官網(wǎng)上,希望大家去看一下。

 

下一個特性是 TensorFlow Lite ,TensorFlow Lite 是跑在移動設(shè)備上的 TensorFlow 的一個子集?,F(xiàn)在移動設(shè)備無處不在,并且越來越重要。在移動設(shè)備上,我們可以在野外判斷這個狗是什么品種或者判斷這個植物有沒有病害,利用人工智能都可以在移動設(shè)備做一些應(yīng)用,所以我們推出了 TensorFlow Lite.

為什么很多時候要在移動設(shè)備上做?除了剛才說的那些應(yīng)用場景,為什么要做移動設(shè)備的推理?這是因為我們時常需要在一些特殊環(huán)境下做一系列的推理,很多時候,尤其在野外,我們的網(wǎng)絡(luò)帶寬非常的低,網(wǎng)絡(luò)延遲非常大。如果每次推理都向遠程服務(wù)器發(fā)送請求,那對移動設(shè)備的電池能力要求很高。雖然現(xiàn)在市面上對移動設(shè)備能夠完成推理有迫切的需求,但是其中存在很多的挑戰(zhàn),最主要的挑戰(zhàn)是因為移動設(shè)備的內(nèi)存、計算資源以及帶寬等等受到了限制。從編程角度來講,因為平臺抑制性很高,開發(fā)越來越復雜,比如說在安卓上,我們可以使用 CPU 或者指令等方式編寫底層代碼,在 IOS 上又有自己一些平臺和工具,這種不同平臺的工具讓我們的硬件以及 API 的開發(fā),甚至存在不同的 API 讓我們的開發(fā)變得更復雜,所以我們設(shè)計了 TensorFlow Lite. 

 

相比 TensorFlow Lite 的話, TensorFlow 主要關(guān)注一些大型的設(shè)備。TensorFlow Lite 讓小型的設(shè)備應(yīng)用更加效率,現(xiàn)在我們通過一個小的例子看 TensorFlow Lite 如何工作的。 

 

這個是 TensorFlow Lite 生命周期,首先我們以標準方式來運行 TensorFlow,運行結(jié)束之后,我們得到 Graphdef 和 Checkpoint,我們通過 TensorFlow Lite 提供一個轉(zhuǎn)換器,把它轉(zhuǎn)換成 TensorFlow Lite 的模型格式。有了這個 TensorFlow Lite 格式的模型之后,我們就可以把它轉(zhuǎn)移到移動設(shè)備當中。接入 TensorFlow Lite 顯示器就能夠在移動設(shè)備加載這個模型。如果我們的顯示器直接調(diào)度 NeonKerels ,如果是在其他設(shè)備上,還可以利用硬件加速器接口來定義自己對自己硬件的一些優(yōu)化。

下一個特性就是 Input Pipeline ,不管是初學者還是專家都會對 Input Pipeline 感興趣,因為 Input Pipeline 使用起來非常痛苦。

 

 

它主要有兩種模式,一種是 Feeding,它優(yōu)點是可以用 python 靈活處理零距,但是性能很差。而且單線程跑,每一步訓練都要等待數(shù)據(jù)處理的完成,這個對 GPU 來說效率非常低。另外一種方式效率高一點,就是把數(shù)據(jù)處理變成一系列的操作,這使用一個 Queues 作為數(shù)據(jù)存放的臨時空間,我們把預處理好的數(shù)據(jù)和一些中間預處理數(shù)據(jù)放在 Queues 里面,通過 python 來控制 Queues 的輸入和控制。但是有一個問題,這個 python 有一個權(quán)值解釋器的鎖,所以它讓這個 Queues 輸入性能受到很大的限制。 

 

還有一個問題就是,我們寫的數(shù)據(jù)處理模塊沒有辦法得到常用,也沒有辦法在訓練的時候更改輸入數(shù)據(jù)。所以我們了開發(fā)了一套 Input Pipeline,因為種種原因,所以把它設(shè)計成惰性的列表。因為我們的數(shù)據(jù)很多長得類似,而且數(shù)據(jù)量可以比較大,所以可以把它定義成 LAZY,我們把它定義成惰性列表之后,可以很自然用函數(shù)編程語言中的 map 和 filter 來定義預處理管道,我們在很多語言當中都可以看到 map 和 filter 的操作?,F(xiàn)在我們看一下它的接口,我們還有第二個接口叫做 Iterator,可以方便把 edements 數(shù)據(jù)取出來。就像很多一般的編程語言里面的 Iterator 一樣,我們可以對這個 Iterator 配置不同的數(shù)據(jù),PPT 上這就是一個例子,大家可以看一下。 

Learn To Learn 

在神經(jīng)網(wǎng)絡(luò)解決問題的時候,神經(jīng)網(wǎng)絡(luò)也會給我們帶來一些新的問題,就是我們設(shè)計神經(jīng)網(wǎng)絡(luò)架構(gòu)需要投入大量的專業(yè)知識和時間投資,比如這個就是谷歌圖象分類的一個 .NET 的架構(gòu),這個神經(jīng)網(wǎng)絡(luò)架構(gòu)設(shè)計從最初的卷積的架構(gòu)到現(xiàn)在復雜的架構(gòu),經(jīng)過研究人員多年的實驗不斷重復、完善,才得以達到這么復雜的模型。

 

我們與其讓科研人員不斷在電腦面前,為什么不用強大計算資源,讓機器自動尋找好的神經(jīng)網(wǎng)絡(luò)架構(gòu)?在谷歌我們用一種方法,就是用 RNN 循環(huán)神經(jīng)網(wǎng)絡(luò)來生成一個子網(wǎng)絡(luò),這個想法的來源是因為我們可以把一個神經(jīng)網(wǎng)絡(luò)對應(yīng)成一個訓練化的一個個序列,RNN 非常擅長解決這類問題,所以我們用 RNN 來生成一個子網(wǎng)絡(luò),我們把這個子網(wǎng)絡(luò)用真實數(shù)據(jù)進行訓練。通過訓練準確度的好壞來更新 RNN 的控制器。在它下一次迭代當中,RNN 就會輸出更高精度的子網(wǎng)絡(luò)。這是 RNN 轉(zhuǎn)接架構(gòu)的例子,這個例子看上去錯綜復雜,其實也不難理解。

 

我們也嘗試用同樣的方法來生成優(yōu)化函數(shù),然后把生成的優(yōu)化函數(shù)和常用的函數(shù)來進行對比,從這張表可以看到生成的函數(shù)超過了現(xiàn)有函數(shù)的精度,但是這些生成的函數(shù)非常的不直觀,所以我們就開始想,有沒有更加直觀的方法來處理 learn 2 learn 這個問題,于是我們想到了進化的算法,或者說遺傳算法。既然一個簡單單細胞生物都可以進化到非常復雜的、有獨立思考多細胞生物,那么我們可以不可以把同樣理論用到模型的構(gòu)建上來,于是我們就設(shè)計了這樣一種算法,在每個時間的開始,我們建立了含有一千個訓練好模型的種群,每一步進化從一千個模型中隨機選兩個,比較他們的準確率,準確率低的模型就會被扔掉,準確率高的模型會留下來,而且模型會繁殖,他們繁殖的方式就是給模型創(chuàng)建一個副本,并且簡單修改這個模型,看上去像基因變異一樣,我們會訓練這個變異的副本然后放在種群當中。

 

 

這個是分布式訓練的細節(jié)。模型變異有很多種,我們剛才提到結(jié)構(gòu)的一些變化,甚至也有一些會保持不變,但是我們會對它多訓練一下,或者重新訓練一下,因為初始化變異非常重要。變異化的選擇是均勻分布概率的模型。

我們看一下進化時間的***進展,圖中橫軸代表的是時間,縱軸是準確率,里面每個點代表種群當中一個模型,灰色點是被淘汰的模型。右上方藍色的點是存活下來的模型,訓練三天之后就在這個位置。訓練三天之后就可以得到一個比較高的準確率。在訓練十天之后,可以看到準確度達到停止期,也就是我們找到了個比較理想的模型。

Device Placement

我們看一下另外一個研究項目叫做 Device placement ,他是用強化學習的方法來做 Device Placement ,當前機器學習使用了非常多的模型,也使用非常多的數(shù)據(jù),這個要求我們必須有很多的設(shè)備共同訓練這個模型。

 

比如說看到這個翻譯的模型就非常大。我們通常使用 128 個 GPU 來訓練,我們先簡單介紹一下 Device placement ,Device placement 就是把計算和設(shè)備對應(yīng)起來,目前我們都是用一些人工的方法,甚至簡單的算法。我們設(shè)置算法需要我們對設(shè)備有充分的了解,而且對模型有充分的了解,這個算法并不是簡單從一個模型推廣到另外一個模型。但是目前非常時髦的做法,都是將基于這些規(guī)則的系統(tǒng)轉(zhuǎn)化為,變成基于機器學習的系統(tǒng),所以我們也用了類似的方法。我們用強化學習的方法來解決這個 Device placement 的模型,我們受 learn 2 learn 方法的啟發(fā)來創(chuàng)建一個類似的模型。

我們有一個網(wǎng)絡(luò),這個網(wǎng)絡(luò)以神經(jīng)網(wǎng)絡(luò)作為輸入,同時告訴一個網(wǎng)絡(luò)有多少計算資源,這個網(wǎng)絡(luò)就會告訴我們 Neural Model ,我們跑一下這個放置好的 Neural Model ,根據(jù)運行的時間來調(diào)整一下神經(jīng)網(wǎng)絡(luò),我們用類似的機器翻譯的架構(gòu)。因為模型比較大,比較慢,我們采用了數(shù)據(jù)并行方式來做訓練。

 

 

 

之后我們看一下訓練出來的結(jié)果,這是在一個神經(jīng)翻譯系統(tǒng) Device placement 的結(jié)果,上面白色的點代表是在 CPU ,在 CPU 運行的節(jié)點,下面彩色點代表在不同 GPU 運行的節(jié)點,盡管取得了 20% 左右的提高,但是還是非常不利于理解?,F(xiàn)階段這個在輸入端采用了 CPU ,到后面都是采用了 GPU 。

 

大數(shù)據(jù) 

***兩張圖表示我們在神經(jīng)翻譯系統(tǒng)上,每個 GPU 運算非常平衡,而右邊人類專家設(shè)計的運算非常不平衡,在 GPU2 花了非常長的時間,在其他 GPU 花了很少的時間,但是這個也是可以理解,因為專家設(shè)計一般只考慮到一部分。在 Inception V3 我們的結(jié)果不是非常平衡。但是可能是因為 Inception V3 當中有一些過分的依賴,我們的結(jié)果仍然在 Inception V3 有總體的運行時間上的提高。后來我們做一些分析發(fā)現(xiàn)因為在數(shù)據(jù)拷貝期間,我們花了更少的時間。所以總體對它有一個運行時間的提高。

The End

我們講了兩個例子,我們探索如何用算法或者機器學習來優(yōu)化機器學習的模型,并且取得了一定的進展,我們相信在不久的將來,如果有更好的計算資源,以后的所有架構(gòu)將是由電腦的生成,谷歌已經(jīng)給大家走出了探索的***步,希望大家都可以參與其中,我講到這里,謝謝大家! 

責任編輯:龐桂玉 來源: 36大數(shù)據(jù)
相關(guān)推薦

2018-04-11 17:50:14

深度學習PyTorchTensorFlow

2009-02-11 13:15:54

軟件工程師女工程師google

2017-08-16 10:57:52

深度學習TensorFlowNLP

2010-01-26 10:00:30

Google工程師Web

2009-03-04 09:17:47

GoogleChrome工程師

2017-06-04 23:39:16

TiKVC++Rust

2021-03-26 09:11:23

技術(shù)研發(fā)工程師

2011-04-25 09:34:52

PythoncGO

2009-10-30 09:36:10

GoogleLinux操作系統(tǒng)

2010-11-29 09:46:35

Dalvik系統(tǒng)架構(gòu)Android

2012-05-31 02:43:40

Google薪酬職位

2010-11-22 10:37:31

Google跳槽

2009-03-23 13:50:10

工程師規(guī)劃職場

2013-08-19 09:31:16

Google工程師

2013-05-22 11:17:52

GoogleAndroid碎片化

2015-05-21 10:43:36

工程師如何寫代碼

2010-01-21 08:56:13

2011-09-16 09:23:41

軟件項目

2013-10-25 11:19:18

Google大數(shù)據(jù)Sanjay Ghem

2010-09-13 17:38:47

Google的系統(tǒng)工程
點贊
收藏

51CTO技術(shù)棧公眾號