您的位置:首页 > Web前端

Caffe深度学习框架作者贾扬清online内容分享I

2016-07-20 18:24 309 查看
Caffe是一个清晰而高效的深度学习框架,其作者是博士毕业于UC Berkeley的 贾扬清,目前在Google工作。本文是根据机器学习研究会组织的online分享的交流内容,简单的整理了一下。

1、caffe分享

我用的ppt基本上和我们在CVPR上要做的tutorial是类似的,所以大家如果需要更多的内容的话,可以去tutorial.caffe.berkeleyvision.org,也欢迎来参加我们的tutorial。网页上应该还有一些python的样例帮助大家上手,所以欢迎参观。ppt比较长,所以我想我主要就介绍一下背景以及high level的内容,然后更多关注大家有一些什么具体的问题,希望大家觉得OK。

1.1 caffe起源

大家最近一段时间应该已经听到很多关于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,不要骂我。

1.2 caffe介绍

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)。只要这两个函数实现了以后,我们就可以把很多层连接成一个网络,这个网络做的事情就是输入我们的数据(图像或者语音或者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 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从一个40961000的分类器变成一个40962的分类器。这个strategy在应用中非常好使,所以我们经常会先在imagenet上pretrain一个网络,因为我们知道imagenet上training的大概过程会怎么样。

1.3 caffe其他方向

我觉得算法上主要就是以上这些了,大概再讲一下最近一些比较有意思的方向吧。首先是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就是一个固定的长度,这样,整个网络就依然是一个feed forward的网络,除了需要一些weight sharing以外,依然是可以用原先的架构来实现的。

另外就是NVidia的cuDNN,NVidia在cuda上做了很多的优化,所以无论大家是用caffe还是实现自己的code,都可以关注一下它。cudnn最近会准备出v3,效果应该比v2还会更快一些。

另外一个比较值得关注的数学计算库是Eigen,在CPU上的优化还是挺显著的。Caffe没有太多地用到Eigen,但是我觉得值得提一下。anyway,我觉得咱们要不还是多留一些时间来讨论大家关注的问题,所以我就先打住了,我们Caffe的主要的contributer都在slide 89上,大家都很nice,如果你在CVPR上碰见我们的话欢迎来聊天:)

贾扬清的个人主页:http://daggerfs.com/

转自:http://www.datakit.cn/blog/2015/06/12/online_meet_up_with_yangqing_jia.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: