四个激活函数

激活函数

首先要了解神经网络的基本模型。
单一神经元模型如下图所示。
在这里插入图片描述

神经网络中的每个神经元节点接受上一层神经元的输出值作为本神经元的输入值,并将输入值传递给下一层,输入层神经元节点会将输入属性值直接传递给下一层(隐层或输出层)。在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数(又称激励函数)。

引用激活函数的目的:使深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。

一、 Sigmoid 函数

sigmoid基本性质

(该函数是将取值为 (−∞,+∞) 的数映射到 (0,1) 之间。)

优点:在特征相差比较复杂或是相差不是特别大时效果比较好。

缺点:当 z 值非常大或者非常小时,sigmoid函数的导数 g′(z) 将接近 0 。这会导致权重 W 的梯度将接近 0 ,使得梯度更新十分缓慢,即梯度消失。
sigmoid函数可用在网络最后一层,作为输出层进行二分类,尽量不要使用在隐藏层

Sigmoid函数是一个在生物学中常见的S型函数,也称为S型生长曲线。在信息科学中,由于其单增以及反函数单增等性质,Sigmoid函数常被用作神经网络的阈值函数,将变量映射到0,1之间 。公式如下:
在这里插入图片描述
基本性质:
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

# Sigmoid函数常被用作神经网络的激活函数,将变量映射到0,1之间
# 除了输出层是一个二元分类问题外,基本不用Sigmoid函数
# sigmoid函数
def sigmoid(x):
    y = 1/(1+np.exp(-x))
    return y
# 曲线绘制
X = np.arange(-5, 5, 0.1)
y = sigmoid(X)
plt.plot(X, y)
plt.ylim(-0.1, 1.1)
plt.scatter(0,0.5,marker='*',c='r') # 标记
plt.show()

在这里插入图片描述

二、softmax(用于多分类过程中)

它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类。
假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是
在这里插入图片描述
在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标。

import numpy as np
import matplotlib.pyplot as plt

# softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类
def softmax(a):
    exp_a = np.exp(a)# 代表的是e的i次方
    sum_exp_a = np.sum(exp_a)# 加和
    return exp_a/sum_exp_a

X = np.arange(-5, 5, 0.1)
y = softmax(X)
plt.plot(X, y)
plt.show()

在这里插入图片描述

三、tanh函数

该函数是将取值为 (−∞,+∞) 的数映射到 (−1,1) 之间。
在这里插入图片描述
优点:tanh函数在 0 附近很短一段区域内可看做线性的。由于tanh函数均值为 0 ,因此弥补了sigmoid函数均值为 0.5 的缺点。
缺点:当 z 很大或很小时,g′(z) 接近于 0 ,会导致梯度很小,权重更新非常缓慢,即梯度消失问题。

在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt

# 双曲正切激活函数
def tanh(x):
    y = (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
    return y

X = np.arange(-5, 5, 0.1)
y = tanh(X)
plt.plot(X, y)
plt.scatter(0,0,marker='^',c='r')
plt.show()

在这里插入图片描述

四、Relu函数

是一种分段线性函数,其弥补了sigmoid函数以及tanh函数的梯度消失问题

在这里插入图片描述
这里的 α 是一个很小的常数。这样,即修正了数据分布,又保留了一些负轴的值,使得负轴信息不会全部丢失。

优点:1)在输入为正数的时候(对于大多数输入 z 空间来说),不存在梯度消失问题。
  2)计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)
缺点:当输入为负时,梯度为0,会产生梯度消失问题。

P-ReLU

Parametric ReLU 对于 Leaky ReLU 中的α ,通常都是通过先验知识人工赋值,可以观察到损失函数对α的导数是可以求得的,可以将它作为一个参数进行训练。

在这里插入图片描述

R-ReLU(是Leaky ReLU的随机版本)

Randomized Leaky ReLU 是 Leaky ReLU 的随机版本(α 是随机选取)。 核心思想就是,在训练过程中,α 是从一个高斯分布U ( l , u ) 中随机出来的,然后在测试过程中进行修正(与Dropout的用法相似)。

优点:

1.Leaky ReLU函数比ReLU函数效果好,但实际中Leaky ReLU并没有ReLU用的多。
2.Leaky ReLU函数类似于ReLU函数,能解决深度神经网络(层数非常多)的“梯度消失”问题,浅层神经网络(三五层那种)才用sigmoid 作为激活函数。
3.它能加快收敛速度。

E-ReLU

Exponential ReLU 是指数线性单元,表达式为:
在这里插入图片描述

ELU也是为解决ReLU存在的问题而提出,
1.ELU有ReLU的基本所有优点
2.不会有Dead ReLU问题
3.输出的均值接近0,zero-centered
缺点:计算量稍大

import numpy as np
import matplotlib.pyplot as plt

# relu():线性整流函数(Rectified Linear Unit, ReLU)
# 又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。
# Relu是最常用的默认激活函数,若不确定用哪个激活函数,就使用Relu或者Leaky Relu

def relu(x):
    return np.where(x<0,0,x)

X = np.arange(-5, 5, 0.1)
y=relu(X)
plt.plot(X, y)
plt.show()

补充:numpy.where()函数的用法

numpy.where(condition[,x,y])

返回元素:可以是x或y,具体取决于条件(condition)
如果condition为True,则产生x,否则产生y。
如果只给出条件,则返回condition.nonzero()
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值