谷歌大腦科學家 Caffe締造者 賈揚清 微信講座完整版

轉載:http://suanfazu.com/t/caffe/9479

大家好!我是賈揚清,目前在Google Brain,今天有幸受雷鳴師兄邀請來和大家聊聊Caffe。
沒有太多準備,所以講的不好的地方還請大家諒解。
我用的ppt基本上和我們在CVPR上要做的tutorial是類似的,所以大家如果需要更多的內容的話,可以去tutorial.caffe.berkeleyvision.org,也歡迎來參加我們的tutorial:)
網頁上應該還有一些python的樣例幫助大家上手,所以歡迎參觀。
ppt比較長,所以我想我主要就介紹一下背景以及high level的內容,然後更多關注大家有一些什麼具體的問題,希望大家覺得OK。
OK,所以大家最近一段時間應該已經聽到很多關於deep learning的八卦了。
deep learning比較流行的一個原因,主要是因爲它能夠自主地從數據上學到有用的feature。特別是對於一些不知道如何設計feature的場合,比如說圖像和speech。deep learning可以學習到比以往比如說sift或者MFCC這樣手工設計的feature更好的方法,而且像slide 4顯示的一樣,這些feature有很強的semantic的含義。
所以很多時候在用到其他的一些task的時候會很有效,這也是爲什麼我們可以用一個feature來實現很多比如說識別,檢測,物體分割這樣的不同task的緣故。anyway,deep learning其實說回來是個挺久的話題了。Yann Lecun在89年的時候就提出了convolutional Neural Net的idea。然後在手寫數字上獲得了很大的成功。最近deep learning重新受到關注,最大的原因是兩個:一個是大規模的數據集使得我們可以學習到遠比digit更加複雜的概念;另外一個是大規模並行計算讓我們可以做很快的優化,使得以前我們沒法想象的計算量都變成小case了:)所以這些都很美好。。。但是問題是,寫code還挺麻煩的。所以大家肯定希望有個比較好用的框架來很快上手和試試這些deep learning的算法。所以這就是Caffe了:)Caffe是我在Berkeley寫thesis的時候想學習C++和cuda寫的,然後寫完了覺得我自己用太虧了,所以想貢獻給community讓大家來用,所以如果你看見一些寫得很爛的code,不要罵我:P
caffe的好處是,我們基本上可以用一個比較簡單的語言(google protobuffer)來定義許多網絡結構,然後我們可以在CPU或者GPU上面執行這些代碼,而且cpu和gpu在數學結果上是兼容的,然後,所有的模型和recipe我們都會公佈出來,使得我們可以很容易地reproduce互相發佈的結果,這也是我感到很幸運的一個地方,大家都很喜歡caffe,也很喜歡分享自己paper裏的成果(比如說MIT的place net和VGG的模型)。
anyway,這就是Caffe的簡單介紹了,最開始是一個hobby project,但是最近Berkeley和其他公司比如說NVidia,Yahoo在很認真地maintain它,希望能夠把整個架構做的更好用。
然後我大概講一下caffe的design吧。基本上,caffe follow了神經網絡的一個簡單假設 - 所有的計算都是以layer的形式表示的,layer做的事情就是take一些數據,然後輸出一些計算以後的結果,比如說卷積,就是輸入一個圖像,然後和這一層的參數(filter)做卷積,然後輸出卷積的結果。每一個layer需要做兩個計算:forward是從輸入計算輸出,然後backward是從上面給的gradient來計算相對於輸入的gradient,只要這兩個函數實現了以後,我們就可以把很多層連接成一個網絡,這個網絡做的事情就是輸入我們的數據(圖像或者語音或者whatever),然後來計算我們需要的輸出(比如說識別的label),在training的時候,我們可以根據已有的label來計算loss和gradient,然後用gradient來update網絡的參數,這個就是Caffe的一個基本流程。如果大家需要自己實現一個layer的話,可以參考slide28的格式。
我簡單解釋一下,比如說輸入是x,我們可以想象一個layer的forward function就是y=f(x),然後,我們會有一個loss function,記成L(.),在做backward的時候,網絡得到的是上層給出的gradient,dL/dy。然後網絡需要做的計算是dL/dx = dL/dy * dy/dx,dy/dx也就是f'(x),於是,這樣我們就可以一層一層往後計算gradient,我找一下具體的slide在哪裏:)slide 31簡單介紹了一下這個forward和backward的結構,anyway,Caffe裏面實現的solver主要也是爲了神經網絡設計的,在做training的時候,我們一般都會做SGD,就是每次輸入一個小batch,做計算,update參數,然後再輸入下一個batch,Caffe也實現了許多實際應用上比簡單SGD要更有效的算法,比如說momentum 和Adagrad,(順便插一句,Ilya Sutskever有paper解釋說,momemtum其實已經可以很好地實現quasi second order的優化,所以建議大家可以從momentum sgd開始嘗試做training)。基本上,最簡單地用caffe上手的方法就和slide 35說的一樣,先把數據寫成caffe的格式,然後設計一個網絡,然後用caffe提供的solver來做優化看效果如何,如果你的數據是圖像的話,可以從現有的網絡,比如說alexnet或者googlenet開始,然後做fine tuning,如果你的數據稍有不同,比如說是直接的float vector,你可能需要做一些custom的configuration,caffe的logistic regression example(slide 36)興許會很有幫助:)
我在和人聊的時候發現大家都比較喜歡fine tune的方法,所以我也簡單介紹一下。基本上,finetuning的想法就是說,我在imagenet那麼大的數據集上train好一個很牛的網絡了,那別的task上肯定也不錯,所以我可以把pretrain的網絡拿過來,然後只重新train最後幾層,重新train的意思是說,比如我以前需要classify imagenet的一千類,現在我只想識別是狗還是貓,或者是不是車牌,於是我就可以把最後一層softmax從一個4096*1000的分類器變成一個4096*2的分類器,這個strategy在應用中非常好使,所以我們經常會先在imagenet上pretrain一個網絡,因爲我們知道imagenet上training的大概過程會怎麼樣,所以我覺得算法上主要就是這些了,大概再講一下最近一些比較有意思的方向吧:)
首先是multi-GPU的訓練,caffe有一個Flickr的branch可以用來做multi-GPU,不過目前好像把它merge進master得過程有點慢,不過,如果你有興趣的話,其實multi-GPU不是很難:)比如說,用MPI實現一個GPU之間的synchronization,然後把data transfer和computation 並行起來,基本上就可以實現一個比較直接的single machine multi-gpu training了,當然希望flickr的branch儘早merge。
另外,sequence model (RNN, LSTM)也是一個比較熱門的方向,一個比較簡單地實現RNN的方法是unrolling,就是說,我不來實現一個for loop,而是確定地說我的sequence就是一個固定的長度,這樣,整個網絡就依然是一個feedforward的網絡,除了需要一些weight sharing以外,依然是可以用原先的架構來實現的,另外就是NVidia的cuDNN,NVidia在cuda上做了很多的優化,所以無論大家是用caffe還是實現自己的code,都可以關注一下它,cudnn最近會準備出v3,效果應該比v2還會更快一些。另外一個比較值得關注的數學計算庫是Eigen,在CPU上的優化還是挺顯著的。Caffe沒有太多地用到Eigen,但是我覺得值得提一下:)anyway,我覺得咱們要不還是多留一些時間來討論大家關注的問題,所以我就先打住了,我們Caffe的主要的contributer都在slide 89上,大家都很nice,如果你在CVPR上碰見我們的話歡迎來聊天:)

二、問答環節:
問:在finetuning的時候,新問題的圖像大小不同於pretraining的圖像大小,只能縮放到同樣的大小嗎?” 
答:對的:)
問:目前dl在時序序列分析中的進展如何?研究思路如何,能簡單描述一下麼
答:這個有點長,可以看看google最近的一系列machine translation和image description的工作。
問:2個問題:1.目前Caffe主要面對CV或圖像的任務,是否會考慮其它任務,比如NLP?2.如果想學習Caffe代碼的話,能給一些建議嗎?
答:Caffe的確主要是做vision的,但是也可以做nlp,caffe的代碼學習我覺得主要還是follow tutorial,另外知乎上我記得有一位兄臺做過一些解析,但是不是很記得link了...
問:"請問下師兄,在移動端用深度學習可以實現實時人臉檢測麼?謝謝" 
答:人臉檢測可能目前用傳統方法還是很competitive的,但是做一些識別等等,我覺得目前的移動設備應該是可以支持的。
問“1、fine tuning過程是用已有的模型來初始化現有的模型,那在fine tuning的過程中,怎麼在fine tuning的時候,不更新某些層的參數呢?” 
答:這個在caffe裏面可以設置一些layer的learning rate爲零來實現:)
問:“我一直想問的問題 就是slide1上的黃嘌呤是什麼意思 ,現在的卷積能實現化合物feature的識別嗎?” 
答:那個其實是咖啡因(caffeine)的分子式 stuck_out_tongue
問:“請問 訓練過程中batch的大小對結果影響大嗎?受限於我的gpu內存,我的batchsize不能選太大,我懷疑這個會導致結果的不收斂” 
答:理論上batch小是不會影響收斂的。小batch主要的問題是在FC層的計算可能會不是很efficient,但是數學上沒有問題。
問:“ 現在在caffe裏實現的imagnet那個 caffenet,是不是 2-GPU的嗎?”
答:是單GPU的,其實AlexNet可以直接用單GPU來實現,大家覺得AlexNet是2GPU的緣故是,Alex當年train網絡的時候GPU內存太小,他只好用兩個GPU來實現:)後來大家一般都是用一個GPU的。
問:"師兄您好,想用caffe做下反捲積,發現裏面有自帶deconv層代碼,但是不大會使用,官網也沒有相關資料" 
答:這個的確有點tricky。。。我個人沒用過deconv層,所以不是很好解釋,你可以在[email protected]上問問:)
問:“用caffe訓練自己的數據時,網絡層數、卷積核大小、滑動步長,學習速率這些參數的設置有沒有一個規律可循呢? ” 
答:這個相對比較tricky,我覺得更多的還是通過已有的架構然後來做一些微調,個人也沒有太好的insights可以分享:微軟的paper,vgg,googlenet可能有幫助。
問:“目前deep learning用在小數據集上有什麼好的方法嗎?在小數據集的問題上是不是可以通過減少網絡的層數來減少過擬合?”
答:小數據集基本上需要通過小的模型來防止overfit,當然如果數據集是圖像等等,也可以通過finetuning。另外一個可能是直接手標更多數據,有時候糙快猛但是還挺好使的。
“我在自己的數據集上訓練,訓練的loss函數一直不降低,調小過偏置大小,學習率也改過很多,但是每次都很快的迭代到一個大的值,不再變化,而且測試準確率就等於瞎猜的準確率” 這個可能是learning rate太大或者初始值的問題?可以縮小初始值的scale事實

“請問在s層,如何確定該用mean pooling還是max pooling?”基本上靠試 stuck_out_tongue

"目前dl近幾年在siamese nets distances結構上的進展如何?研究思路如何?" Yann Lecun有paper講這個,值得看看

“師兄您好,我想問下不使用matlab或python接口,直接在C++的caffe代碼裏對圖像進行分類有什麼好的方式嗎,速度會不會比matlab和python更快” 我覺得速度應該差不多,因爲matlab和python的overhead不會太大

“dl能實現FFT嗎” facebook其實有fft的code,參見fbfft:)

"2、caffe內部的Convolution計算是圖像拉伸成向量進行的計算,這種方式會比普通的方法和fft的方法計算更快嗎?
放大點說,caffe做了哪些算法上的優化 使得計算速度比較快呢?" 那個其實是我的weekend hack,所以推薦大家用其他的優化,比如說cudnn等等。說實話寫caffe的時候我沒太關注速度....

“師兄,您好!用caffe純粹做分類的話(前向),需要softmax層嗎?看代碼有個pro層和softmax一樣嗎?” 不是很清楚pro層是哪個,不過也可以用logistic,任何傳統的分類函數應該都是可以的

“3、對於cxxnet,您是怎麼看待的呢? ” 我還挺喜歡cxxnet的一些設計的,基本上就是大家選自己喜歡的codebase來用吧:)

關於時序的問題統一回答一下 - 大家可以參考最近的machine translation,im2txt等等的一系列文章

“請問,想cxxnet,這些新的框架,也集成了bn,prelu等新的模塊,caffe是否會內置這些模塊呢>” 我覺得會的,這個在code層面上其實沒有太大的問題。我最近主要在做一些refactor,然後還有一些公司的事情,所以沒有關注在push新的模塊上:)
“caffe能否在多個層都連接loss函數,同時進行反向傳播” 可以的,關鍵是要處理好gradient merge的問題,其他都是OK的:)

“caffe裏面的激活函數可以自行修改成其他自己設計的激活函數嗎” 可以的,你可以參考ReLU層的code,然後改一下relu的函數就可以了

“CNN可以應用到對圖像進行深度圖提取嗎?效果會怎樣呢?”最近nyu應該有一篇stereo的文章,應該比較類似?

“caffe會內置rbm的模塊嗎。nin相關的會不會也會考慮添加。” rbm可能不會,因爲最近用得好像比較少。nin其實已經支持了 - nin的本質是1x1的convolution,可以參考googlenet

“我現在是在做機器學習,還沒有深入deep learning,是不是要先打好機器學習的基礎再學dp會好一點,謝謝賈老師了” 這個我其實也不是很清楚,很多想法其實都是相通的(比如說優化的問題),所以可以都看一些,然後按照自己的需求深入:)

“用hdf5layer實現多label的過程不是很清楚,舉個例子說,比如,輸入低分辨圖像,label是高分辨圖像,,這種有沒有詳細一點的教程,或者師兄能不能簡單提一下” 這個主要就是要設計一個input層能夠輸出不同的top blob,其實caffe在這一點上做的不是很好(因爲太關注classification了),可能看一下這些典型的輸入層的實現會有幫助。

“caffe能支持lstm、rnn的訓練嗎?另外,對於百度的dlmc您有什麼看法?” Jeff Donahue有一個branch可以來做lstm,我自己在refactor的一些code應該也是可以的,但是因爲公司review政策的緣故沒法保證什麼時候能release smile dmlc我覺得是個挺好的effort,在開源界看到更多中國學生的身影很興奮!

“師兄您好。想問一個問題,如何將已知的世界知識,比如說語法規則等有效融入到深度學習中?” 這個是個好問題,目前大家都有點傾向於learning from scratch,所以我也說不好怎麼做融合,但是應該是一個值得考慮的研究方向

“請問調參方面有什麼比較細緻的資料或文獻集” “solver裏的 lr_policy: 選擇有什麼規律麼 我看到有fixed inv” 這兩個問題,基本上我覺得還是靠經驗。marc'aurelio ranzato曾經有一個presentation講一些有用的trick,容我找找,anyway,不太好找,但是marc'aurelio的網站在這,應該是其中的某一個slides:http://www.cs.toronto.edu/~ranzato/

“用自己的數據(並不屬於imagenet的1000個類)在imagenet訓練的網絡上做finetune時,發現怎麼調整參數最後幾乎都無法用來分類,這是什麼原因呢?” 這個可能需要看一下圖片是否類似,比如說imagenet的模型用來做醫學圖像識別效果就很可能會不是很好,還是需要看這兩個task的數據之間是否有相似性.

“接着上一輪的提問,caffe實現多層loss反向傳播,我能不能直接在prototxt裏每一層後加一層loss,最後的結果會是怎樣?” 唔,這個得看loss是什麼了,比如說googlenet用到了幾個branch來inject softmax,所以基本上還是要尋找和問題相關的loss term

“可否評論一下nature 新出的DL文章?reinforcement learning之類的會是下一個主要結合的點嗎?” 哈,Hinton本人的說法是“you won't learn much from that paper”。那個更多的是一個overview,如果希望瞭解一下DL的來龍去脈的話值得讀一下。RL其實還是挺熱門的,deepmind做的就有點像RL,berkeley Pieter Abbeel組也做了很多RL的工作

“,lstm97年就出來了,爲何最近又火起來” 我覺得是因爲LSTM的確可以很好地model sequence data,爲啥會有冷熱的問題,這個很神祕:)誰也說不清楚,你看CNN也是冷了好幾年然後忽然熱了。

“dl能實現FFT嗎” facebook其實有fft的code,參見fbfft:)” fb是利用了FFT去快速計算,不是我問的意思。用傅立葉變換其實是提取了頻域特徵,根據應用的不同,最優的變換不一定是FT,可能是時頻變換、分數階FT等等變換。那麼問題就來了:利用深度學習算法,能否學習到最優的時頻特徵表出?如果可以,是不是可以把信號處理裏面的固定分析方法都扔掉?” 這個我就的確不是專家了,我覺得這個有點類似於model design的問題,深度學習相當於也是設計了一大類的model,然後在這一類model當中尋找最優的,所以如果有一些oracle knowledge(比如說已有的固定分析的經驗)可以知道如何rectify數據,我覺得應該還是有幫助的

“caffe有沒有對分佈式的支持?”目前在parallel branch裏面

“3.caffe的訓練過程如何使用gpu對計算性能進行優化” 這個更多的是在code層面上調速度了,如果有興趣的話,nvidia的nvprof應該會很有幫助

“記得有一篇說論文說 在imagenet上,把30%的標籤打亂,反而使得最後的結果更好和更魯棒。那麼是不是意味着我們不需要強定義的數據(不需要那麼仔細的標註數據) 就可以訓練得到一個不錯的模型呢?” 我覺得基本上就是數據越乾淨,數據越多,效果一般就越好(實際應用上我們有時候會讓human rater去再次確認一些不確定的標註)。魯棒性的問題,我覺得可能是因爲增加了regularization?imagenet上基本上還是標準的protocol來training效果最好。

“caffe用的GPU大概成本需要多少” 取決於GPU,我覺得從200到1000美元不等?當然土豪用5000塊錢的K80這種事情也是可以的。

“師兄您好!用SGD的時候,收斂充分的前提下,不同的學習率衰減策略是不是結果都差不多?” 恩,一般會差不多

“dl 在ctr預測上有什麼好的論文或者資料麼?” 我不是很清楚,不過餘凱師兄以前講過百度用DL做CTR效果很好,所以還是很promising的

“不好意思,我的問題可能沒表達清楚,您之前說多層loss反向傳播,需要處理好gradient的merge,我想問,如果只是在prototxt裏,每一層後加上需要的loss函數,那麼caffe最終的反向傳播會是怎樣進行的” 哦,應該是這樣的,每一層後面需要一個split層,把這一層的輸入變成兩個blob,一個繼續往下傳播,一個輸入到loss層裏面。在backprop的時候,split層會把這兩條路徑的gradient加起來

"其實我對師兄解釋的dl在時序方面的應用還是不太清楚,能多分析一下嗎?" DL在時序方面的應用主要是RNN/LSTM這方面,主要是用來理解sequence的信息,兩個用法:(1)提取sequence的feature,然後來做classification或者embedding,(2)從sequence到sequence,比如說輸入語音,輸出識別的句子

“1.caffe的訓練過程能否保持對象的旋轉不變性 怎樣做到這點” 目前不是很好explicit地輸入這樣的constraint,主要還是靠data augmentation(輸入各種旋轉以後的圖)來實現

“2.caffe對不同尺度的同一對象的分類和識別有哪些特殊的處理方法” 這個倒也不單是caffe的問題,在圖像識別上如果需要處理不同尺度,一般就是做multi-scale的detection,可以參考一下selective search,R-CNN等等的工作

“用自己的數據集,且類型和和imagenet的類型不太一樣(比如細胞類型),想用caff訓練的話,最少得需要多少數據量,才比較好?” 這個說不太好,所以最好還是先用一部分數據測試一下,然後你可以用從少到多的數據來訓練,然後外推一下可能會需要多少數據

“現在caffe上有一些已經訓練好的,準確率比較高的模型嗎?我在caffe主頁下載的幾個分類的精度都不高,cifar10和imagenet的都是 百分之八十幾,有精度更高的嗎?” 基本上imagenet的模型算是準確度最高的了,包括googlenet和vggnet

“softmax_layer和softmax_loss_layer有什麼區別。” softmax_layer是做softmax變換(就是把輸入的score變成sum to 1的概率值), softmax_loss是計算prediction和true label之間的cross entropy loss function

“Caffe現在怎麼處理變長的圖片,因爲Conv對變長不明感,而且可以用Dynamic Pooling?”變長的圖片可以用SPPNet這樣的思路,最後做一個固定輸出大小的pooling

“請問多任務學習的DL有什麼經驗可以分享嗎?比如數據分佈的均勻性的影響” 數據分佈均勻性一般都還是挺tricky的,實際操作上一般我覺得cap一些frequency(如果某一類太多了,就downsample一下)會使得training更好一些

“想問一下:在神經網絡的訓練過程中,如何能夠並行或者說更快地計算?” 主要是靠兩點吧,一個是寫更快的code(比如說用cudnn優化convolution),一個是寫並行計算的框架(這方面我推薦用MPI入手,因爲MPI雖然沒有fault tolerance等等的好處,但是並行非常簡單,可以作爲最開始的測試)

“autoencoder 模型中,單個隱含層和多隱層 模型,效果差別很多啊嗎?” 這個可能和具體實現有關,隱層多了以後,representation power增加,很可能會提升效果,但是也可能會overfit,所以需要更仔細的training

“請問除了從分類結果看特徵表出的優劣,有沒有一種通行的方式去看特徵表出的優劣?還有一個問題:lstm簡直就是一個編碼模型…以後機器學習的結構都要往電子工程上靠了嗎?我覺得結構越來越複雜正背離dl的初衷了…” 其實大家經常批評DL的問題就是說,我們從設計feature變成了設計model(我記得原話是jitendra malik講的...啊我太八卦了)。所以這個的確也是一個難解的問題,興許我們可以做一個算法來自動生成很多model然後evolve這些model?MIT曾經有一篇paper來自動學習網絡的結構,但是目前state of the art的模型還經常靠手調

“DL中,能否預知到底學到了一個怎樣的物理模型,來實現分類的?” 參見上面的回答:)目前比較困難,在圖片上,大家做過一些有意思的實驗來檢測模型到底學了什麼,可以參考karen simonyan的文章(用CNN來生成一個"最像"某一個類別的圖像)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章