【DL】一文搞定CNN—AlphaGo攻破围棋

一.前言

卷积神经网络的发展,最早可以追溯到1962年,Hubel和Wiesel对猫大脑中的视觉系统的研究。

当前正由于CNN的发展,才引发其他领域很多变革。利用CNN,AlphaGo战胜了李世石,攻破了围棋。但基础版本的AlphaGo其实和人类高手比起来是有胜有负的。
但利用了ResnetFaster-RCNN的思想,一年后的Master则完虐了所有人类围棋高手,达到神一般的境界,人类棋手毫无胜机。后来又有很多复现的开源围棋AI,每一个都能用不大的计算量吊打所有的人类高手。以至于现在人们讲棋的时候,都是按着AI的胜率来讲了。


二.从神经网络到卷积神经网络(CNN)

我们知道神经网络的结构是这样的:
传统神经网络人工全连接(BP)神经网络的特点:

(1)每相邻两层之间的每个神经元之间都是有边相连的
(2)当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢

传统神经网络存在的问题:

(1)权值太多,计算量太大
(2)权值太多,需要大量样本进行训练

|为了解决传统神经网络不足,CNN出现了

卷积神经网络
一个卷积神经网络由很多层组成,它们的输入是三维的,输出也是三维的,有的层有参数,有的层不需要参数。

卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连接是非全连接的,且同一层中某些神经元之间的连接的权重w和偏置b是共享的(即相同的)大量地减少了需要训练参数的数量

CNN主要特点

减少权值,局部连接,权值共享

CNN通过感受野和权值共享减少了神经网络需要训练的参数的个数。


三.CNN(卷积)详解

在深入解析前,我们先了解一些基本知识。

3.1基础要点

1.边界检测

我们来看一个最简单的例子:“边界检测(edge detection)”,假设我们有这样的一张图片,大小8×8:
在这里插入图片描述
图片中的数字代表该位置的像素值,我们知道,像素值越大,颜色越亮,所以为了示意,我们把右边小像素的地方画成深色。图的中间两个颜色的分界线就是我们要检测的边界。

怎么检测这个边界呢?我们可以设计这样的一个 滤波器(filter,也称为kernel-卷积核),大小3×3:

filter
然后,我们用这个filter,往我们的图片上“盖”,覆盖一块跟filter一样大的区域之后,对应元素相乘,然后求和。计算一个区域之后,就向其他区域挪动,接着计算,直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积”。
(与数学上的卷积概念不同,我们只用知道“卷积”在CNN中是怎么计算的)

这里的“挪动”,就涉及到一个步长(stride)了,假如我们的步长是1,那么覆盖了一个地方之后,就挪一格,容易知道,总共可以覆盖6×6个不同的区域。

那么,我们将这6×6个区域的卷积结果,拼成一个矩阵:
在这里插入图片描述

上面图片,中间颜色浅,两边颜色深,这说明咱们的原图片中间的边界,在这里被反映出来了!

从上面这个例子中,我们发现,我们可以通过设计特定的filter,让它去跟图片做卷积,就可以识别出图片中的某些特征,比如边界。
上面的例子是检测竖直边界,我们也可以设计出检测水平边界的,只用把刚刚的filter旋转90°即可。对于其他的特征,理论上只要我们经过精细的设计,总是可以设计出合适的filter的。

我们的CNN(convolutional neural network),主要就是通过一个个的filter不断地提取特征,从局部的特征到总体的特征,从而进行图像识别等等功能

那么问题来了,我们怎么可能去设计这么多各种各样的filter呀?首先,我们都不一定清楚对于一大推图片,我们需要识别哪些特征,其次,就算知道了有哪些特征,想真的去设计出对应的filter,恐怕也并非易事,要知道,特征的数量可能是成千上万的。

其实学过神经网络之后,我们就知道,这些filter,根本就不用我们去设计,每个filter中的各个数字,不就是参数吗,我们可以通过大量的数据,来 让机器自己去“学习”这些参数嘛。这,就是CNN的原理。

2.padding 填白

从上面的引子中,我们可以知道,原图像在经过filter卷积之后,变小了,从(8,8)变成了(6,6)。假设我们再卷一次,那大小就变成了(4,4)了。

这样有啥问题呢?
主要有两个问题:

每次卷积,图像都缩小,这样卷不了几次就没了;
相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。
为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。
padding
比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。

我们把上面这种“让卷积之后的大小不变”的padding方式,称为 “Same”方式,
把不经过任何填白的,称为 “Valid”方式。这个是我们在使用一些框架的时候,需要设置的超参数。

3.stride 步长

这里的stride就是filter(过滤器/卷积核)每次移动的单位个数。

前面我们所介绍的卷积,都是默认步长是1,但实际上,我们可以设置步长为其他的值。
比如,对于(8,8)的输入,我们用(3,3)的filter,
如果stride=1,则输出为(6,6);
如果stride=2,则输出为(3,3);(这里例子举得不大好,除不断就向下取整)

4.pooling 池化

这个pooling,是为了提取一定区域的主要特征,并减少参数数量,防止模型过拟合。
比如下面的MaxPooling,采用了一个2×2的窗口,并取stride=2:
Max Pooling
除了MaxPooling,还有AveragePooling,顾名思义就是取那个区域的平均值。
在这里插入图片描述

5.对多通道(channels)图片的卷积

这个需要单独提一下。彩色图像,一般都是RGB三个通道(channel)的,因此输入数据的维度一般有三个:(长,宽,通道)。
比如一个28×28的RGB图片,维度就是(28,28,3)。

前面的引子中,输入图片是2维的(8,8),filter是(3,3),输出也是2维的(6,6)。

如果输入图片是三维的呢(即增多了一个channels),比如是(8,8,3),这个时候,我们的filter的维度就要变成(3,3,3)了,它的 最后一维要跟输入的channel维度一致。
这个时候的卷积,是三个channel的所有元素对应相乘后求和,也就是之前是9个乘积的和,现在是27个乘积的和。因此,输出的维度并不会变化。还是(6,6)。

但是,一般情况下,我们会 使用多了filters同时卷积,比如,如果我们同时使用4个filter的话,那么 输出的维度则会变为(6,6,4)。

我特地画了下面这个图,来展示上面的过程:
四个filter
图中的输入图像是(8,8,3),filter有4个,大小均为(3,3,3),得到的输出为(6,6,4)。

其实,如果套用我们前面学过的神经网络的符号来看待CNN的话,

我们的输入图片就是X,shape=(8,8,3);
4个filters其实就是第一层神金网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;
我们的输出,就是Z1,shape=(6,6,4);
后面其实还应该有一个激活函数,比如relu,经过激活后,Z1变为A1,shape=(6,6,4);
所以,在前面的图中,我加一个激活函数,给对应的部分标上符号,就是这样的:
在这里插入图片描述

3.2 CNN的结构组成

上面我们已经知道了卷积(convolution)、池化(pooling)以及填白(padding)是怎么进行的,接下来我们就来看看CNN的整体结构,它包含了3种层(layer):

  1. Convolutional layer(卷积层–CONV)
    由滤波器filters和激活函数构成。
    一般要设置的超参数包括filters的数量和大小、步长stride,以及padding是“valid”还是“same”。当然,还包括选择什么激活函数,一般常用Relu

  2. Pooling layer (池化层–POOL)
    这里里面没有参数需要我们学习,因为这里里面的参数都是我们设置好了,要么是Maxpooling,要么是Averagepooling。
    需要指定的超参数,包括是Max还是average,窗口大小以及步长。
    通常,我们使用的比较多的是Maxpooling,而且一般取大小为(2,2)步长为2的filter,这样,经过pooling之后,输入的长宽都会缩小2倍,channels不变。

  3. Fully Connected layer(全连接层–FC)
    这个前面没有讲,是因为这个就是我们最熟悉的家伙,就是我们之前学的神经网络中的那种最普通的层,就是一排神经元。因为这一层是每一个单元都和前一层的每一个单元相连接,所以称之为“全连接”。
    这里要指定的超参数,无非就是神经元的数量,以及激活函数。

接下来,我们随便看一个CNN的模样,来获取对CNN的一些感性认识:
在这里插入图片描述
在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了。

可以从图中看到,随着网络的深入,我们的图像(严格来说中间的那些不能叫图像了,但是为了方便,还是这样说吧)越来越小,但是channels却越来越大了。在图中的表示就是长方体面对我们的面积越来越小,但是长度却越来越长了。

3.3 卷积神经网络之训练算法

  1. 同一般机器学习算法,先定义Loss function,衡量和实际结果之间差距。
  2. 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)。

四.直观理解卷积

在这里插入图片描述
以上图为例:

第一次卷积可以提取出低层次的特征。

第二次卷积可以提取出中层次的特征。

第三次卷积可以提取出高层次的特征。

特征是不断进行提取和压缩的,最终能得到比较高层次特征,简言之就是对原式特征一步又一步的浓缩,最终得到的特征更可靠
利用最后一层特征可以做各种任务:比如分类、回归等。


五.卷积神经网络 Vs 传统神经网络

学习完CNN,我们发现CNN跟我们之前学习的神经网络,也没有很大的差别。
传统的神经网络,其实就是多个FC层叠加起来。
CNN,无非就是把FC改成了CONV和POOL,就是把传统的由一个个神经元组成的layer,变成了由filters组成的layer。

那么,为什么要这样变?有什么好处?
具体说来有两点:

1.参数共享机制(parameters sharing)

对比一下传统神经网络的层
假设我们的图像是8×8大小,也就是64个像素,假设我们用一个有9个单元的全连接层:全连接
那这一层我们需要多少个参数呢?需要 64×9 = 576个参数(先不考虑偏置项bias)。因为每一个连接都需要一个权重w。

卷积的conv层
那我们看看 同样有9个单元的filter是怎么样的卷积
总共就9个参数!

因为,对于不同的区域,我们都共享同一个filter,因此就共享这同一组参数。
这也是有道理的,通过前面的讲解我们知道,filter是用来检测特征的,那一个特征一般情况下很可能在不止一个地方出现,比如“竖直边界”,就可能在一幅图中多出出现,那么 我们共享同一个filter不仅是合理的,而且是应该这么做的。

由此可见,参数共享机制,让我们的网络的参数数量大大地减少。这样,我们可以用较少的参数,训练出更加好的模型,典型的事半功倍,而且可以有效地 避免过拟合

同样,由于filter的参数共享,即使图片进行了一定的平移操作,我们照样可以识别出特征,这叫做 “平移不变性”。因此,模型就更加稳健了。
———————
• 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
• 需要估算的权重个数减少: AlexNet 1亿 => 3.5w
• 一组固定的权重和不同窗口内数据做内积: 卷积在这里插入图片描述

2.连接的稀疏性(sparsity of connections)

由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系:在这里插入图片描述
而传统神经网络中,由于都是全连接,所以输出的任何一个单元,都要受输入的所有的单元的影响。这样无形中会对图像的识别效果大打折扣。比较,每一个区域都有自己的专属特征,我们不希望它受到其他区域的影响。

正是由于上面这两大优势,使得CNN超越了传统的NN,开启了神经网络的新时代。

六.CNN卷积神经网络的应用

1、目标分类

2、目标检测(目标定位、人脸检测、人形检测、车辆检测

(R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD、YOLO V2、YOLO V3)

3、目标识别(人脸识别、人形识别) 人脸识别算法演化史 (DeepFace、FaceNet、DeepID)
4、目标跟踪
5、目标分割
6、关键点检测 关键点检测

CNN卷积神经网络实现Mnist数据集

七.常见的CNN卷积神经网络

卷积神经⽹络(LeNet)——这是最早用于数字识别的CNN

深度卷积神经⽹络(AlexNet)—— 2012 ILSVRC比赛远超第2名的CNN,比LeNet更深,用多层小卷积层叠加替换单大卷积层。

使⽤重复元素的⽹络(VGG)——2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好。

⽹络中的⽹络(NiN

含并⾏连结的⽹络(GoogLeNet)——2014 ILSVRC比赛冠军

残差⽹络(ResNet

稠密连接⽹络(DenseNet

最后感谢Stack_empty,参考https://www.jianshu.com/p/c0215d26d20a
Madcola,参考https://www.cnblogs.com/skyfsm/p/6790245.html
Asia-Lee,参考https://blog.csdn.net/asialee_bird/article/details/80459163

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值