Sigmoid函数

Sigmoid函数计算公式

sigmoid:x取值范围(-∞,+∞),值域是(0, 1)。

sigmoid函数求导

这是sigmoid函数的一个重要性质。

图像

代码

# -*- coding: utf-8 -*-
"""
@author: tom
"""import numpy
import math
import matplotlib.pyplot as pltdef sigmoid(x):a = []for item in x:a.append(1.0/(1.0 + math.exp(-item)))return ax = numpy.arange(-10, 10, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.show()

当x为0时,Sigmoid函数值为0.5。随着x的增大,对应的Sigmoid值将逼近于1;而随着x的减小,Sigmoid值将逼近于0。两种坐标尺度下的Sigmoid函数图。上图的横坐标为-5到5,这时的曲线变化较为平滑;下图横坐标的尺度足够大,可以看到,在x = 0点处Sigmoid函数看起来很像阶跃函数,如果横坐标刻度足够大(上图中的下图),Sigmoid函数看起来很像一个阶跃函数。

sigmoid函数的性质

  1. sigmoid函数是一个阀值函数,不管x取什么值,对应的sigmoid函数值总是0<sigmoid(x)<1。
  2. sigmoid函数严格单调递增,而且其反函数也单调递增
  3. sigmoid函数连续
  4. sigmoid函数光滑
  5. sigmoid函数关于点(0, 0.5)对称
  6. sigmoid函数的导数是以它本身为因变量的函数,即f(x)' = F(f(x))

sigmoid函数Logistic函数

对于分类问题,需要找到一个单调可微函数将真实值与广义线性回归模型的预测值联系起来,这个函数就是Logistic函数,或者称Sigmoid函数。(单位阶跃函数不连续,且瞬间跳跃的过程很难处理)

原因参考https://zhuanlan.zhihu.com/p/59137998

Logistic/Sigmoid函数是一个常见的S型函数,适合于提供概率的估计以及依据这些估计的二进制响应;由于其单调递增、反函数单调递增、任意阶可导等性质,且可以将变量映射到(0, 1)之间,在逻辑回归、神经网络中有着广泛的应用。

sigmod作为激活函数优缺点

优点:

  1. Sigmoid的取值范围在(0, 1),而且是单调递增,比较容易优化
  2. Sigmoid求导比较容易,可以直接推导得出。

缺点:

  1. Sigmoid函数收敛比较缓慢
  2. 容易饱和(就是梯度消失之后,使用BP算法优化时这个神经元没有变化)和终止梯度传递(“死神经元”);
  3. Sigmoid函数并不是以(0,0)为中心点

tanh函数(双曲正切函数)

tanh为双曲正切函数,过(0,0)点。相比Sigmoid函数,更倾向于用tanh函数

x取值范围(-∞,+∞),值域是(-1, 1)。

tanh求导

又因为


                                         

所以

即:

或者

tanh优缺点

优点:

  • 输出以(0,0)为中心、取值范围(-1~1)、易理解
  • 收敛速度相对于Sigmoid更快

缺点:

  • 该导数在正负饱和区的梯度都会接近于 0 值,会造成梯度消失。还有其更复杂的幂运算。

图像

代码

import math
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.axisartist as axisartist# Tanh 激活函数
class Tanh:       # 原函数 def forward(self, x):return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))# 导数def backward(self, outx):tanh = (np.exp(outx) - np.exp(-outx)) / (np.exp(outx) + np.exp(-outx))return 1 - math.pow(tanh, 2)# 画图
def Axis(fig, ax):#将绘图区对象添加到画布中fig.add_axes(ax)# 隐藏坐标抽ax.axis[:].set_visible(False)# new_floating_axis 创建新的坐标ax.axis["x"] = ax.new_floating_axis(0, 0)# 给 x 轴创建箭头线,大小为1.0ax.axis["x"].set_axisline_style("->", size = 1.0)# 给 x 轴箭头指向方向ax.axis["x"].set_axis_direction("top")# 同理,创建 y 轴ax.axis["y"] = ax.new_floating_axis(1, 0)ax.axis["y"].set_axisline_style("->", size = 1.0)ax.axis["y"].set_axis_direction("right")# 返回间隔均匀的100个样本,计算间隔为[start, stop]。
x =  np.linspace(-10, 10, 100)
y_forward = []
y_backward = []def get_list_forward(x):for i in range(len(x)):y_forward.append(Tanh().forward(x[i]))return y_forwarddef get_list_backward(x):for i in range(len(x)):y_backward.append(Tanh().backward(x[i]))return y_backwardy_forward = get_list_forward(x)
y_backward = get_list_backward(x)#创建画布
fig = plt.figure(figsize=(12, 12))#创建绘图对象ax
ax = axisartist.Subplot(fig, 111)
Axis(fig, ax)# 设置x, y轴范围
plt.ylim((-2, 2))
plt.xlim((-10, 10))# 原函数,forward function
plt.plot(x, y_forward, color='red', label='$f(x) = tanh(x)$')
plt.legend()# 导数, backward function
plt.plot(x, y_backward, label='f(x)\' = 1-(tanh)^2')
plt.legend()plt.show()

ReLU函数(The Rectified Linear Unit, 修正线性单元函数)

公式如下:

图形图像:对于输入的x以0为分界线,左侧的均为0,右侧的为y=x这条直线

优缺点

优点:

  1. 在SGD中收敛速度要比Sigmoid和tanh快很多
  2. 梯度求解公式简单,不会产生梯度消失和梯度爆炸
  3. 对神经网络可以使用稀疏表达
  4. 对于无监督学习,也能获得很好的效果

缺点:

  • 没有边界,可以使用变种ReLU: min(max(0,x), 6)
  • 比较脆弱,比较容易陷入出现”死神经元”的情况,比如我们设置一个特别大学习率,经过一次更新权重参数w之后,w对于后续所有的输入x的结果都小于0,这个时候再进过relu激活,输出还是0,就会造成这个ReLU神经元对后来来的输入永远都不会被激活,同时,在反向传播时,在计算这个神经元的梯度永远都会是0,造成不可逆的死亡。(解决方案:较小的学习率)

ReLU函数是从生物学角度,模拟出脑神经元接收信号更加准确的激活模型。相比于Sigmoid函数,具有以下优点:

  1. 单侧抑制;
  2. 相对宽阔的兴奋边界;
  3. 稀疏激活性;
  4. 更快的收敛速度;

Leaky ReLU激活函数:

在ReLU函数的基础上,对x≤0的部分进行修正;目的是为了解决ReLU激活函数中容易存在的”死神经元”情况的;不过实际场景中:效果不是太好。

ELU激活函数:

指数线性激活函数,同样属于对ReLU激活函数的x≤0部分的转换进行指数修正,而不是和Leaky ReLU中的线性修正。

Maxout激活函数:

参考:https://arxiv.org/pdf/1302.4389.pdf

可以看作是在深度学习网络中加入一层激活函数层,包含一个参数k,拟合能力特别强。特殊在于:增加了k个神经元进行激活,然后输出激活值最大的值。

优点:

  • 计算简单,不会出现神经元饱和的情况
  • 不容易出现死神经元的情况

缺点:

  • 参数double,计算量复杂了

激活值 out = f(W.X+b); f是激活函数。’.’在这里代表內积; 那么当我们对(i+1)层使用maxout(设定k=5)然后再输出的时候,情况就发生了改变

此时网络形式上就变成上面的样子,用公式表现出来就是:

  • z1 = W1.X+b1;
  • z2 = W2.X+b2;
  • z3 = W3.X+b3;
  • z4 = W4.X+b4;
  • z5 = W4.X+b5;
  • out = max(z1,z2,z3,z4,z5);

也就是说第(i+1)层的激活值计算了5次,可我们明明只需要1个激活值,那么我们该怎么办?其实上面的叙述中已经给出了答案,取这5者的最大值来作为最终的结果。

总结一下,maxout明显增加了网络的计算量,使得应用maxout的层的参数个数成k倍增加,原本只需要1组就可以,采用maxout之后就需要k倍了。

软饱和和硬饱和

假设h(x)是一个激活函数。

  1. 当我们的n趋近于正无穷,激活函数的导数趋近于0,那么我们称之为右饱和。
  2. 当我们的n趋近于负无穷,激活函数的导数趋近于0,那么我们称之为左饱和。
  3. 当一个函数既满足左饱和又满足右饱和的时候我们就称之为饱和,典型的函数有Sigmoid,Tanh函数。
  4. 对于任意的x,如果存在常数c,当x>c时,恒有=0,则称其为右硬饱和。如果对于任意的x,如果存在常数c,当x<c时,恒有=0,则称其为左硬饱和。既满足左硬饱和又满足右硬饱和的我们称这种函数为硬饱和。
  5. 对于任意的x,如果存在常数c,当x>c时,恒有趋近于0,则称其为右软饱和。如果对于任意的x,如果存在常数c,当x<c时,恒有趋近于0,则称其为左软饱和。既满足左软饱和又满足右软饱和的我们称这种函数为软饱和。

激活函数之 Sigmoid、tanh、ReLU、ReLU变形和Maxout相关推荐

  1. 激活函数总结sigmoid,tanh,relu,Leaky ReLU,RRelu,ELU,PRelu,SELU,swish

    本文总结深度学习的损失函数及其优缺点. 激活函数是深度学习模型的重要成分,目的是将线性输入转换为非线性.常见的激活函数有sigmoid,tanh,ReLU等 1.sigmoid Sigmoid 非线性 ...

  2. 深度学习激活函数可视化:tanh与relu的比较

    深度学习激活函数可视化:tanh与relu的比较 激活函数是神经网络中非常重要的组成部分,它可以将输入值映射到输出值,并为网络提供非线性性.其中,tanh和relu是两种常用的激活函数,它们在神经网络 ...

  3. 【Python--torch(激活函数说明+代码讲解)】激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh)

    [Python–torch]激活函数(sigmoid/softmax/ELU/ReLU/LeakyReLU/Tanh) 文章目录 [Python--torch]激活函数(sigmoid/softmax ...

  4. 【深度学习】激活函数:原理+常见激活函数(Sigmoid\Tanh\ReLU\Leaky ReLU\Softmax)

    首先需要知道为什么要引入激活函数:激活函数是用来加入非线性因素的,因为线性模型的表达能力不够.引入非线性激活函数,可使深层神经网络的表达能力更加强大. 在深度学习中,线性模型只需要简单的全连接层就能实 ...

  5. 激活函数-Sigmoid, Tanh及ReLU

    什么是激活函数 在神经网络中,我们会对所有的输入进行加权求和,之后我们会在对结果施加一个函数,这个函数就是我们所说的激活函数.如下图所示. 为什么使用激活函数 我们使用激活函数并不是真的激活什么,这只 ...

  6. 常用的激活函数汇总-Sigmoid, tanh, relu, elu

    激活函数(又叫激励函数,后面就全部统称为激活函数)是模型整个结构中的非线性扭曲力,神经网络的每层都会有一个激活函数.那他到底是什么,有什么作用?都有哪些常见的激活函数呢? 深度学习的基本原理就是基于人 ...

  7. 常用激活函数:Sigmoid/Softmax/ELU/ReLU/LeakyReLU/Tanh...(Pytorch)

    激活函数 一.Sigmoid 1.介绍 2.实例 二.Softmax 1.介绍 2.实例 三.ELU:指数线性单元函数 1.介绍 2.实例 四.ReLU:整流线性单元函数 1.介绍 2.实例 五.Re ...

  8. Sigmoid Tanh and Relu 原函数导函数图像python绘制

    import matplotlib.pyplot as plt import numpy as np plt.rcParams['font.family']='SimHei' plt.rcParams ...

  9. 【Deep Learning 三】神经网络中的非线性激活函数之间的优缺点:sigmoid、tanh、ReLu、Leaky ReLu...

    1 什么是激活函数? 激活函数,并不是去激活什么,而是指如何把"激活的神经元的特征"通过函数把特征保留并映射出来(保留特征,去除一些数据中是的冗余),这是神经网络能解决非线性问题关 ...

最新文章

  1. web页面的点对点复制粘贴
  2. Apache2.2+tomcat7 负载均衡配置
  3. Linux文件系统之文件的读写
  4. python获取excel某一列-Python 读取excel指定的列
  5. struts2教程--标签库详解
  6. 帧内16*16模式的宏块数据传输顺序
  7. Linux用ctrl + r 查找以前(历史)输入的命令
  8. 安卓手机状态栏 定位服务自动关闭_手机电池为什么会越用越不耐用
  9. Python 读入Excel表时如何判空NaN
  10. Python、Go、JavaScript、Rust 将长盛 5 年!
  11. (1)非对称加密——RSA——史上最通俗的小白可看懂!
  12. 一些常用的Maven命令的作用
  13. Android之notification通知无法点击打开APP问题解决
  14. CSS常用英语词汇大全
  15. 只有7步,就能将任何魔方6面还原
  16. 银行营销策略数据分析 - 智能定位
  17. 栈和队列的相同点和不同点
  18. 看完《奇葩说》,还有一个千亿级的市场故事可以说说
  19. Web全栈~38.Vue
  20. VMS和Windows NT的首席设计师大卫·卡特勒(David Cutler)

热门文章

  1. 超负荷写代码 = 慢性自杀
  2. C语言多维数组与多级指针
  3. Docker : Dockerfile 定制镜像
  4. ASP.NET MVC中controller和view相互传值的方式
  5. bootstrap 解决弹出窗口(modal) 常见问题
  6. linux gtest安装
  7. 新浪微博之XSS蠕虫脚本源码讲解
  8. MySQL 计算两个时间的差值
  9. think queue 消息队列初体验
  10. 转】MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码