几种激活函数的详解及代码实现:sigmoid()、softmax()、tanh()、relu()、leaky_relu()

75 篇文章 2 订阅
66 篇文章 5 订阅
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

1.sigmoid()函数

# Sigmoid函数常被用作神经网络的激活函数,将变量映射到0,1之间
# 除了输出层是一个二元分类问题外,基本不用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()

2.softmax()函数

# softmax用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类
def softmax(a):
    exp_a = np.exp(a)
    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()

3.tanh()函数

# 双曲正切激活函数
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()

4.relu()函数

# 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()

5.leaky_relu()函数


def leaky_relu(x):
    return np.where(x<0,0.1*x,x)

绘制曲线:

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

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

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

返回元素:可以是x或y,具体取决于条件(condition)
如果condition为True,则产生x,否则产生y。
如果只给出条件,则返回condition.nonzero()

补充:Sigmod(x)的缺点:

1.输出范围在0~1之间,均值为0.5,需要做数据偏移,不方便下一层的学习。

2.当x很小或很大时,存在导数很小的情况。另外,神经网络主要的训练方法是BP算法,BP算法的基础是导数的链式法则,
也就是多个导数的乘积。而sigmoid的导数最大为0.25,多个小于等于0.25的数值相乘,
其运算结果很小。随着神经网络层数的加深,梯度后向传播到浅层网络时,基本无法引起参数的扰动,
也就是没有将loss的信息传递到浅层网络,这样网络就无法训练学习了。这就是所谓的梯度消失。

Sigmod(x)和tanh(x)都有一个缺点:在深层网络的学习中容易出现梯度消失,造成学习无法进行

针对sigmod和tanh的缺点,提出了ReLU函数 

补充: ReLu函数简介

ReLu函数:

修正线性单元(Rectified linear unit,ReLU)是神经网络中最常用的激活函数。它保留了 step 函数的生物学启发(只有输入超出阈值时神经元才激活),
但是只有当输入为正的时候,导数不为零,才允许基于梯度的学习(尽管在 x=0 的时候,导数是未定义的)。
使用这个函数能使计算变得很快,因为无论是函数还是其导数都不包含复杂的数学运算。
当输入为负值的时候,ReLU 的学习速度可能会变得很慢,甚至使神经元直接无效,因为此时输入小于零而梯度为零,
从而其权重无法得到更新,在剩下的训练过程中会一直保持静默。

ReLu激活函数的优点是:

1.相比Sigmoid/tanh函数,使用梯度下降(GD)法时,收敛速度更快

2.相比Sigmoid/tanh函数,Relu只需要一个门限值,即可以得到激活值,计算速度更快

缺点是:

Relu的输入值为负的时候,输出始终为0,其一阶导数也始终为0,这样会导致神经元不能更新参数,此时神经元也不会继续学习了

为了解决Relu函数这个缺点,在Relu函数的负半区间引入一个泄露(Leaky)值,所以称为Leaky Relu函数

补充:Leaky Relu函数

Leaky Relu函数:

带泄露修正线性单元(Leaky ReLU)函数是经典(以及广泛使用的)的ReLu激活函数的变体,该函数输出对负值输入有很小的坡度。
由于导数总是不为零,这能减少静默神经元的出现,允许基于梯度的学习(虽然会很慢),解决了Relu函数进入负区间后,导致神经元不学习的问题。

1.Leaky ReLU函数比ReLU函数效果好,但实际中Leaky ReLU并没有ReLU用的多。
2.Leaky ReLU函数类似于ReLU函数,能解决深度神经网络(层数非常多)的“梯度消失”问题,浅层神经网络(三五层那种)才用sigmoid 作为激活函数。
2.它能加快收敛速度。
  • 5
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值