深度学习的激活函数(包含绘图代码)


1.为什么使用激活函数?

  提高神经网络的非线性表示能力。如果不使用非线性的激活函数,那么在神经网络中每一层的输出都是上一层输入的线性表示。那么即使不断增加网络的深度也还是线性映射,难以模拟实际模型的非线性情形。引入非线性的激活函数,使得神经网络可以逼近非线性模型。

2.常用激活函数

(1)sigmoid函数

  表达式: f ( x ) = s i g m o i d ( x ) = 1 1 + e − x f(x)=sigmoid(x)=\frac{1}{1+e^{-x}} f(x)=sigmoid(x)=1+ex1

  函数图像如下:
      在这里插入图片描述

  绘图代码如下:

%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(-10, 10, 0.01)
y = 1.0 / (1 + np.power(np.e, -x))
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim((-10, 10))
plt.ylim((-0.1, 1.1))
plt.vlines(0, -0.1, 1.1, colors='r')
plt.hlines(0, -10, 10, colors='r')
plt.plot(x, y)
plt.savefig("sigmoid.jpg")
plt.show()

  sigmoid的导函数为: f ′ ( x ) = e − x ( 1 + e − x ) 2 = f ( x ) ( 1 − f ( x ) ) f^{'}(x)=\frac{e^{-x}}{(1+e^{-x})^2}=f(x)(1-f(x)) f(x)=(1+ex)2ex=f(x)(1f(x))

  其函数图像为:
     在这里插入图片描述

x = np.arange(-10, 10, 0.01)
y = np.power(np.e, -x) / ((1 + np.power(np.e, -x)) ** 2)
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f‘(x)')
plt.xlim((-10, 10))
plt.ylim((-0.1, 0.25))
plt.vlines(0, -0.1, 0.25, colors='r')
plt.hlines(0, -10, 10, colors='r')
plt.plot(x, y)
plt.savefig("sigmoid_derivative.jpg")
plt.show()

优点:
  (1)函数的值域为[0, 1],这使得它对每个神经元的输出进行了归一化。
  (2)由于概率的取值范围为[0, 1],sigmoid适合用于将预测概率作为输出的模型。
  (3)梯度平滑,避免“跳跃”的输出值。
  (4)函数是可微的,这意味着可以找到任意两个点的sigmoid曲线的斜率。
缺点:
  (1)sigmoid含有幂运算和除法运算,计算量大。
  (2)反向传播时,易出现梯度消失的情况。
  (3)函数输出不是以0为中心的,这会降低权重更新的效率。


(2)tanh双曲正切函数

  表达式: f ( x ) = t a n h ( x ) = e x − e − x e x + e − x = 2 1 + e − 2 x − 1 f(x)=tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=\frac{2}{1+e^{-2x}}-1 f(x)=tanh(x)=ex+exexex=1+e2x21

  函数图像如下:
     在这里插入图片描述

x = np.arange(-10, 10, 0.01)
y = 2.0 / (1 + np.power(np.e, -2 * x)) - 1
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim((-10, 10))
plt.ylim((-1.1, 1.1))
plt.vlines(0, -1.1, 1.1, colors='r')
plt.hlines(0, -10, 10, colors='r')
plt.plot(x, y)
plt.savefig("tangh.jpg")
plt.show()

tanh函数的导函数为:

   f ′ ( x ) = 1 − t a n h 2 ( x ) f^{'}(x)=1-tanh^{2}(x) f(x)=1tanh2(x)

其函数图像为:
     在这里插入图片描述

x = np.arange(-10, 10, 0.01)
y = 2.0 / (1 + np.power(np.e, -2 * x)) - 1
y = 1 - y ** 2
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim((-10, 10))
plt.ylim((-0.1, 1.1))
plt.vlines(0, -0.1, 1.1, colors='r')
plt.hlines(0, -10, 10, colors='r')
plt.plot(x, y)
plt.savefig("tangh_derivative.jpg")
plt.show()

与sigmoid函数相比:

  (1)当输入较大或较小时,输出几乎是平滑的并且梯度较小,这不利于权重更新。tanh函数以0为中心,使其收敛速度比sigmoid快,减少迭代次数。
  (2)负输入将强映射为负,零输入被映射为接近零。

注意:
  (1)tanh函数也不能避免梯度消失问题。
  (2)在一般的二分类问题中,tanh函数用于隐藏层,而sigmoid函数用于输出层。但这并不是固定的,需具体问题具体分析。


(3)ReLU函数

  表达式: f ( x ) = r e l u ( x ) = m a x ( x , 0 ) f(x)=relu(x)=max(x,0) f(x)=relu(x)=max(x,0)

  函数图像如下:
     在这里插入图片描述

x = np.arange(-10, 10, 0.01)
y = np.where(x < 0, 0, x)
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim((-10, 10))
plt.ylim((-0.1, 10.1))
plt.vlines(0, -0.1, 10.1, colors='r')
plt.hlines(0, -10, 10, colors='r')
plt.plot(x, y)
plt.savefig("relu.jpg")
plt.show()

优点:
  (1)计算量小,计算速度快。
  (2)激活函数导数维持在1,可以有效缓解梯度消失和梯度爆炸等问题。
  (3)使用Relu会使部分神经元为0,这样就造成了网络的稀疏性,并且减少了参数之间的相互依赖关系,缓解了过拟合问题的发生。

缺点:
  (1)输入激活函数值为负数的时候,会使得输出为0,那么这个神经元在后面的训练迭代的梯度就永远是0了(由反向传播公式推导可得),参数w得不到更新,也就是这个神经元死掉了。这种情况在你将学习率设得较大时(网络训练刚开始时)很容易发生(波浪线一不小心就拐到负数区域了,然后就拐不回来了)。
  (2)ReLU的输出为0或正数,这意味着ReLU函数不是以0为中心的函数。


(4)Leaky ReLU函数

  表达式: f ( x ) = l e a k y r e l u ( x ) = m a x ( α x , x ) f(x)=leaky_relu(x)=max(\alpha x, x) f(x)=leakyrelu(x)=max(αx,x)

  函数图像如下:
     在这里插入图片描述

x = np.arange(-10, 10, 0.01)
a = 0.01
y = np.where(x < 0, a * x, x)
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim((-10, 10))
plt.ylim((-1.1, 10.1))
plt.vlines(0, -1.1, 10.1, colors='r')
plt.hlines(0, -10, 10, colors='r')
plt.plot(x, y)
plt.savefig("leaky_relu.jpg")
plt.show()

相比于ReLU函数:
  1.Leaky ReLU通过把x的非常小的线性分量赋予负输入来避免梯度消失的问题。
  2.Leaky 有利于扩大ReLU函数的范围,通常取 α = 0.01 \alpha=0.01 α=0.01


(5)ELU函数

  表达式: f ( x ) = e l u ( x , α ) = { α ( e x − 1 ) x < 0 x x ≥ 0 f(x)=elu(x,\alpha)=\begin{cases} \alpha (e^{x}-1) & x < 0 \\ x & x \geq 0 \end{cases} f(x)=elu(x,α)={α(ex1)xx<0x0

  函数图像如下:
     在这里插入图片描述

x = np.arange(-5, 5, 0.01)
a = 0.1
y = np.where(x < 0, a * (np.power(np.e, x) - 1), x)
plt.grid(True, linestyle='-.')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.xlim((-5, 5))
plt.ylim((-1.1, 5.1))
plt.vlines(0, -1.1, 5.1, colors='r')
plt.hlines(0, -5, 5, colors='r')
plt.plot(x, y)
plt.savefig("elu.jpg")
plt.show()

  ELU的提出解决了ReLU的问题,与ReLU相比,ELU有负值,这会使激活的平均值接近于0,均值激活接近于0可以使学习更快,因为他们使梯度更接近自然梯度。

  ELU具有ReLU的所有优点,除此之外
  1.没有Dead ReLU问题,输出的平均值接近0,以0为中心;
  2.ELU通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;
  3.ELU在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。


 (6)PReLU(Parametric ReLU)函数

  表达式: f ( x ) = P R e L U ( x ) = { α ∗ x x < 0 x x > 0 f(x)=PReLU(x)=\begin{cases} \alpha * x & x < 0 \\ x & x>0 \end{cases} f(x)=PReLU(x)={αxxx<0x>0

注意:PReLU和Leaky ReLU的区别在于PreLU的 α \alpha α是一个可学习参数。

PreLU的优点如下:

  1.在负值域,PreLU的斜率较小,这也可以避免Dead ReLU问题。
  2.与ELU相比,PreLU在负值域是线性运算,尽管斜率很小,但是不会趋于0。


7.Softmax函数

 表达式: f ( x i ) = s o f t m a x ( x i ) = x i ∑ j = 0 n x j f(x_i)=softmax(x_i)=\frac{x_i}{\sum_{j=0}^{n}x_j} f(xi)=softmax(xi)=j=0nxjxi

  Softmax是用于多类分类问题的激活函数,在多类分类问题中,多于两个类标签需要类成员关系。对于长度为K的任意实向量,Softmax可以将其压缩为长度为K,值在(0, 1)之间,并且向量中元素总和为1的向量。

  Softmax与正常的max函数不同:max函数仅输出最大值,但Softmax确保较小值有较小的概率,并且不会直接丢弃。Softmax函数的分母结合了原始输出的所有因子,这意味着Softmax函数获得的概率彼此相关。

Softmax函数的主要缺点是:

  1.在零点不可微;
  2.负输入的梯度为零,这意味着对于该区域的激活,权重不会再反向传播期间更新,因此会产生永不激活的死亡神经元。


8.Swish函数

  表达式: y = x ∗ s i g m o i d ( β x ) y = x * sigmoid(\beta x) y=xsigmoid(βx)
   β 是 个 常 数 或 可 训 练 的 参 数 。 S w i s h 具 备 无 上 界 有 下 界 、 平 滑 、 非 单 调 的 特 性 。 \beta是个常数或可训练的参数。Swish具备无上界有下界、平滑、非单调的特性。 βSwish

  函数图像如下:
     
注:蓝色为 β = 0.1 \beta = 0.1 β=0.1,黄色为 β = 1.0 \beta=1.0 β=1.0,绿色为 β = 10.0 \beta=10.0 β=10.0

Swish激活函数的主要优点如下:

  1.无界性有利于防止慢速训练期间,梯度逐渐接近0并导致饱和;同时,有界性也是有优势的,因为有界激活函数可以具有很强的正则化,并且较大的负输入问题也能解决。
  2.导数恒大于0。
  3.平滑度在优化和泛化中起了重要作用。

参考:
  深度学习中常用的激活函数详解
  深度学习中的激活函数
  深度学习中常用的激活函数
  激活函数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值