在神经网络和深度学习中,激活函数(activation function)是对神经元的输出进行处理的一种函数。神经网络的激活函数必须是非线性的,它的作用是引入非线性因素,从而使神经网络可以处理更加复杂的数据,并且提高模型的准确率。
我们使用感知机输出对应的数字0和1。但是我们发现这是一个分段函数,有两个部分组成。很是冗余,不够简便,那有没有一种可能呢,只需要一个函数就可以表示整个分段的过程,当然有,即使用激活函数。
使用激活函数h(x)来表示上述的分段函数过程,达到简化的效果。
激活函数常见的几种类型包括:
因此,Step跃阶函数在神经网络和深度学习中的应用极其有限,通常不建议使用。实际上,为了解决其导数不连续、不可微分的问题,一些激活函数如Sigmoid、ReLU、LeakyReLU、tanh等都被提出并广泛应用。
由于其简单性和非线性特性,Step跃阶函数在一些特殊场景下仍然有一定的应用,比如在人工神经元模型中,也可以用于控制某些电路元件的开关。
from matplotlib import pyplot as plt
import numpy as np
def step_function(x):
y = x > 0
print("y:",y) # 输出的布尔值
# y = y.astype(np.int64) # 这里写int会出错
y = [int(num) for num in y] # 与上句使用的astype效果一样
return y
x = np.array([1.5,-2,5.0])
step_function(x)
x1 = np.arange(-6,7,1)
y1 = step_function(x1)
plt.plot(x1,y1)
plt.show()
from matplotlib import pyplot as plt
import numpy as np
def sigmoid(x):
y = 1/(1+np.exp(-x))
return y
x1 = np.arange(-6,7,1)
y2 = sigmoid(x1)
plt.title("sigmoid functions") # 给图设置标题
plt.xlabel("x axis") # 设置x轴
plt.ylabel("y axis") # 设置y轴
plt.plot(x1,y2,'y') # 传入x和y的值 创建图
plt.show() # 展示图
# ReLU函数相当于在自变量小于0的时候为0,
# 大于零的时候和自变量相等,也就是在自变量和0中取最大值
from matplotlib import pyplot as plt
import numpy as np
def ReLU(x):
y = np.maximum(0,x)
return y
x1 = np.arange(-6,7,1)
y3 = ReLU(x1)
plt.plot(x1,y3)
plt.show()
from matplotlib import pyplot as plt
import matplotlib
import numpy as np
def leaky_relu(x, alpha=0.01):
"""
LeakyReLU函数的实现
Args:
x: 输入向量或矩阵
alpha: 斜率系数,一般取较小的值,默认为0.01
Returns:
LeakyReLU函数的输出,与输入维度相同
"""
y = np.copy(x)
y[y<0] *= alpha
return y
zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf")
plt.title("LeakyReLu 函数",fontproperties=zhfont1)
x1 = np.arange(-6,7,1,dtype=np.float64)
y3 = leaky_relu(x1)
plt.plot(x1,y3)
plt.show()
tanh函数在神经网络中常用于处理具有正负值的数据,比如图像、音频等数据。同时,tanh函数在神经网络中也是一种常用的激活函数,主要应用于RNN网络中的LSTM、GRU等模型,能够平衡模型的记忆能力和遗忘能力,提高模型的性能和鲁棒性。
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
def tanh(x):
"""
双曲正切函数的实现
Args:
x: 输入向量或矩阵
Returns:
tanh函数的输出,与输入维度相同
"""
return np.tanh(x)
zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf")
plt.title("tanh 函数",fontproperties=zhfont1)
x1 = np.arange(-6,7,1,dtype=np.float64)
y3 = tanh(x1)
plt.plot(x1,y3)
plt.show()
Softmax函数将输入向量中的每个元素从实数范围映射到(0,1)之间,且使输出向量中所有元素之和为1,因此输出向量可被理解为一个概率分布,其中每个元素表示对应类别的预测概率。在神经网络中,通常将Softmax函数作为最后一层的激活函数来输出分类预测结果。
import matplotlib
from matplotlib import pyplot as plt
import numpy as np
def softmax(x, axis=-1):
"""
Softmax函数的实现
Args:
x: 输入向量或矩阵
axis: 指定沿哪个维度进行Softmax操作,默认为最后一个维度
Returns:
Softmax函数的输出,与输入维度相同
"""
# 将输入减去最大值,避免指数爆炸
x_exp = np.exp(x - np.max(x, axis=axis, keepdims=True))
# 计算Softmax分母
x_sum = np.sum(x_exp, axis=axis, keepdims=True)
# 计算Softmax输出
return x_exp / x_sum
zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf")
plt.title("softmax 函数",fontproperties=zhfont1)
x1 = np.arange(-6,7,1,dtype=np.float64)
y3 = softmax(x1)
plt.plot(x1,y3)
plt.show()