Alexnet - 论文研读个人笔记

一、论文架构

  • 摘要:

    • 简要说明了获得成绩、网络架构、技巧特点
  • 1、introduction

    • 领域方向概述
    • 前人模型成绩
    • 本文具体贡献
  • 2、The Dataset
    • 数据集来源,训练数据进行的一些预处理
  • 3、The Architecture

    • 网络模型大体组成
    • ReLU
    • Training on Multiple GPUs
    • LRN (Local Response Normalization)
    • Overlapping Pooling
    • 网络模型整个具体架构
  • 4、Reducing Overfitting

    • Data Augmentation 数据扩充/数据增强
    • Dropout
  • 5、Details of learning

    • 带动量的随机梯度下降
  • 6、Results

    • 测试集错误率
    • 质量评估 - 具体图片分析,评估模型学到了什么
  • 7、Discussion

二、网络结构

  • AlexNet 有5个广义卷积层和3个广义全连接层。

    • 广义的卷积层:包含了卷积层、池化层、ReLULRN 层等。

    • 广义全连接层:包含了全连接层、ReLUDropout 层等

  • 网络具体结构如下所示:
    • 输入层会将3@224x224 的三维图片预处理变成3@227x227的三维图片

      • 为了使后续计算出来是整数
    • 第二层广义卷积层、第四层广义卷积层、第五层广义卷积层都是分组卷积,仅采用本GPU内的通道数据进行计算
      • 多GPU的设置完全是利用多GPU来提高运算的效率,下表给出都是如果只用单GPU情况下输入输出尺寸
    • 第一层广义卷积层、第三层广义卷积层、第六层连接层、第七层连接层、第八层连接层执行的是全部通道数据的计算

    • 第二层广义卷积层的卷积、第三层广义卷积层的卷积、第四层广义卷积层的卷积、第五层广义卷积层的卷积均采用same填充(即:填充0,pad由核大小决定 - 卷积的三种模式:full, same, valid
      • 当卷积的步长为1,核大小为3x3 时,如果不填充0,则feature map的宽/高都会缩减 2 。因此这里填充0,使得输出feature map的宽/高保持不变。

      • 第一层广义卷积层的卷积,以及所有的池化都是valid填充(即:不填充 0,pad = 0 )

    • 第六层广义连接层的卷积之后,会将feature map展平为长度为 4096 的一维向量(这一层实际上看是卷积,使得向量展开成一维)

编号 网络层 子层 核/池大小 核数量 步长 激活函数 输入尺寸 输出尺寸
第0层 输入层 - - - - - - 3@224x224
第1层 广义卷积层 卷积 11x11 96 4 ReLU 3@227x227 96@55x55
第1层 广义卷积层 LRN - - - - 96@55x55 96@55x55
第1层 广义卷积层 池化 3x3 - 2 - 96@55x55 96@27x27
第2层 广义卷积层 卷积 5x5 256 1 ReLU 96@27x27 256@27x27
第2层 广义卷积层 LRN - - - - 256@27x27 256@27x27
第2层 广义卷积层 池化 3x3 - 2 - 256@27x27 256@13x13
第3层 广义卷积层 卷积 3x3 384 1 ReLU 256@13x13 384@13x13
第4层 广义卷积层 卷积 3x3 384 1 ReLU 384@13x13 384@13x13
第5层 广义卷积层 卷积 3x3 256 1 ReLU 384@13x13 256@13x13
第5层 广义卷积层 池化 3x3 - 2 - 256@13x13 256@6x6
第6层 广义连接层 卷积 6x6 4096 1 ReLU 256@6x6 4096@1x1
第6层 广义连接层 Dropout - - - - 4096@1x1 4096@1x1
第7层 广义连接层 全连接 - - - ReLU 4096 4096
第7层 广义连接层 Dropout - - - - 4096 4096
第8层 广义连接层 全连接 - - - - 4096 1000
  • 网络计算与参数数量

    • 第一层:卷积层1,输入为3@224x224的图像,卷积核的数量为96,论文中两片GPU分别计算48个核; 卷积核的大小为3@11x11; stride = 4, stride表示的是步长, pad = 0, 表示不扩充边缘;
      wide = (227 + 2 x padding - kernel_size) / stride + 1 = 55
      height = (227 + 2 x padding - kernel_size) / stride + 1 = 55
      dimention = 96
      然后进行 (Local Response Normalized), 后面跟着池化pool_size = (3, 3), stride = 2, pad = 0 最终获得第一层卷积的feature map
      最终第一层卷积的输出为96@55x55

    • 第二层:卷积层2, 输入为上一层卷积的feature map, 卷积的个数为256个,论文中的两个GPU分别有128个卷积核。卷积核的大小为:48@5×5; pad = 2, stride = 1; 然后做 LRN, 最后 max_pooling, pool_size = (3, 3), stride = 2。后续计算基本类似

    • 网络总参数总计约 6237万。
      • 第6层广义连接层的卷积的参数数量最多,约3770万,占整体六千万参数的 60%。

      • 原因是该子层的卷积核较大、输入通道数量较大、输出通道数量太多。该卷积需要的参数数量为:255x6x6x4096 = 37,748,736

编号 网络层 子层 输出 Tensor size 权重个数 偏置个数 参数数量
第0层 输入层 - 227x227x3 0 0 0
第1层 广义卷积层 卷积 55x55x96 34848 96 34944
第1层 广义卷积层 池化 27x27x96 0 0 0
第1层 广义卷积层 LRN 27x27x96 0 0 0
第2层 广义卷积层 卷积 27x27x256 614400 256 614656
第2层 广义卷积层 池化 13x13x256 0 0 0
第2层 广义卷积层 LRN 13x13x256 0 0 0
第3层 广义卷积层 卷积 13x13x384 884736 384 885120
第4层 广义卷积层 卷积 13x13x384 1327104 384 1327488
第5层 广义卷积层 卷积 13x13x256 884736 256 884992
第5层 广义卷积层 池化 6x6x256 0 0 0
第6层 广义连接层 卷积 4096×1 37748736 4096 37752832
第6层 广义连接层 dropout 4096×1 0 0 0
第7层 广义连接层 全连接 4096×1 16777216 4096 16781312
第7层 广义连接层 dropout 4096×1 0 0 0
第8层 广义连接层 全连接 1000×1 4096000 1000 4097000
总计 - - - - - 62,378,344

三、设计技巧与创新点

  • AlexNet 成功的主要原因在于:

    • 使用ReLU激活函数
    • 使用dropout、数据集增强 、重叠池化等防止过拟合的方法
    • 使用百万级的大数据集来训练
    • 使用GPU训练,以及的LRN使用
    • 使用带动量的mini batch随机梯度下降来训练

3.1 ReLU激活函数

  • Rectified Linear Unit:一种线性且不饱和的激活函数,在该论文中首次提出

    • f(x)=max(0,x)

    • 激活函数作用:激活函数是用来加入非线性因素的,提高神经网络对模型的表达能力,解决线性模型所不能解决的问题。

  • 优点:
    1. ReLU解决了梯度消失的问题,至少x在正区间内,神经元不会饱和。
    2. 由于ReLU线性、非饱和的形式,在SGD(随机梯度下降)中能够快速收敛。
    3. 计算速度要快很多。ReLU函数只有线性关系,不需要指数计算,不管在前向传播还是反向传播,计算速度都比sigmoidtanh快。
  • 缺点:
    1. ReLU的输出不是“零为中心”(Notzero-centered output)
    2. 随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。这种神经元的死亡是不可逆转的死亡。
  • 具体解释参考:不同激活函数对比以及梯度消失、爆炸、神经元节点死亡的解释

3.2 数据集增强

  • AlexNet 中使用的数据集增强手段:

    • 随机裁剪、随机水平翻转:原始图片的尺寸为256x256,裁剪大小为224x224

      • 训练阶段每一个epoch 中,对同一张图片进行随机性的裁剪,然后随机性的水平翻转。理论上相当于扩充了数据集(256-244)²x2=2048倍。

      • 预测阶段不是随机裁剪,而是固定裁剪图片四个角、一个中心位置,再加上水平翻转,一共获得 10 张图片。
        用这10张图片的预测结果的均值作为原始图片的预测结果。

    • PCA 降噪:对RGB空间做PCA 变换来完成去噪功能。同时在特征值上放大一个随机性的因子倍数(单位1 加上一个N(0,0.1)的高斯绕动),也就是对颜色、光照作变换,从而保证图像的多样性。
      • 每一个epoch 重新生成一个随机因子。

      • 该操作使得错误率下降1% 。

  • AlexNet 的预测方法存在两个问题:
    • 这种固定裁剪四个角、一个中心的方式,把图片的很多区域都给忽略掉了。很有可能一些重要的信息就被裁剪掉。
    • 裁剪窗口重叠,这会引起很多冗余的计算。

    • 改进的思路是:

      • 执行所有可能的裁剪方式,对所有裁剪后的图片进行预测。将所有预测结果取平均,即可得到原始测试图片的预测结果。

      • 减少裁剪窗口重叠部分的冗余计算。

      • 具体做法为:将全连接层用等效的卷积层替代,然后直接使用原始大小的测试图片进行预测。将输出的各位置处的概率值按每一类取平均(或者取最大),则得到原始测试图像的输出类别概率。

3.3 局部响应规范化 - LRN

  • 在神经网络中,我们用激活函数将神经元的输出做一个非线性映射,但是tanhsigmoid这些传统的激活函数的值域都是有范围的,但是ReLU激活函数得到的值域没有一个区间,所以要对ReLU得到的结果进行归一化。

  • 局部响应规范层LRN:目的是为了进行一个横向抑制,使得不同的卷积核所获得的响应产生竞争。
    • LRN层现在很少使用,因为效果不是很明显,而且增加了内存消耗和计算时间。
    • AlexNet 中,该策略贡献了1.2%的贡献率。
  • LRN的思想:输出通道i在位置(x,y)处的输出会受到相邻通道在相同位置输出的影响。
    为了刻画这种影响,将输出通道i的原始值除以一个归一化因子。

  • 公式为:
    \[
    {b^{i}_x,_y}={a^{i}_x,_y}/(k+\alpha \sum_{j=max(0,i-n/2)}^{min(N-1,i+n/2)}({a^{j}_x,_y}^{2}))^{\beta } ,i=0,1...N-1
    \]

  • 其中:\({a^{i}_x,_y}\)为输出通道i在位置(x,y)处的原始值,\({b^{i}_x,_y}\)为归一化之后的值。n为影响第i通道的通道数量(分别从左侧、右侧 n/2个通道考虑)。\(\alpha\),\(\beta\),\(k\)为超参数。
    一般而言,k=2 , n=5 , α=10^−4 , β=0.75
  • 功能类似于最大最小归一化:\[x_{i}=x_{i}/(x_{max}-x_{min})\]

3.4 多GPU训练

  • AlexNet 使用两个GPU训练。网络结构图由上、下两部分组成:一个GPU运行图上方的通道数据,一个GPU 运行图下方的通道数据,两个GPU只在特定的网络层通信。即:执行分组卷积。

  • 第二、四、五层卷积层的核只和同一个GPU 上的前一层的feature map 相连。

  • 第三层卷积层的核和前一层所有 GPUfeature map 相连。

  • 全连接层中的神经元和前一层中的所有神经元相连。

3.5 Overlapping Pooling - 重叠池化

  • 一般的池化是不重叠的,池化区域的大小与步长相同。Alexnet 中,池化是可重叠的,即:步长小于池化区域的大小。

  • 重叠池化可以缓解过拟合,该策略贡献了0.4%的错误率。
    • 为什么重叠池化会减少过拟合,很难用数学甚至直观上的观点来解答。一个稍微合理的解释是:重叠池化会带来更多的特征,这些特征很可能会有利于提高模型的泛化能力。

3.6 优化算法

  • AlexNet 使用了带动量的mini-batch 随机梯度下降法。

  • 标准的带动量的mini-batch 随机梯度下降法为:
  • 而论文中,作者使用了修正:
    • \[
      {v_t={-\eta \partial w}-{\beta\cdot \eta w}+{v_{t-1}\cdot momentum}}
      \]
    • \[
      {w=w+v_t}
      \]
    • 其中 momentum=0.9 , β=0.75 , η为学习率

    • \({-\beta\cdot \eta w }\)为权重衰减。论文指出:权重衰减对于模型训练非常重要,不仅可以起到正则化效果,还可以减少训练误差。

3.7 Dropout

  • 引入Dropout主要是为了防止过拟合。在神经网络中Dropout通过修改神经网络本身结构来实现,对于某一层的神经元,通过定义的概率将神经元置为0,这个神经元就不参与前向和后向传播,就如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。在下一次迭代中,又重新随机删除一些神经元(置为0),直至训练结束。

  • Dropout应该算是AlexNet中一个很大的创新,现在神经网络中的必备结构之一。Dropout也可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合,Dropout只需要两倍的训练时间即可实现模型组合(类似取平均)的效果,非常高效。

  • 具体细节见参考:理解Dropout

< AlexNet - 论文研读个人笔记 >的更多相关文章

  1. GoogLeNetv4 论文研读笔记

    Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 原文链接 摘要 向传统体系结构中引入 ...

  2. GoogLeNetv3 论文研读笔记

    Rethinking the Inception Architecture for Computer Vision 原文链接 摘要 卷积网络是目前最新的计算机视觉解决方案的核心,对于大多数任务而言,虽 ...

  3. GoogLeNetv2 论文研读笔记

    Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift 原文链接 摘要 ...

  4. GoogLeNetv1 论文研读笔记

    Going deeper with convolutions 原文链接 摘要 研究提出了一个名为"Inception"的深度卷积神经网结构,其目标是将分类.识别ILSVRC14数据 ...

  5. AD预测论文研读系列2

    EARLY PREDICTION OF ALZHEIMER'S DISEASE DEMENTIA BASED ON BASELINE HIPPOCAMPAL MRI AND 1-YEAR FOLLOW ...

  6. AD预测论文研读系列1

    A Deep Learning Model to Predict a Diagnosis of Alzheimer Disease by Using 18F-FDG PET of the Brain ...

  7. 关于 AlphaGo 论文的阅读笔记

    这是Deepmind 公司在2016年1月28日Nature 杂志发表论文 <Mastering the game of Go with deep neural networks and tre ...

  8. 《MapReduce: Simplified Data Processing on Large Clusters》论文研读

    MapReduce 论文研读 说明:本文为论文 <MapReduce: Simplified Data Processing on Large Clusters> 的个人理解,难免有理解不 ...

  9. 《The Design of a Practical System for Fault-Tolerant Virtual Machines》论文研读

    VM-FT 论文研读 说明:本文为论文 <The Design of a Practical System for Fault-Tolerant Virtual Machines> 的个人 ...

随机推荐

  1. 解决SAP740 GUI 搜索帮助(F4)回填值乱码的问题

    SAP 740客户端引入了搜索帮助增强功能,并且默认是开启该功能的,在带有F4搜索帮助的字段输入框中输入字段的前两个字符,可以自动以下拉框的方式带出包含包含所输入字符的条目,从而实现快速的输入帮助,如 ...

  2. Theano基础

    Theano是python的一个开源库,其解决大量数据问题时性能更好. 首先,给一个关于theano.function的demo: import theano from theano import t ...

  3. iSCSI 共享存储

         iSCSI(Internet Small Computer System Interface,发音为/ˈаɪskʌzi/),Internet小型计算机系统接口,又称为IP-SAN,是一种基于 ...

  4. 高可用架构的实现--dubbo+zookeeper+maven+tomcat

    最近在做分布式的服务架构搭建,因为自己确实很喜欢搞这种技术类的研究,所以在公司需要的时候主动承担了这项光荣而艰巨的任务.公司搭建的架构主要目的是需要支持后端接口的多用户的高并发访问,希望能够达到每秒并 ...

  5. generator和promise配合解决js异步地狱问题

    为何要使用generator函数和promise? js的异步地狱一直是困扰前端程序员的一个头疼的问题 比如说我要获取还有列表,一般来说会使用ajax来获取 $.ajax(...等等,function ...

  6. P4544 [USACO10NOV]购买饲料Buying Feed

    额,直接思路就dp吧.(我还想了想最短路之类的233但事实证明不行2333.....) 直入主题: 化简题意:在x轴上有n个点,坐标为xi.从原点出发,目标点为e,在途中需要收集K重量的物品,在每个点 ...

  7. Linux基础指令--韩顺平老师课程笔记

    一.vi和vim编辑器 ①.三种模式 所有的 Linux 系统都会内建 vi 文本编辑器.vim 具有程序编辑的能力,可以看做是 vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计. ...

  8. 最适合Java开发者的一本书和一软件

    一书-<Java编程思想> 一软件-IntelliJ IDEA Java自学是否可以成功,答案显而易见,可以. 自学Java关键看自己是否有毅力.是否有恒心. 自学Java 自学Java不 ...

  9. PHP str_replace的用法

    PHP str_replace的用法 1 替换单个字符<pre><?phpecho str_replace("world","Shanghai" ...

  10. websocket socketJs

    springboot实现服务器端消息推送(websocket + sockjs + stomp)   服务器端推送技术在web开发中比较常用,可能早期很多人的解决方案是采用ajax向服务器轮询消息,这 ...