Tag Archives: Deep Learning

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

Active Learning: 一个降低深度学习时间,空间,经济成本的解决方案- 简书

  • 转载自:http://www.jianshu.com/p/42801f031cfa?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weibo

作者:Zongwei Zhou | 周纵苇
邮箱:zongweiz@asu.edu
微博:@MrGiovanni


下面要介绍的工作发表于CVPR2017,题为“Fine-tuning Convolutional Neural Networks for Biomedical Image Analysis: Actively and Incrementally”。它主要解决了一个深度学习中的重要问题:如何使用尽可能少的标签数据来训练一个效果promising的分类器。根据我的判断,当遇到两种情况的时候,这篇论文的可以非常强大的指导意义:

  • 一共手头有100个未标记样本,和仅仅够标记10个样本的钱,老板说,通过训练这十个标记的样本,能接近甚至达到训练100个样本的performance;
  • 手头有了一个已经在100个样本中训练完的分类器,现在又来了100个新标记的样本,老板说,只给提供够训练10个样本的计算机;或者只给你提供够训练10个样本的时间,让分类器尽快学习到新来样本的特征;

这两个情况发生的条件是完全不同的,Situation A发生在屌丝公司,没有钱拿到精标记的数据集,却也想做深度学习;Situation B一般发生在高富帅公司,有海量的精标记数据,但是由于目前即使是最牛逼的计算机也不能用深度学习在短时间内一次性地去处理完这些数据(e.g.,内存溢出,或者算上个几年都算不完)。Anyway,我想我已经说清楚应用背景了,读者可以根据实际情况判断是否往后读下去。

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

深度学习正则化系列8:对抗训练、切线距离与切线传播和流形切线分类器

《Deep Learning》Chapter 7
Regularization for Deep Learning
翻译水平有限,如有错误请留言,不胜感激!

 

7.13 对抗训练

在许多情况下,当在独立同分布的测试集上评估时,神经网络已经开始达到人类的表现性能。因此会自然想知道这些模型对这些任务是否达到同人类一样的理解能力。为了探索网络对底层任务的理解水平,我们可以研究模型分类错误的样本。Szegedy等人(2014b)发现,性能接近人类的神经网络在某些样本点上具有接近 $100%$ 的误差率,这些样本点是使用优化过程搜索到的数据点,例如搜索到与输入点 $x^{‘}$ 接近的点是 $x$,使得模型输出与在 $x^{‘}$ 样本点处非常不同。在许多情况下, $x^{‘}$ 可以非常近似于 $x$ ,人类观察者不能区分原始样本和对抗样本之间的区别,但是网络可以做出高度不同的预测,参见图7.8的例子。

对抗性样本有许多含义,例如超出本章知识范围的计算机安全方面。然而,它在正则化中很有趣,通过对抗训练训练来自训练集的对抗扰动样本,可以减少原始独立同分步的测试集上的错误率(Szegedy等人,2014b;Goodfellow等人,2014b )。

Continue reading

深度学习正则化系列7:Dropout

《Deep Learning》Chapter 7
Regularization for Deep Learning
翻译水平有限,如有错误请留言,不胜感激!

本文目录

  1. 7.12 Dropout
 

7.12 Dropout

Dropout(Srivastava等人,2014)是一种计算量不大但功能强大的方法,可用来正则一大类模型。第一种近似下,dropout可以被认为是一个方法,使许多大型神经网络能够集成的更实用的Bagging方法。Bagging涉及训练多个模型,并在每个测试样本上评估多个模型。当每个模型是大型神经网络时就不切实际了,因为训练和评估这样的网络在运行时间和所需内存方面的代价大。通常使用五到十个神经网络集成——Szegedy等人(2014a)使用六个神经网络赢得ILSVRC比赛,但超过这个数目会使集成的结果迅速变得笨拙。即使是对指数级数目的神经网络做集成,dropout也是一种低成本的近似训练和评估一个bagged的集成模型的方法。

Continue reading

深度学习正则化系列6:参数绑定和参数共享、稀疏表示、Bagging和其它集成方法

《Deep Learning》Chapter 7
Regularization for Deep Learning
翻译水平有限,如有错误请留言,不胜感激!

 

7.9 参数绑定与参数共享

本章到目前为止,当讨论给参数加入限制或惩罚时,我们总是限定在固定的区域或点中。例如, $L^2$ 正则化(或权重衰减)惩罚模型参数从参数的固定值零的偏离开始。然而,有时可能需要另外能表达关于模型参数合适值的先验知识。有时可能不知道参数应该采用什么值,但是知道从领域和模型架构的知识,这其中应该有一些模型参数之间的依赖关系。

我们经常想要表达的常见类型的依赖性是某些参数应当彼此接近。考虑以下情况:我们有两个模型执行相同的分类任务(具有相同的类集合),但具有稍微不同的输入数据分布。正式地,我们有参数 $w^{(A)}$ 的模型A和具有参数 $w^{(B)}$ 的模型B,两个模型将输入映射到两个不同但相关的输出: $\hat{y}^{(A)} = f(w^{(A)}, x)$ 和 $\hat{y}^{(B)} = g(w^{(B)}, x)$ 。

让我们假设任务是相似的(可能具有类似的输入和输出分布),我们认为模型参数应该彼此接近: $\forall i, w_i^{(A)}$ 应该接近 $w_i^{(B)}$ 。我们可以通过正则化利用这些信息。具体来说,可以使用以下形式的参数规范惩罚: $\Omega (w^{(A)}, w^{(B)}) = || w^{(A)} – w^{(B)} ||_2^{2}$ 。这里我们使用了 $L^2$ 惩罚,但其它选择也是可能的。 Continue reading

深度学习正则化系列5:半监督学习、多任务学习、提前终止

《Deep Learning》Chapter 7
Regularization for Deep Learning
翻译水平有限,如有错误请留言,不胜感激!

 

7.6 半监督学习

所谓半监督学习,是将 $P(x)$ 产生的未标记样本和 $P(x, y)$ 中的标记样本都用于估计 $P(y | x)$ 或根据样本特征 $x$ 来预测其类别 $y$ 。

在深度学习的背景下,半监督学习通常指的是学习表示 $h = f(x)$ 。目标是学习数据表征,使得来自相同类的样本具有类似的数据表征。无监督学习可以为如何在表示空间中分组的样本提供了有用的策略。在输入空间中聚集紧密的样本应能映射到相似的表示。新空间中的线性分类器在许多情况下可以实现更好的泛化(Belkin和Niyogi,2002;Chapelle等人,2003)。这种方法的一个变体是在应用分类器(在投影数据上)之前将主成分分析作为预处理步骤之一。

半监督模型中有着独立的无监督和监督的部分,它由 $P(x)$ 或 $P(x,y)$ 的生成模型与 $P(y|x)$ 的判别模型组成且共享参数。我们可以对无监督或生成模型(例如 $\log P(x)$ 或 $-\log P(x,y)$)对监督模型的标准 $-\log P(y | x)$ 进行平衡。生成模型对监督学习问题的解是一种特殊形式的先验知识(Lasserre等人,2006),即 $P(x)$ 的结构通过某种共享参数的形式连接到 $P(y | x)$ 的结构 。通过控制生成模型中准则占总准则中的比例,可以找到比纯粹是生成模型或完全是判别模型准则进行训练得到更好的(判别与生成模型间的)平衡(Lasserre等人,2006;Larochelle和Bengio,2008)。

Salakhutdinov和Hinton(2008)描述了一种用于学习用于回归问题的核机器的核函数方法,其中使用未标记的样本来建模 $P(x)$ 非常显着地改善了 $P(y | x)$ 。

更多关于半监督学习的信息,请参阅 Chapelle 等人(2006)的文章。

Continue reading

深度学习正则化系列4:正则化和受约束问题、数据集扩充、噪声鲁棒性

《Deep Learning》Chapter 7
Regularization for Deep Learning
翻译水平有限,如有错误请留言,不胜感激!

 

7.3 正则化和受约束问题

在某些情况下,正则化对机器学习问题的正确定义是必要的。机器学习中的许多线性模型,包括线性回归和主成分分析(PCA)的计算都依赖计算翻转矩阵,即 $X^T X$ 。$X^T X$ 是奇异的是不可能的(This is not possible whenever $X^T X$ is singular)。每当数据生成分布在一些方向上确实没有方差时,或者当在一些方向上没有观察到方差时,该矩阵可以是奇异矩阵,因为存在比输入的特征数目( $X$ 的列)更少的样本数( $X$ 的行)。在这种情况下,许多形式的正则化对应于反转 $X^T X + \alpha I$ ,这个正则化矩阵保证是可逆的。

Continue reading