Category Archives: 深度学习

Very Deep Convolutional Networks for Large-Scale Image Recognition

Very deep convolutional networks for large-scale image recognition
Simonyan, Karen, and Andrew Zisserman.
arXiv preprint arXiv:1409.1556 (2014).
下载地址:https://arxiv.org/pdf/1409.1556.pdf

这篇文章是以比赛为目的——解决ImageNet中的1000类图像分类和localization(这里需要注意localization和detection的区别。localization是找到某个物体的检测框,而detection是找到所有物体的检测框,后文会详细说明)。

作者对六个网络的实验结果在深度对模型影响方面,进行了感性分析(越深越好),实验结果是16和19层的VGGNet(VGG代表了牛津大学的Oxford Visual Geometry Group,该小组隶属于1985年成立的Robotics Research Group,该Group研究范围包括了机器学习到移动机器人)分类和localization的效果好(作者斩获2014年分类第二,localization第一,分类第一是当年的GoogLeNet)。下面是来自一段对同年的GoogLeNet和VGG的描述:

GoogLeNet和VGG的Classification模型从原理上并没有与传统的CNN模型有太大不同。大家所用的Pipeline也都是:训练时候:各种数据Augmentation(剪裁,不同大小,调亮度,饱和度,对比度,偏色),剪裁送入CNN模型,Softmax,Backprop。测试时候:尽量把测试数据又各种Augmenting(剪裁,不同大小),把测试数据各种Augmenting后在训练的不同模型上的结果再继续Averaging出最后的结果。
参考:如何评价今年的 ILSVRC 2014 结果? | 知乎
https://www.zhihu.com/question/24904450/answer/29400634

需要注意的是,在VGGNet的6组实验中,后面的几个网络使用了pre-trained model A的某些层来做参数初始化。这点上虽然作者没有提该方法带来的性能增益,但其实是很大的(我会在下文中优秀的特征提取器和泛化能力具体说明)。

上图来自CS231n课程blog的tiny-vggnet模型架构,可以看到有三组卷积后接一个全连接层,每组卷积(blog里称为pattern)的形式都是一样的(conv-relu-conv-relu-pool),实际的VGG16(只算卷积和全连接层的个数是16)与上图略有不同(前两组conv-relu-conv-relu-pool,中间三组conv-relu-conv-relu-conv-relu-pool,最后三个fc,前两个fc是fc-relu-dropout,最后一个fc仅有fc。后文ConvNet Configurations部分我会具体说明),不过整体来说作者也承认是继承了AlexNet和OverFeat

1. 继承了AlexNet不少网络结构(基于它加深层数和修改所有卷积核为3×3的小卷积),最后三个fc层基本算是平移AlexNet的到VGGNet上;
2. 继承了OverFeat在Localization任务中的做法(we adopt the approach of Sermanet et al. (2014),没记错的话OverFeat拿了2013年Localization任务的第一名)。

VGGNet的两个特点:层数更深更宽、卷积核更小。因为卷积核变小全部改用3×3大小(性能最好的两个网络:实验D(VGG16)和实验E(VGG19)),小卷积核的使用带来参数量减少,可以更加steadily地增加层数得同时不会太过于担心计算量的暴增因为这篇文章正文写的是分类,附录介绍了VGGNet在localization上的工作,我也会对localization任务的解决进行分析。

这篇文章的主要特别的地方是前两点(换句话说,抄的不是很明显):

  1. 卷积核变小。作者做的6组实验中,卷积核全部替换为3×3(极少用了1×1),选用更小卷积核的motivation是作者受到这两篇文章(Zeiler & Fergus, 2013; Sermanet et al., 2014)启发,使用更小的卷积核尺寸和stride得到性能提升;
  2. 层数更深更宽(11层、13层、16层、19层)。我认为作者是觉得:既然小卷积核带来性能提升,那么不妨试试深度对性能的影响,反正参数量我的gpu可以cover住。作者的实验也发现层数越深,带来的分类结果也越好,但并没有提到channel变宽这一个因素:6组实验中channel数都是逐层加宽的,如果单说深度对性能的影响而忽略宽度(这里宽度不是feature map的width而是depth),我觉得并不够convincing,应该再加入一下对宽度(channel)数分析对比的实验;
  3. 池化核变小且为偶数。AlexNet中的max-pool全是3×3的,但VGGNet中都是2×2的。作者没有说明选择这种size的考量(现在stride=2、以及2×2和3×3的pooling kernel选择的主流),我认为主要是2×2带来的信息损失相比3×3的比较小,相比3×3更容易捕获细小的特征变化起伏,此外或许是发现2×2的实验效果确实比3×3的好吧(毕竟这也是直接原因);
  4. 网络测试阶段将训练阶段的三个全连接替换为三个卷积。对于训练和测试一样的输入维度下,网络参数量没有变化,计算量也没有变化,思想来自OverFeat,1×1的卷积思想则来自NIN。优点在于全卷积网络可以接收任意尺度的输入(这个任意也是有前提的,长和宽都要满足:$a\times2^n$,n是卷积与池化做stride=2的下采样的次数);
  5. 刷比赛的小技巧。其实没什么意思,比方输入图片的尺寸对于训练和测试阶段的处理方式不同,single和multi-scale的问题(具体见后文)。

下面我将会任务背景开始说明,最后我会再次引用CS231n对于VGG的中肯评价进行总结。 Continue reading

ImageNet Classification with Deep Convolutional Neural Networks

这篇文章是Alex Krizhevsky在2012年提出的,Alex师从Hinton(也是本文的第三作者),之后也是FeiFei Li的学生。下面这幅图是模型的架构图(五个卷积后接三个全连接,最后是处理1000个元素的feature map的softmax,但softmax没画出来。后文会具体说明):

本文做了这么件事:训练了一个深度卷积网络(6千万参数、65万神经元,结构为五层卷积,某些卷积层后接max-pooling层,后接三个全连接层,图中的方块或者竖条是feature map,连接的线是layer的名字,全连接就是dense layer。最后的特征是1000个元素的feature map,丢给没在图上体现的softmax完成分类)来完成2010年的ImageNet分类比赛的任务(LVSRC-2010),将120万张高分辨率的图片分为1000个类别

特点在于:

  1. 收敛/训练速度加快,用了非饱和神经元(ReLU,即线性矫正单元)。ReLU是一种非线性神经元(当输入x大于0,则输出为x;输入​x小于0,则输出​0)较之前的等激活函数计算速度更快,收敛也更快;
  2. 模型并行。文中并没写是模型并行,但我看介绍认为是一种(有数据并行的)模型并行。训练过程用了两个GTX580 GPU 3GB(一个gpu无法cover住),除了第三层卷积、最后的两个全连接层(两个GPU将全连接拆成各自两部分)和Softmax(汇聚到单个GPU处理),其余部分处理可以看作两个GPU的数据并行(AlexNet架构图的上部分和下部分对应两个GPU各自的处理流程,单GPU的话,就是group=2这个可以看后文中通过netscope可视化出的网络结构)。相比单GPU没加快多少,同时某些层两个GPU共享参数,可以减少显存占用这样以便在一次参数更新放更多的图片加入训练。发现双卡比单卡top1和top5的error有下降(我认为是作者忘了改SGD学习率导致,先跑one-gpu net再跑two-gpu net);
  3. 正则化——数据扩增和dropout。关于数据增强,我的理解是:有变化才能找到规律。只要保证数据多样性的同时,同样的图像有些许的变化(不aug过头),这样网络的权重才能学到在变化中,输入到输出的映射本质,学习出/建立起鲁棒的网络权重/参数。没dropout模型训练很快会过拟合,加上后double了收敛时间(iteration次数)。但这一项没有做ablation study(或许做了文中没说),感觉这个dropout不convincing;
  4. 性能state of art。top-1和top-5错误率分别为37.5%和17.5%。相比第二top-5错分率是26.2%。我觉得除以上外,性能提升的一个重要因素是做了数据扩增(data augmentation),产生更diverse的数据来拟合模型。

我个人认为Alex的工作主要在提出了AlexNet这一个网络架构和cuda-convnet这个库,其实整体工作很偏工程的。比较有特色的是跨通道的LRN(Local Response Normalization对acc提升很有限)但之后的发展历史上没见过了(不过我觉得LRN跨通道特征transform的思想带来了shuffleNet),论文中只有一个两行的带了动量的SGD的权重更新公式,没有数学证明和推倒,很像一篇实验报告,最后定性分析了结果(第一层卷积核的可视化:不同group上学到的kernel不同;网络最后一层的学到的特征好,可以用于图像搜索前的原始特征提取)。没什么理论证明啥的,dropout,relu那些东西也是拿来主义。

我想了下,也不能这么说,最大的工作就是AlexNet这个架构,除了不断尝试(超强的工程能力),有一定道理的分析和拍脑袋也是有学术思想在里面的(不能说偏工程,毕竟工程是实现的前提)。AlexNet能提出还是很有想法的。当时没有什么深度学习框架,实现这个工程挺难的。

总结:学术和工程意义非凡!开创了现代CNN的先河!本篇对该文章进行了分析,具体目录如下:

 

当然我有两个问题没有解决:

  1. Local Response Normalization的backprop是怎么做的(后文给出了caffe的代码);
  2. data augmentation的Fancy PCA怎么算一张三通道图像的特征值和特征向量的(后文给出了cuda-convnet代码位置)?

下面我会逐一来详细分析这几个要点。不过首先来说一下任务背景。

Continue reading

Ubuntu16.04安装CPU版Caffe

本文是安装CPU版本Caffe的教程,如果你是ARM平台也可以参考,但是可能需要在编译OpenBLAS的时候需要进一步参考给出的链接,选择相应的编译设置,其它无异。该文大部分参考官方在github的wiki上的教程,另外两个参考是csdn上在遇到hdf5.h缺失和pycaffe安装的问题,下面就开始:

 
Continue reading

尝试解决Caffe内存不够Check failed: *ptr host allocation of size XXX failed问题

只是做infer,在使用Caffe(C/C++ API)跑inception-v2和MXNet(Python API)跑inception-v2、v3、vgg-16、AlexNet、DeepID网络的时候都出现了内存不够的问题。这个和Spark的out of memory问题很像,Spark的问题可以参考我之前记录的这篇解决Spark数据倾斜的八种方法)文章,说不定也可以得到inspire。

 
Continue reading

深度神经网络的必知技巧

作者是南京大学的 Xiu-Shen Wei,由于给的是英文原文——《Must Know Tips/Tricks in Deep Neural Networks》 (by Xiu-Shen Wei),这里对其翻译学习。在此,将会介绍搭建、训练深度网络的实现细节或技巧,因本人水平有限,如有错译请在下方留言,不胜感激

 
Continue reading

【MLT】13-Deep Learning

本章是上一章神经网络的进阶——深度学习,在原本的基础上,我们有深度学习的概念,对比浅度学习,自动编码器(用来给DL做网络权重的pre-training,预防落入局部最优),设计鲁棒性更强的自动编码器,自动编码器与主成分分析(与自动编码器相似,但用的函数是线性函数)。

 
Continue reading

【MLT】12-Neural Network

本章是神经网络的入门,包含如下四个方面:

  1. Motivation:基本单位-神经元,与生物神经元的联系
  2. Neural Network Hypothesis:神经元的转换函数(激活函数),物理解释
  3. Neural Network Learning:网络权重的学习,网络权重的偏微分推导,反向传播(BP)
  4. Optimization and Regularization:网络优化,模型VC维,两种regularization方法(正则化项,early stopping)
 

Continue reading

Word2vec发展趋势

本文来自 – Word2vec: what’s next? Tomas Mikolov, Facebook Talk at Moscow State University, 2016 (http://www.machinelearning.ru/wiki/images/d/db/MikolovWord2vecSlides.pdf),这里简单翻译了一下该PPT,感谢爱可可老师的分享!如有错误,请在下方留言!

 

Continue reading

Support Vector Machines vs Artificial Neural Networks

svms.org网站上一篇神经网络和支持向量机的对比文章,这里做简单翻译,如有错误请在下方评论处留言,感谢作者!感谢爱可可-爱生活分享!

 

Continue reading

【UFLDL】Supervised Convolutional Neural Network——Pooling

监督卷积网络(Supervised Convolutional Neural Network)——池化(Pooling)

池化:概述(Pooling: Overview)

在得到卷积特征后,我们下一步就是用其来做分类。理论上,我们可以用一个基于提取到的所有特征来做分类器,比方说 softmax 分类器,但在计算量上的开销是很大的。考虑到每张图片大小为 96×96 像素,并进一步假设我们已经在 8×8 像素大小的输入单元上学习了400个特征。每个卷积将会产生一个$(96-8+1)*(96-8+1)=7921$ 个元素的输出,因为我们有400个特征,这样每个样本将会产生长度为 $89^2∗400=3,168,400$ 个特征元素的向量。有着超过三百万的特征元素让分类器去学习的想法是不明智的,这也会使分类器倾向于过拟合。 Continue reading