卷积层,pooling层的理解

卷积层

  1. 参考:卷积池化的基本解释,写的还不错。
  2. 什么是卷积核?
    卷积核就是图像处理时,给定输入图像,在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均,其中权值由一个函数定义,这个函数称为卷积核。
  3. 卷积核其实在图像处理中并不是新事物,Sobel 算子等一系列滤波算子,一直都在被用于边缘检测等工作中,只是以前被称为 Filter。
  4. CNN 中的卷积核跟传统的卷积核本质没有什么不同。仍然以图像为例,卷积核依次与输入不同位置的图像块做卷积,得到输出,如图一。在这里插入图片描述
  5. 一个卷积核在与 Input 不同区域做卷积时,它的参数是固定不变的。
  6. 其实卷积核卷积后得到的会是原图的某些特征(如边缘信息),所以在 CNN 中,卷积核卷积得到的 Layer 称作特征图。
  7. 一般 CNN 中两层之间会含有多个卷积核,目的是学习出 Input 的不同特征,对应得到多个特征图。
  8. 卷积神经网络中每层卷积层(Convolutional layer)由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。
  9. 卷积层和全连接层的理解:
  • 理解1:(概念角度)
    卷积取的是局部特征,全连接就是把以前的局部特征重新通过权值矩阵组装成完整的图。
    因为用到了所有的局部特征,所以叫全连接。

  • 理解2:(打比方)
    从卷积网络谈起,卷积网络在形式上有一点点像咱们正在召开的“人民代表大会制度”。卷积核的个数相当于候选人,图像中不同的特征会激活不同的“候选人”(卷积核)。
    池化层(仅指最大池化)起着类似于“合票”的作用,不同特征在对不同的“候选人”有着各自的喜好。
    全连接相当于是“代表普选”。所有被各个区域选出的代表,对最终结果进行“投票”,全连接保证了receiptive field 是整个图像,既图像中各个部分(所谓所有代表),都有对最终结果影响的权利。

  • 理解3:(打比方)
    假设你是一只小蚂蚁,你的任务是找小面包。你的视野还比较窄,只能看到很小一片区域。当你找到一片小面包之后,你不知道你找到的是不是全部的小面包,所以你们全部的蚂蚁开了个会,把所有的小面包都拿出来分享了。全连接层就是这个蚂蚁大会~(理解1和理解3倒是共通的)

  • 理解4:(数学角度)
    例如经过卷积,relu后得到3x3x5的输出。
    那它是怎么样把3x3x5的输出,转换成1x4096的形式?
    很简单,可以理解为在中间做了一个卷积。
    在这里插入图片描述
    从上图我们可以看出,我们用一个3x3x5的filter 去卷积激活函数的输出,得到的结果就是一个fully connected layer 的一个神经元的输出,这个输出就是一个值。因为我们有4096个神经元。我们实际就是用一个3x3x5x4096的卷积层去卷积激活函数的输出。

以VGG-16再举个例子吧,
对224x224x3的输入,最后一层卷积可得输出为7x7x512,如后层是一层含4096个神经元的FC,则可用卷积核为7x7x512x4096的全局卷积来实现这一全连接运算过程。
它把特征representation整合到一起,输出为一个值。

好处:
在这里插入图片描述
9. 步长为1的卷积操作,表示卷积核每次向右移动一个像素(当移动到边界时回到最左端并向下移动一个单位)。
10.

损失函数

损失函数层(loss layer)用于决定训练过程如何来“惩罚”网络的预测结果和真实结果之间的差异,它通常是网络的最后一层。各种不同的损失函数适用于不同类型的任务。例如,Softmax交叉熵损失函数常常被用于在K个类别中选出一个,而Sigmoid交叉熵损失函数常常用于多个独立的二分类问题。欧几里德损失函数常常用于结果取值范围为任意实数的问题。

pooling layer

  1. 主要是两个作用:
  2. invariance(不变性),这种不变性包括translation(平移),rotation(旋转),scale(尺度)
  3. 保留主要的特征同时减少参数(降维,效果类似PCA)和计算量,防止过拟合,提高模型泛化能力

(1) translation invariance:
这里举一个直观的例子(数字识别),假设有一个16x16的图片,里面有个数字1,我们需要识别出来,这个数字1可能写的偏左一点(图1),这个数字1可能偏右一点(图2),图1到图2相当于向右平移了一个单位,但是图1和图2经过max pooling之后它们都变成了相同的8x8特征矩阵,主要的特征我们捕获到了,同时又将问题的规模从16x16降到了8x8,而且具有平移不变性的特点。图中的a(或b)表示,在原始图片中的这些a(或b)位置,最终都会映射到相同的位置。
在这里插入图片描述
(2) rotation invariance:
下图表示汉字“一”的识别,第一张相对于x轴有倾斜角,第二张是平行于x轴,两张图片相当于做了旋转,经过多次max pooling后具有相同的特征
在这里插入图片描述
(3) scale invariance:
下图表示数字“0”的识别,第一张的“0”比较大,第二张的“0”进行了较小,相当于作了缩放,同样地,经过多次max pooling后具有相同的特征
在这里插入图片描述
总结:就是为了让计算机处理的时候的维度不要太高,所以对于输入的图象在保持其特征不变的基础上进行降维。

(1)过拟合作用的理解:

对于一个样本(一张图片)x,特征维数dim(x)从原来的256(16x16),到现在的64(8x8),我们的特征维数减少了,同时我们的参数w规模也减少了,整个模型就变得相对简单点。就好比一些常见的防止过拟合的方法,例如L1正则,目的是为了得到稀疏解,即稀疏的w。相反,如果我们的特征变多了,模型会拟合这些特征,使得模型变得复杂,但同时模型的泛化能力降低,即过拟合。

也就是说pooling后会让之前的特征维数减少,训练参数减少,泛化能力加强,进而防止过拟合。 其中特征维数的减少并不会让之前的特征丢失。

注意:不变性只是在【一定范围内】才成立的。

例子:
做窗口滑动卷积的时候,卷积值就代表了整个窗口的特征。
因为滑动的窗口间有大量重叠区域,出来的卷积值有冗余,进行最大pooling或者平均pooling就是减少冗余。
减少冗余的同时,pooling也丢掉了局部位置信息,所以局部有微小形变,结果也是一样的。就像图片上的字母A,局部出现微小变化,也能够被识别成A。
而加上椒盐噪音,就是字母A上有很多小洞,同样的能够被识别出来。

而平移不变性,就是一个特征,无论出现在图片的那个位置,都会识别出来。
所以平移不变性不是pooling带来的,而是层层的权重共享带来的。所以,本质上,pooling是在精简feature map数据量的同时,最大化保留空间信息和特征信息,的处理技巧;
目的是,通过feature map进行压缩浓缩,给到后面hidden layer的input就小了,计算效率能提高;
而CNN的invariance的能力,本质是由convolution创造的(共享权值)

资料来源:关于pooling层的理解,内有一个生动的视频

泛化能力

泛化能力(generalization ability)是指机器学习算法对新鲜样本的适应能力。学习的目的是学到隐含在数据对背后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出,该能力称为泛化能力。
通常期望经训练样本训练的网络具有较强的泛化能力,也就是对新输入给出合理响应的能力。应当指出并非训练的次数越多越能得到正确的输入输出映射关系。网络的性能主要用它的泛化能力来衡量。

VGG-style

  1. 一个19层深度的深层网络。
  2. VGGNet由牛津大学的视觉几何组(Visual Geometry Group)提出,是ILSVRC-2014中定位任务第一名和分类任务第二名。其突出贡献在于证明使用很小的卷积(3*3),增加网络深度可以有效提升模型的效果,而且VGGNet对其他数据集具有很好的泛化能力。

如今,卷积神经网络已经成为计算机视觉领域的常用工具,所以有很多人尝试改善2012年提出的AlexNet来实现更好的效果。比如,在ILSVRC中-2013中表现最好的ZFNet在第一卷积层使用更小的卷积(receptive window size)和更小的步长(stride)。另一种策略是多尺度地在整张图像上密集训练和测试。VGGNet则强调了卷积神经网络设计中另一个重要方面—深度。

  • 目的:改善cnn的基本卷积层,每一层之间的规律都改了,提高每一层的效率。核心还是卷积。

Fully Connected全连接层

  1. 定义:全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽。
  2. 简而言之,全连接层是用来融合前面卷积出来的,学到的深度特征。然后根据softmax之类的函数来实现分类。
  3. 例子:全理解层的作用是分类。
    我们现在的任务是去区别一图片是不是猫
    在这里插入图片描述
    假设这个神经网络模型已经训练完了
    全连接层已经知道
    在这里插入图片描述
    当我们得到以上特征,我就可以判断这个东东是猫了。(局部特征全连接起来判断,各个特征都有了,它是猫的可能性为%99。这就是全连接最后输出一个向量的判断过程。)
    在这里插入图片描述
    当我们把这些找到的特征组合在一起,发现最符合要求的是猫
    ok,我认为这是猫了。
    接下来再说,对于猫脸部的判断。首先,我们知道猫有这些特征,如下图,然后根据这些特征书写判断函数。
    在这里插入图片描述
    于是我们下一步的任务,就是把猫头的这么些子特征找到,比如眼睛啊,耳朵啊。然后图片放入卷积层,可以将特征(卷出来)获得,然后在全连接层中就被激活了。如图:
    在这里插入图片描述
    道理和区别猫一样
    当我们找到这些特征,神经元就被激活了(上图红色圆圈)最后所有特征输出为一个向量,这个向量代入判断函数,得到最终结果(分类)。
  4. 全连接的核心操作就是矩阵向量乘积。本质就是由一个特征空间线性变换到另一个特征空间。目标空间的任一维——也就是隐层的一个 cell——都认为会受到源空间的每一维的影响。不考虑严谨,可以说,目标向量是源向量的加权和。 在这里插入图片描述
    在 CNN 中,全连接常出现在最后几层,用于对前面设计的特征做加权和。比如 mnist,前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。
    全连接层中的每个神经元与其前一层的所有神经元进行全连接.全连接层可以整合卷积层或者池化层中具有类别区分性的局部信息.最后一层全连接层的输出值被传递给一个输出,可以采用softmax逻辑回归(softmax regression)进行 分 类,该层也可 称为 softmax层(softmax layer).
  • 例子:
    在这里插入图片描述

relu(激活函数)

作用:所谓激活函数(Activation Function),就是在人工神经网络的神经元上运行的函数,负责将神经元的输入映射到输出端。
意义:激活函数(Activation functions)对于人工神经网络 模型去学习、理解非常复杂和非线性的函数来说具有十分重要的作用。它们将非线性特性引入到我们的网络中。如图1,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数。引入激活函数是为了增加神经网络模型的非线性。没有激活函数的每层都相当于矩阵相乘。就算你叠加了若干层之后,无非还是个矩阵相乘罢了。 MLP(多层感知机)使用的就是恒等激活函数,那么其实整个网络跟单层神经网络是等价的;
如图:

在这里插入图片描述
为什么使用激活函数:
如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。

如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。

常见的激活函数:
在这里插入图片描述
常用的是Relu激活函数(The Rectified Linear Unit),用于隐层神经元输出。
常常使用的原因是:
关于大脑方面的研究表明生物神经元的信息编码通常是比较分散及稀疏的。通常情况下,大脑中在同一时间大概只有1%-4%的神经元处于活跃状态。使用线性修正以及正则化(regularization)可以对机器神经网络中神经元的活跃度(即输出为正值)进行调试;相比之下,逻辑函数在输入为0时达到 ,即已经是半饱和的稳定状态,不够符合实际生物学对模拟神经网络的期望。不过需要指出的是,一般情况下,在一个使用修正线性单元(即线性整流)的神经网络中大概有50%的神经元处于激活态。

  • 稀疏性带来的好处
  1. 信息解离
    原始数据(以自然数据为主)中通常缠绕着高度密集的特征。
    原因是这些特征向量是相互关联的,一个小小的关键因子可能牵扰着一堆特征,有点像蝴蝶效应,牵一发而动全身。
    如果能够解开特征间缠绕的复杂关系,转换为稀疏特征,那么特征就有了鲁棒性(去掉了无关的噪声)。
  2. 线性可分性
    稀疏特征有更大可能线性可分,或者对非线性映射机制有更小的依赖。因为稀疏特征处于高维的特征空间上(被自动映射了)
    从流形学习观点来看(参见降噪自动编码器),稀疏特征被移到了一个较为纯净的低维流形面上。
    线性可分性亦可参照天然稀疏的文本型数据,即便没有隐层结构,仍然可以被分离的很好。
    简而言之:relu函数带来了稀释性,稀释性又导致了对rule函数的依赖降低。这样一来,在深层网络中,就可以在神经元之间激活的时候用稀释性激活函数(relu等),获取到了稀释的特征,然后在神经元里用的是简单、速度快的线性激活函数,加快效率又不失准确性。两两重叠,能有更加好的效果。
  3. 稠密分布但是稀疏(只是强调一下第一点的应用价值)
    稠密缠绕分布着的特征是信息最富集的特征,从潜在性角度,往往比局部少数点携带的特征成倍的有效。
    而稀疏特征,正是从稠密缠绕区解离出来的,潜在价值巨大。
  4. 稀疏性激活函数的贡献的作用:
    不同的输入可能包含着大小不同关键特征,使用大小可变的数据结构去做容器,则更加灵活。
    假如神经元激活具有稀疏性,那么不同激活路径上:不同数量(选择性不激活)、不同功能(分布式激活),
    两种可优化的结构生成的激活路径,可以更好地从有效的数据的维度上,学习到相对稀疏的特征,起到自动化解离效果。

更加有效率的梯度下降以及反向传播:避免了梯度爆炸和梯度消失问题。

  • 注意:诚然,稀疏性有很多优势。但是,过分的强制稀疏处理,会减少模型的有效容量。即特征屏蔽太多,导致模型无法学习到有效特征。

简而言之,relu具有稀释性,比较符合人的神经活跃函数。
-ReLU的有效性体现在两个方面:

  • 克服梯度消失的问题
  • 加快训练速度
  • ReLu的使用,使得网络可以自行引入稀疏性。等效于无监督学习的预训练。

参考资料:激活函数

自动编码器(降维的方式,参考pooling)

  1. 目的:对于一般的高维数据进行降维处理。
  2. 产生原因:数据维度过高,数据单调,噪声分布广,特征难以提取。了解决高维度的问题,出现的线性学习的PCA降维方法,PCA的数学理论确实无懈可击,但是却只对线性数据效果比较好。此时出现了CNN,它另辟蹊径,利用卷积、降采样(pooling)两大手段从信号数据的特点上很好的提取出了特征。对于一般非信号数据,该怎么办呢??
  3. 原理:自动编码器基于这样一个事实:原始input(设为x)经过加权(W、b)、映射(Sigmoid)之后得到y,再对y反向加权映射回来成为z。
    通过反复迭代训练两组(W、b),使得误差函数最小,即尽可能保证z近似于x,即完美重构了x。
    那么可以说正向第一组权(W、b)是成功的,很好的学习了input中的关键特征,不然也不会重构得如此完美。
    在这里插入图片描述
    注意:此过程的y比起x要降维了,这就是关键。
    从生物的大脑角度考虑,可以这么理解,学习和重构就好像编码和解码一样。
    在这里插入图片描述
    这个过程很有趣,首先,它没有使用数据标签来计算误差update参数,所以是无监督学习。
    其次,利用类似神经网络的双隐层的方式,简单粗暴地提取了样本的特征。
4. 降噪自动编码器(Denoising Autoencoder)
  1. 目的:提取、编码出具有鲁棒性的特征。
  2. 怎么才能使特征很鲁棒呢?就是以一定概率分布(通常使用二项分布)去擦除原始input矩阵,即每个值都随机置0, 这样看起来部分数据的部分特征是丢失了。
    以这丢失的数据x’去计算y,计算z,并将z与原始x做误差迭代,这样,网络就学习了这个破损(原文叫Corruputed)的数据。

这个破损的数据是很有用的,原因有二:
其之一,通过与非破损数据训练的对比,破损数据训练出来的Weight噪声比较小。降噪因此得名。
原因不难理解,因为擦除的时候不小心把输入噪声给×掉了
在这里插入图片描述
其之二,破损数据一定程度上减轻了训练数据与测试数据的代沟。由于数据的部分被×掉了,因而这破损数据
一定程度上比较接近测试数据。(训练、测试肯定有同有异,当然我们要求同舍异)。
这样训练出来的Weight的鲁棒性就提高了。图示如下:
在这里插入图片描述
关键是,这样胡乱擦除原始input真的很科学?真的没问题? Vincent又从大脑认知角度给了解释:
在这里插入图片描述
paper中这么说到:人类具有认知被阻挡的破损图像能力,此源于我们高等的联想记忆感受机能。

我们能以多种形式去记忆(比如图像、声音,甚至如上图的词根记忆法),所以即便是数据破损丢失,我们也能回想起来。

另外,就是从特征提取的流形学习(Manifold Learning)角度看:
在这里插入图片描述
破损的数据相当于一个简化的PCA,把特征做一个简单的降维预提取。

  • PCA:后面补充

  • 应用:
    自动编码器相当于创建了一个隐层,一个简单想法就是加在深度网络的开头,作为原始信号的初级filter,起到降维、提取特征的效果。
    关于自动编码器取代PCA的基本用法,参考http://www.360doc.com/content/15/0324/08/20625606_457576675.shtml

在这里插入图片描述
感觉不会增维啊??为什么说增了?

无监督学习

对于很多问题,特征是不容易选择的。例如,选择广义识别的对象特点这是很难的,算法需要分辨从面孔,从汽车等等。那么从我们的输入信息维度我们该如何提取?这是机器学习的一个领域,称为无监督学习。在下一节中,我们将讨论自动编码(autoencoder),杰弗里·辛顿开创的基于神经网络的一种无监督学习技术。我们将简要讨论自动编码(autoencoder)是如何工作并且如何与传统的线性方法的差距。例如对计算机视觉的主成分分析(PCA)和潜在语义分析(LSA)的自然语言处理。
AutoEncoder可以看作是PCA的非线性补丁加强版

残差网络

  1. 原理:残差的思想都是去掉相同的主体部分,从而突出微小的变化。
  2. 目的:通过增加相当的深度来提高准确率。核心是解决了增加深度带来的副作用(退化问题),这样能够通过单纯地增加网络深度,来提高网络性能。
  3. 解决的问题:对于原来的网络,如果简单地增加深度,会导致梯度弥散或梯度爆炸。对于该问题的解决方法是正则化初始化和中间的正则化层(Batch Normalization)(BN层),这样的话可以训练几十层的网络。虽然通过上述方法能够训练了,但是又会出现另一个问题,就是退化问题,网络层数增加,但是在训练集上的准确率却饱和甚至下降了。
    为了解决退化问题,引入了残差处理:
    深度残差网络。如果深层网络的后面那些层是恒等映射,那么模型就退化为一个浅层网络。那当前要解决的就是学习恒等映射函数了。 但是直接让一些层去拟合一个潜在的恒等映射函数 ,比较困难,这可能就是深层网络难以训练的原因。但是,如果把网络设计为 ,如下图。我们可以转换为学习一个残差函数 。 只要 ,就构成了一个恒等映射 。 而且,拟合残差肯定更加容易。
    在这里插入图片描述
    F是求和前网络映射,H是从输入到求和后的网络映射。比如把5映射到5.1,那么引入残差前是 ,引入残差后是 , , 。这里的F’和F都表示网络参数映射,引入残差后的映射对输出的变化更敏感。比如s输出从5.1变到5.2,映射 的输出增加了2%,而对于残差结构输出从5.1到5.2,映射F是从0.1到0.2,增加了100%。明显后者输出变化对权重的调整作用更大,所以效果更好。残差的思想都是去掉相同的主体部分,从而突出微小的变化。
    这种残差学习结构可以通过前向神经网络+shortcut连接实现,如结构上图所示。而且shortcut连接相当于简单执行了同等映射,不会产生额外的参数,也不会增加计算复杂度。 而且,整个网络可以依旧通过端到端的反向传播训练。
  4. 梯度爆炸:因为通常神经网络所用的激活函数是sigmoid函数,这个函数有个特点,就是能将负无穷到正无穷的数映射到0和1之间,并且对这个函数求导的结果是f′(x)=f(x)(1−f(x))。因此两个0到1之间的数相乘,得到的结果就会变得很小了。神经网络的反向传播是逐层对函数偏导相乘,因此当神经网络层数非常深的时候,最后一层产生的偏差就因为乘了很多的小于1的数而越来越小,最终就会变为0,从而导致层数比较浅的权重没有更新,这就是梯度消失。
    那么什么是梯度爆炸呢?梯度爆炸就是由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。

猜你喜欢

转载自blog.csdn.net/qq_42031483/article/details/89345938