• 从曲面拟合尝试理解神经网络中的激活函数


    激活函数引用:https://www.cnblogs.com/ms-uap/p/9962978.html

    首先,单个神经元是长这样的:

    也就是,当A=σ(Z)=Z时,不使用激活函数的话,那么,单个神经网络,输出只能是A = ΣWX + b

    1. 从训练数据来理解。(参考:https://blog.csdn.net/weixin_38275649/article/details/80340538

    假如我们的神经网络,仅仅是一个单细胞的神经元

    联想我们的样本,例如在做图片识别的时候,通常来说,训练数据:

    x1,x2,x3,是某动物的概率。(例如:有毛发:1,有獠牙:1,毛色R:255,毛色G:109,毛色B:100,是豹子的概率:0.75)

    显然,如果拿A=σ(Z) = sigmoid(Z) = 0.75,看起来就很合适了(当然,强行的Z=0.75好像也没什么问题,且看第2点)

    2. 从非线性组合的角度来理解。(参考:https://zhuanlan.zhihu.com/p/27661298

    在测绘中,通常我们拟合曲面的时候,有如下样本数据:

    x,y,z

    目标是,知道范围内的x,y,获得z。

    先说一下通常的做法(我认为这是建模与神经网络训练十分重要的区别):


    首先,我们假定它有一个模型:Z = w0 +  w1 * x + w2 * y + w3 * x * y + w4 * x2 + w5 * y2 + w6 * x 2* y + w7 * y2 * x +  w8 * x3 + w9* y3 + ……(一般就w0~w9到此为止了)

    假定,(w0~w9),其初始值为(w'0~w'9),也就是:(0.1,……0.1)

    假如我们使用高斯牛顿迭代法来求解,我们不直接解w0~w9,令wi = w'i +dwi,我们要解的是dwi ,也就是初始值的改正值:

    原函数变为:Z = (w'0 + dw0) +  (w'1+dw1) * x + (w'2 + dw2) * y + (w'3 + dw3 ) * x * y + ……;

    也就是:Z = Z '  +    dw0 +  dw1 * x + dw2 * y + w3 * x * y  + ……;

    也就是:AW = (Z - Z')= b

    W = [dw0,……dw9]T

    而A的每一行,根据各个样本,有An = [1,x,y,xy,x2,y2 ……]

    解AW=b

    根据最小二乘原理,解AW=b。

    ATAW=ATb

    W = (ATA)-1ATb,解得W = [dw0,……dw9]T

    将解的结果,代回w''i = w'i +dwi , (w''0~w''9)作为新的初始值,继续迭代解

    直到:上次迭代的(Z - Z')2 和本次迭代的 (Z - Z')2  相差无几。

    ***如有需要以离区域中心加权,可以引入权矩阵:  W = (ATPA)-1ATPb,P通常是对角阵,意思是Z与Z之间高程是独立观测量,也就是说Zi ≠ f(Zj)。

    ***P对角上的数值可以为 di / ∑ d,d是离中心的距离 ; 在测绘上,可以表示为 1 / (Z测量误差)2

    ***权值,代表我们对这个样本的关注程度,样本误差越小,权值越大。

    在曲面不太复杂,且有一定的规律的时候,这种方法通常效果很理想。因为其考虑了XY之间的非线性因素。


    如果以“单细胞神元” , 且激活函数A=σ(Z)=Z时,我们顶多可以 Z = WX + b ,  W = [w1,w2] , X = [x,y]T

    这样完全只是一个空间平面而已。(w1*  x  +  w2* y  - z  + b =  0)

    进而,我们考虑:

    A=σ(Z) =  sigmoid(Z)  ,参考https://zhuanlan.zhihu.com/p/27661298

    根据sigmoid函数,1 / (1 + e^-z),可以看出,e^-z的泰勒展开,其实就是对x,y的非线性组合,可以解决函数仅仅为线性函数的问题。

    但是:

    sigmoid函数的值,只能是0~1之间,显然,我们要的Z值,肯定不是这样的(Z是根据地形,数值可能是2.xxx ,3.xxxx各种)

    那么,能解决这个问题,只能是多层神经网络:https://www.cnblogs.com/ms-uap/p/10031484.html


     

    我们的样本,其实是一个个:

    (x1,y1,z1)……(xn,yn,zn)

    上图仅仅是一元方程的一个样本的求法。

    在引用文章当中,是逐个样本来迭代。可以将样本分为几组来迭代:

    输入层,是1*2,也就是(xi,yi)

    隐藏层,权重数组是128*2,那么不难理解,Z1 = WX + b

    X = [ x , y ]T

    Wi = [ Wi-x , Wi-y ]

    bi = bi

    i代表的是第几个一层神经元。

    说白了,

    对于一组样本:

    子样本1----> 128个一层神经元------>1个二层神经元------>输出a1

    子样本2----> 128个一层神经元------>1个二层神经元------>输出a2

    子样本3----> 128个一层神经元------>1个二层神经元------>输出a3

    子样本n----> 128个一层神经元------>1个二层神经元------>输出an

    各个子样本公用同一组W1,B2,W2,B2

    而损失函数,变为loss = 1 / 2 / n ∑(a - z)


    那么,引用的资料中,也说明了,调参说白了,就是调整:

    1. 隐藏层神经元的数量

    2. 学习效率,也就是各层的步长a

    3. loss阈值


     

       

  • 相关阅读:
    ubuntu下Thrift快速入门
    java Future用法和意义一句话击破 [转]
    RPC、基于netty的长连接和websocket
    基于netty的长连接
    IO
    HTML5 中websocket长连接的具体实现方法
    单链表中是否出现环状,使用快慢指针算法。
    SpringMVC 事务配置完全详解
    hibernate annotation 一对多,多对一,实例
    tomcat 内存溢出
  • 原文地址:https://www.cnblogs.com/pylblog/p/10364631.html
Copyright © 2020-2023  润新知