和 Google 頂尖工程師一起研究機器學習一整年,這是我的精華筆記

【我們為什麼挑選這篇文章】這篇是非常完整的筆記了,寫出了 Ryan 這一年嘗試做的事,學到的經驗,還有在面對問題時中間的處理思路,有點難,但很好看,請笑納。(責任編輯:林子鈞)

本文作者 Ryan Dahl 是 Node.js 的創始人,應該算是軟體工程領域當之無愧的強人了。他和我們分享了自己在谷歌大腦見習項目一年中的工作,成果,失敗和思考。

去年,在通過對 TensorFlow 的研究得出一點點心得之後,我申請併入選了谷歌大腦舉辦的的首屆見習項目(Google Brain Residency Program)。該項目共邀請了 24 名在機器學習領域有著不同背景的人士,受邀者將在為期一年的時間裡和 Google 的科學家及工程師們在位於山景城的 Google 深度學習研究實驗室中共同探索最前沿的深度學習科技。

這個為期一年的項目已經結束了,在此我將就這一年的經歷作一個總結與分享。

最初擬定的目標是「修正」老電影或電視劇的畫面。想像一下,上世紀 90 年代電視劇的粗糙畫面或 60 年代的黑白電影,在色彩華麗的 4K 屏幕上播放的情景。

這應該是完全可行的:把 4K 視頻轉換成滿是顆粒感的、低分辨率的、甚至是只有黑白兩色的視頻並不難,之後再通過某個訓練出的監督模型來反轉這個過程就可以「修正」了。而且,有數不盡的數據訓練集,很棒不是嗎!

先別急著興奮——因為能做這事的技術還沒有出現…… 不過我們確實離目標越來越近了。

為了更好地實現這個目標,以科技之名,我再一次搬離了布魯克林來到了灣區。幾天後我的日常生活就變成了與 Google 的機器學習專家進行討論以及在龐大的軟體架構中四處探索。

如果你想跳過技術細節,可以直接跳到總結部分。

本文作者 Ryan Dahl 開發了 Node.js,一個流行的前端框架

超分辨率的像素遞歸

眾所周知,在美劇《CSI 犯罪現場》中使用的縮放技術在現實中並不存在,你無法將照片放大到任意倍數。但可行的是,在放大照片的同時將像素可能構成的合理圖形進行推測並呈現,這也是實現我目標的第一步–逆向提高圖片的分辨率。

在文獻中,這一問題被稱之為「超分辨率」問題,是一個科學家們嘗試了很久都沒有解決的難題。

根據以往的經驗,我們認識到只是訓練一個卷積模型最小化低分辨率圖像與高分辨率圖像的平均像素差值無法徹底地解決這一問題。因為這一類模型訓練的目的是平均化輸入圖像和目標圖像的整體差值,這就導致了生成的圖片非常模糊。

對我們而言,理想模型應該針對不同區域做出一個最佳的選擇,儘可能的對細節做出全方位的優化。比如說,輸入一張模糊的樹的圖片,我們希望我們的模型能分別對樹的軀幹、樹枝、樹葉進行優化,哪怕原圖中沒有相應的細節也沒有關係。

起初,我們打算用條件型生成對抗網絡(conditional GAN)來解決這個問題,但經過幾次失敗的嘗試後,我們換成了另一種有望解決該問題的新型生產式模型—— PixelCNN。(換成 PixelCNN 不久,SRGAN 就發佈了,它用 GAN 來解決超分辨率問題並能輸出相當不錯的結果。)

PixelCNN 和傳統的卷積神經網絡十分不同,它將圖像生成問題轉化成了一個像素序列選擇問題。核心思想借鑑與於 LSTM(長短時記憶網絡)這樣的門控遞歸網絡,儘管他們通常被應用於單詞或字符序列的生成上,但無可否認效果是非常好的。 PixelCNN 巧妙地構建出一個卷積神經網絡(CNN),它能基於先前的像素的概率分佈來生成下一個像素,也就是說同時具備了序列模型和卷積神經網絡的特點。

van den Oord 等人所繪

讓我沒想到的是,通過 PixelCNN 生成的圖像看起來非常自然。與對抗網絡試圖在生成與鑑別中找到一個精確的平衡不同,PixelCNN 的目標只有一個,所以面對超參數的變化,它有更好的穩健性,也更容易被優化。

對於用 PixelCNN 解決超分辨率問題的首次嘗試,我試圖用 ImageNet 提供的圖片進行訓練,但事實證明這個目標還是有些太高了。(相較於很多生成式模型使用的 CIFAR-10、CelebA 或 LSUN 數據集,ImageNet 更加的複雜)我很快地就發現——像素來序列生成圖像的過程極其緩慢。

當輸出圖像的尺寸大於 64×64 時,生成一張圖片的耗時超過數個小時!但當我降低了輸出圖像的尺寸並使用臉部或臥室類的小型數據集後,就開始慢慢得到了一些振奮人心的結果了。

用名人臉部圖像數據集訓練出來的超分辨率像素遞歸模型所生成的高分辨率圖像。

左側為測試數據集所用的 8×8 低分辨率輸入圖像。中間為 PixelCNN 模型所輸出的 32×32 高分辨率圖像,右側是原始的 32×32 分辨率圖像。我們的模型優先整合臉部特徵,而後去合成較為逼真的頭髮與皮膚方面的細節。

就計算資源而言,在 Google 不會因 GPU 或 CPU 的數量而受限,所以如何擴大訓練的規模便成為該項目的另一個目標——因為即便採用這些小型的數據集,在單個 GPU 上完成訓練也要花上數週的時間。

異步隨機梯度下降(Asynchronous SGD)是最理想的分佈式訓練方法。使用這種方法,你可以用 N 台機器,每一台都獨立訓練同一模型,並在每個時間步長共享一次權重參數。

權重參數被託管在一台單獨的「參數服務器」上,該服務器在每個時間步長內都進行「遠程過程調用(RPC)」,以獲得最新數值並發送梯度更新。

如果整個數據流非常順暢,就可以通過增加線程的方式線性增加模型每秒內的訓練次數。但因為每個線程都是獨立訓練的,隨著線程數的增加會越來越容易導致在當前線程還沒有完成一次訓練或更新時,它所使用的權重就已經過期了。

如果是為瞭解決分類問題,這對神經網絡的影響不大,把訓練的規模擴增到幾十台機器不難。但 PixelCNN 卻對過時的梯度極其敏感,這就導致了通過增加硬件的數量來使用異步隨機梯度下降算法所帶來收益微乎其微。

另一個方法,是用同步隨機梯度下降算法(Synchronous SGD)。使用這一方法,所有線程在每個時間步長內進行同步,每次下降的梯度會被平均,這保證不會出現權重過期的問題。

從數學的角度看,它與隨機梯度下降算法是一樣的,既機器越多,批處理能力越強。但同步隨機梯度下降算法(Sync SGD)的優勢是,它允許各線程使用更小、更快的批尺寸,從而來增加每秒訓練的次數。

但同步隨機梯度下降算法也有自己的問題:首先,它需要大量的機器經常進行同步,這就無可避免的會導致停機時間的增加;其次,除非將每台機器的批尺寸設為 1,否則它無法通過增加機器的數量來增加每秒訓練的次數。最終,我發現對我而言最簡單有效的設置是用一台 8GPU 的機器使用同步隨機梯度下降算法進行訓練,即便如此每次訓練仍需花上數天的時間。

擁有大量計算能力的另一好處是可以對超參數的優化進行大規模的暴力搜索。不確定該使用什麼樣的批尺寸進行訓練?每個都試一遍!在找到論文中所用的配置前,我曾嘗試過數百種配置。

另一個難題是如何量化評估結果。如何才能證明我們的圖像比基準模型更好?衡量超分辨率效果的傳統方法,是對比輸出圖像與原始圖像在對應像素點之間的距離(峰值信噪比,PSNR)。

雖說我們的模型輸出的臉部圖像在質量上明顯更好,但在像素對比上,平均看來還不如基準模型所輸出的模糊圖像。我們還嘗試用 PixelCNN 本身的相似度測量來證明我們的樣本比基準版本有著更佳的像素分佈,但同樣失敗了。最後,我們把這項任務交給了大眾——詢問參與調查的人哪些圖像看上去更真實,這才證明了我們模型的價值。

超分辨率的像素遞歸 論文

PixColor:著色問題的另一次嘗試

PixColor 輸出的雙色模式

Slim 的創造者 Sergio Guadarrama 一直在研究圖像著色問題,他曾和我描述過這樣一個試驗:獲取一張 224×224×3 的圖像,將其置於 YPbPr 色彩空間中(該空間圖像的灰度、顏色相互分離),首先將顏色通道降至 28×28×2 的超低分辨率,再用雙線性插值法再把顏色通道放大,所得圖像與高色彩分辨率的原始圖像相比幾乎沒有差別。

你需要的只是幾種顏色。頂行是原始彩色圖像;中間是降低並採樣後的色度圖像,尺寸縮小至 28 像素;底行是雙線性提高中間行的採樣率並結合原始灰度圖像的結果。

這一現象表明,著色問題可以簡化成低分辨率顏色預測問題。我原本已準備好徹底放棄 PixelCNN 了,因為顯然它無法輸出大尺寸的圖像,但轉念一想其用來生成 28×28×2 的圖像還是很可行的,並最終通過使用 4 位顏色數值而非 8 位,進一步的簡化了著色問題。

Sergio 構建了一個「美化」神經網絡,它能美化低分辨率顏色的圖像,並將溢出邊界的顏色推回至正確位置–構造僅僅是使用 L2 損失函數將圖片與圖片進行比較。我們還用一個預訓練好的 ResNet 作為輔助神經網絡,以避免需要額外添加一個新的損失函數的需求,這中做法我們在超分辨率項目中就使用過。

通過以上所有技巧,不論是通過大眾評估還是顏色直方圖交叉測量,我們能夠在 ImageNet 的訓練集上實現最佳的結果。事實證明,一個訓練好的 PixelCNN 模型產生的圖像具有良好的數據分佈性,而且沒有發生過任何模型崩潰的問題。

Lab 顏色空間中的顏色通道的邊緣統計數據。左:每種測試方法的直方圖以藍色顯示,ImageNet 的測試數據集直方圖以黑色顯示。右圖:左圖顏色通道的相交比例

由於模型為每個灰度輸入的可能著色聲明了一個概率分佈,我們可以對該分佈進行多次取樣,以獲取同一輸入的不同著色。下圖用結構相似度(SSIM)很好地展示了分佈的多樣性:

為證明我們的模型可生成不同的樣本,我們用多尺度 SSIM 對比了同一輸入的兩種輸出。上圖顯示了 ImageNet 測試數據集的 SSIM 距離直方圖。圖中在多個 SSIM 間距上分別顯示了每對圖像。SSIM 值為 1 表示兩張圖像完全相同。

該模型還遠稱不上「完美」,因為 ImageNet 儘管龐大,但不能代表所有的圖像。我們的模型在處理非 ImageNet 圖像時並不理想。真實的黑白照片(不同於彩色照片轉化出的黑白照片)會得出許多不同的分佈數據,也會出現很多彩色照片中所沒有的物體。比如,Model T 汽車的彩色照片不多,ImageNet 圖像集中可能一張都沒有。或許採用更大的數據集和更好的數據擴增方法可以改善這些問題。

如果想瞭解輸出圖像的質量,可以來看看這些圖:

當我們模型處於訓練中期時處理的一小組非常難處理的圖像:

http://tinyclouds.org/residency/step1326412_t100/index.html

用我們的模型處理 ImageNet 上的隨機數據集:

http://tinyclouds.org/residency/rld_28px3_t100_500_center_crop_224/

作為對比,下面是用其他算法來處理同一 ImageNet 測試數據集的結果:

http://hi.cs.waseda.ac.jp/~iizuka/projects/colorization/en/

http://richzhang.github.io/colorization/

http://people.cs.uchicago.edu/~larsson/colorization/

所有完整的細節都可以在我們的論文中找到:

https://arxiv.org/abs/1705.07208

失敗與未報告的實驗結果

這一年期間,我曾間歇性地投入過許多業餘的小項目,儘管它們都沒成功,但其中有幾個值得一提的項目:

大數的質因數分解

質因數分解一向都是個難題,儘管近期在質數分佈領域又有了突破,也依舊很有挑戰性。我們的想法是,如果為神經網絡提供足夠多的訓練樣本,看看它能否找出一些新的東西?

Mohammad 和我嘗試過兩種方法:他修改了 Google 機器翻譯的 seq2seq 模型,該模型把一個半質大數的整數序列作為輸入,並以預測其素因數中的一個做為輸出;我則使用一個較為簡單的模型,它將定長整數作為輸入,並用幾個全連接層來預測輸入的分類:質數或合數。

但這兩種方法最後都只學到了最為明顯的規律(如果尾數為 0,那它就不是質數!),最後我們只能拋棄這個想法。

對抗做夢

受 Michael Gygli 的項目啟發,我想看看能否用一個鑑別器充當它自己的生成器。為此,我構建出一個簡單的二元分類卷積神經網絡來判斷輸入的真假。

Michael Gygli 的項目:

https://arxiv.org/abs/1703.04363

既給出一張噪點(拍出來有一點點明顯顆粒的照片,這些顆粒稱為噪點)圖片並讓它使用梯度自我更新來生成圖像(也稱為 deep dreaming),訓練的目標是令該網絡把「真實」類別的輸出達到最大化。該模型通過交替生成「假」實例來進行訓練,跟典型的 GAN 中的鑑別器一樣,通過升級權重來區分真假實例。

起初我的想法是,因為這個模型不需要像 GAN 那麼複雜的架構設計,所以應該會極大地降低訓練的難度。而事實上,這個模型在 MNIST 數據集上的確輸出了不錯的結果,如下欄所示:每一縱列都是由噪音圖片一步步推進成為紅色的 MNIST 數值。

但我沒法在 CIFAR-10 數據集上達到同樣的效果,並且它的實用性也極為有限。很遺憾,因為我覺得「對抗做夢(Adversarial Dreaming)」將會是一個很酷的論文標題。

使用 PixelCNN 來訓練生成器

鑑於 PixelCNN 訓練一次需要很長的時間,我便想試試能不能用一個訓練好的 PixelCNN 模型訓練出前饋式、圖像對圖像卷積神經網絡生成器(8×8 至 32×32 尺寸的 LSUN 臥室圖片集)。我所設置的訓練方法是:在前饋式網絡的輸出上進行自動回歸,在 PixelCNN 下更新權重以便將兩張圖片的相似率最大化。但這個設計失敗了,它生成了非常奇怪的圖像:

探索「異步隨機梯度下降」的改進方法

如前所述,很多模型都不適用於異步隨機梯度下降算法。最近,一篇名為 DCASGD 的論文提出了一種解決過時梯度問題的可能方法——在每一個線程更新自己的權重時使用差分向量。如果可以實現,這種方法可以大大減少每次需要的訓練時間。不幸的是,我沒能在 TensorFlow 上復原他們的結果,也就無法嘗試我基於此方法的幾個設想,可能還是哪裡有 Bug。

DCASGD 的 論文

思考,結論

作為軟體工程師,我在機器學習方面並沒有什麼經驗。但基於過去一年對深度學習的研究,我想說一下對該領域的總體看法,以及與範圍更廣的軟體領域之間的關係。

我堅信,機器學習將改變所有行業,並最終改善每個人的生活,許多行業都會因機器學習的發展而受益。我相信我在這個項目中嘗試的超分辨率問題在不久的將來就會被解決,所有人都可以看到查理.卓別林這類老電影的 4K 版。

不過,我確實發現,這一模型的構建、訓練和調試都相當困難。當然,大部分的困難是由於我缺乏經驗,這也表明有效訓練這些模型是需要相當豐富的經驗的。我的工作集中在機器學習最為容易的分支上:監督式學習。但即便有著完美的標記數據,開發模型可能仍然十分困難。

一般情況就是預測的維度越大,構建模型所花的時間就越長(例如:花大把的時間進行編程、調試和訓練)。基於我的經驗,建議所有人在開始時都儘可能的簡化和限制你的預測範圍。

舉一個我們在著色實驗中的例子:我們在開始時試圖讓模型預測整個 RGB 圖像,而非只去預測顏色通道。最開始的想法是,因為我們使用的是跳躍連接(skip connection),所以神經網絡應該容易就能處理好灰度圖並輸出可觀的結果。後來,我們通過只預測顏色通道這一做法極大的提高了模型的性能。

如果我用「工作」這一詞的直觀意義來描述軟體的話,那麼圖像分類任務似乎“工作”的很穩健;生成式模型幾乎很少能「工作」,人們也不太瞭解這種模型,GAN 能輸出高質量圖像,但同時卻極難構建起來。我的經驗是,對 GAN 的架構作出任何小改動都有可能使它完全無法工作。我聽說強化學習與其相比更加困難,但因經驗不足,在此就不作評價了。

另一方面,隨機梯度下降算法的性能十分強大,即使是嚴重的數學錯誤,可能也只是會使結果有一些失真,而不至於產生嚴重的偏差。

因為訓練模型經常需要花費很多天,這是一個非常緩慢的修改—運行循環。

機器學習領域的測試文化尚未完全興起。訓練模型時我們需要更好的評斷方法,例如網絡的多個組成部分需要維持特定的均值和變量,不能過度擺動超出界定的範圍。機器學習的 bug 使 heisenbugs 一類的漏洞很輕鬆地通過了我寫的測試。

並行化(Parallelization)能帶來的好處很有限。增加計算機數量使大規模的超參數搜索會變得更加容易,但理想情況下,我們會設計不用特別仔細調試也能很好運轉的模型。(實際上,我懷疑超參數搜索能力有限的研究人員將不得不設計出更好的模型,因此他們設計出的模型更加穩定)。

不好的是,對於很多模型而言,異步隨機梯度下降算法並沒有什麼用處——更加精確的梯度通常用處不大。這就是為什麼 DCASGD 的研究方向很重要的原因。

從軟體維護的角度看,關於如何組織機器學習項目大家鮮有共識——就像是 Rails 出現之前的網站:一群隨機 PHP 腳本,商業邏輯和標記符號亂寫一氣。在 TensorFlow 項目中,數據通道、數學和超參數等配置無組織地混為一團。

我認為精美的機器學習類項目的結構/組織還未被發現(或者說是還未被重新發現,就像 DHH 重新發現並普及 MVC 那樣)。我的項目結構一直在進步,但我現在還無法將它稱之為“精美”。

機器學習的框架會繼續快速迭代。我最初使用的是 Caffe,後來又不得不稱讚 TensorFlow 帶來的好處,而 PyTorch 和 Chainer 之類的項目現在則使用動態計算圖來形吸引客戶。

但漫長的「修改 – 運行」循環是開發更好模型的主要阻礙,所以我認為能優先實現快速啟動和快速評估的框架最終會取得成功。儘管擁有 TensorBoard 和 iPython 之類的有用工具,但是檢查模型在訓練期間的具體細節仍然很難。

論文中的信噪比很低。但是還有很大的改進空間。人們通常不會坦率承認他們模型的失敗之處,因為學術會議更看重的是準確度而不是透明度。我希望學術會議能接受提交博客文章,並要求開源實現,Distill 在這方面的努力值得稱讚。

對機器學習而言,這是一個令人激動的時代。在各個層面上都有大量工作等待完成:從理論到框架,每一方面都有很多值得改進的空間。它幾乎和互聯網的誕生一樣令人激動,加入這場技術革命吧!

原文鏈接

和 Google 一起學習進步

Google AI 首席科學家李飛飛:AI 不是用來取代人類,「關懷人類」才是目標

【快訊】Google 智慧台灣計畫啟動!釋出 300 個職缺,要將台灣打造成亞洲 AI 戰略基地

跟著大神學 AI:Google 免費機器學習課程上線,影片都有中文字幕超佛心!

(本文經 大數據文摘 授權轉載,並同意 TechOrange 編寫導讀與修訂標題,原文標題為 〈我在谷歌大腦見習機器學習的一年:Node.js 創始人的嘗試筆記 〉。)

 


人工智慧 x 雲端應用 Solution 是什麼?
10 分鐘填寫 TO 趨勢調查問卷,就送您人工智慧黃金時代必備祕笈:

1. 結果分析報告
2.專家客製化 IT 雲端轉型完整建議

>> 填問卷 Get 祕笈

點關鍵字看更多相關文章: