首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

入门必看!一文读懂神经网络中的激活函数(二)

看看深度学习之激活函数

本篇接着上一篇推文入门《必看!从零开始了解到训练神经网络(一)》,在介绍完神经网络的基本原理和结构之后,继续介绍神经网络中的关键之一 —— 激活函数。

树根这一部分会给大家通俗讲一下激活函数的概念,原理以及作用,还有实际应用中各种激活函数的优缺点。因为激活函数本身就是一种数学函数,推文中出现数学公式在所难免,但是树根力求讲得通俗清晰,让初学者都能读懂,轻松入门深度学习。

1

感知机 Percrptron

Activation Function

感知机由Rosenblatt于1957年提出,是一个经典的二分类的线性分类器。对每一个输入w⋅x+b ,到输出 f(x) 的函数为:

f(x)=sign(w⋅x+b)

称为感知机。其中,参数w叫做权值向量weight,b称为偏置bias,w*b 表示w和x的点积,这些树根在之前也已经说了。sign为符号函数,即:

因此感知机会把输入分类为+1或者-1两类。放上一张图大家就懂了:

我们的输入为实例样本的特征(上图中分别为x1和x2),输出为实例的类别(上图实例分为两类,蓝色取+1,红色取-1)。

而感知机,就是上图中把实例样本划分为+1或-1两类的那条直线,即 w*x+b=0 。感知机旨在求出该直线,怎么求那条直线呢?类似于树根之前介绍神经网络时那样,引入了基于误分类的损失函数,利用梯度下降法 ,对损失函数进行最优化。

如上图,我们在二维的平面空间里,线性分类器是一条直线,那么假如是一个三维的立体空间呢?那么线性分类器就是一个平面,在大于三个维度的空间进行实例样本的分类呢,所求的线性分类器就是一个超平面(hyperplane)(我们看不见大于三维的空间,这里只能靠大家的想象了2333)

其实接触过机器学习的朋友都觉得以上内容很熟悉,对的,这部分内容和SVM支持向量机的基本原理是一样的。因此,感知机其实是神经网络和支持向量机的基础(树根有时间会给大家讲一下SVM支持向量机的原理和应用)。

但是怎么处理非线性不可分的实例样本呢?也许有些朋友会说,可以采用多个感知机,用很多条直线进行组合,获得更强的平面分类能力不就得了。

还有没有更加好的方法呢?

2

有激活函数的神经网络

Activation Function

我们在神经网络每一层神经元做完线性变换(SUM)以后,加上一个非线性激励函数(f)对线性变换的结果进行转换,那么输出(t)就是一个不折不扣的非线性函数了,如图所示:

拓展到多个神经元的情况,在每一个神经元的后面加上一个非线性的激活函数,输出就变成了一个复杂的非线性函数了:

而怎么样的函数能作为激活函数呢?这里树根认真复习了李飞飞还有吴恩达还有一些大牛的论文,总结出激活函数的一些特点:

(1)非线性,这点不用我多说了,直白的说就是提供网络的非线性建模能力,“让神经网络具备强大的拟合能力”。

(2)几乎处处可导(可微):当优化方法是基于梯度的时候,这个性质是必须的,也就是具备光滑性。保证了在优化中梯度的可计算性。对于分段线性函数比如ReLU,只满足几乎处处可微(在原点处不可微),这个激活函数树根等等会详细介绍。

(3)计算简单:激活函数在神经网络前向的计算次数与神经元的个数成正比,神经元越多,计算次数越多。因此简单的非线性函数自然更适合用作激活函数(这点谷歌大脑也有论文证实了)。

(4)接近恒等变换f(x)≈x:这样的好处是使得输出的幅值不会随着深度的增加而发生显著的增加,从而使网络更为稳定,同时梯度也能够更容易地回传。这个与非线性是有点矛盾的,因此激活函数基本只是部分满足这个条件。

(5)参数少:大部分激活函数都是没有参数的。

(6)单调性:即一阶导数符号不变。这个性质大部分激活函数都有。个人理解为,单调性使得在反向传播的时候,激活函数处的梯度方向不会经常改变,从而让训练更容易收敛。

(7)输出范围有限:有限的输出范围使得网络对于一些比较大的输入也会有稳定的输出,这也是为什么早期的激活函数都以此类函数为主,如Sigmoid、TanH。但这导致了前面提到的梯度消失问题,而且强行让每一层的输出限制到固定范围会限制其表达能力。

树根大概能理解的关于激活函数的特点可能会有错漏的地方,欢迎大家来补充和纠正。在我们大概理解了怎么样的函数能作为激活函数,接下来我们就来看看常见的激活函数有哪些。

3

常见的激活函数

Activation Function

下面是常见的激活函数的图示及其一阶导数的示意图(蓝线是函数,橙线是其导数),所有的激活函数一共有26个,这里由于篇幅问题,树根就不一一列举出来了,仅仅是列举几个最常用的激活函数,但是在日常的实践中已经够用了。

1.Sigmoid

数学形式:

Sigmoid 因其在 logistic 回归中的重要地位而被人熟知,值域在 0 到 1 之间。Logistic Sigmoid(或者按通常的叫法,Sigmoid)激活函数给神经网络引进了概率的概念(用于多分类的Softmax函数)。它的导数是非零的,并且很容易计算(是其初始输出的函数)。然而,在分类任务中,sigmoid 正逐渐被 Tanh 函数取代作为标准的激活函数。

sigmoid 函数曾经被使用的很多,不过近年来,用它的人越来越少了。主要是因为它的一些 缺点(基于李飞飞的CS231n课程):

(1) Sigmoids saturate and kill gradients: 该函数存在饱和性(saturation)和梯度消失问题(vanishing gradient problem)。我们看图像可以知道,该函数的导数(向量形式称为梯度)在x取很大或者很小的时候,是接近于0的。回忆一下,在反向传播的时候,这个梯度将会与整个损失函数关于该神经元输出的梯度相乘。因此,如果激活函数的梯度非常小,那么相乘的结果也会接近零,这会有效地“杀死”梯度,这会导致网络变的很难进行学习。

(2)Sigmoid函数的输出不是零中心的(Zero-centered)。首先熟悉微积分的可以手算一下,该函数的导数为:sigmoid * (1 - sigmoid),如果输入x都是正数,那么sigmoid的输出y在[0.5,1]。那么sigmoid的梯度 = [0.5, 1] * (1 - [0.5, 1]) ~= [0, 0.5] 总是 > 0的。假设最后整个神经网络的输出是正数,最后 w 的梯度就是正数;反之,假如输入全是负数,w 的梯度就是负数。

这样的梯度造成的问题就是,优化过程呈现“之字形”(zig-zag),因为你的 w 要么只能往下走(负数),要么只能往右走(正的),导致优化的效率十分低下。

2.Tanh

数学表达:

在分类任务中,双曲正切函数(Tanh)逐渐取代 Sigmoid 函数作为标准的激活函数,其具有很多神经网络所钟爱的特征。它是完全可微分的,反对称,对称中心在原点。为了解决学习缓慢和/或梯度消失问题,可以使用这个函数的更加平缓的变体(log-log、softsign、symmetrical sigmoid 等等)

在实际应用中,tanh的效果几乎都比sigmoid好,这一点吴恩达也说了。假如不是二分类问题,一般是采用tanh取代sigmoid。它将实数值压缩到[-1,1]之间。和sigmoid神经元一样,它也存在饱和性问题,但是和sigmoid神经元不同的是,它的输出是零中心的,因此收敛会比sigmoid快。因此,在实际操作中,tanh非线性函数比sigmoid非线性函数更受欢迎。

3.ReLU

数学表达式:

f(x) = max (0, x)

在近些年ReLU(修正线性单元)变得非常流行。在介绍ReLU之前,我们再稍微提一下梯度不稳定的问题。在深层的神经网络中,后面层的梯度是前面层的累积的乘积,所以只要梯度稍微大于1或者小于1,神经网络都会非常不稳定,通常有多层后, 每层网络都以非常不同的速率学习。

怎么解决这个梯度不稳定问题呢?我们可以让激活函数的梯度刚好等于1。

ReLu解决了vanishing gradient的问题,至少在正区间内,神经元不会饱和了。值得注意的是,在原点该函数是不存在导数的(左导数为0,右导数为1,左右导数不相等故导数不存在,连续不一定可导)。但是不必担心,在实际训练中,出现完全为0的样本的概率是非常低的,这点并不会影响训练。

其次,ReLU 在x0时导数为 1,所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。但随着训练的推进,部分输入会落入硬饱和区,导致对应权重无法更新。这种现象被称为“神经元死亡”。

第三,一般来说,ReLU仅限于作为隐藏层的激活函数,不会用来放在输出层。但是假如你想预测房价,样本不存在负数的情况下,也许可以考虑ReLU。

4.softmax

树根在之前的推文已经说过了,softmax函数用于多分类神经网络输出,数学表达式为:

5.Leaky ReLU

数学表达式:

f(x) = max(0.01x, x)

经典(以及广泛使用的)ReLU 激活函数的变体,带泄露修正线性单元(Leaky ReLU),输出对负值输入有很小的坡度。由于导数总是不为零,这能减少死神经元的出现,允许负值输入基于梯度的学习(虽然会很慢)。

值得一说的是,这里提到了这个0.01可以是任意数值,可以作为类似于学习率这样的超参数进行调整

还有其他的激活函数,比如PReLU、Maxout、ELU等等,树根就不介绍了,但是以上都是神经网络训练中比较常用的几个激活函数。那么我们该怎么选择适合的激活函数呢?

4

激活函数的选择

Activation Function

(1)用于分类器时,Sigmoid函数及其组合通常效果更好。当然了解LSTM模型的朋友也知道Sigmoid函数会用于“遗忘门”。但是其他情况下,由于梯度消失问题,要尽量避免使用sigmoid函数(和tanh函数)。

(2)ReLU函数是一个通用的激活函数,目前在大多数情况下使用。

一点经验(来自吴恩达和其他大牛):你可以从ReLU函数开始,如果ReLU函数没有提供最优结果,再尝试tanh激活函数,万不得已,不要去试sigmoid函数。

感谢阅读

--欢迎后台调戏聊天机器人--

树根精选原创TOP

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20171222G0DDD300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券