【深度学习】②--细说卷积神经网络

1. 神经网络与卷积神经网络

先来回忆一下神经网络的结构,如下图,由输入层,输出层,隐藏层组成。每一个节点之间都是全连接,即上一层的节点会链接到下一层的每一个节点。

卷积神经网在神经网络的基础上有所变化。下图中,每一列都表示一个层级,这些层级的类型不同,有CONV,RELU,POOL,FC等。这些层的结构与功能下面会详细说。

那么为什么我们要用卷积神经网去代替神经网络呢?

卷积神经网之所以这些年如此如火如荼,原因在于它在图像处理上的优秀变现。当然深度神经网络(DNN)也可以做图像识别。但是,我们知道图像的维度是非常大的,几千维的像素加上3维的颜色,假设DNN有两隐层,因为DNN是全链接,所以为产生几千维*几千维的权重需要被估计,这样的计算不是不可以,但是非常的消耗资源。而卷积神经网恰巧可以规避掉这个缺陷。

2. 卷积神经网络的层级结构

卷积神经网有如下层级结构,每一个层级下面都会详述。

2.1 输入层

输入层我们可以看做是对数据做的预处理,数据的预处理使得输入数据的质量增高,从而也能配合模型做最优的结果。预处理的方式有如下几种:

1.去均值 去均值就是将输入数据的各个维度都中心化到0。求出原始数据的均值,然后将每个数据减去均值,计算后的新数据均值就变成0了。下图中直观可见,就是将数据的分布平移到以0为中心(每个特征的均值都是0)。

2.归一化 归一化是将特征的幅度变换到统一范围(不一定是0-1之间),这个在图像识别中不使用,这里只是拿出来说一下,因为图像的RGB本来就是在0-255之间,幅度是一样的,故不需要做调整。由下图是归一化后的数据。

这里有一点要注意,我们在读外文文献或翻译文献的时候,有点时候,normalized意思是正则化,大家学习的时候注意分辨就行。

3.PCA PCA是主成分分析,一种降维的方法,经常被使用,可以解决共线性(特征之间彼此相关),同时也降低了维度,简化了模型,提高了模型的性价比。效果如下图

4.白化 白化其实是指将特征转换成正态分布。但是这个我们一般不做,尤其是使用随机梯度法计算损失函数最小值的时候。效果如右下图

2.2 卷积计算层

我们已经提过在图像处理上,之所以卷积神经网优于普通的深度神经网是因为它可以避免巨多维度的计算,那到底是如何避免的呢,卷积计算层绝对功不可没。

局部关联: 首先假设图像上的某个像素点与和它向邻近的点是相似的,也就是对于图像上的某块小区域,区域内的点因为相近,所以相似。

基于这个假设,某个神经元就可以只对这一块小区域做连线,但不是对整个小区域做一根连线,而是,对整个区域中的每个点做连接。这个小区域会移动的,它从左到右移动,然后向下一行再从左到右移动,将这个图片都遍历一遍,每一次移动都只是对新的小区域内的点做连接

看下图,蓝色框框内是一个层,这个层里有5个神经元,这5个神经元都是独立的个体,他们会各自对输入层(也就是粉红色区域)中的每个小区域都做一次遍历。

这个窗口的滑动会涉及到下面几个参数: 1.深度depth:对应的是上图中蓝色区域内的神经元个数。 2.步长stride:是小窗口移动的步数,也就是移动的格子数,如果步长为2,那就是每次向右移动2个格子。 3.填充值zero-padding:小窗口根据给定的步长向有移动,最后一次移动可能会超出原有的区域,这个时候我们去认为地在外增加若干圈为0的小格子作为补全。

来看下面几个图的变化,可能会有助于理解: 左边紫色区域为输入层,有三个输入节点(分别是RGB),并在外围补了一圈为0的小格子。 中间粉色的为两个神经元,每个神经元分别要去对应三个输入节点,所有相应地有3个权重居中,格子里的数即为权重参数。 右边绿色的是卷基层的输出,上下两个分别对应粉色的两个神经元。

第一步,第一个神经元对输入层的三个节点的第一个窗口做内积计算,得到最终结果为绿色输出矩阵中第一列第一行的-3

接着,小窗口右移两个步长,再做一次对应的内积,得到输出矩阵中第一行第二列的-3.

接下去,以此类推:

在卷积层,假设每个神经元连接数据窗口的权重是一致的的,即权重共享机制。因为对于每个神经元它们的分工是独立相异的。比如,第一个神经元负责记录图像的颜色特征,第二个神经元负责关注图片的轮廓信息,第三个神经元负责关注图像的纹理特征...也就是说每个神经元只负责关注一个特性。 另外,因为权重共享机制,权重的维度便大大地降低了! 一组固定的权重与不同窗口内的数据做内积的过程,就叫做“卷积”。

2.3 激励层

激励层的功能就是把卷基层输出的结果做一个非线性的映射。关于非线性的映射我们在笔记第一弹中已经详细讲过,就是将线性函数的输出结果作为一个输入变量放进sigmoid函数中,输出的值范围就在[0,1]之间了。在卷计算机网的激励层,就是将卷积层的输出作为输入变量放进一个函数中,从而做一个非线性的转换。

在很多paper中会将激励层包含在卷积层中,这里我们将它单独作为一个层来看。

激励层的函数有多种,下面一一解释各个激励函数:

1.sigmoid 这个激励函数我们不陌生,是逻辑回归中的非线性转化函数,也是DNN中感知器中的激励函数。它的图形如下,当z=0时,g(z)=0.5,当输入z > 0,输出 > 0.5,y = 1。当输入z < 0,输出 < 0.5,y = 0。

但是!我们一般不使用sigmoid函数来作为卷积神经网络的激励函数。因为它存在一个严重的缺陷:当输入的z很大的时候,输出的值就会无限逼近与1,那么此时的斜率就几乎约等于0了(无限接近1的时候几乎是在一条平行线上了)。而当我们使用BP算法利用随机梯度下降反向传播损失的时候,会去求损失函数的偏导数,梯度为0导致Δw = 0。这叫“梯度弥散”形成了“饱和”。一旦出现这个问题,激励函数就挂掉并不得抢救。在模型的运行过程中,会发现损失不小却一直维持在一个水平不在下降。

2.Tanh Tanh是与sigmoid类似的,也是呈现一个S型,与sigmoid存在相同的的“梯度弥散”问题。 不同之处就是中心点为0。

3.RELU(The Rectified Linear Unit/修正线性单元) RELU是卷计神经网络中最常用的激励函数,如下图,它是由两条射线组成: 当x > 0时,y = x,类别为1 当x < 0时,y = 0,类别为0

当x > 0 ,y不会随着x的增大而接近某个值,梯度(斜率)永远为1.因为BP算法中需要裘每一层的梯度,而RELU求解梯度的简单行提高了BP算法的效率。

但是RELU也有缺点,它比较脆弱,若输入的数据在某一个幅度范围内,它收敛地非常非常快,但是一旦超出了这个范围,就会不再被激活了。所以使用RELU要非常小心,要去监控它的输入与输出是否活跃,一旦挂掉边无法在激活。

4.Leaky ReLu 这个函数的形式如下,a是一个参数

这也是一个由两条射线组成的函数,与RELU不同的是,当x<0时,形成的是一条斜率为a的射线。 这样保证了无论x取什么值,都会求到不等于0的斜率,在SGD反向传播时避免了"饱和",而且计算得也很快。

5.ELU指数线性单元 ELU的函数如下形式:

当x > 0 时,仍然与前两个激励函数相同 当x < 0 时,时一条在x轴下方y轴左边的指数函数。

ELU具备了RELU的所有优点,而且不容易挂掉,输出的均值区域0. 但是缺点是,因为指数的存在,计算量略大。

6.Maxout 函数形式如下:

由函数可见Maxout也是由两条直线拼接起来的。

Maxout的优点是计算是线性的,不会饱和,不容易挂掉。 但缺点是增加了参数的数量(函数中的两个w和b)。

激励层的经验:

2.4 池化层 pooling layer

池化层是夹在连续的卷基层中间的(卷基层中包含了激励层)

池化层的过程非常简单,就是将数据进行压缩,比如下图,将一张图片的维度进行压减。

压减的形式是这样的,之前我们假设过一个点与它邻近的点有相似性,所以针对同一个窗口内的点,我们选其中一个点或是一个数来代替窗口内的所有点。下图中,将图片分成了4各区域,每个区域中选出了最大值的点来代替整个区域,于是4*4的维度就压缩到了2*2了。另外也可以去窗口内的均值来代替。

这个过程叫做downsampling,向下取样。有两个优点, 第一,压缩了数据和参数的量。 第二,缓解了过拟合。

2.5 全连接层 FC layer

全连接的方式其实就是深度神经网络中的连接方式。通常全连接层放在卷积神经网络的尾部。

之所以在最后还要使用全连接是为了还原信息。虽然全连接会增加非常多的参数以及计算的复杂度,但是只在最后一层进行全连接还是可以承受的,况且它可以还原更多信息量,总体而言“性价比”比较高。

总结: 至此,我们解释了卷积神经网络中的5个主要的层次,一般CNN的结构依次是:

3. 案例过程展示

将以下这张美女图作为CNN的输入

第一层卷基层的输入的权重矩阵与输出。左边每一列是一个权重,我们发现每个格子中的形状各异,这个可以理解为每个权重矩阵都会关注某个特征,比如下半部分有颜色说明关注的是图片的颜色,有些关注的是从左导游的文理,有些关注的是从上到下的纹理,等等

到第二层卷基层,其实我们人眼已经无法去分辨图片中的是什么了。

4.CNN优缺点

4.1 优点

1.共享卷积核(卷基层共享权重矩阵),对高维数据处理无压力(适合图像处理) 2.无需手动选取特征,训练好权重,即得特征。 3.分类效果好

4.2 缺点

1.需要调整参数,需要大样本,训练最好要有GPU 2.是一个黑盒,物理含义不明确

原文发布于微信公众号 - Spark学习技巧(bigdatatip)

原文发表时间:2018-01-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Python中文社区

Python机器学习算法入门之梯度下降法实现线性回归

專 欄 ❈ ZZR,Python中文社区专栏作者,OpenStack工程师,曾经的NLP研究者。主要兴趣方向:OpenStack、Python爬虫、Pytho...

3075
来自专栏有趣的Python

15- OpenCV+TensorFlow 入门人工智能图像处理- Adaboost与Hog特征

1382
来自专栏AI科技大本营的专栏

如何用TensorFlow实现基于深度学习的图像补全?看完这篇就明白了

作者|Brandon Amos 译者|@MOLLY && 寒小阳 简介 第一步:将图像理解为一个概率分布的样本 你是怎样补全缺失信息的呢? 但是怎样着手统...

1.8K10
来自专栏智能算法

SVM 的“核”武器

一、上一次我们讲到关于SVM通过拉格朗日乘子法去求解的部分,引入乘子 得到下面的式子: ? 我们令 ? 当所有的约束条件满足时,我们得到的 ? ,而之前的优...

3346
来自专栏IT大咖说

阿猫还是阿狗?AI视觉识别中目标检测的关键技术

内容来源:2018 年 04 月 21 日,AI教育求职平台景略集智创始人王文凯在“百度深度学习公开课·北京站:AI工程师的快速进阶之路”进行《目标检测面面观》...

771
来自专栏新智元

Reddit 讨论:Hinton的Capsule网络真的比CNN效果更好吗?

【新智元导读】Hinton 提出用 Capsule 这个概念代替反向传播,引起广泛关注。本文来自Reddit上“Capsule networks为何与众不同,它...

3377
来自专栏云时之间

深度学习与TensorFlow:FCN论文翻译(二)

Each layer of data in a convnet is a three-dimensional array of size h × w × d, ...

2072
来自专栏深度学习自然语言处理

深度学习之激活函数详解

激活函数是什么 激活函数,即Activation Function,有时候也称作激励函数。它是为了解决线性不可分的问题引出的。但是也不是说线性可分就不能用激活函...

2967
来自专栏人工智能

卷积神经网络学习笔记

1.卷积神经网络的图像识别原理: 通过过滤函数 来描绘出图像的边界: 过滤函数和图像相同区域的数值进行相乘,得到新的图像, 新图像则只剩下边图像。 cros...

25910
来自专栏机器学习算法原理与实践

K近邻法(KNN)原理小结

    K近邻法(k-nearest neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用。比如,我们判断一个人的人品,...

1205

扫码关注云+社区