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)的分子式
问:“请问 训练过程当中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?”基本上靠试 算法
"目前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 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来生成一个"最像"某一个类别的图像)