zoukankan      html  css  js  c++  java
  • 对激活函数的理解

    在完成Z=X*W.T+b后,我们需要一个激活函数,把Z变成另外一个值,然后传到神经网络的下一层去

    在神经网络的输出层,我们需要将最后的Z通过激活函数,转换成我们需要的答案

    输出层需要激活函数很好理解,总不能把Z输出,搞得程序最后运行得出一个奇奇怪怪的东西吧

    在隐藏层中,如果我们不需要激活函数,那我们先假设隐藏函数只有一层

    x[1][1] = X[0]*W[1][1]+b[1][1]

    x[1][2] = X[0]*W[1][2]+b[1][2]

    x[1][3] = X[0]*W[1][3]+b[1][3]

    Z= X[1]*W[2][1]+b[2][1]

    化简得

    Z = k1*x1+k2*x2+k3*x3+B

    也就是说,过了一整个神经网络,我的训练效果差不多就是那一个节点的训练效果

    emmmmmm

    而如果有了激活函数

    就可以把线性的东西变成非线性的,这到底有什么用呢?

    现在我们来看看常用的激活函数

    1.  sigmoid(z)

       f(z)=1/(1+e^(-z))

       

    2.  tanh(Z)

       tanh(Z) = (e^x-e^(-x))/(e^x+e^(-x))

       

    3.  max(Z,0)

       

    4.  max(Z,0.01Z)

       

     对于二元分类(最后输出结果为1 or 0的神经网络)

    我们一般用的是前两种激活函数,其中用的最多的是第二种

    可以看到,这两种神经网络的倒数都有一个特点,就是在x足够大,或者足够小的时候导数接近于0,而x接近于0的时候,导数较大

    因为我们输出0 or 1嘛,然后最后的输出又是由sigmoid函数输出的

    所以我们要尽量让x远离0,已得到一个确切的,正确的结果。

    也就是说,在x已经远离0且是正确的情况下,我们的W,b参数基本上是不用动的

    而在x接近0的情况下,我们要让x往正确的方向,偏离尽可能的远,所以这个时候导数要尽量大

    至于最后的两个,在特定的情况下,也有他们的优缺点。

    对于特定的问题,我们可以试着调整激活函数,看能不能提高精度。

    其实直觉告诉我,最优解在,函数越多越好,越少越好,每一层用的种类越多越好,每一层都相同,然后各层的激活函数不同之中

    下个星期可以试试

  • 相关阅读:
    真香!PySpark整合Apache Hudi实战
    Apache Hudi又双叕被国内顶级云服务提供商集成了!
    Apache Hudi集成Apache Zeppelin实战
    实战 | 将Apache Hudi数据集写入阿里云OSS
    实战|使用Spark Structured Streaming写入Hudi
    Apache Hudi 设计与架构最强解读
    【Flink】Flink作业调度流程分析
    【Flink】深入理解Flink-On-Yarn模式
    【Flink】Flink 底层RPC框架分析
    【MyBatis】MyBatis自动生成代码之查询爬坑记
  • 原文地址:https://www.cnblogs.com/shensobaolibin/p/7931906.html
Copyright © 2011-2022 走看看