美文网首页机器学习实战
深度学习——BP算法

深度学习——BP算法

作者: 飘涯 | 来源:发表于2018-05-21 10:01 被阅读35次

    前言:从感知器开始引出神经元,感知器中的激活函数进行改进,引入全连接神经网络,只要并且重点介绍一下BP神经网络

    感知器神经网络

    也就01分类器,给定阈值,解决二分类问题。类似于前面提到的二值化,例如:对分数就行排名的时候通常让大于60分的认定为“及格”。至于添加大于八十分为“优秀”只需要在添加一个感知器即可,由于神经网络模拟的是人的思考过程,既给定一个输入,会产生一个输出,人的决策过程是众多神经元的结果,下面就来分析简单的感知器神经网络对分类产生的结果。人脑分布如下下图:


    • 神经元
      前面已经提到过,现在简单附属一下。既,输入、输出、激活函数。


    • 感知器
      就是当激活函数返回值为两个值时候为感知器



      缺点:
      由于输出结果为固定的两个值,当就行参数优化的时候,要么输出不变,要么输出突然变化,参数优化不容易实现,所以通常用sigmoid函数作为激活函数

    线性神经网络

    可以做多分类问题
    添加少量隐层的神经网络就叫做浅层神经网络;也叫作传统神经网络, 一般为2隐层的神经网络。
    用sigmoid的缺点是同城隐层只能是两层,由于激活函数特殊的限制,通常在迭代求导的过程中,sigmoid函数的导数会向零方向逼近,造成“死神经元”



    tanh函数效果好一点,可任然解决不了隐层多的问题,引入relu函数

    BP神经网络

    神经网络的一种求解W的算法,分为信号“正向传播(FP)”求损失,“反向 传播(BP)”回传误差;根据误差值修改每层的权重,继续迭代



    分别求出
    输出层误差


    隐层的误差


    输入层误差



    用代码来实现BP算法的过程如下:

    import numpy as np
    
    w = [0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65]
    # 偏置项b不进行更新
    b = [0.35, 0.65]
    l = [-5, 10]
    
    
    def sigmoid(z):
        return 1.0 / (1 + np.exp(-z))
    
    
    def f1(w, b, l):
        # 前向传播,计算结果值
        h1 = sigmoid(w[0] * l[0] + w[1] * l[1] + b[0])
        h2 = sigmoid(w[2] * l[0] + w[3] * l[1] + b[0])
        h3 = sigmoid(w[4] * l[0] + w[5] * l[1] + b[0])
    
        o1 = sigmoid(w[6] * h1 + w[8] * h2 + w[10] * h3 + b[1])
        o2 = sigmoid(w[7] * h1 + w[9] * h2 + w[11] * h3 + b[1])
    
        # 后向传播,更新w
        t1 = -(0.1 - o1) * o1 * (1 - o1)
        t2 = -(0.99 - o2) * o2 * (1 - o2)
    
        w[6] = w[6] - 0.5 * (t1 * h1)
        w[8] = w[8] - 0.5 * (t1 * h2)
        w[10] = w[10] - 0.5 * (t1 * h3)
        w[7] = w[7] - 0.5 * (t2 * h1)
        w[9] = w[9] - 0.5 * (t2 * h2)
        w[11] = w[11] - 0.5 * (t2 * h3)
    
        w[0] = w[0] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[0]
        w[1] = w[1] - 0.5 * (t1 * w[6] + t2 * w[7]) * h1 * (1 - h1) * l[1]
        w[2] = w[2] - 0.5 * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[0]
        w[3] = w[3] - 0.5 * (t1 * w[8] + t2 * w[9]) * h2 * (1 - h2) * l[1]
        w[4] = w[4] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[0]
        w[5] = w[5] - 0.5 * (t1 * w[10] + t2 * w[11]) * h3 * (1 - h3) * l[1]
    
        return o1, o2, w
    
    
    for i in range(1001):
        r1, r2, w = f1(w, b, l)
        print("第{}次迭代后,结果值为:({},{}),权重更新为:{}".format(i, r1, r2, w))
    

    输出结果:

    第1000次迭代后,结果值为:(0.09996083954832574,0.9778184034399262),权重更新为:[-0.030672263069416547, 0.41134452613883266, 0.09476393030400698, 0.4604721393919862, 0.20319883709854172, 0.5436023258029161, -0.9980730809431909, 0.9438220932399313, -0.8629482660589612, 1.0419668423034139, -1.0146000749780355, 1.181504874794456]
    
    
    
    
    

    相关文章

      网友评论

        本文标题:深度学习——BP算法

        本文链接:https://www.haomeiwen.com/subject/eugidftx.html