做者 | Ryan Dahl
html
編譯 | AI100
算法
去年,在我研究TensorFlow出了一番成果後,我開始申請Google Brain的首屆見習項目(Google Brain Residency Program),最後竟然成功了。受邀參加該項目的共有24人,每一個人都有着不一樣的機器學習背景。服務器
咱們24我的,須要在Google位於山景城的深度學習研究實驗室工做一年,天天跟Google的科學家和工程師們一塊兒,共同來作TensorFlow的前沿研究。想一想就把我給興奮壞了。網絡
現在,這個爲期一年的項目已經結束了,確實收穫滿滿。我也但願把學到的一些東西,結合個人心得,總結一下,分享出來,但願能爲在機器學習的道路上耕耘的夥伴兒提供一些幫助。架構
先說說我起初擬定的目標吧。個人目標是修正老電影或電視劇的畫面。併發
想象一下,畫面粗糙的90年代電視劇,或是60年代黑白電影,要是能被修正爲色彩華麗的4K畫面,觀看體驗會有多棒!框架
而這事看上去徹底可行:咱們很輕鬆就能把4K視頻轉換成盡是顆粒感的、低分辨率的、甚至是隻有黑白兩色的視頻,只要訓練出某個監督模型來反轉這個過程就能夠了。並且,可用的訓練數據無窮無盡。咳咳,這個想法簡直太強悍了!機器學習
帶着這樣的目標,我再一次(上一次是爲Node.js項目)從紐約布魯克林搬到舊金山灣區,以更好地實現這項深度學習技術。幾天後,個人平常生活就變成了跟Google的深度學習專家進行討論、在Google龐大的軟件庫內瀏覽代碼,blablabla...異步
接下來我要開始大談這些日子以來,我所作的不少技術細節。固然,若是不想看,能夠直接跳到總結部分。
衆所周知,FBI在《犯罪現場調查》(CSI)中所用的縮放技術是不可能實現的。沒人能任意放大照片。然而,在你放大照片圖像時把相關像素所構成的合理圖形呈現出來,這仍是有可能作到的。可以平滑地提高圖像分辨率,將是我實現目標的第一步。
該問題在本文中用 超分辨率 一詞來描述,好久之前人們就在嘗試解決它了。
據此,咱們認識到簡單使用ConvNet沒法完全解決該問題:它只是把你輸入的低分辨率圖像的像素間距(L2)最小化來輸出高分辨率圖像。這類損失函數所學到的,是輸出全部可能結果的平均值——所輸出的圖像看上去就比較模糊了。咱們想要的模型是這樣的:對於給定的低分辨率圖像,它能從全部可能的強化結果中選出那張特定的、效果最好的高分辨率圖像。若是是「強化」一張關於樹的模糊照片,咱們會但願它能給出枝、葉在位置上的一些細節,即使它們的位置並不是是枝、葉在樹上的實際位置。
某種條件型的GAN(生成式對抗網絡)看上去頗有但願,但構建起來較難,通過幾回失敗的嘗試後,咱們換成了另外一種新型的生產式模型:PixelCNN,它也比較有戲。(等咱們啓動以後,用GAN解決來超分辨率問題的SRGAN就發佈了,它生成的結果很是好。)
PixelCNN是一種奇怪的反直覺模型。它將圖像生成問題重寫成每次選擇一個像素序列。像LSTM(長短時記憶網絡)這樣的門控制遞歸網絡在序列生成方面是很是成功的,它一般會用在單詞或字符上。PixelCNN巧妙地構建出一個卷積神經網絡(CNN),它能基於先前的像素的機率分佈來精確生成像素。這是RNN和CNN的混合功能。
示意圖由 van den Oord 等人所繪
圖1:用名人臉部圖像數據集訓練出來的超分辨率像素遞歸模型所生成的高分辨率圖像。左側爲測試數據集所用的8x8低分辨率輸入圖像。中間爲PixelCNN模型所輸出的32x32高分辨率圖像,右側是原始的32x32分辨率圖像。咱們的模型優先整合臉部特徵,然後去合成較爲逼真的頭髮與皮膚方面的細節。
https://arxiv.org/abs/1702.00783
PixColor輸出的雙色模式
圖3:你須要的只是一些顏色。頂行是原始彩色圖像。中間行是下降採樣率後的真實色度圖像,尺寸縮小至28像素。底行是雙線性提升中間行的採樣率並結合原始灰度圖像的結果。
圖7:實驗室顏色空間中的顏色通道的邊緣統計數據。左:每種方法的直方圖以藍色顯示,ImageNet的測試數據集直方圖以黑色顯示。右圖:顏色通道的直方圖相交。
圖8:爲證實咱們的模型可生成不一樣的樣本,咱們用多尺度SSIM對比了同一輸入的兩種輸出。上圖顯示了ImageNet測試數據集的SSIM距離直方圖。圖中在多個SSIM間距上分別顯示了每對圖像。SSIM值爲1表示兩張圖像徹底相同。
處於咱們模型處理中間階段的一小組很是難處理的圖像
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,那它就不是素數!),咱們只能拋棄這個想法。
受Michael Gygli的項目啓發,我想探究一下鑑別器可否充當它本身的生成器。爲此,我構建出一個簡單的二元分類卷積神經網絡來判斷輸入的真假。爲了生成圖像,你須要給出噪點並讓它使用梯度來更新輸入(有時被稱爲deep dreaming),令該網絡把「真實」類別最大化。該模型經過交替生成「假」實例來進行訓練,然後跟典型的GAN鑑別器同樣,經過升級權重來區分真假實例。
個人想法是,鑑於更少的架構決策,該網絡相比通常的GAN可能更容易訓練。事實上,它用MNIST確實能夠工做。下圖中每一欄都在展現:不一樣的噪音圖像被逐漸推向紅色MNIST數值的情形。
但我無法讓它在CIFAR-10數據集上工做,而且它的實際意義也極爲有限。這遺憾了,我相信 "Adversarial Dreaming" 會是一個很酷的論文題目。
PixelCNN生成樣本的時間過長,這讓我很沮喪。因而,我就想試試能不能用一個預訓練的PixelCNN訓練出前饋式圖像對圖像卷積神經網絡(8x8至32x32尺寸的LSUN臥室圖片集)。我所設置的訓練方法是:在前饋式網絡的輸出上進行自動迴歸。在PixelCNN下更新權重以便將機率最大化。它用這樣的線條生成了很是奇怪的圖像:
對異步隨機梯度降低算法的修改探索
如前文所述,不少模型都不適用於異步隨機梯度降低算法。最近,一篇名爲DCASGD論文提出了一種解決過期梯度問題的可能方法:在機器開始步進去應用它們權重的前,在權空間(weight space)使用差分向量。這種方法可大大減小每個人的訓練時間。不幸的是,我沒能在TensorFlow上重複他們的結果,也沒法實現我所想出的幾個相似想法。這裏可能有Bug。(若是想獲取個人實現方法,請經過內部渠道聯繫我)
做爲軟件工程師,我在機器學習方面並無什麼經驗。但基於過去一年對深度學習的研究,我來分享一下在該領域的整體見解,及其同範圍更廣的軟件領域之間的關係。
我堅信,機器學習將改變全部行業,並最終改善每一個人的生活,許多行業都會因機器學習所提供的智能預測而受益。
對於我,我在這個項目中,最初的目標是,在不久的未來,全部人均可以看到查理·卓別林這類老電影的4K版。
不過,我確實發現,這一模型的構建、訓練和調試都至關困難。固然,大部分的困難是因爲我缺少經驗,這也代表有效訓練這些模型是須要至關豐富的經驗的。
個人工做集中在機器學習最爲容易的分支上:監督式學習。但即使有着完美的標註,模型開發仍十分困難。彷佛,預測的維度越大,構建模型所花的時間就越長(例如:花大把的時間進行編程、調試和訓練)。
所以,我推薦全部人在開始時都儘量簡化和限制你的預測。
舉一個咱們在着色實驗中的例子:咱們在開始時試圖讓模型預測整個的RGB圖像,而非只預測顏色通道。咱們認爲,神經網絡很容易就能處理好灰度圖(intensity image)並輸出出來,由於咱們使用的是跳躍鏈接(skip connection)。只預測顏色通道依然能改進性能。
由於訓練模型常常須要花費數日,這是一個很是緩慢的 修改—運行 循環。
測試文化還沒有徹底興起。訓練模型時咱們須要更好的評斷方法,網絡的多個組成部分須要維持特定的均值和變量,不能過分擺動或者留在範圍內。機器學習漏洞使系統的heisenbugs能特別輕鬆地經過測試。
不幸的是,對於不少模型而言,異步隨機梯度降低算法並無什麼用處——更加精確的梯度一般用處不大。這就是爲何 DCASGD 的研究方向很重要的緣由。
就像是Rail出現以前的網站:一羣隨機PHP腳本,商業邏輯和標記符號亂混一氣。在TensorFlow項目中,數據管道、數學和超參數/配置管理無組織地混爲一團。我認爲咱們還未發現精美的結構/組織。(或者說是還未從新發現,就像DHH從新發現並普及 MVC那樣。)個人項目結構一直在進步,可是我不會認爲它是精美的。
這是你的機器學習系統嗎?