经典激活函数代码实现—relu、sigmoid、tanh、softplus、softmax

经典激活函数

relu、softplus、tanh、sigmoid、softmax

reLU

线性整流函数(Rectified Linear Unit, ReLU)
f ( x ) = m a x ( 0 , x ) f(x) = max(0,x) f(x)=max(0,x)
而在神经网络中,Relu作为神经元的激活函数,定义了该神经元在线性变换 w x + b wx+b wx+b之后的非线性输出结果。换言之,对于进入神经元的来自上一层神经网络的输入向量,使用线性整流激活函数的神经元会输出

softplus

SoftPlus是ReLU函数的平滑近似,可用于将网络的输出约束为始终为正。

f ( x ) = log ⁡ ( 1 + e x ) f(x) = \log (1 + {e^x}) f(x)=log(1+ex)
它的导数是sigmoid
f ′ ( x ) = 1 1 + e − x f'(x) = \frac{1}{{1 + {e^{ - x}}}} f(x)=1+ex1
在这里插入图片描述

tanh

双曲正切函数(hyperbolic tangent function)是双曲函数的一种,经常简写为tanh,双曲正切函数(tanh)是双曲正弦函数(sinh)与双曲余弦函数(cosh)的比值,其形式为:
tanh ⁡ x = sinh ⁡ x cosh ⁡ x = e x − e − x e x + e − x \tanh x = \frac{{\sinh x}}{{\cosh x}} = \frac{{{e^x} - {e^{ - x}}}}{{{e^x} + {e^{ - x}}}} tanhx=coshxsinhx=ex+exexex
双曲的导数是双曲余弦的平方的倒数,即
( tanh ⁡ x ) ′ = 1 cosh ⁡ 2 x (\tanh x)' = \frac{1}{{{{\cosh }^2}x}} (tanhx)=cosh2x1

sigmoid

也被称为Logistic函数,用于隐层神经元输出,取值范围为(0,1),它可以将一个实数映射到(0,1)的区间,可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。Sigmoid作为激活函数有以下优缺点:
优点:平滑、易于求导。
缺点:激活函数计算量大,反向传播求误差梯度时,求导涉及除法;反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。

f ( x ) = 1 1 + e − x f(x) = \frac{1}{{1 + {e^{ - x}}}} f(x)=1+ex1
尤其!!
f ′ ( x ) = e − x ( 1 + e − x ) 2 = f ( x ) ( 1 − f ( x ) ) f'(x) = \frac{{{e^{ - x}}}}{{{{(1 + {e^{ - x}})}^2}}} = f(x)(1 - f(x)) f(x)=(1+ex)2ex=f(x)(1f(x))

softmax

归一化指数函数
f ( x ) j = e x j ∑ k = 1 K e z k f(x)_j = \frac{e^{x_j}}{\sum_{k=1}^K e^{z_k}} f(x)j=k=1Kezkexj
在这里插入图片描述
如果某一个 x j x_j xj 大过其他 x x x, 那这个映射的分量就逼近于 1,其他就逼近于 0,主要应用就是多分类。
为什么要取指数:
第一个原因是要模拟 max 的行为,所以要让大的更大。第二个原因是需要一个可导的函数

Softmax 和 Sigmoid区别:

(1)分类问题

  • sigmoid将一个real value映射到(0,1)的区间,用来做二分类。
  • softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成(b1,b2,b3,b4….)其中 bi是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi的概率大小来进行多分类的任务。

(2)回归问题

  • softmax是sigmoid的扩展,当类别数 k=2 时,softmax 回归退化为 logistic 回归。

(3) 模型基于的分布不同

  • softmax建模使用的分布是多项式分布,而logistic则基于伯努利分布
  • 多个logistic回归通过叠加也同样可以实现多分类的效果,但是softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即”苹果”这个词语既属于”水果”类也属于”3C”类别。

代码实现


import torch
import torch.nn.functional as F
from torch.autograd import Variable
import matplotlib.pyplot as plt
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'

#生成伪数据
x = torch.linspace(-5, 5, 200)  #torch.linspace(start, end, steps=100, out=None) → Tensor
                                #返回一个1维张量,包含在区间start和end上均匀间隔的step个点。
x = Variable(x)
x_np = x.data.numpy()   #用numpy数据生成plot

#常用激活函数 relu sigmoid tanh softplus softmax
y_relu = torch.relu(x).data.numpy()
y_sigmoid = torch.sigmoid(x).data.numpy()
y_tanh = torch.tanh(x).data.numpy()
y_softplus = F.softplus(x).data.numpy()
y_softmax = torch.softmax(x, dim=0).data.numpy() #sigmoid将一个real value映射到(0,1)的区间,用来做二分类
            # 而 softmax 把一个 k 维的real value向量(a1,a2,a3,a4….)映射成一个(b1,b2,b3,b4….)
            # 其中 bi 是一个 0~1 的常数,输出神经元之和为 1.0,所以相当于概率值,然后可以根据 bi 的概率大小来进行多分类的任务。
            # 二分类问题时 sigmoid 和 softmax 是一样的,求的都是 cross entropy loss,而 softmax
            # 可以用于多分类问题多个logistic回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,
            # 即一个输入只能被归为一类;多个logistic回归进行多分类,输出的类别并不是互斥的,即"苹果"这个词语既属于"水果"类也属于"3C"类别。


plt.figure(1, figsize=(8, 9))
plt.subplot(321)
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim((-1, 5))
plt.legend(loc='best')

plt.subplot(322)
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')

plt.subplot(323)
plt.plot(x_np, y_tanh, c='red', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')

plt.subplot(324)
plt.plot(x_np, y_softplus, c='red', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')

plt.subplot(325)
plt.plot(x_np, y_softmax, c='red', label='softmax')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')

plt.show()

图像绘制结果

plot图

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值