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

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

原创
作者头像
languageX
发布于 2022-05-04 08:16:09
发布于 2022-05-04 08:16:09
4.7K00
代码可运行
举报
文章被收录于专栏:计算机视觉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)$` 

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

也就是希望参数的梯度是反方向,也就是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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
前端开发常见面试题,有参考答案
JavaScript中的map不会对为null或者undefined的数据进行处理,而React.Children.map中的map可以处理React.Children为null或者undefined的情况。
ccAllen23
2022/07/27
1.4K0
react高频面试题总结(一)
那为什么会有这样的限制呢?Hooks 的设计初衷是为了改进 React 组件的开发模式。在旧有的开发模式下遇到了三个问题。
helloworld1024
2022/08/02
1.4K0
前端一面常考react面试题
相同点: 组件是 React 可复用的最小代码片段,它们会返回要在页面中渲染的 React 元素。也正因为组件是 React 的最小编码单位,所以无论是函数组件还是类组件,在使用方式和最终呈现效果上都是完全一致的。
beifeng1996
2023/01/05
1.3K0
字节前端二面react面试题(边面边更)_2023-03-13
在一个组件传入的props更新时重新渲染该组件常用的方法是在componentWillReceiveProps中将新的props更新到组件的state中(这种state被成为派生状态(Derived State)),从而实现重新渲染。React 16.3中还引入了一个新的钩子函数getDerivedStateFromProps来专门实现这一需求。
用户10358021
2023/03/13
1.8K0
React面试八股文(第二期)
React.forwardRef 会创建一个React组件,这个组件能够将其接受的 ref 属性转发到其组件树下的另一个组件中。这种技术并不常见,但在以下两种场景中特别有用:
beifeng1996
2022/10/19
1.7K0
2021前端react面试题汇总
(2)区别 Redux更多的是遵循Flux模式的一种实现,是一个 JavaScript库,它关注点主要是以下几方面∶
zz1998
2021/09/24
2.4K0
20道高频react面试题(附答案)
在调用 super() 方法之前,子类构造函数无法使用this引用,ES6 子类也是如此。
beifeng1996
2022/09/16
1.3K0
前端面试指南之React篇(一)
关于 React16 开始应用的新生命周期: 可以看出,React16 自上而下地对生命周期做了另一种维度的解读:
beifeng1996
2022/11/02
7670
美团前端react面试题汇总
服务端渲染是数据与模版组成的html,即 HTML = 数据 + 模版。将组件或页面通过服务器生成html字符串,再发送到浏览器,最后将静态标记"混合"为客户端上完全交互的应用程序。页面没使用服务渲染,当请求页面时,返回的body里为空,之后执行js将html结构注入到body里,结合css显示出来;
goClient1992
2022/09/13
5.3K0
滴滴前端高频react面试题总结
当调用 setState时, React做的第一件事是将传递给setState的对象合并到组件的当前状态,这将启动一个称为和解( reconciliation)的过程。
flyzz177
2022/09/14
4K0
百度前端高频react面试题(持续更新中)_2023-02-27
2. 尽量不要在 componentWillReviceProps 里使用 setState,如果一定要使用,那么需要判断结束条件,不然会出现无限重渲染,导致页面崩溃
用户10358021
2023/02/27
2.5K0
react-redux 开发实践与学习分享
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/j_bleach/article/details/78070539
j_bleach
2019/07/02
9830
react-redux 开发实践与学习分享
我的react面试题笔记整理(附答案)
组件状态数据或者属性数据发生更新的时候,组件会进入存在期,视图会渲染更新。在生命周期方法 should ComponentUpdate中,允许选择退出某些组件(和它们的子组件)的和解过程。
beifeng1996
2022/11/15
1.3K0
React高频面试题合集(二)
虚拟 DOM (VDOM)是真实 DOM 在内存中的表示。UI 的表示形式保存在内存中,并与实际的 DOM 同步。这是一个发生在渲染函数被调用和元素在屏幕上显示之间的步骤,整个过程被称为调和。
helloworld1024
2022/08/02
1.4K0
这些react面试题你会吗,反正我回答的不好
第二个参数是一个函数,该函数会在 setState函数调用完成并且组件开始重渲染时调用,可以用该函数来监听渲染是否完成。
beifeng1996
2022/09/24
1.2K0
前端工程师的20道react面试题自检
Fiber 是 React 16 中新的协调引擎或重新实现核心算法。它的主要目标是支持虚拟DOM的增量渲染。React Fiber 的目标是提高其在动画、布局、手势、暂停、中止或重用等方面的适用性,并为不同类型的更新分配优先级,以及新的并发原语。
beifeng1996
2022/11/08
9780
React总结概括
react的功能其实很单一,主要负责渲染的功能,现有的框架,比如angular是一个大而全的框架,用了angular几乎就不需要用其他工具辅助配合,但是react不一样,他只负责ui渲染,想要做好一个项目,往往需要其他库和工具的配合,比如用redux来管理数据,react-router管理路由,react已经全面拥抱es6,所以es6也得掌握,webpack就算是不会配置也要会用,要想提高性能,需要按需加载,immutable.js也得用上,还有单元测试。。。。
杨永贞
2020/08/04
1.2K0
你要的 React 面试知识点,都在这了
React是流行的javascript框架之一,在2019年及以后将会更加流行。React于2013年首次发布,多年来广受欢迎。它是一个声明性的、基于组件的、用于构建用户界面的高效javascript库。
前端小智@大迁世界
2019/06/15
18.9K0
写给自己的react面试题总结
每个React组件强制要求必须有一个 render()。它返回一个 React 元素,是原生 DOM 组件的表示。如果需要渲染多个 HTML 元素,则必须将它们组合在一个封闭标记内,例如 <form>、<group>、<div> 等。此函数必须保持纯净,即必须每次调用时都返回相同的结果。
beifeng1996
2022/09/22
1.8K0
高频react面试题自检
展示组件关心组件看起来是什么。展示专门通过 props 接受数据和回调,并且几乎不会有自身的状态,但当展示组件拥有自身的状态时,通常也只关心 UI 状态而不是数据的状态。
beifeng1996
2022/11/14
8990
相关推荐
前端开发常见面试题,有参考答案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验