在机器学习中,我们通常要考虑的一个问题是如何的“以偏概全”,也就是以有限的样本或者结构去尽可能的逼近全局的分布。这就要在样本以及结构模型上下一些工夫。

在一般的训练任务中,考虑的关键问题之一就是数据分布是否合理:首先是数据集的覆盖度,也就是数据集是否能够覆盖样本空间;其次还要尽可能的保证具有和真实数据一样的分布(注意数据分布是未知的,你只能根据一些先验来近似),这样的数据才是有效的。当然这些方式只是增大了得到正确解的概率,而并不能保证一定可以得到正确解。当你不知道你所取的训练集合是否和真实分布一致的时候,那么就要多取几次,每一个数据集都算算,对于分类器也是这样,单个分类器往往不能精确描述一个分界面,那么我们就组合一下,每个都算算。从方法论上讲,对于事物观察到的往往是局部,因此会犯以偏概全的错误,如果能够将所得到的“偏” ensambling 一下,那么就生成了相对的“全”,从而可以更大的概率逼近总体分布。这种思想在好多方面都体现出来,如交叉验证,经典的RANSAC,Random Tree(forest),Adaboost 等方法。

下面将从数据和模型两个方面来学习一下AlexNet中的一些技巧,主要参考的是Alex 2012 年的 NIPS论文ImageNet classification with deep convolutional neural networks.
 
1. 数据的处理:

到目前为止,还没有人看到数据集的大小对deeplearning算法理论上限造成的影响,也就是说数据集合还没有达到临界点,所以增加数据集只有好处,没有坏处。

在Alex的论文中,采用了两个方法对于图像进行了增强。

a. 增大训练样本:通过对于图像的变换实现了对于数据集合的enlarge。首先对于输入的图像(size 256*256)随机提取224*224的图像集合,并对他们做一个horizontal reflections。变换后图像和原图像相差了32个像素,因此主体部分应该都包含在训练集合中,相当于在位置这个维度上丰富了训练数据。对horizontal reflections来说,相当于相机在主轴方向做了镜像,丰富了反方向的图像。数据集合增大了2048倍,直接结果就是降低了overfitting同时降低了网络结构设计的复杂层度。

在测试阶段,取每一个测试样本四个角以及中间区域,一共5个patch然后再镜像后得到10个样本输入到网络中,最后将10个softmax输出平均后作为最后的输出。

b.使用PCA对于训练数据进行增强:对于每一个RGB图像进行一个PCA的变换,完成去噪功能,同时为了保证图像的多样性,在eigenvalue上加了一个随机的尺度因子,每一轮重新生成一个尺度因子,这样保证了同一副图像中在显著特征上有一定范围的变换,降低了overfitting的概率。

以上的策略是不是真的有必要,这个还是要打一个问号,因为对于a部分来说,样本少,可以在结构设计上下下功夫,可能达到相同的效果。对于b来说,deeplearning还需要对于图像加入增强处理吗?如果这样的话,自然也可以用一些传统人工特征先来一遍,再deeplearning了。我想关键的原因是deeplearning还没有真正的被证明的规则,所以你用什么策略都有点道理,但是谁敢保证不是“以偏概全”呢?

2. 模型结构:

在模型的设计上,AlexNet做了一个Local Response Normalization的处理,同时在节点的选择上采用了一个dropout策略。

a. Local Response Normalization.

公式如下,其中a是每一个神经元的激活,n是在同一个位置上临近的kernel map的数目,N是可kernel的总数目,k,alpha,beta都是预设的一些hyper-parameters,其中k=2,n=5,alpha = 1*e-4,beta = 0.75。

从这个公式中可以看出,原来的激活a被加一个归一化权重(分母部分)生成了新的激活b,相当于在同一个位置(x,y),不同的map上的激活进行了平滑,但是至于为什么k,alpha,beta这样来设置,没有想太清楚。

这个平滑大概可以将识别率提高1-2个百分点。

b. Dropout策略

使用多个model来共同进行预测是一个降低test errors的基本方法,但是单独的训练多个model组合会导致整个的训练成本增加,毕竟训练一个单一的网络需要很长的时间,即便计算资源足够,在不影响精度的情况下降低整个运算时间还是我们追求的目标。

由此Hinton提出了dropout策略,这个策略很简单,对于每一个隐层的output,以50%的概率将他们设置为0,不再对于forward或者backward的过程起任何作用。对于每一个input来说,使用的不同的网络结构,但是权重是共享的。这样求得的参数能够适应不同的情况下的网络结构,也就是提高了系统的泛化能力。

在AlexNet中最后的两个full-connected层中使用了这个策略。

3. 优化算法的参数

论文中使用SGD算法,基本参数设置在前面优化算法的总结中已经提到了。这里要说几个个人体会。

a. 原文中输入的batch数目是256,应该Alex经过调节后的结果,我实际用到的机器性能比较低,内存8G,显存4G,所以不得不就将batch数目往下调到64,以免产生out of memory的错误。这样就需要调节其他的参数来保证数据的收敛。原因是batch比较小,导致本文开篇提到的样本覆盖面过低,产生了非常多的局部极小点,在步长和方向的共同作用下,导致数据产生了震荡,导致了不收敛。

b.在这种情况下,把learning rate调节到了0.02,相当于加大了步长,这样可以在一定程度上避免震荡,可以越过局部极小点往比较大的极值点行走。

c. 对于每一层的bias从1设置为了0.1,在一定程度上限制了激活的大小,这样就限制了某一过大的误差的影响,这样可以避免迭代方向出现过大的变化。

d. 经过b c后,系统终于收敛了,但带来的不良后果就是整个收敛速度变慢,因此还需要增加最大迭代次数,经过测试迭代次数成了从45w修改成了70w。

e. 在整个运行过程中,出现了几次平稳点,20w以及40w左右的时候,因此迭代的learning rate应该随着迭代的接近平稳点的时候有意的减小一些,目前是以每10w次减小为1/10,调参数用了5天,最后运行时间为15天。

f. 关于调参策略,上面只是按照一些简单的理解设置的,如果没有一个合理的解释,调参就变成了一个很low的工作。还好发现了好几篇关于调参的论文,主要是优化算法理论方面的,学习完再回来测试一下。

caffe study- AlexNet 之算法篇的更多相关文章

  1. 深度学习word2vec笔记之算法篇

    深度学习word2vec笔记之算法篇 声明:  本文转自推酷中的一篇博文http://www.tuicool.com/articles/fmuyamf,若有错误望海涵 前言 在看word2vec的资料 ...

  2. 算法篇(前序)——Java的集合

    菜鸟拙见,望请纠正:附上JDK参考文档(中文文档和英文文档):链接:https://pan.baidu.com/s/14KDmCtQxeGCViq7e0zENjA 密码:e9xs  以及算法篇全文链接 ...

  3. Caffe训练AlexNet网络,精度不高或者为0的问题结果

    当我们使用Caffe训练AlexNet网络时,会遇到精度一值在低精度(30%左右)升不上去,或者精度总是为0,如下图所示: 出现这种情况,可以尝试使用以下几个方法解决: 1.数据样本量是否太少,最起码 ...

  4. FCC编程题之中级算法篇(下)

    介绍 本篇是"FCC编程题之中级算法篇"系列的最后一篇 这期完结后,下期开始写高级算法,每篇一题 目录 1. Smallest Common Multiple 2. Finders ...

  5. FCC编程题之中级算法篇(上)

    介绍 FCC: 全称为freeCodeCamp,是一个非盈利性的.面向全世界的编程练习网站.这次的算法题来源于FCC的中级算法题. FCC中级算法篇共分为(上).(中).(下)三篇.每篇各介绍7道算法 ...

  6. 学习 Rust cookbook 之算法篇(algorithm)

    原文作者:suhanyujie 永久链接:https://github.com/suhanyujie/rust-cookbook-note 博客链接:https://ishenghuo.cnblogs ...

  7. 二级py--day4 数据结构与算法篇

    二级py--day4 数据结构与算法篇 1.算法的基本特征:可行性.确定性.有穷性.拥有足够的情报 2.算法的设计要求包括效率与低存储量,既要考虑算法的时间复杂度和空间复杂度 3.算法的优劣:与算法描 ...

  8. 基于Caffe训练AlexNet模型

    数据集 1.准备数据集 1)下载训练和验证图片 ImageNet官网地址:http://www.image-net.org/signup.php?next=download-images (需用邮箱注 ...

  9. LDA工程实践之算法篇之(一)算法实现正确性验证(转)

    研究生二年级实习(2010年5月)开始,一直跟着王益(yiwang)和靳志辉(rickjin)学习LDA,包括对算法的理解.并行化和应用等等.毕业后进入了腾讯公司,也一直在从事相关工作,后边还在yiw ...

随机推荐

  1. 初学 Ajax(涉及 php)

    一直知道 ajax 但是尚未真正了解, 这次看了慕课网的<Ajax全接触>,算是有所收获,入了个门. 需要用到php,因为 Ajax也是向服务器请求(不知道这么解释对不对), 所以还需要配 ...

  2. 模拟试题A

    模拟试题A 一.单项选择题(2′*12=24′) 1.下面各种坐标变换中,会产生变换前后维度的改变的是( ) A)建模变换 B)观察变换 C)投影变换 D)视口变换 2.下列描述深度缓冲消隐算法的特点 ...

  3. .NET 请求和接收FormData的值

    <body> <div> <!-- 上传单个文件---> <form action="/Home/UpdateFile2" enctype ...

  4. linux中errno使用(转)

    当linux中的C api函数发生异常时,一般会将errno变量(需include errno.h)赋一个整数值,不同的值表示不同的含义,可以通过查看该值推测出错的原因,在实际编程中用这一招解决了不少 ...

  5. 任务调度开源框架Quartz概述

    任务调度开源框架Quartz 几乎每个项目中都用到了自动任务处理功能.所以在任务调度的功能很常用,但是一个好的任务调度程序是一个颇具挑战性的工作.最近用到Quartz这个框架,感觉很好,所以进行学习. ...

  6. 浅谈[^>]在正则中的2种用法

    /^A/会匹配"An e"中的A,但是不会匹配"ab A"中的A,此时^A的意思是“匹配开头的A” /[^a-z\s]/会匹配"my 3 sister ...

  7. Linux内核crash/Oops异常定位分析方法

    在内核开发的过程中,经常会碰到内核崩溃,比如空指针异常,内存访问越界.通常我们只能靠崩溃之后打印出的异常调用栈信息来定位crash的位置和原因.总结下分析的方法和步骤. 通常oops发生之后,会在串口 ...

  8. Spring MVC 的概念1

    ---恢复内容开始--- SpringMVC是一个采用模型----视图------控制器(MVC)的WEb框架建立在中央前端控制器的 Servlet(DispatcherServlet),他负责发送每 ...

  9. openblas下载安装与使用

    openblas下载 官方地址 zip文件 tar文件 openblas安装 直接执行 git clone https://github.com/xianyi/OpenBLAS.git cd Open ...

  10. 基于Tags的简单内容推荐的实现

    原来为了简单方便,自己小网站上的文章页的相关内容推荐就是从数据库里随机抽取数据来填充一个列表,所以一点相关性都没有,更本没有办法引导用户去访问推荐内容. 算法选择 如何能做到相似内容的推荐呢,碍于小网 ...