• 神经网络 02(激活函数)


    一、激活函数

    神经元中引入了激活函数,它的本质是向神经网络中引入非线性因素的,通过激活函数,神经网络就可以拟合各种曲线

    • 如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合;
    • 引入非线性函数作为激活函数,那输出不再是输入的线性组合,可以逼近任意函数

    激活函数的作用:

    增加模型的非线性分割能力

    提高模型鲁棒性
    缓解梯度消失问题
    加速模型收敛等

    常用的激活函数

    1.1 Sigmoid/logistics函数

    sigmoid 在定义域内处处可导,且两侧导数逐渐趋近于0。

    如果X的值很大或者很小的时候,那么函数的梯度 (函数的斜率)会非常小,在反向传播的过程中,导致了向低层传递的梯度也变得非常小。此时,网络参数很难得到有效训练。这种现象被称为梯度消失

    一般来说,sigmoid 网络在5层之内就会产生梯度消失现象。而且,该激活函数并不是以0为中心的,所以在实践中这种激活函数使用的很少。sigmoid函数一般只用于二分类的输出层

    1. # 导入相应的工具包
    2. import tensorflow as tf
    3. import tensorflow.keras as keras
    4. import matplotlib.pyplot as plt
    5. import numpy as np
    6. # 定义x的取值范围
    7. x = np.linspace(-10, 10, 100)
    8. # 直接使用tensorflow实现
    9. y = tf.nn.sigmoid(x)
    10. # 绘图
    11. plt.plot(x,y)
    12. plt.grid()

    1.2 tanh(双曲正切曲线)

    tanh 也是一种非常常见的激活函数。与 sigmoid 相比,它是以 0 为中心的,使得其收敛速度要比 sigmoid 快(相比之下,tanh 曲线更为陡峭一些),减少迭代次数。然而,从图中可以看出,tanh 两侧的导数也为 0,同样会造成梯度消失。

    1. # 导入相应的工具包
    2. import tensorflow as tf
    3. import tensorflow.keras as keras
    4. import matplotlib.pyplot as plt
    5. import numpy as np
    6. # 定义x的取值范围
    7. x = np.linspace(-10, 10, 100)
    8. # 直接使用tensorflow实现
    9. y = tf.nn.tanh(x)
    10. # 绘图
    11. plt.plot(x,y)
    12. plt.grid()

    1.3 RELU

    ReLU是目前最常用的激活函数。 从图中可以看到,当x<0时,ReLU导数为0,而当x>0时,则不存在饱和问题。所以,ReLU 能够在x>0时保持梯度不衰减,从而缓解梯度消失问题。然而,随着训练的推进,部分输入会落入小于0区域,导致对应权重无法更新。这种现象被称为“神经元死亡”。

    Relu是输入只能大于0,如果你输入含有负数,Relu就不适合,如果你的输入是图片格式,Relu就挺常用的,因为图片的像素值作为输入时取值为[0,255]

    与sigmoid相比,RELU的优势是:

    • 采用sigmoid函数,计算量大(指数运算),反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。
    • sigmoid函数反向传播时,很容易就会出现梯度消失的情况,从而无法完成深层网络的训练。
    • Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生。
       
    1. # 导入相应的工具包
    2. import tensorflow as tf
    3. import tensorflow.keras as keras
    4. import matplotlib.pyplot as plt
    5. import numpy as np
    6. # 定义x的取值范围
    7. x = np.linspace(-10, 10, 100)
    8. # 直接使用tensorflow实现
    9. y = tf.nn.relu(x)
    10. # 绘图
    11. plt.plot(x,y)
    12. plt.grid()

    1.4 LeakyReLu

    1.5 SoftMax

    softmax用于多分类过程中,它是二分类函数 sigmoid 在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。

    softmax 直白来说就是将网络输出的 logits 通过softmax函数,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们将它理解成概率,选取概率最大(也就是值对应最大的)接点,作为我们的预测目标类别。

    Logits 是神经网络输出层的原始得分或未经激活函数处理的值。在深度学习中,通常将 logits 用于多类别分类问题,其中每个类别都对应于一个可能的类别。Logits 是模型对每个类别的得分,模型会根据这些得分来进行分类决策。

    通常,神经网络的最后一层会生成 logits。然后,通过应用 softmax 激活函数,将 logits 转换为每个类别的概率分布。Softmax 操作将 logits 映射到概率值,使得它们的总和等于1。这样,可以选择具有最高概率的类别作为最终的分类结果。

    1. # 导入相应的工具包
    2. import tensorflow as tf
    3. import tensorflow.keras as keras
    4. import matplotlib.pyplot as plt
    5. import numpy as np
    6. # 数字中的score
    7. x = tf.constant([0.2,0.02,0.15,0.15,1.3,0.5,0.06,1.1,0.05,3.75])
    8. # 将其送入到softmax中计算分类结果
    9. y = tf.nn.softmax(x)
    10. # 将结果进行打印
    11. print(y)

    1.6 其他激活函数

    二、如何选激活函数

    2.1 隐藏层

    • 优先选择RELU激活函数
    • 如果ReLu效果不好,那么尝试其他激活,如Leaky ReLu等。
    • 如果你使用了Relu, 需要注意一下Dead Relu问题, 避免出现大的梯度从而导致过多的神经元死亡。
    • 不要使用sigmoid激活函数,可以尝试使用tanh激活函数


    2.2 输出层

    • 二分类问题选择sigmoid激活函数
    • 多分类问题选择softmax激活函数
    • 回归问题选择identity激活函数



     

  • 相关阅读:
    【3D目标检测】KITTI数据集介绍
    2023 版 QQ 机器人运行部署文档
    PyQt,PySide-槽函数被执行了两次
    全球首例:肾衰7年的他移植了一颗猪肾脏
    2310如何维护旧代码
    136. 只出现一次的数字
    Cocos发布智能座舱解决方案“Cocos HMI”
    java+springboot+vue高校毕业生就业统计管理系统022xr
    初识 kubernetes 之 Pod
    element-ui el-table 树形结构 父子级联动
  • 原文地址:https://blog.csdn.net/peng_258/article/details/132828856