常见的激活函数有sigmoid、tanh和relu三种非线性函数,其数学表达式分别为:

  • sigmoid: y = 1/(1 + e-x)
  • tanh: y = (ex - e-x)/(ex + e-x)
  • relu: y = max(0, x)

  其代码实现如下:

import numpy as np
import matplotlib.pyplot as plt def sigmoid(x):
return 1 / (1 + np.exp(-x)) def tanh(x):
return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x)) def relu(x):
return np.maximum(0, x) x = np.arange(-5, 5, 0.1)
p1 = plt.subplot(311)
y = tanh(x)
p1.plot(x, y)
p1.set_title('tanh')
p1.axhline(ls='--', color='r')
p1.axvline(ls='--', color='r') p2 = plt.subplot(312)
y = sigmoid(x)
p2.plot(x, y)
p2.set_title('sigmoid')
p2.axhline(0.5, ls='--', color='r')
p2.axvline(ls='--', color='r') p3 = plt.subplot(313)
y = relu(x)
p3.plot(x, y)
p3.set_title('relu')
p3.axvline(ls='--', color='r') plt.subplots_adjust(hspace=1)
plt.show()

  其图形解释如下:

  相较而言,在隐藏层,tanh函数要优于sigmoid函数,可以认为是sigmoid的平移版本,优势在于其取值范围介于-1 ~ 1之间,数据的平均值为0,而不像sigmoid为0.5,有类似数据中心化的效果。

  但在输出层,sigmoid也许会优于tanh函数,原因在于你希望输出结果的概率落在0 ~ 1 之间,比如二元分类,sigmoid可作为输出层的激活函数。

  但实际应用中,特别是深层网络在训练时,tanh和sigmoid会在端值趋于饱和,造成训练速度减慢,故深层网络的激活函数默认大多采用relu函数,浅层网络可以采用sigmoid和tanh函数。

  另外有必要了解激活函数的求导公式,在反向传播中才知道是如何进行梯度下降。三个函数的求导结果及推理过程如下:

  1. sigmoid求导函数:

  其中,sigmoid函数定义为 y = 1/(1 + e-x)  = (1 + e-x)-1

  与此相关的基础求导公式:(xn)' = n * xn-1   和  (ex)= ex

  应用链式法则,其求导过程为:dy/dx = -1 * (1 + e-x)-2 * e-x * (-1)

                    =  e-x * (1 + e-x)-2

                    = (1 + e-x - 1) / (1 + e-x)2

                    = (1 + e-x)-1  -  (1 + e-x)-2 

                    = y - y

                    = y(1 -y)

2. tanh求导函数:

  其中,tanh函数定义为 y = (ex - e-x)/(ex + e-x)

  与此相关的基础求导公式:(u/v)= (uv - uv') / v2

  同样应用链式法则,其求导过程为:dy/dx = ( (ex - e-x)' * (ex + e-x) - (ex - e-x) * (ex + e-x)) / (ex + e-x)2

                      =  ( (ex - (-1) * e-x) * (ex + e-x) - (ex - e-x) * (ex + (-1) * e-x) ) / (ex + e-x)2   

                      =  ( (ex + e-x) -  (ex - e-x)2 ) / (ex + e-x)2

                      =  1 -  ( (ex - e-x)/(ex + e-x) )2

                      = 1 - y2

  3. relu求导函数:

  其中,relu函数定义为 y = max(0, x)

  可以简单推理出 当x <0 时,dy/dx = 0; 当 x >= 0时,dy/dx = 1

转自:https://www.cnblogs.com/hutao722/p/9732223.html

deep_learning_Activate_method的更多相关文章

随机推荐

  1. 学一学Transfomer

    017年,Google发表论文<Attention is All You Need>,提出经典网络结构Transformer,全部采用Attention结构的方式,代替了传统的Encode ...

  2. React Native实战一

    效果图如下所示: 展示列表页面,点击跳转至详情页面:     /** * Sample React Native App * https://github.com/facebook/react-nat ...

  3. Jenkins - Tips

    01 - RPM包安装方式 默认路径 配置文件:/etc/sysconfig/jenkins 日志文件:/var/log/jenkins/jenkins.log 执行文件:/usr/lib/jenki ...

  4. Mysql安装后在服务里找不到和服务启动不起来的解决方法

    一,在安装完Mysql数据库后,发现在控制面板->管理->服务中找不到Mysql的服务启动 解决方法如下:开启命令行,按照如下步骤即可: 1.进入到mysql的安装包,在bin里执行:my ...

  5. hbase增量和全量备份

    1.星期五全量备份星期四23:59:59的数据,星期一全量备份到星期日23:59:59的数据,其他的增量备份,备份前一天00:00:00  -  23:59:59的数据 * * /opt/prodfu ...

  6. mysql数据库之单表查询多表查询

    单表查询 前期表准备 create table emp( id int not null unique auto_increment, name varchar(20) not null, sex e ...

  7. C语言I—2019秋作业第一周作业

    1.你对软件工程专业或者计算机科学与技术专业了解是怎样? 软件工程专业是一门研究用工程化方法构建和维护有效的.实用的和高质量的软件的学科.它涉及到程序设计语言,数据库,软件开发工具,系统平台,标准,设 ...

  8. 基于JAVA Socket的底层原理分析及工具实现

    前言 在工作开始之前,我们先来了解一下Socket 所谓Socket,又被称作套接字,它是一个抽象层,简单来说就是存在于不同平台(os)的公共接口.学过网络的同学可以把它理解为基于传输TCP/IP协议 ...

  9. 【Python】【demo实验21】【练习实例】【求球反弹高度】

    原题: 一球从100米高度自由落下,每次落地后反跳回原高度的一半:再落下,求它在第10次落地时,共经过多少米?第10次反弹多高? 我的源码: #!/usr/bin/python # encoding= ...

  10. 什么是数据管理DMS

    数据管理(Data Management)支持MySQL.SQL Server.PostgreSQL.PPAS.Petadata等关系型数据库,DRDS等OLTP数据库,ADS.DLA等OLAP数据库 ...