什么是激活函数
如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function。
![d1cf1eb803f3e55960d9757f6a575325.png](https://i-blog.csdnimg.cn/blog_migrate/02600c8e4c6ab04df30d89483205dced.png)
为什么使用激活函数
如果不用激励函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
激活函数的类型
sigmoid
![bbbdf0ee98d84f4e32b563c836c69fff.png](https://i-blog.csdnimg.cn/blog_migrate/ce2eda7d32aca284a96205de704c921d.png)
取值范围
(0, 1)
# -*- coding: utf-8 -*-
import numpy as np
from math import e
import matplotlib.pyplot as plt
z = np.arange(-10, 10, 0.05)
e_z = [e**(-z) for z in z]
sigmoid = [1/(1+z) for z in e_z]
plt.plot(z, sigmoid)
plt.show()
应用场景:
二分类的任务,多分类的任务不是特别适合。在二分类的任务中,根据特定的场景设置阈值,不一定是0.5的阈值,也可能是其他的。
softmax
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
import math
z = np.arange(-10, 10, 0.05)
exp_z = [math.exp(z) for z in z]
sum_exp_z = sum(exp_z)
softmax_z = [round(i / sum_exp_z, 6) for i in exp_z]
plt.plot(z, softmax_z)
plt.show()
取值范围
[0, 1]
![f29c41c1e15795e82a912c786f32b540.png](https://i-blog.csdnimg.cn/blog_migrate/22b58781773c410e5d8c064e4426feee.png)
应用场景
多分类任务,当类别数k=2时,Softmax回归退化为Logistic回归。
relu
![f16cecf5799bf53f372cad5acb3ba0fa.png](https://i-blog.csdnimg.cn/blog_migrate/70b80cfcbe5c9062a67449fa0652dc5c.png)
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
z = np.arange(-10, 10, 0.05)
max_z = [max(0, z) for z in z]
plt.plot(z, max_z)
plt.show()
应用场景
CNN还有其他需要稀松或者防止梯度消失的模型,当然防止梯度消失还有其他的方式。
ReLU 会引起一种效果,叫单侧抑制作用, 在CNN网络中表现突出,它使得神经网络中的神经元具有了稀疏激活性,说明白点就是会让一部分神经元Dead。莫名觉得和drop方法有点像,收敛速度会比 sigmoid/tanh 快一些(注),猜测收敛速度会快是因为它比较稳定,不会因为梯度消失而让模型停滞不前。
# 这两个写法一样的
import math
print(math.exp(1))
print(math.e ** 1)