當前位置:
首頁 > 科技 > 程序員想搞機器學習?看看Nodejs之父這一年摸爬滾打的心路歷程

程序員想搞機器學習?看看Nodejs之父這一年摸爬滾打的心路歷程

導讀:本文是Nodejs之父Ryan Dahl在Google Brain做了一年深度學習後的心得體會,他在那裡的目標是用機器學習來卓別林的老電影自動修改到4K畫質。他的新項目成果幾何?Nodejs之父的機器學習心得又是什麼?下面讓我們直接來看文章:

去年,在研究TensorFlow做出一番成果後,我開始申請Google Brain的首屆見習項目,最後竟然成功了。受邀參加該項目的共有24人,每人都有著不同的機器學習背景,我們需要在Google位於山景城的深度學習研究實驗室工作一年,跟Google的科學家和工程師們共同來推進該技術上的前沿研究。

如今,這個為期一年的項目剛剛結束,我就在這裡總結一下自己的心得體會。

我最初的目標是改進老電影或電視劇的畫面:想像一下,畫面粗糙的90年代電視劇,或是60年代黑白電影,要是能被修正為色彩華麗的4K畫面,那樣的觀影體驗該有多棒!

而這事看上去完全可行:我們很輕鬆就能把4K視頻轉換成滿是顆粒感的、低解析度的、甚至是只有黑白兩色的視頻,那隻要訓練出某個監督模型來反轉這個過程就可以了。而且,可用的訓練數據無窮無盡。咳咳,這個想法簡直太彪悍了!

但也別高興太早——現在的技術還沒到這步……但是快了!

帶著這樣的目標,我再一次從紐約布魯克林搬到舊金山灣區(上一次是為Node.js項目),以更好地實現這裡的深度學習技術。幾天後,我生活的日常,就變成了跟Google的深度學習專家進行討論、在Google龐大的軟體庫內瀏覽代碼……

如果你不想看接下來的技術細節,可以直接跳到總結部分。

超解析度的像素遞歸

眾所周知,FBI在《犯罪現場調查》(CSI)中所用的縮放技術是不可能實現的。沒人能任意放大照片。然而,在你放大照片圖像時把相關像素所構成的合理圖形呈現出來,這還是有可能做到的。能夠平滑地提升圖像解析度,將是我實現目標的第一步。

該問題在本文中用 超解析度 一詞來描述,很久以前人們就在嘗試解決它了。

據此,我們認識到簡單使用ConvNet無法徹底解決該問題:它只是把你輸入的低解析度圖像的像素間距(L2)最小化來輸出高解析度圖像。這類損失函數所學到的,是輸出所有可能結果的平均值——所輸出的圖像看上去就比較模糊了。我們想要的模型是這樣的:對於給定的低解析度圖像,它能從所有可能的強化結果中選出那張特定的、效果最好的高解析度圖像。如果是「強化」一張關於樹的模糊照片,我們會希望它能給出枝、葉在位置上的一些細節,即便它們的位置並非是枝、葉在樹上的實際位置。

某種條件型的GAN(生成式對抗網路)看上去很有希望,但構建起來較難,經過幾次失敗的嘗試後,我們換成了另一種新型的生產式模型:PixelCNN,它也比較有戲。(等我們啟動之後,用GAN解決來超解析度問題的SRGAN就發布了,它生成的結果非常好。)

PixelCNN是一種奇怪的反直覺模型。它將圖像生成問題重寫成每次選擇一個像素序列。像LSTM(長短時記憶網路)這樣的門控制遞歸網路在序列生成方面是非常成功的,它通常會用在單詞或字元上。PixelCNN巧妙地構建出一個卷積神經網路(CNN),它能基於先前的像素的概率分布來精確生成像素。這是RNN和CNN的混合功能。

示意圖由 van den Oord 等人所繪

意外的是,PixelCNN所生成的圖像看起來非常自然。不像艱難平衡兩種目標的對抗網路,該模型的目標只有一個,因而面對超參數的變化,它有更好的穩健性。也就是說,它更易於優化。

解決超解析度問題的首次嘗試,我野心過大,選用了ImageNet來訓練PixelCNN。(跟CIFAR-10、CelebA或LSUN相比,ImageNet是個較難的數據集,很多生成式模型研究都在用它。)但很顯然,按像素來序列生成圖像的過程極其緩慢。輸出圖像的尺寸大於64x64時,耗時將超過數小時!然而,在我把圖像的尺寸限制到小尺寸,並使用臉部或卧室類的小型數據集後,得出的結果就開始令人激動了。

圖1:用名人臉部圖像數據集訓練出來的超解析度像素遞歸模型所生成的高解析度圖像。左側為測試數據集所用的8x8低解析度輸入圖像。中間為PixelCNN模型所輸出的32x32高解析度圖像,右側是原始的32x32解析度圖像。我們的模型優先整合臉部特徵,而後去合成較為逼真的頭髮與皮膚方面的細節。

由於在Google可以獲取到無窮的計算資源,如何擴大訓練的規模便成為該項目的另一個目標——因為即便採用這些小型的數據集,在單個CPU上完成訓練也要花上數周的時間。

非同步隨機梯度下降演算法(Asynchronous SGD)是最理想的分布式訓練方法。使用這種方法,你用N台機器獨立來訓練同以個模型,但每個時間步長都要共享一次權重參數。權重參數被託管在一台單獨的「參數伺服器」上,該伺服器在每個時間步長內都進行遠程過程調用(RPC),以獲得最新數值並發送梯度更新。如果數據管道足夠好,你就可以線性增加模型每秒內的訓練步數,方法是增加機器——因為機器之間互不依賴。然而,當機器增加時,由於老機器更新了權重,新機器的權重會逐步過期或「落伍」。在分類網路中,這裡的問題不大,把訓練的規模擴增到幾十台機器不難。但PixelCNN卻對過時的梯度極其敏感,在它的非同步隨機梯度下降演算法內增加機器幾乎沒有任何收益。

另一個方法,是用同步隨機梯度下降演算法(Synchronous SGD)。使用這一方法,機器在每個時間步長內都進行同步,且每台機器的梯度都會被平均。它與隨機梯度下降演算法在數學上是相同的。更多的機器會增大批尺寸。但同步隨機梯度下降演算法(Sync SGD)允許各機器使用更小、更快的批尺寸,從而來增加每秒的步數(steps/sec)。然而,同步隨機梯度下降演算法也有它自己的問題。首先,它需要大量的機器經常進行同步,這必然導致停機時間的增加。其次,除非將每台機器的批尺寸設為1,否則它無法通過增加機器來增加每秒訓練的步數。最終,我發現簡單的設置是用一台機器安裝8個GPU來使用同步隨機梯度下降演算法——但完成訓練仍需花上數天的時間。

採用大規模計算的另一個辦法,是進行規模更大的超參數搜索。如何來確定所用的批尺寸?把它們全都試一遍。在找到論文中所用的配置前,我嘗試過數百種配置。

如何定量評估結果,則是另外一個難題。如何才能證明我們的圖像比基準模型好?衡量超解析度質量的典型方法,是對比強化圖像與原始圖像的對應像素點之間的距離(峰值信噪比,PSNR)。雖說本模型輸出的臉部圖像在質量上明顯更好,但在像素對比上,平均看來它們還不如基準模型所輸出的模糊圖像。我們嘗試用PixelCNN本身的相似度測量來證明我們的樣本比基準版本有著更高的概率值,但同樣失敗了。最後,我們把這項任務眾包給人類評估員——詢問他們哪些圖像看上去更真實。這倒奏效了。

具體的結果請查看這篇論文:超解析度的像素遞歸:https://arxiv.org/abs/1702.00783

PixColor: 關於著色的嘗試

PixColor輸出的雙色模式

Slim的創造者Sergio Guadarrama一直在嘗試給圖像著色。他跟我說過一個試驗:用分量介面(該介面中圖像的灰度、顏色相互分離)獲取一張224×224×3的圖像,將其顏色通道降至28×28×2的超低解析度,然後用雙線性插值法再把顏色通道放大,所得圖像與顏色解析度很高的原始圖像相比幾乎沒有差別。

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

這表明,把問題變成僅預測低解析度顏色,我們就可以簡化著色問題。我原本已準備好徹底放棄PixelCNN了,因為它顯然無法放大小圖像,但用來生成28×28×2的圖像還是很可行的。通過將顏色數值簡化為32個數字而非256,我們進一步簡化了著色問題。

Sergio構建了一個「改進的」網路,它能夠清理低解析度顏色的輸出,並將溢出邊界的顏色推回至正確位置——使用前饋式圖像對圖像卷積神經網路進行訓練,損失僅為L2。我們還用一個預訓練好的ResNet作為條件網路,用以消解額外的損耗項需求,畢竟在超解析度項目中我們已經用過這樣的損耗項。

使用這些方法後,無論是眾包評估還是用顏色直方圖相交評估,我們都能得出ImageNet上最好的結果。事實證明,經過正確訓練的PixelCNN可以很好地模擬圖像統計數據,不發生任何模式崩潰。

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

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

圖8:為證明我們的模型可生成不同的樣本,我們用多尺度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://tinyclouds.org/residency/ltbc_500_center_crop_224/index.html

彩色圖像著色 -http://tinyclouds.org/residency/cic_500_center_crop_224/index.html

自動著色的學習表示 -http://tinyclouds.org/residency/lrac_500_center_crop_224/index.html

最後,完整的細節都在我們的論文中:PixColor: Pixel Recursive Colorization - https://arxiv.org/abs/1705.07208

失敗與未報告的實驗

這一年期間,我曾短暫著迷過許多業餘的小項目,儘管它們都失敗了……接下來我會簡單來描述其中的幾個:

大數的素因數分解

素因數分解一向都是個大難題。但即便是如今,我們仍在不斷發現有關素數分解的新問題。如果為深度神經網路提供足夠的實例,它能不能找出一些新東西?Mohammad和我嘗試過兩種方法。他修改了Google機器翻譯的seq2seq神經模型,該模型把一個半素大數的整數序列作為輸入,並將其素因素預測為輸出。我則使用一個較為簡單的模型,它將定長整數作為輸入,並用幾個全連接層來預測輸入的分類:素數或合數。這兩種方法都只學到了最為明顯的規律(如果尾數為0,那它就不是素數!),我們只能拋棄這個想法。

Adversarial Dreaming

受Michael Gygli的項目啟發,我想探究一下鑒別器能否充當它自己的生成器。為此,我構建出一個簡單的二元分類卷積神經網路來判斷輸入的真假。為了生成圖像,你需要給出噪點並讓它使用梯度來更新輸入(有時被稱為deep dreaming),令該網路把「真實」類別最大化。該模型通過交替生成「假」實例來進行訓練,而後跟典型的GAN鑒別器一樣,通過升級權重來區分真假實例。

我的想法是,鑒於更少的架構決策,該網路相比一般的GAN可能更容易訓練。事實上,它用MNIST確實可以工作。下圖中每一欄都在展示:不同的噪音圖像被逐漸推向紅色MNIST數值的情形。

但我沒法讓它在CIFAR-10數據集上工作,並且它的實際意義也極為有限。這遺憾了,我相信 "Adversarial Dreaming" 會是一個很酷的論文題目。

使用PixelCNN來訓練生成器

PixelCNN生成樣本的時間過長,這讓我很沮喪。於是,我就想試試能不能用一個預訓練的PixelCNN訓練出前饋式圖像對圖像卷積神經網路(8x8至32x32尺寸的LSUN卧室圖片集)。我所設置的訓練方法是:在前饋式網路的輸出上進行自動回歸。在PixelCNN下更新權重以便將概率最大化。它用這樣的線條生成了非常奇怪的圖像:

對非同步隨機梯度下降演算法的修改探索

如前文所述,很多模型都不適用於非同步隨機梯度下降演算法。最近,一篇名為DCASGD論文提出了一種解決過時梯度問題的可能方法:在機器開始步進去應用它們權重的前,在權空間(weight space)使用差分向量。這種方法可大大減少每一個人的訓練時間。不幸的是,我沒能在TensorFlow上重複他們的結果,也無法實現我所想出的幾個類似想法。這裡可能有Bug。(如果想獲取我的實現方法,請通過內部渠道聯繫我)

想法和總結

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

我堅信,機器學習將改變所有行業,並最終改善每個人的生活,許多行業都會因機器學習所提供的智能預測而受益。對於我,我在這個項目中,最初的目標是,在不久的將來,所有人都可以看到查理·卓別林這類老電影的4K版。

不過,我確實發現,這一模型的構建、訓練和調試都相當困難。當然,大部分的困難是由於我缺乏經驗,這也表明有效訓練這些模型是需要相當豐富的經驗的。我的工作集中在機器學習最為容易的分支上:監督式學習。但即便有著完美的標註,模型開發仍十分困難。似乎,預測的維度越大,構建模型所花的時間就越長(例如:花大把的時間進行編程、調試和訓練)。因此,我推薦所有人在開始時都儘可能簡化和限制你的預測。

舉一個我們在著色實驗中的例子:我們在開始時試圖讓模型預測整個的RGB圖像,而非只預測顏色通道。我們認為,神經網路很容易就能處理好灰度圖(intensity image)並輸出出來,因為我們使用的是跳躍連接(skip connection)。只預測顏色通道依然能改進性能。

如果我以主觀、本能的方式使用「工作」來描述軟體:圖像分類工作起來似乎很穩健。生成式模型幾乎很少能工作,人們也不太了解這種模型。GAN能輸出很好地圖像,但是構建起來幾乎是不可能的——我的經驗是,對架構作出任何小改動都有可能使它無法工作。我聽說強化學習更加困難。但因經驗不足,我對遞歸神經網路不予置評。

但是,隨機梯度下降演算法工作起來是太過於穩定,即使是嚴重的數學錯誤也不會讓它徹底失敗,僅稍稍有損於性能。

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

測試文化尚未完全興起。訓練模型時我們需要更好的評斷方法,網路的多個組成部分需要維持特定的均值和變數,不能過度擺動或者留在範圍內。機器學習漏洞使系統的heisenbugs能特別輕鬆地通過測試。

並行計算帶來的好處有限。更多的計算機數會讓大規模的超參數搜索會變得更容易,但理想情況下,我們會設計出無需仔細調試也可正常工作的模型。(實際上,我的懷疑是,超參數搜索能力有限的研究人員,將不得不設計出更好更穩健的模型。)不幸的是,對很多模型而言,非同步隨機梯度下降演算法並沒有什麼用處——更加精確的梯度通常用處不大。這就是為什麼 DCASGD的研究方向會如此重要。

從軟體維護的角度看,大家對如何組織機器學習項目鮮有共識。就像Rails出現之前的網頁一樣:一群雜亂PHP腳本、商業邏輯和標記符號混在一起。在TensorFlow項目中,數據管道、數學和超參數/配置管理同樣豪無組織地混成一團。我認為,精美的結構/組織還有待於我們發掘。(或是說有待於重新發現,就像DHH重新發現並普及MVC那樣。)我的項目結構一直在進步,但我不會認為它已足夠精美。

框架將繼續快速進化。雖說我一開始用的是Caffe,但也不得不感激TensorFlow所帶來的好處。而今,PyTorch與Chainer之類的框架都在用動態計算圖表來取悅用戶。漫長的 修改—運行 循環是開發出更好模型的主要障礙——我猜測那些優先考慮快速啟動和快速評估的框架將取得最後的成功。儘管有TensorBoard、iPython這類有用的工具,但檢查模型在訓練期間的活動仍很困難。

論文中的信噪比都很低,改進的空間依然很大。由於學術會議更看重的是準確度而非透明度,人們往往不會坦率承認他們模型上的失敗之處。我希望學術會議能夠接受博客作為附加材料,同時要求開源的實現。Distill在這方面的努力值得稱讚。

對機器學習而言,這是一個激動人心的時代。在各個層面上都有大量的工作需要完成:從理論端到框架端,還有很多值得改進的空間。這幾乎跟互聯網的誕生一樣令人激動。快動手加入進來吧!

圖片說明:

這就是你的機器學習系統嗎?

是啊!把數據倒進這堆線性代數中,然後在另外一頭接收答案就好了。

如果答案錯了怎麼辦?

只管攪動這堆數據,直到結果開始看上去正確為止。

致謝

非常感謝Jon Shlens和Mohammad Norouzi帶給我無數的白板指導和寶貴建議;非常榮幸能跟David Bieber和Sergio Guadarrama這兩位頂級黑客共事;最後,特別感謝參與見習項目的其他同事:Martin Stumpe、Kevin Murphy、Doug Eck和Leslie Phillips。

原文:http://tinyclouds.org/residency/

點擊展開全文

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器學習 的精彩文章:

蘋果發力AI WWDC主題演講不忘機器學習掛嘴邊
乾貨分享 | 新一波機器學習資料匯總(已完結...)
詳解蘋果Core ML:如何為iOS創建機器學習應用?
用機器學習「武裝」產品應用,蘋果的人工智慧時代降臨
機器學習入門很難?騙你的!

TAG:機器學習 |

您可能感興趣

「Google機器學習速成課程」您看了嗎?
通過這個在線免費課程,Google 想讓更多人了解 AI 和機器學習
一文看懂機器學習流程
Google 工程師帶你了解聊天機器人的過去、現在和未來
看官,機器學習了解一下?
Boston Dynamics 的機器人正在練習室外慢跑,以及機器狗能自行導航了
機器人一秒記憶?如何解決這個弊端?Facebook說話了
能文能武的智能管家機器人,帶著你的freestyle來挑戰一下吧
仔細看看ARM的機器學習硬體 它具有怎樣的優勢?
我們試用了iRobot 兩款機器人 發現不做掃擦一體機是有原因的
Lobe:超小白的機器學習平台,讓你不懂編程也能自造數據集
Qualcomm AI研究重大進展,讓機器像人一樣看世界
路痴又不好意思問人?Facebook 的「指路機器人」能救你
谷歌的機器翻譯模型 Transformer,現在可以用來做任何事了
DeepMind提出心智神經網路ToMnet,訓練機器的理解能力
生物神經網路與機器學習的碰撞,Nature論文提出DNA試管網路識別手寫數字
Segway推機器人「Loomo」:走哪跟哪
Google AI猜圖刷屏,你畫的這麼爛,真是為難了機器人!
學界 | 谷歌的機器翻譯模型 Transformer,現在可以用來做任何事了
一台iPhone X的價格,就能把會跟隨的機器人路萌帶回家!