其他
【强基固本】从Binary到Swish——激活函数深度详解
“强基固本,行稳致远”,科学研究离不开理论基础,人工智能学科更是需要数学、物理、神经科学等基础学科提供有力支撑,为了紧扣时代脉搏,我们推出“强基固本”专栏,讲解AI领域的基础知识,为你的科研学习提供助力,夯实理论基础,提升原始创新能力,敬请关注。
地址:https://www.zhihu.com/people/he-chao-14-51
Binary Linear Sigmoid Tanh ReLU Leaky ReLU (LReLU) Parametric ReLU (PReLU) Exponential Linear Unit (eLU) ReLU-6 Softplus Softsign Softmax Swish
01
def binary_active_function(x):
return 0 if x < 0 else 1
for i in [-5,-3,-1,0,3,5]:
print(binary_active_function(i))
output:
0
0
0
1
1
1
简单的二分类
不适用于多分类情况 其导数总是0,无法做到更新权重
02
def linear_active_function(a,x):
return a * x
x = numpy.linspace(-10,10,500)
y_1 = [linear_active_function(1,i) for i in x] # a=1
y_2 = [linear_active_function(2,1) for i in x] # a=2
y_1
[-10.0,-9.9,-9.8,-9.7,... ...,9.7,9.8,9.9,10.0]
03
def sigmoid_active_function(x):
return 1/(1+numpy.exp(-x))
x = numpy.linspace(-10, 10, 5000)
y = [sigmoid_active_function(i) for i in x]
y
> [4.5397868702434395e-05, 4.5854103946941324e-05, ... , 0.9999532196250409, 0.9999536850759906, 0.9999541458960531]
在接近1.0和-1.0附近时值会被稀释掉 它将所有的值都限制在了0到1之间,这会导致梯度消失
04
def tanh_active_function(x):
return 2*sigmoid_active_function(2*x)-1
x = numpy.linspace(-10, 10, 5000)
y = [tanh_active_function(i) for i in x]
y
> [-0.9999999958776927, -0.9999999957944167, ... , 0.9999999956227836, 0.9999999957094583, 0.9999999957944166]
值分布在-1,1之间 梯度比sigmoid更大,导数能扑捉到的范围同样也变大
同样会存在梯度消失的问题
05
def relu_activate_function(x):
return numpy.array([0,x]).max()
x = numpy.linspace(-10, 10, 5000)
y = [relu_active_function(i) for i in x]
y
> [0.0, 0.0, ... , 9.97, 9.98, 9.99]
容易实施且运行快 最常用的神经网络生态
当值小于0时neuron失效 不适用于RNN、LSTM、GRU相关模型
06
def leaky_relu_acvtive_function(x):
return 0.01* x if x<0 else x
x = numpy.linspace(-10, 10, 5000)
y = [leaky_relu_active_function(i) for i in x]
y
> [-0.1, -0.0999, ... , 9.97, 9.98, 9.99]
解决了dying relu的问题
07
def parametric_relu_active_function(x):
return a*x if x < 0 else x
x = numpy.linspace(-10, 10, 5000)
y_1 = [parametric_relu_active_function(0.25, i) for i in x]
y_2 = [parametric_relu_active_function(0.5, i) for i in x]
y_3 = [parametric_relu_active_function(0.75, i) for i in x]
y_4 = [parametric_relu_active_function(1, i) for i in x]
y_1
> [-2.5, -2.4975, ... , 9.97, 9.98, 9.99]
a = 0.25、0.5、0.75、1
生成ReLU激活函数 避免了“dying ReLU”的问题 参数a能够被神经元学习
08
Exponential Linear Unit (eLU)
def elu_activate_functino(a,x):
return a*(numpy.exp(x)-1) if x <0 else x
x = numpy.linspace(-10, 10, 5000)
y_1 = [elu_active_function(0.1, i) for i in x]
y_2 = [elu_active_function(1, i) for i in x]
y_3 = [elu_active_function(2, i) for i in x]
y_4 = [elu_active_function(5, i) for i in x]
y_1
> [-0.09999546000702375, -0.09999541437933579, ... , 9.97, 9.98, 9.99]
a = 0.1, 1, 2, 4:
ELU 能够缓慢减小直到 -α,而RELU很陡峭 不同于 ReLU, ELU 能够产生负值
x大于0的部分范围为0到无限大
09
def relu_6_active_function(x):
return numpy.array([0,x]).max() if x<6 else 6
y = [relu_6_active_function(i) for i in x]
10
def softplus_active_function(x):
return math.log(1+numpy.exp(x))
y = [softplus_active_function(i) for i in x]
11
def softsign_active_function(x):
return x / (1+abs(x))
y = [softsign_active_function(i) for i in x]
12
def softmax(x):
return numpy.exp(x)/numpy.sum(numpy.exp(x))
x = [0.8, 1.2, 2.4, 4.6]
y = softmax_active_function(x)
y
> [0.01917691, 0.02860859, 0.09498386, 0.85723064]
numpy.sum(y)
> 1.0
13
def swish_active_function(x):
return x/(1+numpy.exp(-x))
x = numpy.linspace(-10, 10, 5000)
y = [swish_active_function(i) for i in x]
y
> [-0.0004539786870243439, -0.0004967044303692657, ..., 9.699405586525717, 9.799456604457717, 9.89950329556963]
14
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“强基固本”历史文章
“卷积”其实没那么难以理解
DNN加速器性能分析
如何通俗易懂地让女朋友明白什么是语言模型?
深度学习从入门到放飞自我:完全解析triplet loss
卡尔曼滤波器
Reinforcement learning入门:从马尔可夫,动态规划到强化学习
算法工程师应该了解的浮点数知识
神经网络量化简介
样本量极少如何机器学习?Few-Shot Learning概述
我们真的需要深度图神经网络吗?
深度强化学习(Deep Reinforcement Learning)入门
伪标签(Pseudo-Labelling)——锋利的匕首
基础算法:使用numpy实现逻辑回归随机梯度下降(附代码)
脉冲神经网络(SNN)
分享、点赞、在看,给个三连击呗!