Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习基础知识(一)--激活函数

深度学习基础知识(一)--激活函数

原创
作者头像
languageX
发布于 2022-05-04 08:16:09
发布于 2022-05-04 08:16:09
4.7K10
代码可运行
举报
文章被收录于专栏:计算机视觉CV计算机视觉CV
运行总次数:0
代码可运行

激活函数的意义

在神经网络中加入激活函数存在的意义就是为网络增加非线性因素,比如全卷积神经网络,不加入激活函数,就是一堆线性操作矩阵运算,对于复杂任务仅用线性操作而不用复杂的函数表示肯定效果不会好。

最常用来举例的图

上图中的分类问题,左图可以用线性函数解决,中间靠线性函数就不能解决,需要右图的非线性函数来解决。这就是我们要在网络中加入激活函数增加非线性因素的原因,解决线性模型无法解决的问题。

在分析具体激活函数前,我们先了解一些基础概念。

梯度消失(vanishing gradient)和爆炸(exploding gradient)

根据深度学习中参数更新,采用梯度下降策略会运用反向传播,而由于深度学习中网络层数肯定不止一层,根据链式求导法则,我们对浅层参数的求导会有一个连乘操作,前面层的梯度是来自于后面层梯度的乘积。

如果网络层中多层的梯度均大于1,穿过多层后求出的梯度更新会以指数形式增加(前面层的更新速度远远快于后面层)就属于梯度爆炸现象;反之如果多层梯度均小于1,前面层的更新速度远低于后面层,更新特缓慢,那么就属于梯度消失现象。

梯度消失和梯度爆炸均会引起训练不稳定。

zero-centered

很多地方会提出希望网络层的输入是zero-centered零均值化的,包括数据预处理我们也通常会讲输入数据进行一个归一化,那么数据以0为中心有什么好处呢?

为了加速参数收敛。

假设我们的网络定义为:

代码语言:txt
AI代码解释
复制
                                                     `$f(x;w,b) = f(w_0 x_0+w_1 x_1+b)$` 

假设,参数 的最优解 , 需要满足条件

也就是希望参数的梯度是反方向,也就是x0和x1符号相反。如果数据是零均值化,就能走下图中蓝色快速收敛方向;否则如果同大于0或者同小于0就出现了zig zag path,一个折线图,收敛缓慢。

常用激活函数

下面来介绍常用的各种激活函数以及优缺点~

sigmoid

sigmoid目前在网络层中使用的比较少,但是在分类问题特别是二分类,多标签分类的输出层是还是会经常使用的。

sigmoid函数:

sigmoid求导:

具体求导过程不详细介绍了:https://www.jianshu.com/p/0182ae2ad5f5

sigmoid曲线图
sigmoid曲线图

通过函数曲线看出,sigmoid取值范围是0,1,所以他可以在分类问题的输出层使用。

现在在网络中间层不太使用sigmoid作为激活函数主要原因是存在如下几个缺点:

  1. 计算量大,公式内有个指数函数,反向传播求导数还带个除法
  2. 容易出现梯度消失,从曲线看在左右端导数很平缓趋于0,学不到深层网络层的信息
  3. 输出不是zero-centered,因为sigmoid的输出一直都是正值,会让本层的输出均为正或者均为负,在寻找最优解时会走一个折线(zigzag现象),降低了收敛速度。所以在训练过程中对输入最好时能zero-centered。

softmax

softmax也是将输出归一化到0,1之间,所有元素的和累加起来等于1。可以直接当作概率对待,一般用在分类问题的输出层。

softmax公式,i分量的向量的softmax公式为:

偏导数不详细介绍,可参考https://zhuanlan.zhihu.com/p/105722023

softmax曲线
softmax曲线

tanh

tanh 其实算sigmoid的变形

公式为:

导数公式:

tanh曲线
tanh曲线

通过曲线可以看出,tanh解决了sigmoid的zero-centered问题,但是梯度消失和计算量的问题还存在。

relu(rectifier linear unit)

relu目前是比较主流的激活函数,扔掉一部分神经元的输出,让网络稀疏,可以一定程度防止过拟合。而且计算简单(relu并不是处处可导,0点有特殊处理)。

relu公式:

relu的优势是计算很简单,不存在梯度消失的问题。而且从生物学角度,通常神经元真正被激活在同一时间大概只有4%,relu可以抑制激活。

relu的缺点是它并不是zero-centered的,而且单侧抑制对于某些神经元可能一直都不会被激活,如果初始化不好或者恰好输入都到了负数部分,可能导致网络均不被激活参数无法学习。这种现象叫Dead ReLU Problem。

有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

relu曲线
relu曲线

relu6

如果对relu不加限制,其输出值就是0到正无穷大。relu6就是在relu的基础上增加一个抑制最大值,当x>6时,其导数也为0.

公式:

relu6曲线
relu6曲线

leaky relu

leaky relu和relu的区别是,relu是将所有的负值都设为零,Leaky ReLU是给负值赋予一个非零斜率。

leaky relu公式:

leaky relu的好处就是可以解决relu的神经元死亡问题,在反向传播时,对于输入小于零的部分,也可以计算得到梯度。

leaky_relu曲线
leaky_relu曲线

R-Relu和P-Relu

R-Relu(随机修正线性单元)和P-Relu(参数化修正线性单元)都是leaky relu的变体。RRelu是对leaky relu的参数进行随机取值,随机取值能够对优化带来一定的随机性,随机噪声能够帮助参数取值跳出局部最优;而PPelu时将作为学习参数,通过数据进行学习得到。

elu(exponential linear unit)

ELU融合了sigmoid和relu。它的输出均值接近于零,所以收敛速度更快。左侧单边饱和,可以更好的收敛。但是elu也有个缺点就是,计算量较大,包含了指数计算。

elu公式:

elu求导:

softplus

softplus公式

按照论文的说法,一开始想要使用一个指数函数(天然正数)作为激活函数来回归,但是到后期梯度实在太大,难以训练,于是加了一个log来减缓上升趋势。加了1是为了保证非负性。和relu一样不会有梯度饱和问题,缺点是和sigmoid一样计算量大。

softplus曲线
softplus曲线

swish

swish是谷歌大脑提出的,其公式:

求导公式

和 ReLU 一样,Swish 无上界有下界。与 ReLU 不同的是,Swish 是平滑且非单调的函数。

swish曲线
swish曲线

h-swish

通过公式可以看出swish的计算量也很大,h-swish是使用relu6来近似swish,如下图

h-swish公式
h-swish公式
hswish曲线
hswish曲线

代码实现

最后列举下常用激活函数的代码实现:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def linear(x,k=1):
    """
    linear activation

    公式: y = kx

    """
    y = k*x
    return y


def sigmoid(x, derivative=False):
    """
    sigmoid activation

    公式: y = \frac{1}{e^(-x) + 1} = \frac{e^x}{e^x + 1}
    导数公式: sigmoid*(1-sigmoid)

    """
    y =  1/(1+np.exp(-x))
    if derivative:
        return y*(1-y)
    return y



def tanh(x, derivative=True):
    """
    tanh activation

    公式: y =  {{e^{2x} - 1} \over {e^{2x} + 1}}.

    """
    y =  (np.exp(2*x)-1)/(np.exp(2*x)+1)
    if derivative:
        return 1-y*y
    return y


def softmax(x):
    """
    relu activation

    公式: y = \frac{e^x}{sum(e^x)}

    """
    exp_x = np.exp(x)

    y = exp_x / np.sum(exp_x)
    return y


def relu(x):
    """
    relu activation

    公式: y = max(0,x)

    """
    y = np.where(x > 0, x, 0)
    return y

def relu6(x):
    """
    relu activation

    公式: `{\rm min}({\rm max}(x, 0), 6)`

    """
    maxx = np.where(x > 0, x, 0)
    return np.where(maxx < 6, maxx, 6)

def leaky_relu(x, alpha=0.5):
    """
    leaky relu activation

    公式: y = max(alpha * x, x)

    """
    y =  np.where(x < 0, alpha * x, x)
    return y


def elu(x):
    """
    leaky elu activation

    公式:  y = \left\{ {\begin{array}{*{20}{c}}{x,\;\;\;\;\;\;\;\;\;x \ge 0}\\{{e^x} - 1,\;\;\;x < 0}\end{array}} \right..

    """
    return np.where(x < 0, np.exp(x) - 1, x)
    return y

def swish(x, beta=1.0):
    """
    swish
    x * sigmoid(beta*x)

    公式: :`y = x\cdot {\rm sigmoid}(\beta x) = {e^{(\beta x)} \over {e^{(\beta x)} + 1}} \cdot x`

    """

    ex = np.exp(beta * x)

    return (ex / (ex + 1)) * x

def softplus(x):
    """
    swish: `log(exp(x) + 1)`.

    公式: `{\rm log}(e^x + 1)`

    """

    return np.log(np.exp(x) + 1)

def hswish(x):
    """
    h-swish:

    公式: x*relu6(x+3)/6

    """

    return x*(relu6(x+3))/6

后续持续更新...

参考:

https://liam.page/2018/04/17/zero-centered-active-function/

https://zhuanlan.zhihu.com/p/25110450

https://www.cnblogs.com/shiliuxinya/p/12244519.html

https://zhuanlan.zhihu.com/p/172254089

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
文章很好,说明的很详细! 开源地址 http://github.crmeb.net/u/lsq
文章很好,说明的很详细! 开源地址 http://github.crmeb.net/u/lsq
回复回复1举报
推荐阅读
编辑精选文章
换一批
神经网络中常见的激活函数
深度学习中已经成为了人工智能领域的必备工具,源于人工神经网络的研究,含多个隐藏层的多层感知器就是一种深度学习结构。寻找隐藏层的权重参数和偏置的过程,就是常说的“学习”过程,其遵循的基本原则就是使得网络最终的输出误差最小化。在神经⽹络中,激活函数是必须选择的众多参数之⼀,从而使神经⽹络获得最优的结果和性能。
半吊子全栈工匠
2022/12/03
1.9K0
神经网络中常见的激活函数
深度学习基础知识(四)--- 激活函数
激活函数也就是一些非线性单元,如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
TeeyoHuang
2020/02/14
9160
深度学习基础知识(四)--- 激活函数
8个深度学习中常用的激活函数
当在隐藏层和输出层中实现时,激活函数的选择非常关键。模型的准确性和损失很大程度上依赖于激活函数。此外,必须根据您对模型的期望来选择它们。例如,在二值分类问题中,sigmoid函数是一种最优选择。
deephub
2021/07/01
6780
Swish和H-Swish激活函数:提升模型训练效率
在深度学习领域,激活函数是神经网络中的关键组成部分,它决定了网络的输出和性能。近年来,研究人员提出了许多新的激活函数,其中Swish激活函数因其独特的性能优势而备受关注。这种函数在2017年被重新发现,并被认为是Swish函数的一个变体。Swish函数不仅性能卓越,还能有效缓解梯度消失问题,因此在神经网络中得到了广泛应用。
用户3578099
2024/04/30
2K0
Swish和H-Swish激活函数:提升模型训练效率
深度学习4大激活函数
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出实际上都是上层输入的线性函数。
皮大大
2023/08/25
4110
深度学习4大激活函数
激活函数 | 深度学习领域最常用的10个激活函数,详解数学原理及优缺点
激活函数是神经网络模型重要的组成部分,今天分享从激活函数的数学原理出发,详解了十种激活函数的优缺点。
计算机视觉研究院
2021/03/13
34K0
深度学习: 激活函数 (Activation Functions)
激活函数(activation function)层又称 非线性映射 (non-linearity mapping) 层,作用是 增加整个网络的非线性(即 表达能力 或 抽象能力)。
JNingWei
2018/09/27
3K0
深度学习: 激活函数 (Activation Functions)
梯度消失问题与如何选择激活函数
当我们在做反向传播,计算损失函数对权重的梯度时,随着越向后传播,梯度变得越来越小,这就意味着在网络的前面一些层的神经元,会比后面的训练的要慢很多,甚至不会变化。
杨熹
2018/08/03
9740
梯度消失问题与如何选择激活函数
神经网络中的激活函数具体是什么?为什么ReLu要好过于tanh和sigmoid function?
为什么引入激活函数? 如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。 正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络就有意义了(不再是输入的线性组合,可以逼近任意函数)。最早的想法是sigmoid函数或者tanh函数,输出有界,很容易充当下一层输入(以及一些人的生物解释balabala)。
机器学习AI算法工程
2018/03/15
3K0
神经网络中的激活函数具体是什么?为什么ReLu要好过于tanh和sigmoid function?
【深度学习】神经网络为何非激活函数不可?
激活函数是神经网络中一个至关重要的概念,决定了某个神经元是否被激活,判断该神经元获得的信息是否有用,并决定该保留还是该去掉此神经元。
zenRRan
2020/02/18
1.2K0
入门 | 一文概览深度学习中的激活函数
选自Learn OpenCV 机器之心编译 参与:路雪、蒋思源 本文从激活函数的背景知识开始介绍,重点讲解了不同类型的非线性激活函数:Sigmoid、Tanh、ReLU、LReLU、PReLU、Swish,并详细介绍了这些函数的优缺点。 本文介绍了多种激活函数,并且对比了激活函数的优劣。本文假设你对人工神经网络(AAN)有基本了解,如果没有,推荐先阅读机器之心介绍过的相关文章: 神经网络快速入门:什么是多层感知器和反向传播? DNN 概述论文:详解前馈、卷积和循环神经网络技术 1. 什么是激活函数? 生物神
机器之心
2018/05/10
9180
【激活函数合集】盘点当前最流行的激活函数及选择经验
在阅读DarkNet源码的时候发现作者定义了大量从古至今流行的损失函数,本着科普的态度我打算做一个全面的总结,所以就有了这篇文章。
BBuf
2020/02/26
2.9K0
AI知识点(1)--激活函数
激活函数是神经网络中非常重要的一个内容,神经网络是受到生物神经网络的启发,在生物神经网络中也存在着激活函数,而且激活函数决定了神经元之间是否要传递信号,而在人工的神经网络中,激活函数的作用则主要是给网络添加非线性因素,使得网络可以逼近任意复杂的函数,一个简单的神经元如下图所说,其中 f 表示的就是激活函数。
kbsc13
2019/12/31
1.3K0
AI知识点(1)--激活函数
【深度大白话】——曲则全,谈谈深度学习中的激活函数
如上图所示,激活函数(Activation Function)是在人工神经网络神经元上运行的函数,负责将神经元的输入映射到输出。激活函数为人工神经网络引入非线性因素,可以让人工神经网络模型更好的去学习、理解非常复杂的非线性关系。
Dendi
2019/12/04
1.3K1
【深度大白话】——曲则全,谈谈深度学习中的激活函数
五万字总结,深度学习基础。「建议收藏」
人工神经网络(Artificial Neural Networks,简写为ANNs)是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的,并具有自学习和自适应的能力。神经网络类型众多,其中最为重要的是多层感知机。为了详细地描述神经网络,我们先从最简单的神经网络说起。
全栈程序员站长
2022/08/31
1K0
五万字总结,深度学习基础。「建议收藏」
6 种激活函数核心知识点,请务必掌握!
我们知道,神经网络模型中,各隐藏层、包括输出层都需要激活函数(Activation Function)。我们比较熟悉的、常用的激活函数也有 ReLU、Sigmoid 等等。但是,对于各个激活函数的选取方法、区别特点还有几点需要特别注意的地方。今天红色石头就和大家一起来总结一下常用激活函数 Sigmoid、tanh、ReLU、Leaky ReLU、ELU、Maxout 的关键知识点。
红色石头
2022/01/12
3940
6 种激活函数核心知识点,请务必掌握!
一文讲透神经网络的激活函数
原理上来说,神经网络模型的训练过程其实就是拟合一个数据分布(x)可以映射到输出(y)的数学函数,即 y= f(x)。
算法进阶
2022/06/02
7550
一文讲透神经网络的激活函数
深度学习中常见激活函数的原理和特点
前面一些分享文章提到了激活函数,这篇文章将介绍各种激活函数,下一篇将分享我和同事在业务中对激活函数的一些思考与应用。
自学气象人
2023/06/20
1.3K0
深度学习中常见激活函数的原理和特点
激活函数其实并不简单:最新的激活函数如何选择?
如今,机器学习领域的科学进步速度是前所未有的。除非局限在一个狭窄的细分市场,否则要跟上时代的步伐是相当困难的。每天都有新论文出现并声称自己取得了一些最先进的成果。但是这些新发现中的大多数从来没有成为默认的首选方法,有时是因为它们没有最初希望的那么好,有时只是因为它们最终在新进展的洪流中崩溃了。
deephub
2021/09/15
1.3K0
激活函数其实并不简单:最新的激活函数如何选择?
42个激活函数的全面总结
2015 年 11 月,wikipedia的用户 Laughinthestocks 首次引入了“激活函数表”。从那时开始到现在,维基百科页面已经发生了 391 次更改。在本文中,我通过自己写的一个程序来挖掘截至 2022 年 4 月 22 日时维基百科页面历史中的每个唯一激活函数。本文还提供了针对激活函数的适当研究论文的附加链接,如果没有或者在无法找到特定研究论文的情况下,提供了相关的相关论文。
deephub
2022/06/04
5410
42个激活函数的全面总结
推荐阅读
相关推荐
神经网络中常见的激活函数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验