Vannesa's Studio

神经网络的发展

Word count: 2kReading time: 7 min
2020/08/28 Share

卷积神经网络

卷积运算需要什么?

  1. 输入层:比如图片处理,将图片(二维或三维)转化为矩阵形式
    Image text
    Image text
    Image text
  2. 卷积核:需要的特征的过滤器 :假如老鼠尾巴是我们想要提取的特征,那么卷积核应该设为
    Image text

如何提取特征(简单版本)

  • 将卷积核作用于图片,发现对于能够识别的特征计算出来的值非常大
    Image text
  • 对于不能识别的特征,计算的值非常小
    Image text
    卷积结果为0

综上所述,我们提取图片特征的关键是设计合理的卷积核。
做完卷积后,我们再经过池化,就可以得到相应的值。

为什么CNN能自动提取图像特征?

  1. 介绍:

    • 在大部分传统机器学习场景里,我们先经过特征工程等方法得到特征表示,然后选用一个机器学习算法进行训练。在训练过程中,表示事物的特征是固定的。
    • 后来深度学习就崛起了。深度学习对外推荐自己的一个很重要的点是——深度学习能够自动提取特征
  2. CNN网络主要有两个算子:

    • 池化层:池化层无非滑动一个滑动窗口,滑动窗口之内最大值或者取平均值。
      Image text
    • 卷积层:卷积层也是滑动一个滑动窗口,滑动窗口之内做卷积运算。
      Image text
  3. 我们依然存在疑惑: 为什么 CNN 的卷积层是这样的?Lecun 大神设计 CNN 的卷积层是怎么考虑的?

    • 为了理解这个问题,我们先思考一个问题:提取图片特征最朴素的想法是什么?

    简化问题,我们要分类黑白图片中的字母 A 还是 X。
    Image text

    这两个有一个鲜明区别是 A 的顶部模式。
    Image text

    如果能在图片中抽取 A 的顶部模式,图片中的字母是 A; 如果不能,图片中的字母是 X。为了提取图片是否包含 A 的顶部模式,我们将 A 的顶部模式在图片中滑动,切分处理的局部图片和 A 顶部模式做内积。下图显示是 A 图片的 1 和 2 部位切分出来的局部图片和 A 的顶部模式做内积。

    Image text

    根据图中表示,A 图片的 1 部位是 A 字母的顶部,内积为 4; 2 部位不是 A 顶部,内积只有 1。在 A 图片中滑动 A 顶部模式,得到的结果为

    Image text

    然后我们取其中最大值得到最终结果是 4。这是我们可以说图片包含 A 顶部模式的的 “倾向性” 或者说 “可能性” 是 4。我们就提取了一个特征。

    X 那张图按照相同的操作,结果为 3。这个结果是从 X 的交叉部位得到的。

  • A 的顶部模式在图片中滑动其实就是 CNN 里卷积层做的事情, A 的顶部模式就是卷积核;同时,在内积结果上取最大值就是最大池化层的操作。也就是说 CNN 用卷积层和池化层,实践了最朴素的图片特征提取方法。
  • 真实世界的 CNN 要复杂得多: 1) 真实世界的图片和卷积核是多层的。这个好理解,在图片是多层的情况下,局部模式肯定也是多层,卷积核自然也是多层的。2) 真实世界的 CNN 并不是一个卷积层搭配一个池化层,而是存在连续多层卷积层。这个也好理解。在这个时候,局部模式是有多个连续卷积核表示的。

自动学习

  1. 对于大规模图片库我们并不知道那个局部模式是有效的。即使我们选定局部模式,也会因为太过具体而失去反泛化性。那么我们怎么应对这个问题呢,即如何确定卷积核的值呢?

    这里就要讲到大名鼎鼎梯度向后传播算法。一开始我们随机初始化卷积核的参数,然后通过基于梯度向后传播算法的优化算法,自适应地调整卷积核的值从而最小化模型预测值和真实值之间的误差。这样得到的卷积核的参数不一定直观,但是能够有效地提取特征,使得模型预测值和真实值之间的误差最小。为了简化问题,下面我们还是用单层图片做例子。即使简化到单层图片,我们依然觉得计算卷积层和池化层的梯度比较难。为了进一步直观化,我们将卷积层分解多个容易计算梯度的简单线性算子,将池化层分解容易计算梯度的多个简单操作。

    BP算法详解参照reference.1

    Image text

    通过分解卷积层和池化层,我们易得下面一系列计算梯度公式。池化层本身没有参数,只需要把梯度往回传就行。这里我们要关注下最大池化层:最大值操作是选择窗口内最大值,怎么看都不是连续函数,就不可能存在导数(梯度)。假设MaxPooling(xx)=xi,j那么∂MaxPooling(xx)∂xxi,j∂MaxPooling(xx)∂xxnot–i,j==10另外一个问题就是怎么求卷积层的梯度。我们用 conv(xx,ww) 表示卷积, conv(xx,ww)i,j 表示卷积结果中的第 i 行第 j 列, xconv−i,j 表示用于生成卷积结果第 i 行第 j 列的图片局部(即 xconv−i,j⋅ww=conv(xx,ww)i,j )。卷积核参数的梯度可以用下面的公式计算∂conv(xx,ww)ww=∑i,jconv(xx,ww)i,jww=∑i,jxconv−i,j
    至于梯度怎么传回去呢?如下图所示,我们先定义 δ(i,j) 表示图片大小的矩阵,生成第 i 行第 j 列的卷积结果的图片区域用卷积核参数填充,其他区域为 0。

    Image text

    此时我们得到梯度往回传的公式。∂conv(xx,ww)∂xx=∑i,jδ(i,j)

总结

  • 通过卷积核刻画图片的局部模式,CNN 能够提取图片的特征;
  • 通过梯度向后传播算法,CNN 能够确定每个卷积核的参数,从而实现自动提取图片的特征。
  • 表示是指我们如何表达相关特征,涉及到特征工程、特征算子和特征组合等问题。
  • 目标是指我们想模型学习到什么,涉及问题建模和目标函数。
  • 优化是怎么计算得到模型,涉及梯度下降、随机梯度下降或者演化计算等优化算法。

在大部分传统机器学习场景里,表示和目标是分离的。在用优化算法求解目标的过程中,表示事物的特征是固定的,并不会根据目标和优化的反馈自适应地调整特征。

神经网络或者说深度神经网络,将表示和目标结合起来进行 “联合学习”。在深度学习模型训练过程中,特征相关的参数(比如 CNN 卷积核的参数)可以根据目标和优化的反馈(梯度)自适应地调整。特征能够自适应地调整,深度学习才有能力建立深度的和层次化的特征表达体系。

Reference

  1. 后向传播算法“backpropragation”详解? https://www.cnblogs.com/yangmang/p/7228069.html?utm_source=itdadao&utm_medium=referral
  2. 为什么CNN能自动提取图像特征? https://www.cnblogs.com/ymd12103410/p/9874878.html https://www.bbsmax.com/A/gVdnwlMazW/
  3. 为什么卷积能够提取图像的特征?看完此文应该能够给你一个答案 https://blog.csdn.net/charleswangzi/article/details/82733016
CATALOG
  1. 1. 卷积神经网络
    1. 1.1. 卷积运算需要什么?
    2. 1.2. 如何提取特征(简单版本)
    3. 1.3. 为什么CNN能自动提取图像特征?
    4. 1.4. 自动学习
    5. 1.5. 总结
  2. 2. Reference