天天看點

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

ai并不是一門簡單的學科,ai算法的開發和調試并沒有一個統一的、內建了大量api友善調用的平台和語言,目前的人工智能開發平台仍然處于一種半蠻荒的狀态。許多功能需要自己親自去搭建和實作。

不過幸運的是,這個領域受到了足夠多的重視,是以許多巨頭都針對它開發了自己的平台,這其中就包括谷歌的tensorflow。谷歌deepmind在ai領域的造詣已經人盡皆知,其推出的這款開發語言平台也不禁引人遐想,那麼,tensorflow到底适合如何拿來做開發?能不能為你的研究或者産品帶來更好的機會?

本期公開課我們邀請到了科技公司nielsen的機器學習實驗室的負責人李加波博士,他帶領的團隊利用基于tensorflow自己改進的算法成功運用在了公司的精準廣告推送業務中。在産業界的十多年中,李博士始終堅持學術研究與産業應用相結合,長期保持與學術界的緊密合作,并将學術成果引入到軟體創新中。

嘉賓介紹,李加波,目前任職于美國科技公司nielsen的 machine learning lab, 負責上司基于深度學習智能産品的研發,主要利用tensorflow架構搭建新型的深度神經網絡,利用gpu訓練各種使用者分類模型,并将這些模型運用于精準廣告推送中。在去年加入nielsen之前曾任職于生物,制藥和金融等科技軟體公司,包括accelrys, 薛定谔(schrödinger)及td ameritrade。

李博士在工業界的十多年中始終堅持學術研究與工業應用相結合,長期保持與學術界的緊密合作,并将學術成果引入直接到軟體創新中。目前任中山大學藥學院客座教授,指導博士生的研究課題,并開設了advanced lectures on algorithms and high performance computing (算法與高性能計算程式設計) 進階研讨班。另外在國際期刊發表科學論文六十多篇。李博士對各種複雜科學計算算法問題有極緻的追求,并發明了一系列不同學科的優秀算法。

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

▎為什麼一開始選擇tensorflow作為首選平台?

最開始對于選取何種深度學習平台并不确定,而且那時tensorflow還尚未問世。當時的考慮主要是該平台的成熟程度,支援的程式設計語言,gpu的支援和效率,搭建神經網絡的使用的友善程度,上手難易,平台的後續發展,開發的生态環境,平台的效率等因素。盡管我們收集了一些評比資料,要在諸多因素的權衡之中做出選擇并非易事,而且逐個去試也不現實。不久之後,tensorflow從google開源,我們毫不猶豫地標明了它。

其一,tf有我們要求的所有功能(c++/python語言支援,gpu,等)。更重要的是我們相信由google推出的平台會很快為大家接受并迅速形成對應的開發生态圈和活躍的後續更新發展。後來的事實也證明了我們的料想。下面表格比較了幾種流行的平台,資料來源于今年二月份在arxiv釋出的論文。

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

那時候,caffe和theano還是最活躍的開源開發社群,但到目前tensorflow已有最多的開發者。見下表:

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

總體來講,tf給我的感覺不錯,我相信google産品的後發優勢。

總的來說,tensorflow提供的api對搭建神經網絡有了足夠的自由度。對于損失函數的構造也很直接,tf架構能自動計算任意建構的損失函數的導數。對模型參數的訓練也提供了最新的一些算法可供選擇。tf使用者論壇也很活躍,有疑難問題也很快能從中得到幫助。

當然也有一些不足之處。例如如果要構造任意連接配接的神經網絡,tf沒有提高直接的工具,但有一個通過矢量轉置的變通的辦法來實作,但代價是訓練和打分都十分的緩慢。

另一個不足之處是,對于實時的應用(需要對單個輸入一個個單獨計算打分),效率很低。例如,将一千個輸入記錄作為一個批處理交給tf打分要比分一千次每次計算一個記錄要快100倍。這意味着後者(實時應用)比其前者的效率低了兩個數量級。

何恺明去年底提出的152層超深度的殘差網絡赢得了2015年度imagenet競賽的冠軍,随後論文發表在arxiv上("deep residual learning for image recognition", by kaiming he, xiangyu zhang, shaoqing ren, and jian sun. (dec. 10 2015) http://arxiv.org/abs/1512.03385)。

今年七月同樣在arxiv 上發表續集("identity mappings in deep residual networks", by kaiming he, xiangyu zhang, shaoqing ren, and jian sun. (july, 2016) http://arxiv.org/abs/1603.05027v3)。 這裡姑且叫前者resnet i, 後者 resnet ii。殘差網絡的出發點很簡單,簡潔性正是大受歡迎的原因。

起核心思想包含三個要素:資訊通路捷徑,殘差單元,殘差單元輸出與資訊通路的合并。數學表達為:

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

其中f為殘差單元的操作,h(x) = x. resnet i 與 resnet ii的差異在于其中的f 函數。如f是非線性變換,則為resnet i, 如果f 為恒等變換則為resnet ii,見下圖:

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

figure 2a. the tensor flow chart of resnet i.

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

figure 2b. the tensor flow chart of resnet ii. 

總結:resnet i在資訊合并後緊接非線性變換,而resnet ii則數非線性變換後在合并。

首先,沒有一個現成的網絡構架能完全合乎我們問題的解決方案,這是實際需要。同時,要得到最好結果,必須對最新的研究成果廣泛吸收,加以創新。對于為何在應用中要采用resnet的思想我們得從了解resnet為何能有效開始。盡管恺明有一點解釋,但這裡我給出不同角度的一個了解。一個神經網絡模型的精确度受兩個競争因素的影響:網絡複雜度越高,模型的表達力越強,逼近最佳結果的潛力也越高。

另一面,複雜度越高,從高維參數空間通過sgd方法尋求最佳解的困難也越大。可以将sgd優化類比從山上沿着山路下到山底谷的過程, 如圖(圖檔來自網上):

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

figure 3. stochastic gradient descendent (sgd)  method 

可以這樣了解:可以将優化問題了解為從山上凹凸不平的山路中尋找一條到達山谷的途徑,山路崎岖,充滿陷阱。隻是相對于神經網絡模型而言是在一個超高維(數百萬維對于三維)的山上,而山路的崎岖複雜和陷阱的數量遠超三維空間的情形。要成功下到山谷(或接近山谷),下山途中要盡量避免誤入歧途,掉入陷阱,萬一掉入也有機會逃去陷阱。resnet的結構是在原有的網絡基礎上添加了一個資訊通路捷徑,進而可以向前跨越數層網絡在一些特定層與原來的輸出彙合,并作為下一個殘差單元的輸入。從數學直覺上看,這應該是勢能面變得平坦一些,即使下山掉入陷阱,從中逃逸的機會也大些。

一旦了解了resnet的思想就可以在其它網絡構架中利用,而這個在tensorflow上很容易實作。

tensorflow提供的python api可直接用于網絡的搭建。這些api非常直覺,可以将網絡結構的數學表達直接翻譯成對應tf函數的調用(例如tf.nn.matmul, tf.nn.relu, tn.nn.l2_loss  for l2 regularization,and  tf.reduce_sum for l1 regularization)。由于tf能對任意損失函數自動計算導數,是以可以設計任何形式的損失函數和任意的網絡結構,非常靈活。

resnet 的引入,讓我們可以建立超深度的神經網絡而不必太擔心訓練模型中的收斂性的問題。即使對于不太深的網絡,resnet 仍可以改進收斂和改善精度。

▎tensorflow使用中需注意的問題?

在使用tensorflow上與其它架構沒有特别的地方。不過有些問題對于神經網絡的訓練帶有普遍性。

首先,訓練神經網絡往往有許多宏觀控制參數,包括網絡結構的深度,寬度,學習速率的選擇及動态調節,正則化(regularization)的類型和強度,疊代次數等。這些沒有一個簡單的标準怎樣選區,通常隻能通過不斷試錯才能找到最佳答案。模型中的參數初始化也很關鍵, 如選擇不當,疊代會停滞不前。例如,如果優化陷入停滞不前,簡單的解決辦法就是對全體起始參數進行縮放。

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

figure 4. convergence is very sensitive to both learning rate and model initialization.

前一個圖開始學習速率為0.002,模型訓練收斂正常。第二個圖開始學習速率為0.02,完全不收斂(欲速則不達)。

在tensorflow上搭建神經網絡還是比較直接的,因為tensorflow 提供了十分豐富的api (python和c++),和搭建神經網絡的各個元件,包括卷積網絡構件,各種優化方法,各種損失函數的組合,正則化控制等。是以許多軟體開發都可以基于tensorflow提供的python應用接口進行,是以在研發中可以快速實驗不同的構架。

然而,也正是因為使用python接口,對于特定應用這有可能成為效率的瓶頸。我目前還沒有深入到c++底層修改tensorflow。但從長遠看進入底層的擴充是必要的,特别是對特定應用進行效率優化。 例如,對于一個實時應用來說,要求能夠對于每一個單獨的輸入快速響應,傳回結果。我們發現,雖然tensorflow gpu版本能夠高速批處理打分(batch scoring),如果同樣的數量單獨一個個處理,效率可能會慢兩個數量級,這對于實時應用是個問題。解決之道可以單獨編寫一個高效率的打分函數,而不必依賴tensorflow。

這個問題要這樣看:殘差網絡(resnet) 和卷積神經網絡( convnet) 之間是平行概念,互不排斥。

resnet的基本思想可以和卷積神經網絡結合,也可和其它任何類型的神經網絡結合。resnet的核心思想是在不改變網絡表達力和複雜度的情形下改變損失函數勢能面的狀況,進而使優化到最佳點的途徑變得順利些。

這個問題很大,有些籠統。總的來說,并非所有應用都需要用深度學習。能用簡單模型解決的問題絕不用複雜的深度模型。例如如果問題能用線性模型就能得到很好的結果,那麼用深度神經網絡就沒必要,因為簡單模型的效率要高很多。但如果問題是高度非線性,而且各個變量之間存在強烈耦合,那麼這時用神經網絡可能是一個好的選擇。但即使如此,也要從簡單的網絡開始入手,例如3-6層網絡,然後逐漸增加層數,仔細觀察是否有改進空間。由于sgd優化結果帶有一定的誤差和不确定性,每次tensorflow優化的結果會有g一定的差别,是以觀測增加層數是否改進模型精度時要小心,要重複多次運算,取平均值,然後做比較。這樣做對于樣本數較少時尤為重要。

這個問題很大,應該問jeff hinton 或yan lecun 等大牛。但一些通常的創新思維方式還是值得借鑒的。我認為,首先要對問題有透徹的了解。例如我門希望對卷積神經網絡是怎樣工作的,近幾年不斷改進的算法是如何提高模型精度的有深入的認識,不僅如此,我們還要對反方向的研究結果有所了解。例如,szegedy 等人的研究表明,在一個能被dnn模型完全正确識别的圖檔(如獅子)加入人眼難以擦覺的噪聲,然後再讓計算機識别,會認為是一個完全不同的類别。

還有最近yoshinski 的研究表明利用一訓練好的dnn模型可以從完全無規的電視機雪花噪聲圖檔(完全沒有任何意義),通過對圖象優化使得dnn以很高的置信度(99.99%)認為是某個特定動物(如熊貓或啄木鳥等)而得到的圖像仍然如同一片噪聲,完全看不出任何有意義的模樣。  

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

如果我們能從數學上了解這些現象那麼我們必将産生更新的思想,引導我們嘗試新的網絡結構,進而發現更有效,更精确,更魯棒的算法來。但是,對于這些問題我們目前還了解得不透,而恰恰是因為這樣,還有許多創新空間等待我們發現。另外,目前關于圖像識别的大多數算法幾乎都是基于卷積神經網絡。是否有其它途徑,使得我們即使利用較少的樣本也可以訓練出很好的模型,如同人類認知能力一樣?這值得我們深思!

怎樣跟據自己需求改進網絡架構這個問題比較泛。大緻講要根據自身應用問題的特殊性調整。例如,卷積神經網絡主要用于圖像識别,因為圖像中的每個像素都與其鄰近像素關連,而全部的這種關聯,空間關系決定了一個圖像的表征。卷積神經網絡的設計就是為了提取這些特征,并通過大量例子訓練模型。

而有些問題,其變量之間的互相作用關系不明确,無法套用卷積神經網絡。這時可以采用全連接配接網絡,或根據已知或猜測到的互相作用關系建立網絡連接配接(這樣可大大減少參數量)。實際應用中還涉及模型的效率(速度)問題。 如果一個神經網絡過大,無論是訓練還是用于打分都會較慢,如需提速,必須減少模型的大小。

▎如何利用gpu加速?請舉例說明。

對于tensorflow,其gpu加速已在其核心構架的底層已經實作了。對于所有關神經網絡運算都有對應的gpu版本,是以從開發者的角度看,tensorflow 實際上已将開發者從gpu程式設計的痛苦中解救出來了。是以,利用gpu加速變成了僅僅是一個安裝的問題。

如果你有gpu機器,裝載支援gpu的tensorflow版本即可。cpu/gpu版本從api的角度是透明的,同樣的python代碼可以在cpu/gpu兩個版本上運作。

不過安裝gpu版本時有一點要注意:tensorflow預設要求gpu卡的運算能力為3.5或以上。如果你的gpu的運算能力為3.0(相當普遍),那麼預設安裝會有問題。這時要從源代碼進行編譯安裝,并且要在編譯時的計算能力選項參數設為3.0。目前amazon雲計算提供的gpu還是3.0,是以在amazon 上安裝tensorflow 要從源代碼開始編譯安裝。tensorflow支援多gpu,但相應的代碼要修改,因為要對任務的配置設定進行程式設計。我們比較了一個32核cpu與一個單片gpu機上tensorflow 運作的速度做個比較。gpu機器大約是32核cpu機器速度的4倍。 

▎你是如何多年堅持科研并将成果引入到軟體創新中的?

多年堅持将學術成果引入到軟體創新中需要有很大的熱情。

我一直保持着學術研究的興趣,尤其是與實際應用相關的問題, 其目的就是要将突破性研究成果融入到新産品的開發之中。 例如,2006獲得了公司獎勵的學術休假,使得我有幾個月自由科研的機會,也正是在此期間發明了恺撒(caesar)算法,提高了三維分子結構模拟的效率達十倍以上,并作為藥物分子設計的一個核心子產品廣泛應用于各大制藥公司的藥物研發中。從2008年以來開始與中山大學,除了給國内的研究所學生遠端授課外,每年也回國一兩次講學,并指導研究所學生的課題。

另一成功案例:wega(三維幾何形狀比較的高斯權重)算法。

工業應用:藥物分子的計算機輔助設計 問題痛點:超大規模分子庫三維數十億個分子形狀的比較計算量巨大而費時。 合作研究:與中山大學藥學院合作,組建了一個攻關團度,包括博導和其學生。 解決方案:分三步:1)新算法,2)gpu加速, 3)gpu叢集的大規模并行。

研究成果:

1)算法方面,提出了比較分子三維形狀的wega(高斯權重)算法,大大提高了計算精度同時保留了計算的簡潔性和高效率。 2)指導中大博士生開發了利用gpu加速的gwega,使得單片gpu即可提高近100倍的加速。 3 )利用廣州超算中心的gpu叢集實作了大規模gpu并行,将tb數量級的超大規模分子庫的三維結構檢索移植到gpu叢集中,實作了1億次/秒的高通量藥物分子虛拟篩選,比國際競争對手快了近兩個數量級。這一成果我們申請了中國和國際專利。

難點:這個項目的難點是gpu程式設計。gpu程式設計的門檻較高,尤其是要達到高效率,特别是要達到近100倍的加速,對程式設計技巧有苛刻的要求。為此,外特地為中東研究所學生開設了gpu程式設計課,讓學生很快入門,進而對gpu架構有深入的了解,關鍵地方和學生一同探讨,對每行代碼逐條分析優化,将效率推行極緻。這個過程不僅培養了學生,同時也使難題得以解決。

可以,但比較麻煩,因為你不知道怎樣歸類,對于音頻完全可以,時間和頻率構成二維圖像。

Come on ! 手把手教你玩轉谷歌TensorFlow | 硬創公開課

本文作者:宗仁

繼續閱讀