深度学习之卷积神经网络

卷积神经网络的基本知识

卷积神经网络主要会涉及到:卷积层(主要核心)、激活函数、池化层、全连接层。这面我们分别介绍一下。

卷积层

作用

它的主要作用是来进行特征提取

假设输入图像是32* 32* 3,3是它的深度(即R、G、B),卷积层是一个553的filter(感受野),这里注意:感受野的深度必须和输入图像的深度相同。 通过一个filter与输入图像的卷积可以得到一个28281的特征图,下图是用了两个filter得到了两个特征图。
在这里插入图片描述通常我们会使用多层卷积层来得到更深层次的特征图。如下:
在这里插入图片描述
再比如:
在这里插入图片描述

其计算过程如下图所示

在这里插入图片描述
整体过程:输入图像和filter的对应位置元素相乘再求和,最后再加上b,得到特征图。 具体过程:如图中所示,filter w0的第一层深度和输入图像的蓝色方框中对应元素相乘再求和得到0,其他两个深度得到2,0,则有0(第一层加权和)+2(第二层加权和)+0(第三层加权和)+1(偏置)=3即图中右边特征图的第一个元素3.,卷积过后输入图像的蓝色方框再滑动,stride=2,如下:
在这里插入图片描述
如上图,完成卷积,得到一个3* 3*2的特征图;在这里还要注意一点,在本示例中是加入了zero pad项,即为图像加上一个边界,边界元素均为0.(对原输入无影响)一般有

若F=3 则 zero pad with 1(即四周加入1层0)

若F=5 则 zero pad with 2 (即四周加入2层0)

若F=7则 zero pad with 3,边界宽度是一个经验值,加上zero pad这一项是为了使输入图像和卷积后的特征图具有相同的维度(注意这里是假设stride=1的时候),如:

输入为5* 5* 3,filter为3* 3* 3,在zero pad 为1。
则加上zero pad后的输入图像为7* 7* 3,则卷积后的特征图大小为5* 5*1,因为(7-3)/1+1=5,与输入图像一样;

而关于特征图的大小计算方法具体如下:

在这里插入图片描述

权值共享

卷积层还有一个特性就是“权值共享”原则,下面解释一下,为什么要权值共享。
在这里插入图片描述
如没有这个原则,则特征图由10个32* 32* 1的特征图组成,即每个特征图上有1024个神经元,每个神经元对应输入图像上一块5* 5* 3的区域,即一个神经元和输入图像的这块区域有75个连接,即75个权值参数,则共有75 * 1 024* 10=768000个权值参数,这是非常复杂的,因此卷积神经网络引入“权值”共享原则,即一个特征图上每个神经元对应的75个权值参数被每个神经元共享,这样则只需75*10=750个权值参数,而每个特征图的阈值也共享,即需要10个阈值,则总共需要750+10=760个参数。

补充:

(1)对于多通道图像做1*1卷积,其实就是将输入图像的每个通道乘以系数后加在一起,即相当于将原图中本来各个独立的通道“联通”在了一起;

(2)权值共享时,只是在每一个filter上的每一个channel中是共享的;

激活函数

首先,激活函数不是真的要去激活什么,而是指如何把“激活的神经元的特征”通过函数把特征保留并映射出来,即负责将神经元的输入映射到输出端。在神经网络中,激活函数的作用是能够给神经网络加入一些非线性因素,使得神将网络可以更好地解决较为复杂的问题。
比如:
在这里插入图片描述
如上图所示,在最简单的情况下,数据是线性可分的,只需要一条直线就已经很好的进行分类了。
但是,如果情况变得复杂一些了呢,比如下面的数据:
在这里插入图片描述
如上图所示的数据,就变成了线性不可分的情况,在这种情况下,简单的一条直线就已经不能够对样本进行很好的分类了。
于是,我们尝试引入非线性的因素,对样本进行分类。
在这里插入图片描述
在神经网络中也类似,我们需要引入一些非线性的因素,来更好地解决复杂的问题。而激活函数恰好能够帮助我们引入非线性因素,它使得我们的神经网络能够更好地解决较为复杂的问题。

总结:
激活函数只是一个抽象的概念,使用激活函数是为了让中间输出多样化,能够处理更加复杂的问题。

如果不使用激活函数的话,每一层最后输出的都是上一层输入的线性函数,不过加多少层神经网络,我们最后的输出也只是最开始输入数据的线性组合而已。激活函数给神经元引入了非线性因素,当加入多层神将网络的时候,就可以让神经网络拟合任何线性函数及非线性函数,从而使得神经网络可以适用于更多的非线性问题,而不仅仅是线性问题。

激活函数的定义及其相关概念在这里插入图片描述

上图是神经网络中的一个典型的神经元设计,它完全仿照人类大脑中神经元之间传递数据的模式进行设计。大脑中,神经元通过若干树突(dendrite)的突触(synapse),接受其他神将元的轴突(axon)或者树突传递来的消息,而后经过处理再由轴突输出。

在这里,每个xi 是其他神经元的轴突传来的消息, 每个wi 是突触对消息的影响,每个wixi 则是神经元树突上传递的消息。这些消息经由神经元整合后(z(x→;w→,b)=∑iwixi+b)再激活输出(f(z))。这里,整合的过程是线性加权的过程,各输入特征 xi 之间没有相互作用。激活函数(active function)一般来说则是非线性的,各输入特征 xi 在此处相互作用。

在实际应用中,我们还会涉及到以下的一些概念:
a.饱和
当一个激活函数h(x)满足

limn→+∞h′(x)=0

时我们称之为右饱和。

当一个激活函数h(x)满足

limn→−∞h′(x)=0

时我们称之为左饱和。当一个激活函数,既满足左饱和又满足又饱和时,我们称之为饱和。
b.硬饱和与软饱和
对任意的xx,如果存在常数cc,当x>cx>c时恒有 h′(x)=0则称其为右硬饱和,当x<cx<c时恒 有h′(x)=0则称其为左硬饱和。若既满足左硬饱和,又满足右硬饱和,则称这种激活函数为硬饱和。但如果只有在极限状态下偏导数等于0的函数,称之为软饱和。

注意,因为神经网络的数学基础是处处可微(因为涉及到优化求导数的操作),因此所选取的激活函数要能保证数据输入与输出也是可微的,运算特征是不断进行循环计算的,所以在每代循环过程中,每个神经元的值也是在不断变化的。

如果你不清楚,为什么神经网络中经常使用以下非线性函数来作为激活函数,强烈建议你阅读这里推荐的内容:(1)神经网络中激活函数的真正意义?一个激活函数需要具有哪些必要的属性?还有哪些属性是好的属性但不必要的? (看一些高赞回答,认真思考!);(2)激活函数,你真的懂了吗?; (3)浅析激活函数之Relu函数;(4)为什么要使用relu激活函数

Sigmoid函数
f ( x ) = 1 1 + e − x f(x)=\frac{1}{1+e^{-x}} f(x)=1+ex1

函数对应的图像是:
在这里插入图片描述

优点:
1、Sigmoid函数的输出映射在(0,1)之间,单调连续,输出范围有限,优化稳定,可以用作输出层。可以作为概率,辅助模型解释。
2、求导容易,可以直接通过原函数进行计算。( f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) f'(x)=f(x)(1-f(x)) f(x)=f(x)(1f(x))

缺点:
1、由于其软包和性,容易产生梯度消失的问题,导致训练出现问题,对于深度网络的训练不太适合(从上图的sigmoid的导数图像可以看出,其导数值是永远小于1的,最大才为0.25)。
2、其输出并不是以(0,0)为中心的。

tanh函数
现在,比起sigmoid函数,我们通常更倾向于tanh函数,tanh函数被定义为双切正切曲线,过(0,0)点。

函数公式:
在这里插入图片描述
相应的在这里插入图片描述
函数曲线如下:
在这里插入图片描述
优点:
1、函数输出以(0,0)为中心
2、收敛速度对于sigmoid更快
缺点:
1、tanh并没有解决sigmoid梯度消失的问题。

谈谈激活函数以零为中心的问题

在这里我们重点讲sigmoid函数输出值不以(0,0)为中心的这一缺点。

收敛速度
这里首先需要给收敛速度一个诠释。模型的最优解即是模型参数的最优解。通过逐轮迭代,模型参数会被更新到接近其最优解。这一过程中,迭代轮次多,则我们说模型收敛速度慢,反之,迭代轮次少,则我们说模型收敛速度快。
参数更新

深度学习一般的学习方法是反向传播,简单来说,就是通过链式法则,求解全局损失函数L(x->)对某一参数w的偏导数(梯度);而后辅以学习率η,向梯度的反方向更新参数w:
w ← w − η ⋅ ∂ L ∂ w w←w−η⋅\frac{∂L}{∂w} wwηwL
考虑学习率 η 是全局设置的超参数,参数更新的核心步骤即是计算 ∂ L ∂ w \frac{∂L}{∂w} wL。再考虑到对于某个神经元来说,其输入与输出的关系是:
f ( x → ; w → , b ) = f ( z ) = f ( ∑ i w i x i + b ) f(x→;w→,b)=f(z)=f(∑_iw_ix_i+b) f(x;w,b)=f(z)=f(iwixi+b)
因此,对于参数 w i w_i wi来说,
∂ L ∂ w i = ∂ L ∂ f ∂ f ∂ z ∂ z ∂ w i = x i ⋅ ∂ L ∂ f ∂ f ∂ z . \frac{∂L}{∂w_i}=\frac{∂L}{∂f}\frac{∂f}{∂z}\frac{∂z}{∂w_i}=xi⋅\frac{∂L}{∂f}\frac{∂f}{∂z}. wiL=fLzfwiz=xifLzf.
因此,参数的更新步骤就变为:
w i ← w i − η x i ⋅ ∂ L ∂ f ∂ f ∂ z w_i←w_i−ηxi⋅\frac{∂L}{∂f}\frac{∂f}{∂z} wiwiηxifLzf

更新方向
由于 w i w_i wi 是上一轮迭代的结果,此处可视为常数,而 η 是模型超参数,参数 w i w_i wi 的更新方向实际上由 x i ⋅ ∂ L ∂ f ∂ f ∂ z x_i⋅\frac{∂L}{∂f}\frac{∂f}{∂z} xifLzf 决定。

又考虑到 ∂ L ∂ f ∂ f ∂ z \frac{∂L}{∂f}\frac{∂f}{∂z} fLzf对于所有的 w i w_i wi 来说是常数,因此各个 w i w_i wi 更新方向之间的差异,完全由对应的输入值 x i x_i xi 的符号决定。
以零为中心的影响
至此,为了描述方便,我们以二维的情况为例。亦即,神经元描述为

f ( x → ; w → , b ) = f ( w 0 x 0 + w 1 x 1 + b ) f(x→;w→,b)=f(w_0x_0+w_1x_1+b) f(x;w,b)=f(w0x0+w1x1+b).

现在假设,参数 w 0 w_0 w0, w 1 w_1 w1 的最优解 w 0 ∗ , w_0^∗, w0, w 1 ∗ w_1^∗ w1 满足条件

w 0 < w 0 ∗ , w 1 ⩾ w 1 ∗ w_0<w_0^∗,w_1⩾w_1^∗ w0<w0,w1w1.
这也就是说,我们希望 w0 适当增大,但希望 w1 适当减小。考虑到上一小节提到的更新方向的问题,这就必然要求 x0 和 x1 符号相反。

但在 Sigmoid 函数中,输出值恒为正。这也就是说,如果上一级神经元采用 Sigmoid 函数作为激活函数,那么我们无法做到 x0 和 x1 符号相反。此时,模型为了收敛,不得不像逆风前行的风助力帆船一样,走 Z 字形逼近最优解。
在这里插入图片描述
如图,模型参数走绿色箭头能够最快收敛,但由于输入值的符号总是为正,所以模型参数可能走类似红色折线的箭头。如此一来,使用 Sigmoid 函数作为激活函数的神经网络,收敛速度就会慢上不少了。

ReLU函数
最近几年很常用的激活函数

公式入下:
在这里插入图片描述在这里插入图片描述
优点:
1、在SGD中收敛速度要比sigmoid和tanh快得多;
例如在下图的实验中,在一个四层的卷积神经网络中,实线代表了ReLU,虚线代表了tanh,ReLU比起tanh更快地到达了错误率0.25处。据称,这是因为它线性、非饱和的形式。
在这里插入图片描述2、Sigmoid和tanh涉及了很多很expensive的操作(比如指数),ReLU可以更加简单的实现。
3、有效地解决了梯度消失的问题;
4、对神经网络可以使用稀疏表达;
5、在没有无监督预训练的时候也能有较好的表现。

缺点:
随着训练的进行,可能会出现神经元死亡,权重无法更新的情况。如果发生这种情况,那么流经神经元的梯度从这一点开始将永远是0。也就是说,ReLU神经元在训练中不可逆地死亡了。(具体解释看这里的高赞回答深度学习中,使用relu存在梯度过大导致神经元“死亡”,怎么理解?

总结:关于激活函数的选取,目前还不存在定论,实践过程中,更多还是需要结合实际情况,考虑不同激活函数的优缺点综合使用。同时也期待越来越多的新想法,改进目前存在的不足。

池化层

对输入的特征图进行压缩,一方面使得特征图变小,简化网络计算复杂度;一方面进行特征压缩,提取主要特征。

比如:
在这里插入图片描述
池化操作一般有两种,一种是Avy Pooling,一种是max Pooling,如下:
在这里插入图片描述
同样地采用一个2*2的filter,max pooling是在每一个区域中寻找最大值,这里的stride=2,最终在原特征图中提取主要特征得到右图。

(Avy pooling现在不怎么用了(其实就是平均池化层),方法是对每一个22的区域元素求和,再除以4,得到主要特征),而一般的filter取22,最大取3*3,stride取2,压缩为原来的1/4.

注意:这里的pooling操作是特征图缩小,有可能影响网络的准确度,因此可以通过增加特征图的深度来弥补(这里的深度变为原来的2倍)。

全连接层

连接所有的特征,将输出值送给分类器(如softmax分类器)。

总的一个结构大致如下:
在这里插入图片描述
注意:CNN网络中前几层的卷积层参数量占比小,计算量占比大;而后面的全连接层正好相反,大部分CNN网络都具有这个特点。因此我们在进行计算加速优化时,重点放在卷积层;进行参数优化、权值裁剪时,重点放在全连接层。

推荐资料

1、零基础入门深度学习之卷积神经网络
推荐阅读
2、这是Denny Britz.大神关于卷积神经网络的两篇文章
对于入门的同学强烈推荐阅读,一篇关于基于CNN的文本分类的实现;一篇关于CNN对NLP的应用的讨论。

3、卷积神经网络(CNN)应用于自然语言处理(NLP)
这里面提到的一点值得注意,。不同于图像处理的卷积,CNN对NLP的卷积核大小有要求,一般来说,卷积核的长度和词向量的维度应该是一致的.

4、padding
5、padding参考
个人感觉这篇文章介绍的还不错,着重理解一下
个人总结:

  • 当padding表示“SAME”的时候,在计算输出大小的时候,要自己先根据公式p=(F-1)/2(F:表示滤波器大小)计算出出p值的大小,然后再代入(W-F+2P)/S +1 (W:输入大小,F:滤波器大小 ,P:Padding大小,S:步长)的公式。
  • 当padding="VALID"的时候,输出大小为:(W-F)/S +1.因为在设置为“VALID”的时候,是不需要进行padding补充的,所以P=0.
    注:以下3、4、5各选择其中一个读即可,若为了加深理解,可以都读一下。

卷积神经网络的深度模型框架

tensorflow中CNN相关的参考资料

6、padding 参考2 :tensorflow中的两种卷积方式
7、Tensorflow中padding的两种类型SAME和VALID
8、TensorFlow中CNN的两种padding方式“SAME”和“VALID”
9、tf.nn.conv2d()解释
推荐阅读,解释了每一个参数的含义
10、卷积函数之tf.nn.conv2d
推荐阅读,里面的图像有助于理解卷积过程
11、tf.nn.max_pool实现池化操作
本篇作者和6、是同一个作者,解释了函数中每个参数的含义。

pytorch中的相关资料

12、参见这里:Pytroch之卷积神经网络

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱科研的徐博士

请各位看官赏赐,小仙女笔芯笔芯

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值