北京酒店团购网站建设,建设网站程序,制作图片视频的软件有哪些,阳泉网站建设公司机器学习-激活函数的直观理解
在机器学习中#xff0c;激活函数#xff08;Activation Function#xff09;是用于引入非线性特性的一种函数#xff0c;它在神经网络的每个神经元上被应用。
如果不使用任何的激活函数#xff0c;那么神经元的响应就是wxb#xff0c;相当…机器学习-激活函数的直观理解
在机器学习中激活函数Activation Function是用于引入非线性特性的一种函数它在神经网络的每个神经元上被应用。
如果不使用任何的激活函数那么神经元的响应就是wxb相当于线性的。由此任意数量的线性激活的神经元叠加其功能和单个线性激活的神经元一致线性叠加后仍然是线性的。
1、几种常用的激活函数
线性激活函数也相当于没有激活函数其作用相当于线性叠加 Sigmoid函数Sigmoid函数是一个典型的逻辑函数它会将任何实数映射到0到1之间。然而它在输入值非常大或非常小的时候会出现梯度消失的问题。f(x) 1 / (1 e^(-x)) Tanh函数Tanh函数与Sigmoid函数非常相似它会将任何实数映射到-1到1之间。和Sigmoid函数一样它也存在梯度消失的问题。Tanh函数相对于原点对称在处理某些具有对称性的问题时Tanh可能会比Sigmoid更有优势。f(x) (e^x - e^(-x)) / (e^x e^(-x)) ReLU函数ReLURectified Linear Unit是一种常用的激活函数它对负数输出0对正数则直接输出该数值。由于其简单性和在多层神经网络中的表现ReLU在很多深度学习模型中得到了应用。但是它可能会在训练过程中出现神经元“死亡”的情况。f(x) max(0, x)
死亡当神经网络的权重更新导致神经元的输入变为负值由于ReLU函数的特性其输出将会为0并且在后续的训练中该神经元的输出将一直保持为0因此某些神经元会不起作用。 Leaky ReLU为了解决ReLU的“死亡”神经元问题人们提出了Leaky ReLU激活函数。Leaky ReLU允许负数的小斜率这样即使输入是负数神经元也不会完全失效。在x小于0时有一个极小的负斜率。 Softmax函数Softmax函数常用于多分类神经网络的输出层因为它可以给出输入数据属于每个类别的概率。 Swish函数Swish是一种自门控激活函数它在深度学习模型中表现出了优于ReLU的性能。Swish函数的形状介于ReLU和Sigmoid之间。f(x) x * sigmoid(βx)
2、激活函数的直观理解
让我们来拟合一个函数其目标如下所示 使用两层网络进行建模其中第一层包含两个神经元激活函数如下待定第二层包含一个线性激活的神经元。
线性激活函数首先使用线性激活函数作为第一层两个神经元的激活函数训练得出的最终结果如下所示由此可见多个线性激活神经元等效于一个神经元因为最终得到的还是线性函数 ReLU函数其次使用ReLU函数作为第一层两个神经元的激活函数在理想的情况下会得到如下的拟合结果相当于是两个ReLU函数的组合一个是直接向左平移一个是翻转后平移 但是ReLU在训练时可能会出现神经元死亡现象上面解释过了此时继续迭代也不会给性能带来提升相当于陷入局部最优了如 由此可见激活函数就是拟合的最小单元。 Leaky ReLU使用Leaky ReLU可以避免ReLU在训练时导致的死亡现象每次训练都能得到满意的结果
Sigmoid函数Sigmoid函数在此处实际上更有优势因为其实际上就是一个连续的曲线Tanh同理
总结激活函数就是拟合最终结果的最小单元最终结果就是激活函数的平移反转或多次计算。上面的例子第二层是线性激活因此最终结果相当于是第一层结果的线性叠加
3、结论分析
总结激活函数就是拟合最终结果的最小单元最终结果就是激活函数的平移反转或多次计算。上面的例子第二层是线性激活因此最终结果相当于是第一层结果的线性叠加
显然如果将第一层的两个神经元改为1个就只会使用一个激活函数去进行拟合Sigmoid的案例如;
4、代码
# 引入相关的包
import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Dense
import warnings
warnings.simplefilter(actionignore, categoryUserWarning)
# 创建要拟合的函数
X np.linspace(0,2*np.pi, 100)
y np.cos(X)1
XX.reshape(-1,1)
# 画图可选
fig,ax plt.subplots(1,1, figsize(4,3))
ax.plot(X,y)
plt.show()
# 构建模型
model Sequential([# Dense(2, activationlinear, name l1),Dense(2, activationsigmoid, name l1),# Dense(2, activationtanh, namel1),# Dense(2, activationrelu, namel1),# Dense(2, activationleaky_relu, namel1),# Dense(2, activationswish, namel1),Dense(1, activationlinear, name l2)]
)
model.compile(losstf.keras.losses.MeanSquaredError(),optimizertf.keras.optimizers.Adam(0.04),
)
model.fit(X,y,epochs300
)
# 进行模型预测
yhat model.predict(X)
fig,ax plt.subplots(1,1, figsize(4,4))
ax.plot(X,y)
ax.plot(X,yhat)
plt.show()
# 进行模型预测
l1 model.get_layer(l1)
l2 model.get_layer(l2)
l1.get_weights()
l2.get_weights()