深度学习(激活函数)

欢迎大家关注我的B站:

偷吃薯片的Zheng同学的个人空间-偷吃薯片的Zheng同学个人主页-哔哩哔哩视频 (bilibili.com)

目录

1 神经元的一般模型

​ 2 激活函数的特点

3 常见激活函数

3.1 sigmoid及其改进型

3.1.1 sigmoid介绍

3.1.2 sigmoid的导数介绍

3.1.3 Mesh

3.1.4 swish

3.2 relu及其改进型

3.2.1 relu 介绍

3.2.2 relu的导数介绍

 3.2.3 Leaky relu

3.2.4 Prelu

3.2.5 ELU 

4 软饱和硬饱和

5 激活函数的选择


1 神经元的一般模型

一个基本的架构就是多个输入通过不同权重求加权和并加上偏置,这得到的结果通过一个非线性函数就得到了该神经元的输出。而这个非线性函数就是我们要讨论的激活函数

 2 激活函数的特点

(1)激活函数一般是非线性的,这样多层神经网络就能拟合出各种想要的函数

(2)优化器一般采用梯度下降去更新参数,因此要求激活函数可导

(3)激活函数单调,使得优化问题变成凸优化问题,使全局最优解易得,防止陷入局部极值

(4)满足有界性能够使较大的负输入问题得到解决,同时解决过拟合问题

(5)结构简单,为了计算量小,训练速度快,函数形式不能过于复杂

(6)当参数初始化为随机小值时,f (x) 近似等于 x,神经网络更稳定

3 常见激活函数

3.1 sigmoid及其改进型

3.1.1 sigmoid介绍

\sigma (x)=\frac{1}{1+e^{-x}}

优点:sigmoid 函数是平滑的,输入输出连续变化,易求导。同时范围限制在 0~1 之间,相当于做了一个归一化。   

缺点:存在幂运算,计算量大,训练耗时。容易产生梯度消失

下面是Python定义 sigmoid 的代码

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
fig = plt.figure()
plt.plot(x, y)
plt.show()

3.1.2 sigmoid的导数介绍

下面是Python定义 sigmoid 的一阶导数的代码

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
y = y*(1-y)
fig = plt.figure()
plt.plot(x, y)
plt.show()

 sigmoid 的一阶导数范围在 0~0.25 之间,链式求导往往是多层导数相乘,由于是小于1 的数多次相乘,梯度将像指数那样趋近于零,会产生梯度消失的问题。

3.1.3 Mesh

f(x)=x*tanh(log(1+e^{x}))

下面是Python定义 Mesh 的代码

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = 1 / (1 + np.exp(-x))
fig = plt.figure()
plt.plot(x, y)
plt.show()

3.1.4 swish

f(x)=x*sigmoid(\beta x)

下面是Python定义 swish 的代码

import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10,10,50)
y = x / (1 + np.exp(-beta*x))
fig = plt.figure()
plt.plot(x, y)
plt.show()

beta 是个可训练的参数或固定的常数。

3.2 relu及其改进型

3.2.1 relu 介绍

f(x)=\begin{cases} x& x\geq 0 \\ 0&x< 0 \end{cases}

优点:relu 在正输入时是线性的,收敛速度快,计算速度快,同时符合恒等性的特点。当输入为正时,由于导数是1 ,能够完整传递梯度,不存在梯度消失的问题。

缺点:relu 在小于0的时候梯度为零,导致了某些神经元永远被抑制,最终造成特征的学习不充分。这是典型的 Dead relu 问题,所以需要改进随机初始化,避免将过多的负数特征送入relu。relu的输出为0或正数,说明relu不是以 0 为中心的函数。

下面是Python定义 relu 的代码

x = np.linspace(-10,10,50)
y = np.zeros(x.shape)
for i,v in enumerate(x):
    if v >= 0:
        y[i] = v
    else:
        y[i] = 0
fig = plt.figure()
plt.plot(x, y)
plt.show()

3.2.2 relu的导数介绍

下面是Python定义 relu 的一阶导数的代码

x = np.linspace(-10,10,50)
y = np.zeros(x.shape)
for i,v in enumerate(x):
    if v >= 0:
        y[i] = 1
    else:
        y[i] = 0
fig = plt.figure()
plt.plot(x, y)
plt.show()

 3.2.3 Leaky relu

f(x)=\begin{cases} x& x\geq 0 \\ \lambda x& x< 0 \end{cases} \qquad\lambda \in(0,1)

下面是Python定义 Leaky relu 的一阶导数的代码

import numpy as np
import matplotlib.pyplot as plt
x1 = np.linspace(-10,10,50)
y1 = np.zeros(shape = x1.shape[0])
for i,v in enumerate(x1):
    if v > 0:
        y1[i] = v
    else:
        y1[i] = 0.1*v

fig = plt.figure()
plt.plot(x1, y1)
plt.show()

 理论上 Leaky relu 继承了relu的大多数优点,同时解决了 Dead relu 的问题,但是实际实验中并没有优于relu。

3.2.4 Prelu

f(x)=\begin{cases} x& x\geq 0 \\ a_{i}*x & x< 0 \end{cases}

ai为可学习的参数,如果ai=0,则退化为relu,若ai恒定则退化为 Leaky relu。

3.2.5 ELU 

f(x)=\begin{cases} x& x\geq 0 \\ a*(e^{x}-1)& x< 0 \end{cases}

融合了sigmoid 与 relu,左侧有软饱和性,右侧无饱和性,抗干扰能力强。

4 软饱和硬饱和

5 激活函数的选择

对于初学者,激活函数的选择有如下建议

(1)选择relu

(2)学习率设置较小

(3)初始参数符合正态分布

 

对于进阶者,对激活函数的选择需要考虑很多因素,详情参考为神经网络选择正确的激活函数_deephub的博客-CSDN博客_神经网络回归问题用什么激活函数

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

无意2121

创作不易,多多支持

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

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

打赏作者

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

抵扣说明:

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

余额充值