This is the guide for the CNNs newbie.

上周在学校做了一个关于 CNN 的报告,主要内容是对卷积神经网络的一个新手指导。主要有以下三个部分:
- Introduction
- Structure
- Other Tech

Introduction

首先是第一部分 Introduction. 2012 年,是卷积神经网络取得显著成果的一年。Alex 和他的团队,用 AlexNet 在 ImageNet 比赛上将错误率从 26% 降低到 15%。从那时开始,许许多多的公司开始研究并且使用卷及神经网络。比如 Google、amazon、Facebook 等等,应用在图像搜索,商品推荐等诸多领域。

对于我本人来说,在我学习当中应用到的最多的是图像方面。

图像分类任务中要求我们做的是输入一张图片,经过一定的运算之后,计算机输出结果告诉我们这张图片是某种东西的概率。在人眼中,看到的是一张图,一个物体。机器眼中只不过是一些数字。人类通过图片中的线条,颜色等相互关系,判断是什么物体。这种行为是人类从小就开始培养的,看到一个东西,认识他是什么。机器同样也是通过对数字相互关系的分析,判断物体。机器在图像分类的训练过程同样是在模仿人类从小学习的过程,只不过人类用了几年学会,机器可能用几天。

Structure

接下来,对基本的卷积神经网络的每一层,开始介绍。

关于每一层的操作,我也就不再赘述,网上有很多很多了。这篇文章主要讲一讲,为什么要有这些层,这些层都做了些什么。

  • 卷积层
    首先第一个,也就是最重要的一层,就是卷积层。卷积层可以看作是一个特征提取器,那么怎么样进行特征提取的呢?

    看下面这张图。

    这是一个弧线一个拐角。表现在像素矩阵上就是其他地方为 0,线上的位置不为 0。那么我们假设想在一张图上提取出类似这种弧线的特征。怎么做呢?

    看上面这个图一个老鼠,左上角位置的弧线和我们想要提取的特征很相似,左边的矩阵是这个位置的矩阵表示,右边是我们想提取的特征的矩阵表示也就是我们所说的卷积和。对应位置相乘并相加,就是我们说的卷积操作。结果是 6600。这是一个很大的数,想像一下,如果这部分不是这么一个弧线而是一个别的样子的,那么对应位置相乘相加之后,就只有很小的一个数了,通过这个结果的大小,我们可以得到这部分是不是有这个特定的特征存在。这就是特征提取。实际上这和我们人判断物体是什么是很相似的,我们也是通过寻找物体的线条颜色等特征,来判断物体是什么的。这就是为什么我们要用卷积层,我们用它来提取特征。

    下面介绍两个卷积层中最重要的参数 Stride and Padding
    Stride 代表的是步长,就是卷积核在图片上移动的距离。可以控制输出的特征图的大小。
    在卷积的时候我们看到整个图片可以说是变得越来越小的,但是我们有时候不想让他缩小的太快,所以就要用 padding 这个参数。

  • 激活层
    接下来介绍激活层。激活层实际上是一个函数。那么为什么要有激活层的存在呢?我们可以假设,没有激活层,或者说激活层函数是 y = x。


    在如图的二分类问题中,单层感知机无论怎么样都无法正确划分。同样带隐层的也无法划分,无论多少层,化简后都是一个线性函数,只不过斜率什么的变化了。

    但是如果加上激活函数,比如 sigmoid,就不再是线性的了,说不定就可以有这么样一条曲线,解决这个问题。

    常用的函数有这些诸如 Sigmoid、ReLU等。ReLU 是最近比较火的一个激活函数,Aleximagenet classification with deep convolutional 论文中也使用了这个激活函数,并说提高了训练速率,因为他不像 sigmoid 那样需要指数运算等耗费计算资源的运算,而且也没有 sigmoid 的梯度消失问题。

  • Pooling 层
    接下来就是同样重要的 Pooling 层了。Pooling 有很多种,比如 max or avg。那么为什么要有 pooling 层呢?Pooling 层有 3 个主要的作用。

    • invariance
      首先第一个是 invariance ,即不变性,我们更多时候关注的是一个图片中是否有某种特征,而不是特征具体的位置。就像下面这个例子。虽然这个直线向右平移了一个元素,但是 pooling 后还是不变的,我们只关注直线这个特征,不关注他具体的位置。

    • reduce parameters
      第二个作用是可以减少参数,参数数量会大幅度减少。

    • overfitting
      另外一个作用是可以减缓过拟合。

  • Dropout 层
    Dropout 作用的机制是按照一定几率随机的将输出置为 0。可以暂时认为这些节点不是网络结构的一部分,但是它的权重得保留下来。Dropout 可以很好的缓解过拟合问题。比如在 AlexNet 论文中,随机忽略 0.5 的神经元。Dropout 可以看做是一种模型平均,就是把来自不同模型的估计或者预测通过一定的权重平均起来。Dropout中哪里体现了“不同模型”;这个奥秘就是我们随机选择忽略隐层节点,在每个批次的训练过程中,由于每次随机忽略的隐层节点都不同,这样就使每次训练的网络都是不一样的,每次训练都可以单做一个“新”的模型;此外,隐含节点都是以一定概率随机出现,因此不能保证每2个隐含节点每次都同时出现,这样权值的更新不再依赖于有固定关系隐含节点的共同作用,阻止了某些特征仅仅在其它特定特征下才有效果的情况。

  • FC 层
    最后就是全连接层了,在整个卷积神经网络中起到“分类器”的作用。可以通过一个与特征图大小相同的卷积核卷积操作实现。由于 FC 参数众多,通常占据整个网络 80% 参数,近期人们找出许多方法来替代全连阶层,比如 全局均值池化等。

Other Tech

  • Deconv
    最后我介绍一些不同于传统 CNN 网络的有效提高性能的技术。比如反卷积操作。反卷积就是将卷积核转置后操作。通过反池化,反激活,反卷积之后,可以用于可视化卷积网络。

  • Transfer Learning
    当我们的数据量不像 google 等公司那样大的时候,可能无法取得好的训练效果。但转移学习的想法有助于减少数据需求。转移学习是采取预先训练的模型,以及使用自己的数据集“微调”模型的过程。这个想法是这个预先训练的模型将作为一个特征提取器。我们自己删除网络的最后一层,并将其替换为您自己的分类器。然后冻结所有其他层的权重并正常训练网络(冻结层意味着在梯度下降/优化期间不改变权重)。比如,ImageNet是一个数据集,其中包含1400万个图像,超过1000个类。当我们考虑网络的较低层时,我们知道它们会检测边缘和曲线等特征。除非我们有一个非常独特的问题空间和数据集,否则我们的网络也需要检测曲线和边缘。而不是通过随机初始化权重训练整个网络,我们可以使用预先训练的模型的权重(并冻结它们),并将重点放在更重要的层次上(更高的层次)进行训练。

  • Data Augmentation Techniques
    我们很清楚的知道数据的重要性。当我们数据集不够好,比如数量太少等问题的时候,训练效果可能会不好。这里有很多数据处理的方法可以增加数据量。对我们人类来说图像平移一像素,可能很难察觉出,但是对于计算机来说,平移一像素可能会影响很大。通过平移,镜像,旋转等方法,可以成倍的增加数据集大小。比如 Alex 在论文中采用碎片采样原始数据集四个角和中间位置来增大数据集。

Some Image are from https://adeshpande3.github.io/
If there is any infringement please contact me as soon as possible to do delete processing.