大家好啊,我是董董灿。
上一篇文章Resnet图像识别入门——残差结构说到了Resnet网络的残差结构,也就是人们俗称的高速公路。
Resnet50这个图像分类网络,就是有很多残差结构组成的卷积神经网络,一层层搭建而成的。除了卷积层,还有激活层、池化层、BN层等。
每一个卷积层的后面,都会跟着一个激活层,在Resnet50中,激活函数用的是Relu激活函数。那为什么在神经网络中,每一层卷积后面都需要跟着一个激活函数呢?
敲黑板,划重点,为了,非线性。
我们都学过线性关系,最简单的 y = kx + b,画出来就是一条直线。这个函数就是一个线性函数,称 y 和 x 是线性关系。
如果这个时候,又有一个线性关系 z = hy + d,那么,可以通过如下的线性变换,得到变量 z 和 x 同样也是线性关系!
z = hy + d = h(kx+b) + d
= hkx + hb + d
= Ax + B
其中:A = hk, B = hb + d。
所以,不管有多少个线性关系,只要在数学上首尾相连,最终都可以等效成一个线性关系!
而在深度学习任务中,如分类任务,具有线性关系的模型其分类效果是不好的,甚至是很差的。
因为卷积算法是由大量的乘法和加法组成,所以,卷积算法也是线性的!
这就导致,由大量卷积算法组成的卷积神经网络(CNN),如果没有非线性因素的引入,会退化成一个简单的线性模型。
这就使得多层卷积失去了意义。比如,Resnet50网络中的50层卷积,就会退化为一个卷积。
而在神经网络中,使用多层卷积的一个重要目的,就是利用不同卷积核的大小,来抽取不同卷积核尺度下的图像特征。
因此,在神经网络设计时,在每层的卷积后面,都增加一个非线性函数,就可以完成两个卷积层的线性隔离,确保每个卷积层完成自己的卷积任务。
目前常见的激活函数,主要有Sigmoid、tanh、Relu等。Resnet50中的激活函数就是Relu。
下面主要介绍下这三个函数。
Sigmoid 函数的图像看起来像一个 S 形曲线。公式为:
f(z) = 1/(1+ e^-z)
Sigmoid 在神经网络中使用,是有一些优点的,主要体现在:
tanh激活函数的图像也是 S 形,表达式如下:
tanh 是一个双曲正切函数。tanh 函数和 sigmoid 函数的曲线相对相似。但是它比 sigmoid 函数更有一些优势。
首先,当输入比较大或者比较小时,函数的输出几乎是平滑的并且梯度较小,这不利于权重更新。二者的区别在于输出间隔,tanh 的输出间隔为 1,并且整个函数以 0 为中心,比 sigmoid 函数更好;
在 tanh 图中,负输入将被强映射为负,而零输入被映射为接近零。
ReLU激活函数图像如上图所示,函数表达式如下:
ReLU 函数是深度学习中较为流行的一种激活函数,相比于 sigmoid 函数和 tanh 函数,它具有如下优点:
当然,它也有缺点:
但是在反向传播过程中,如果输入负数,则梯度将完全为零,sigmoid 函数和 tanh 函数也具有相同的问题:我们发现 ReLU 函数的输出为 0 或正数,这意味着 ReLU 函数不是以 0 为中心的函数。
除了上面的3种激活函数之外,还有很多其他激活函数,比如Relu函数就有很多变种,如PRelu、LeakyRelu等。
每种激活函数,都在一种或几种特定的深度学习网络中有优势。
判断一个激活函数的好与坏,绝不仅仅是从函数的数学表达式上来判断,而是需要在实际的深度学习网络中不断地实验和实践,来找到最适合这个网络的激活函数。
总之,之所以在神经网络中添加激活函数,一个重要的原因是给网络模型增加非线性因素。
目前已有的激活函数有很多种,每种激活函数,不论从数学原理上还是从适用的AI模型上,都有各自的优缺点,需要根据网络特点和适用场景,进行实验,选择最适合这个模型的激活函数。
阅读量:1138
点赞量:0
收藏量:0