一般说“感知机”指的是“朴素感知机”,即使用阶跃函数为激活函数的单层感知机;
而“多层感知机”就是指神经网络,即使用sigmoid函数等平滑的激活函数的多层网络。

激活函数activation function:把输入信号的总和转换为输出信号的转换器。
它的关键在于如何去激活输入信号的总和。

(1)阶跃函数

h ( x ) = { 1 , x > 0 0 , x ≤ 0 h(x)=\left\{ \begin{aligned} 1,x>0\\ 0,x\leq0 \end{aligned} \right. h(x)={1,x>00,x≤0​

def step_function(x): # 参数x只能接收实数if x>0:return 1else:return 0
import numpy as np
import matplotlib.pylab as pltdef step_func(x): # 参数x可以接受numpy数组y = x > 0 # y是布尔型数组return y.astype(np.int)x = np.arange(-5., 5., .1)
y = step_func(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1) # y轴范围
plt.title('step function')
plt.show()


显然,阶跃函数的导数在绝大多数地方(除了0之外)的导数都是0。所以用它做激活函数的话,参数们的微小变化所引起的输出的变化就会直接被阶跃函数抹杀掉,在输出端完全体现不出来,训练时使用的损失函数的值就不会有任何变化,这是不利于训练过程的参数更新的。

(2)sigmoid

h ( x ) = 1 1 + e x p ( − x ) h(x)=\frac{1}{1+exp(-x)} h(x)=1+exp(−x)1​

import numpy as np
import matplotlib.pylab as pltdef step_func(x): # 参数x可以接受numpy数组y = x > 0 # y是布尔型数组return y.astype(np.int)def sigmoid(x):return 1 / (1 + np.exp(-x))x = np.arange(-5., 5., .1)
y1 = step_func(x)
y2 = sigmoid(x)
plt.plot(x,y1,linestyle='--',color='black')
plt.plot(x,y2,color='black')
plt.ylim(-0.1, 1.1) # y轴范围
plt.title('step function & sigmoid function')
plt.show()


step function 和sigmoid的相同点:

  • 都是非线性函数
  • 虽然平滑性不同,但宏观上看的形状是相似的,均为“输入小则输出接近0,输入大则输出接近1”
  • 输出均在0和1之间

step function 和sigmoid的不同点:

  • 导数

sigmoid函数的导数在任何地方都不为0。

而阶跃函数的导数在绝大多数地方(除了0之外)的导数都是0。

sigmoid函数的导数在任何地方都不为0。这对NN的学习非常重要。参数们的一点微小的变化也会引起输出的微小的连续的变化,从而使得损失函数可以连续地变化,从而使得参数的更新正常进行,使得NN的学习正确进行。

所以用它做激活函数的话,参数们的微小变化所引起的输出的变化就会直接被阶跃函数抹杀掉,在输出端完全体现不出来,训练时使用的损失函数的值就不会有任何变化,这是不利于训练过程的参数更新的。

  • 平滑性不同。sigmoid是平滑曲线,输出随输入连续变化。而阶跃函数的输出随着输入急剧性变化。sigmoid的这种平滑性对于NN的学习具有重要意义。
  • 阶跃函数只能返回0或1,而sigmoid可以返回0,1之间的实值。所以感知机中流动的是0,1二元信号,而NN中流动的是连续的实值信号。

(3)RELU(Rectified Linear Unit)

NN的历史上,sigmoid最早被使用。但relu最近用的更多。
h ( x ) = { x , x > 0 0 , x ≤ 0 h(x)=\left\{ \begin{aligned} x,x>0\\ 0,x\leq0 \end{aligned} \right. h(x)={x,x>00,x≤0​

def relu(x):return np.maximum(0,x)x = np.arange(-5., 5., .1)
y3 = relu(x)
plt.plot(x,y3,color='black')
plt.ylim(-0.1, 5) # y轴范围
plt.title('relu')
plt.show()

输出层的激活函数

(4)恒等函数(用于回归任务)

机器学习任务通常分为回归和分类两种任务。回归任务是要求出具体的预测值,所以输出层不再使用激活函数进行非线性转换,或者说使用恒等函数作为激活函数,它什么都没做。

def identity_function(x): # 恒等函数,用作回归任务的输出层的激活函数return x

(5)softmax(用于分类任务)

分类的类别数目等于输出层神经元的数目。

假设输出层有n个神经元,第k个的输出 y k y_k yk​:
y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) y_k=\frac{exp(a_k)}{\sum_{i=1}^nexp(a_i)} yk​=∑i=1n​exp(ai​)exp(ak​)​
分母是所有输入信号的指数函数的和,所以输出层的每个神经元都要受到所有输入信号的影响。

重要性质: ∑ k = 1 n y k = 1 \sum_{k=1}^ny_k=1 ∑k=1n​yk​=1. 这使得我们可以把softmax的输出解释为概率。

e: 纳皮尔常数 2.7182···

'''
# 这个实现虽然功能正确,但容易导致溢出
# 指数函数的运算容易出现很大的超出数值范围(4或8字节)的数字,如exp(1000)导致溢出overflow
# 推导发现,可以通过减去输入信号的最大值避免溢出,且结果不变
def softmax(a): # a是数组,包含所有的输入信号exp_a = np.exp(a)sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y'''


y k = e x p ( a k ) ∑ i = 1 n e x p ( a i ) = C e x p ( a k ) C ∑ i = 1 n e x p ( a i ) y_k=\frac{exp(a_k)}{\sum_{i=1}^nexp(a_i)}=\frac{Cexp(a_k)}{C\sum_{i=1}^nexp(a_i)} yk​=∑i=1n​exp(ai​)exp(ak​)​=C∑i=1n​exp(ai​)Cexp(ak​)​
= e x p ( a k + l o g C ) ∑ i = 1 n e x p ( a i + l o g C ) = e x p ( a k + C ′ ) ∑ i = 1 n e x p ( a i + C ′ ) =\frac{exp(a_k+logC)}{\sum_{i=1}^nexp(a_i+logC)}=\frac{exp(a_k+C')}{\sum_{i=1}^nexp(a_i+C')} =∑i=1n​exp(ai​+logC)exp(ak​+logC)​=∑i=1n​exp(ai​+C′)exp(ak​+C′)​
取 C ′ C' C′为输入信号的最大值,即可解决溢出问题

def softmax(a):c = np.max(a)exp_a = np.exp(a-c) # 防溢出sum_exp_a = np.sum(exp_a)y = exp_a / sum_exp_areturn y

激活函数(阶跃,sigmoid,relu,恒等,softmax)相关推荐

  1. ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function、sigmoid、softmax、ReLU等)求导函数等代码实现之详细攻略

    ML/DL之激活函数/求导函数:ML中常用的AF激活函数(step_function.sigmoid.softmax.ReLU等)&求导函数等代码实现之详细攻略 目录 AF函数&求导函 ...

  2. 激活函数(Relu,sigmoid,Tanh,softmax)详解

    目录 1 激活函数的定义 2 激活函数在深度学习中的作用 3 选取合适的激活函数对于神经网络有什么样的重要意义 4 常用激活函数 4.1 Relu 激活函数 4.2 sigmoid 激活函数 4.3 ...

  3. 激活函数:Sigmoid,Tanh,Softmax,Swish,Relu系列,GLU+GTU

    激活函数:Sigmoid,Tanh,Softmax,Swish,Relu系列,GLU+GTU 激活函数又称"非线性映射函数",是深度卷积神经网络中不可或缺的模块.可以说,深度网络模 ...

  4. 深度学习激活函数总结(sigmoid,tanh,ReLU,Leaky ReLU,EReLU,PReLU,Softmax,Swish,Maxout,Softplus)

    摘要 本文总结了深度学习领域最常见的10中激活函数(sigmoid.Tanh.ReLU.Leaky ReLU.ELU.PReLU.Softmax.Swith.Maxout.Softplus)及其优缺点 ...

  5. 激活函数详解(ReLU/Leaky ReLU/ELU/SELU/Swish/Maxout/Sigmoid/tanh)

    神经网络中使用激活函数来加入非线性因素,提高模型的表达能力. ReLU(Rectified Linear Unit,修正线性单元) 形式如下: ReLU公式近似推导:: 下面解释上述公式中的softp ...

  6. relu函数_【AI初识境】激活函数:从人工设计(sigmoid,relu)到自动搜索(swish)

    这是专栏<AI初识境>的第4篇文章.所谓初识,就是对相关技术有基本了解,掌握了基本的使用方法. 在神经网络中,有一个看似不起眼但是非常重要的概念,那就是激活函数.激活函数模型固然理解起来简 ...

  7. 神经网络激活函数汇总(Sigmoid、tanh、ReLU、LeakyReLU、pReLU、ELU、maxout)

    神经网络激活函数汇总(Sigmoid.tanh.ReLU.LeakyReLU.pReLU.ELU.maxout) 常规 sigmoid 和 tanh sigmoid 特点:可以解释,比如将0-1之间的 ...

  8. 17,18_常见函数梯度,激活函数梯度(Sigmoid、Tanh、ReLu)

    1. 常见函数梯度 1.1 常见函数 2. 激活函数及其梯度 2.1 激活函数 Derivative (倒数) Sigmoid / Logistic

  9. 激活函数σ、tanh、relu、Leakyrelu、LR_BP反向传播推导

    激活函数 1- SIgmoid 1-1 sigmoid导数 2- tanh 2-1 tanh函数导数 3- ReLU 4- LeakyReLu 5- LR 公式推导 Sigmoid.tanh.ReLU ...

  10. 信号与系统——阶跃信号与冲激信号

    我们在学习阶跃信号与冲激信号之前,我们首先要知道什么是奇异信号? 什么是奇异信号? 解释:函数本身有不连续点(跳变点)或其导数与积分有不连续点的一类函数统称为奇异信号或奇异函数.而我们下面所要介绍的单 ...

最新文章

  1. 创新方法系列 如何找联系 符号化就是找数学中的等于==关系,遇到等号请留意
  2. c语言:【顺序表】静态顺序表的初始化、打印、尾插、尾删
  3. (0060)iOS开发之iOS 9: UIStackView入门
  4. 计算机硬件的组装实践,毕业论文-计算机硬件组装实践.doc
  5. Centos7 安装 Elasticsearch7.10(不错可以试试)
  6. 手动删除oracle 归档文件,Oracle手动删除归档日志厚,出现ORA-19571错误
  7. SAP ABAP CDS view里的注解在ABAP后台是如何被解析的?
  8. 分享21个丰富多彩的 HTML5 小游戏
  9. 语义分割中的类别不平衡的权重计算
  10. 今天tiktok小社群更新 第5个项目行业案例
  11. 【OpenStack】OpenStack系列5之Cinder详解
  12. Ajax-图书管理系统数据提交
  13. Menu控件在IE8中子菜单不能正常显示的解决方案(转)
  14. 《直面苦难》--周国平
  15. 兼容 iOS retina 高清屏
  16. 其实我(微笑哥)是个正经男人!
  17. html的nofollow标签,nofollow标签两种使用方法及案例
  18. 【风控策略】通过查全率和查准率确定cutoff
  19. mysql failover_MySQL 8.0.22 新特性Async Replication Auto failover
  20. 已发送邮件如何撤回?

热门文章

  1. 机器学习 特征选择篇——python实现MIC(最大信息系数)计算
  2. 如何学习虚拟现实技术vr? vr初级入门教程开始
  3. python流量监控脚本
  4. linux命令:Linux命令大全
  5. 图象淡入淡出(VB6)
  6. 首次发布!中国四维发布国内首个干涉SAR商业卫星星座数据产品
  7. Bootstrap3的栅格化布局样式
  8. 理解js执行的过程:JS运行三部曲
  9. strtodate mysql_MySQL str_to_date()函数
  10. LintCode 1218. 补数 JavaScript算法