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

1、講座正文:
你們好!我是賈揚清,目前在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上遇見咱們的話歡迎來聊天:)python

2、問答環節:
問:在finetuning的時候,新問題的圖像大小不一樣於pretraining的圖像大小,只能縮放到一樣的大小嗎?」 
答:對的:)
問:目前dl在時序序列分析中的進展如何?研究思路如何,能簡單描述一下麼
答:這個有點長,能夠看看google最近的一系列machine translation和image description的工做。
問:2個問題:1.目前Caffe主要面對CV或圖像的任務,是否會考慮其它任務,好比NLP?2.若是想學習Caffe代碼的話,能給一些建議嗎?
答:Caffe的確主要是作vision的,可是也能夠作nlp,caffe的代碼學習我以爲主要仍是follow tutorial,另外知乎上我記得有一位兄臺作過一些解析,可是不是很記得link了...
問:"請問下師兄,在移動端用深度學習能夠實現實時人臉檢測麼?謝謝" 
答:人臉檢測可能目前用傳統方法仍是很competitive的,可是作一些識別等等,我以爲目前的移動設備應該是能夠支持的。
問「一、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層,因此不是很好解釋,你能夠在caffe-users@googlegroups.com上問問:)
問:「用caffe訓練本身的數據時,網絡層數、卷積核大小、滑動步長,學習速率這些參數的設置有沒有一個規律可循呢? 」 
答:這個相對比較tricky,我以爲更多的仍是經過已有的架構而後來作一些微調,我的也沒有太好的insights能夠分享:微軟的paper,vgg,googlenet可能有幫助。
問:「目前deep learning用在小數據集上有什麼好的方法嗎?在小數據集的問題上是否是能夠經過減小網絡的層數來減小過擬合?」
答:小數據集基本上須要經過小的模型來防止overfit,固然若是數據集是圖像等等,也能夠經過finetuning。另一個多是直接手標更多數據,有時候糙快猛可是還挺好使的。
「我在本身的數據集上訓練,訓練的loss函數一直不下降,調小過偏置大小,學習率也改過不少,可是每次都很快的迭代到一個大的值,再也不變化,並且測試準確率就等於瞎猜的準確率」 這個多是learning rate太大或者初始值的問題?能夠縮小初始值的scale事實git

「請問在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:)oracle

"二、caffe內部的Convolution計算是圖像拉伸成向量進行的計算,這種方式會比普通的方法和fft的方法計算更快嗎?
放大點說,caffe作了哪些算法上的優化 使得計算速度比較快呢?" 那個實際上是個人weekend hack,因此推薦你們用其餘的優化,好比說cudnn等等。說實話寫caffe的時候我沒太關注速度....框架

「師兄,您好!用caffe純粹作分類的話(前向),須要softmax層嗎?看代碼有個pro層和softmax同樣嗎?」 不是很清楚pro層是哪一個,不過也能夠用logistic,任何傳統的分類函數應該都是能夠的機器學習

「三、對於cxxnet,您是怎麼看待的呢? 」 我還挺喜歡cxxnet的一些設計的,基本上就是你們選本身喜歡的codebase來用吧:)分佈式

關於時序的問題統一回答一下 - 你們能夠參考最近的machine translation,im2txt等等的一系列文章ide

「請問,想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來生成一個"最像"某一個類別的圖像)

相關文章
相關標籤/搜索