天天看點

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

本文根據才雲科技首席大資料科學家鄭澤宇在qcon2016全球軟體開發大會(上海站)上的演講整理而成,希望大家可以了解如何通過tensorflow實作深度學習算法,并将深度學習運用到企業實踐中。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

講師介紹

鄭澤宇,谷歌進階工程師。從 2013 年加入谷歌至今,鄭澤宇作為主要技術人員參與并上司了多個大資料項目,擁有豐富機器學習、資料挖掘工業界及科研項目經驗。2014 年,他提出産品聚類項目用于銜接谷歌購物和谷歌知識圖譜(knowledge graph)資料,使得知識卡片形式的廣告逐漸取代傳統的産品清單廣告,開啟了谷歌購物廣告在搜尋頁面投遞的新紀元。他于2013年5月獲得美國 carnegie mellon university(cmu)大學計算機碩士學位, 期間在頂級國際學術會議上發表數篇學術論文,并獲得西貝爾獎學金。

什麼是深度學習?

深度學習這個名詞聽了很多次,它到底是什麼東西,它背後的技術其實起源于神經網絡。神經網絡最早受到人類大腦工作原理的啟發,我們知道人的大腦是很複雜的結構,它可以被分為很多區域,比如聽覺中心、視覺中心,我在讀研究中心的時候,做視訊有計算機視覺研究室,做語言有語言所,語音有語音所,不同的功能在學科劃分中已經分開了,這個和我們人類對大腦了解多多少少有一些關系。之後科學家發現人類大腦是一個通用的計算模型。  

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

科學家做了這樣一個實驗,把小白鼠的聽覺中心的神經和耳朵通路剪斷,視覺輸入接到聽覺中心上,過了幾個月,小白鼠可以通過聽覺中心處理視覺信号。這就說明人類大腦工作原理是一樣的,神經元工作原理一樣,隻是需要經過不斷的訓練。基于這樣的假設,神經學家做了這樣的嘗試,希望給盲人能夠帶來重新看到世界的希望,他們相當于是把電極接到舌頭上,通過錄影機把不同的像素傳到舌頭上,使得盲人有可能通過舌頭看到世界。對人類神經工作原理的進一步了解讓我們看到深度學習有望成為一種通用的學習模型。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中
如何通過TensorFlow實作深度學習算法并運用到企業實踐中

上圖給出了神經網絡的大緻結構。圖中左側是人類的神經元,右側是神經網絡的神經元。神經網絡的神經元最早受到了人類神經元結構的啟發,并試圖模型人類神經元的工作方式。具體的技術這裡不做過深的讨論。上圖中下側給出的是人類神經網絡和人工神經網絡(artificial neural network)的對比,在計算機神經網絡中,我們需要明确的定義輸入層、輸出層。合理的利用人工神經網絡的輸入輸出就可以幫助我們解決實際的問題。

神經網絡最核心的工作原理,是要通過給定的輸入信号轉化為輸出信号,使得輸出信号能夠解決需要解決的問題。比如在完成文本分類問題時,我們需要将文章分為體育或者藝術。那麼我們可以将文章中的單詞作為輸入提供給神經網絡,而輸出的節點就代表不同的種類。文章應該屬于哪一個種類,那麼我們希望對應的輸出節點的輸出值為1,其他的輸出值為0。通過合理的設定神經網絡的結構和訓練神經網絡中的參數,訓練好的神經網絡模型就可以幫助我們判斷一篇文章應該屬于哪一個種類了。

深度學習在圖像識别中的應用

深度學習,它最初的應用,在于圖像識别。最經典的應用就是imagenet的資料集。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

imagenet是一個非常大的資料集,它裡面有1500萬張圖檔。下圖展示了資料集中一張樣例圖檔。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

在深度學習算法被應用之前,傳統的機器學習方法對圖像處理的能力有限。在2012年之前,最好的機器學習算法能夠達到的錯誤率為25%,而且已經很難再有新的突破了。在2012年時,深度學習首次被應用在在imagenet資料集上,直接将錯誤率降低到了16%。在随後的幾年中,随着深度學習算法的改進,錯誤率一直降低到2016年的3.5%。在imagenet資料集上,人類分類的錯誤率大概為5.1%。我們可以看到,機器的錯誤率比人的錯誤率更低,這是深度學習帶來的技術突破。

什麼是tensorflow

tensorflow是谷歌在去年11月份開源出來的深度學習架構。開篇我們提到過alphago,它的開發團隊deepmind已經宣布之後的所有系統都将基于tensorflow來實作。tensorflow一款非常強大的開源深度學習開源工具。它可以支援手機端、cpu、gpu以及分布式叢集。tensorflow在學術界和工業界的應用都非常廣泛。在工業界,基于tensorflow開發的谷歌翻譯、谷歌rankbrain等系統都已經上線。在學術界很多我在cmu、北大的同學都表示tensorflow是他們實作深度學習算法的首選工具。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

上面的ppt給出了一個簡單的tensorflow程式樣例,這個樣例實作了向量加法的功能。tensorflow提供了python和c++的api,但python的api更全面,是以大部分tensorflow程式都是通過python實作的。在上面程式的第一行我們通過import将tensorflow加載進來。在tensorflow中所有的資料都是通過張量(tensor)的方式存儲,要計算張量中資料的具體取值,我們需要通過一個會話(session)。

上面代碼中的第二行展示了如何生成會話。會話管理運作一個tensorflow程式所需要的計算資源。tensorflow中一個比較特殊的張量是變量(tf.variable),在使用變量之前,我們需要明确調用變量初始化的過程。在上面的代碼最後一行,我們可以看到要得到結果張量output的取值,我們需要明确調用計算張量取值的過程。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

通過tensorflow實作神經網絡是非常簡單的。通過tflearn或者tensorflow-slim可以在10行之内實作mnist手寫體數字識别問題。上面的ppt展示了tensorflow對于不同神經網絡結構的支援,可以看出,tensorflow可以在很短的代碼内支援各種主要的神經網絡結構。

雖然tensorflow可以很快的實作神經網絡的功能,不過單機版的tensorflow卻很難訓練大規模的深層神經網絡。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

這張圖給出了谷歌在2015年提出的inception-v3模型。這個模型在imagenet資料集上可以達到95%的正确率。然而,這個模型中有2500萬個參數,分類一張圖檔需要50億次加法或者乘法運算。即使隻是使用這樣大規模的神經網絡已經需要非常大的計算量了,如果需要訓練深層神經網絡,那麼需要更大的計算量。神經網絡的優化比較複雜,沒有直接的數學方法求解,需要反複疊代。在單機上要把inception-v3模型訓練到78%的準确率大概需要5個多月的時間。如果要訓練到95%的正确率需要數年。這對于實際的生産環境是完全無法忍受的。

tensorflow on kubernetes

如我們上面所介紹的,在單機環境下是無法訓練大型的神經網絡的。在谷歌的内部,google brain以及tensorflow都跑在谷歌内部的叢集管理系統borg上。我在谷歌電商時,我們使用的商品分類算法就跑在1千多台伺服器上。在谷歌外,我們可以将tensorflow跑在kubernetes上。在介紹如何将tensorflow跑在kubernetes上之前,我們先來介紹一下如何并行化的訓練深度學習的模型。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

深度學習模型常用的有兩種分布式訓練方式。一種是同步更新,另一種是異步更新。如上面的ppt所示,在同步更新模式下,所有伺服器都會統一讀取參數的取值,計算參數梯度,最後再統一更新。而在異步更新模式下,不同伺服器會自己讀取參數,計算梯度并更新參數,而不需要與其他伺服器同步。同步更新的最大問題在于,不同伺服器需要同步完成所有操作,于是快的伺服器需要等待慢的伺服器,資源使用率會相對低一些。而異步模式可能會使用陳舊的梯度更新參數導緻訓練的效果受到影響。不同的更新模式各有優缺點,很難統一的說哪一個更好,需要具體問題具體分析。

無論使用哪種更新方式,使用分布式tensorflow訓練深度學習模型需要有兩種類型的伺服器,一種是參數伺服器,一種是計算伺服器。參數伺服器管理并儲存神經網絡參數的取值;計算伺服器負責計算參數的梯度。

在tensorflow中啟動分布式深度學習模型訓練任務也有兩種模式。一種為in-graph replication。在這種模式下神經網絡的參數會都儲存在同一個tensorflow計算圖中,隻有計算會配置設定到不同計算伺服器。另一種為between-graph replication,這種模式下所有的計算伺服器也會建立參數,但參數會通過統一的方式配置設定到參數伺服器。因為in-graph replication處理海量資料的能力稍弱,是以between-graph replication是一個更加常用的模式。

如何通過TensorFlow實作深度學習算法并運用到企業實踐中

最後一個問題,我們剛剛提到tensorflow是支援以分布式叢集的方式運作的,那麼為什麼還需要kubernetes?如果我們将tensorflow和hadoop系統做一個簡單的類比就可以很清楚的解釋這個問題。大家都知道hadoop系統主要可以分為yarn、hdfs和mapreduce計算架構,那麼tensorflow就相當于隻是hadoop系統中mapreduce計算架構的部分。

tensorflow沒有類似yarn的排程系統,也沒有類似hdfs的存儲系統。這就是kubernetes需要解決的部分。kubernetes可以提供任務排程、監控、失敗重新開機等功能。沒有這些功能,我們很難手工的去每一台機器上啟動tensorflow伺服器并時時監控任務運作的狀态。除此之外,分布式tensorflow目前不支援生命周期管理,結束的訓練程序并不會自動關閉,這也需要進行額外的處理。

本文作者:鄭澤宇

來源:51cto

繼續閱讀