深度学习入门--激活函数
激活函数的概念
感知机的权重偏置参数都是人为设定的,而神经网络的一个重要性质就是它可以自动的从数据中学习到合适的权重偏置参数。
将输入信号的总和转换为输出信号,这种函数一般称为激活函数。激活函数的作用在于决定如何来激活输入信号的总和。
x=b+w1x1+w2x2
y=h(x)
这里的h(x)
就是激活函数,若x>0
则y=1
;若x<=0
则y=0
。
激活函数是连接感知机和神经网络的桥梁。一般而言,“朴素感知机”是指单层网络,指的是激活函数使用阶跃函数
的模型。“多层感知机”是指神经网络,即使用sigmoid函数
等平滑的激活函数。
阶跃函数
阶跃函数是指一旦输入超过阀值,就切换输出的函数。
阶跃函数的简单实现(参数x仅支持实数):
def step_function(x):
if x>0:
return 1
else:
return 0
阶跃函数的numpy数组实现(参数x取numpy数组)
def step_function(x):
y=x>0 # 数组y是一个布尔数组
return y.astype(np.int) # 将数组y的元素类型从布尔型转换为int型
阶跃函数的图形:
import numpy as np
import matplotlib.pylab as plt
def step_function(x):
return np.array(x>0, dtype=np.int)
x=np.arange(-5.0, 5.0, 0.1)
y=step_function(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
图形如下:
sigmoid函数
sigmoid函数的实现:
def sigmoid(x):
return 1/(1+np.exp(-x)) # 这里np.exp(-x)对应exp(-x)
sigmoid函数的图形:
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1/(1+np.exp(-x)) # 这里np.exp(-x)对应exp(-x)
x=np.arange(-5.0, 5.0, 0.1)
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
图形如下:
阶跃函数和sigmoid函数的对比:
- 阶跃函数只能返回0或1,sigmoid函数能返回0-1中的每一个实数(具有平滑性)
- 两者的输出信号的值都在0-1之间。
- 两者都为非线性函数。神经网络的激活函数必须使用非线性函数
ReLU函数
ReLU函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0.
当x>0时,h(x)=x;
当x<=0时,h(x)=0;
ReLU函数的实现:
def relu(x):
return np.maximum(0, x) # maximum函数会从输入的数值中选择较大的那个值进行输出
ReLU函数的图形:
import numpy as np
import matplotlib.pylab as plt
def relu(x):
return np.maximum(0, x) # maximum函数会从输入的数值中选择较大的那个值进行输出
x=np.arange(-5.0, 5.0, 0.1)
y=relu(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1) # 指定y轴的范围
plt.show()
图形如下:
输出层的激活函数
神经网络一般是两层及以上,这里的层数指拥有权重的层数。
上面的阶跃函数
、sigmoid函数
、ReLU函数
都是中间层的激活函数,而输出层的激活函数一般有两种:
神经网络可以用在分类问题和回归问题上,一般而言,分类问题用softmax函数
,回归问题用恒等函数
。
恒等函数
在输出层使用恒等函数时,输入信号会原封不动的被输出。
恒等函数的实现:
def identity_function(x):
return x # 将输入按原样输出
恒等函数的图形:
import numpy as np
import matplotlib.pylab as plt
def identity_function(x):
return x # 将输入按原样输出
x=np.arange(0, 5.0, 0.1)
y=identity_function(x)
plt.plot(x,y)
plt.ylim(0, 5) # 指定y轴的范围
plt.show()
图形如下:
softmax函数
softmax函数的分子是输入信号a的指数函数,分母是所有输入信号的指数函数的和。
求解机器学习问题的步骤可以分为学习
和推理
两个阶段。首先,在学习阶段进行模型的学习,然后,在推理阶段,用学到的模型对未知的数据进行推理(分类)。在输出层使用softmax函数
主要是因为它和神经网络的学习有紧密关系。
softmax函数的实现:
def softmax(x):
c=np.max(x) # 找出输入信号中的最大值
exp_x=np.exp(x-c) # 减去最大值,结果不变,防止溢出
sum_exp_x=np.sum(exp_x)
y=exp_x/sum_exp_x
return y
softmax函数的示例:
import numpy as np
def softmax(x):
c=np.max(x) # 找出输入信号中的最大值
exp_x=np.exp(x-c) # 减去最大值,结果不变,防止溢出
sum_exp_x=np.sum(exp_x)
y=exp_x/sum_exp_x
return y
x=np.array([0.3, 2.9, 4.0])
y=softmax(x)
print(y)
np.sum(y)
输出为:
[0.01821127 0.24519181 0.73659691]
1.0
上面的例子可以解释为y[0]的概率为0.018、y[1]的概率为0.245、y[2]的概率为0.737。并且,softmax函数的输出值的总和为1,输出总和为1是softmax函数的一个重要性质。也就是说,通过使用softmax函数,我们可以用概率的角度处理问题。
每天学习一点点,每天进步一点点。