精华内容
下载资源
问答
  • BP算法公式推导

    千次阅读 2016-10-25 21:22:05
    BP算法公式推导,这几天花了不少时间在算法的公式推导上,只有清楚了原理才能更好地利用BP算法去解决问题!

    首先来了解基本的定义,

    如,

    其中,N表示训练样本的数量,向量x(n)表示第n个样本在输入层输入数据,向量d(n)表示在输出层对应的期望的输出。

    设神经元j位于网络的输出层,那么由该神经元输出产生的误差定义为:


    其中,表示期望的输出,表示实际的输出,表示神经元j输出产生的误差。

    由神经元j产生的瞬时误差能量定义为:

     

    那么整个网络所产生的总瞬时误差能量为:

    其中C表示网络输出层的神经元的集合。

    在神经元j的激活函数处的诱导函数(诱导局部域)为:

    其中m是神经元j的输入数量,表示从神经元i到神经元j之间的突触权值,为神经元j的偏置,对应于表示连接到神经元j的神经元i的函数输出信号。

    神经元j的函数信号,即输出为:

    其中,表示对应神经元j的激活函数。(简便起见,通常,网络中的所有神经元的激活函数均为同一个函数)。

    在BP算法反向传播进行权值调整时引用一个修正值,它正比于偏导数,根据微分的链式规则可写为,

      

    对公式4取微分可得到:

     

    (由于是针对某个神经元j求偏导,所以结果并非这种结果)

    对公式2取微分可得到:

     

    对公式6取微分可得到:

    对公式5取微分可得到:

       

    将公式8、9、10、11带入公式7得,

      

    对于权值的修正根据delta法则定义为:

    其中为学习率参数,是一个常数,可指定;负号表示在权值空间中寻找一个使下降的权值改变的方向(即使网络总体误差能量减小)。

    将公式12带入公式13得,

    其中为局域梯度,定义为:

    可见,神经元j的局域梯度等于该神经元的误差信号与其激活函数对诱导局部域的导数的乘积。

    所以得到,

    其中可指定,在BP算法前向计算过程中可以得到,激活函数是已知的,通过计算可以得到,重点在于的计算。显然对于神经元j的位置需要进行分类讨论:

    1.神经元j位于输出层,这是最简单的情形,此时,该神经元的期望输出和实际输出均为已知(实际输出在算法的前向计算中得出),

    从而神经元i到神经j的突触权值便可进行调整。

    2.神经元j不位于输出层,而位于隐藏层。此时误差信号不能够再根据公式2得以确定,因为是不可知的。误差信号需要与与其直接相连接的神经元的误差信号来向后地柜决定。设连接到神经元j的位于输出层的神经元为k,便需重新定义

    重点放在的计算,

    对公式17对求微分得,

    (由于是对求偏导,而每一项都是的函数,所有含有)同样,使用链式规则得到,

    又因为


    所以,

    根据之前的解述,可以知道,

    其中m为神经元j所在网络层神经元数。对公式22求微分得,


    将公式21、23带入公式19可以得到,

    将公式24带入公式16得到,

    将公式25与公式14可以得到,

    这样便可以对神经元i到神经元j的权值进行调整。

    综上所述,可以知道,对权值的调整核心即为,



    展开全文
  • 机器学习BP算法公式推导 BP神经网络通过外界输入的数据,不断改变网络的连接权值,以使最后的输出结果不断的接近期望值。BP神经网络的本质是对各连接权值不断的动态调整,使期望值与输出值相差最小。 BP神经网络首先...

    机器学习BP算法公式推导

    BP神经网络通过外界输入的数据,不断改变网络的连接权值,以使最后的输出结果不断的接近期望值。BP神经网络的本质是对各连接权值不断的动态调整,使期望值与输出值相差最小。
    BP神经网络首先通过正向传播(输入数据-输入层-各隐藏层-输出层)求得输出数据。若输出数据与期望数值不符,则进行反向传播来调整参数。通过反向传播,以修正各层的连接权值。通过不断的“正向—反向”的迭代过程,使各权值的误差最小化,最终取得较为满意的训练模型参数。
    基于BP算法的多层网络模型:
    基于BP算法的多层网络模型
    模型标号表示如下:
    在这里插入图片描述

    1. 向前传播计算式:
      在这里插入图片描述
    2. 网络误差与权值调整:
      在这里插入图片描述
      将隐藏层展开,代入3.4.7
      在这里插入图片描述
      以上公式是计算从输入数据到输出数据的结果。
      为了得到输出值与预期值的最小差值,需要反复迭代递度下降法,求出权值的偏导数,不断优化连接权值参数。
      在这里插入图片描述
      2.推导过程
      采用链式反推法,求输出层与隐藏层的权值偏导数,隐藏层与输入层的权值偏导数。
      在这里插入图片描述
      可进一步将权值优化写成:
      在这里插入图片描述
      可以看出:权值与输入数据成正比例关系。
      在这里插入图片描述
      下面具体求两个比例系数值:
      在这里插入图片描述
      这里的激活函数定义为:
      在这里插入图片描述
      得到两个比例系数:
      在这里插入图片描述
      最后得到权值调整公式:
      在这里插入图片描述
    展开全文
  • 学习深度学习我们应该从Bp开始,一下是学习路径 如果我们把深度学习比喻一棵大树,Bp相当于根,LeNet相当于茎,GAN,RNN,CNN相当于树叶. Bp 神经网络的简单理解 bp是 Back Propagation 的简写 ,意思是反向传播。而神经...

    前言
    在这里插入图片描述

    学习深度学习我们应该从Bp开始,一下是学习路径

    在这里插入图片描述
    如果我们把深度学习比喻一棵大树,Bp相当于根,LeNet相当于茎,GAN,RNN,CNN相当于树叶.
    Bp 神经网络的简单理解
    bp是 Back Propagation 的简写 ,意思是反向传播。而神经网络,听着高大上,其实就是一类相对复杂的计算网络。
    正向传播
    正向传播就是让信息从输入层进入网络,依次经过每一层的计算,得到最终输出层结果的过程。
    在这里插入图片描述
    反向传播
    反向传播的信息是误差,也就是 输出层(output )的结果 与 输入信息 x 对应的真实结果 之间的差距。
    在这里插入图片描述

    实例设计

    1. 通过正向传播与计算,得到一个正向值
    2. 与标准值对比,得到误差函数E
    3. 反向传播,计算
    4. 得到修正值
    5. 替换成新值,本次学习结束

    在这里插入图片描述

    import math
    import numpy as np
    import sys
    import scipy.io as sio
    from PIL import Image
    import os
    
    def sigmod(x):
        return np.array(list(map(lambda i: 1 / (1 + math.exp(-i)), x)))
    
    
    def get_train_pattern():
        current_dir = "D:/bp1/"
        train = sio.loadmat(current_dir + "mnist_train.mat")["mnist_train"]
        train_label = sio.loadmat(
            current_dir + "mnist_train_labels.mat")["mnist_train_labels"]
        train = np.where(train > 180, 1, 0)  #二值化
        return train, train_label
    
    
    def get_test_pattern():
        base_url = "D:/bp1/mnist_test/"
        test_img_pattern = []
        for i in range(10):
            img_url = os.listdir(base_url + str(i))
            t = []
            for url in img_url:
                img = Image.open(base_url + str(i) + "/" + url)
                img = img.convert('1')   # 二值化
                img_array = np.asarray(img, 'i')  # 转化为int数组
                img_vector = img_array.reshape(
                    img_array.shape[0] * img_array.shape[1]) #展开成一维数组
                t.append(img_vector)
            test_img_pattern.append(t)
        return test_img_pattern
    
    class BPNetwork:
        # 神经网络类
        def __init__(self,in_count, hiden_count, out_count, in_rate, hiden_rate):
            """
    
            :param in_count: 输入层数
            :param hiden_count: 隐藏层数
            :param out_count: 输出层数
            :param in_rate: 输入层学习率
            :param hiden_rate: 隐藏层学习率
            :return:
            """
            # 各个层的节点数量
            self.in_count = in_count
            self.hiden_count = hiden_count
            self.out_count = out_count
    
            # 输入层到隐藏层连线的权重随机初始化
            self.w1 = 0.2 * \
                np.random.random((self.in_count, self.hiden_count)) - 0.1
            # 隐藏层到输出层连线的权重随机初始化
            self.w2 = 0.2 * \
                np.random.random((self.hiden_count, self.out_count)) - 0.1
            # 隐藏层偏置向量
            self.hiden_offset = np.zeros(self.hiden_count)
            self.out_offset = np.zeros(self.out_count)
    
            # 输入层学习率.
            self.in_rate = in_rate
            # 隐藏层学习率
            self.hiden_rate = hiden_rate
    
        def train(self,train_img_pattern, train_label):
            if self.in_count != len(train_img_pattern[0]):
                sys.exit("输入层维数与样本维数不等")
            for i in range(len(train_img_pattern)):
                if i % 5000 == 0:
                    print(i)
                # 生成目标向量
                target = [0] * 10
                target[train_label[i][0]] = 1
                # 前向传播
                # 隐藏层值等于输入层 * w1 + 隐藏层偏置
                hiden_value = np.dot(
                    train_img_pattern[i], self.w1) + self.hiden_offset
                hiden_value = sigmod(hiden_value)
    
                #计算输出层的输出
                out_value = np.dot(hiden_value, self.w2) + self.out_offset
                out_value = sigmod(out_value)
    
                # 反向更新
                error  = target - out_value
                # 计算输出层误差
                out_error = out_value * (1 - out_value) * error
                # 计算隐藏层误差
                hiden_error = hiden_value * \
                              (1 - hiden_value) * np.dot(self.w2, out_error)
    
                # 更新w2 ,w2是j行k列的矩阵,存储隐藏层到输出层的权值
                for k in range(self.out_count):
                    # 更新w2第k列的值,连接隐藏层所有节点到输出层的第k个节点的边
                    # 隐藏层学习率*输入层误差*隐藏层的输出值
                    self.w2[:, k] += self.hiden_rate * out_error[k] * hiden_value
                # 更新w1
                for j in range(self.hiden_count):
                    self.w1[:, j] += self.in_rate * \
                        hiden_error[j] * train_img_pattern[i]
    
                # 更新偏置向量
                self.out_offset += self.hiden_rate * out_error
                self.hiden_offset += self.in_rate * hiden_error
    
    
        def test(self, test_img_pattern):
            """
            测试神经网络的正确率
            :param test_img_pattern:
            :return:
            """
            right = np.zeros(10)
            test_sum = 0
            for num in range(10):
                num_count = len(test_img_pattern[num])
                test_sum += num_count
                for t in range(num_count): #数字num的第t张图片
                     hiden_value = np.dot(
                     test_img_pattern[num][t],self.w1) + self.hiden_offset
                     hiden_value = sigmod(hiden_value)
                     out_value = np.dot(hiden_value,self.w2) + self.out_offset
                     out_value = sigmod(out_value)
    
                     if np.argmax(out_value) == num:
                         # 识别正确
                         right[num] += 1
                print("数字%d的识别正确率%f" % (num, right[num] / num_count))
                # 平均识别率
            print("平均识别率为: ", sum(right) / test_sum)
    
    
    def run():
        # 读入训练集
        train, train_label = get_train_pattern()
        # 读入测试图片
        test_pattern = get_test_pattern()
        # 神经网络配置参数
        in_coount = 28 * 28
        hiden_count = 6
        out_count = 10
        in_rate = 0.1
        hiden_rate = 0.1
        bpnn = BPNetwork(in_coount, hiden_count, out_count, in_rate, hiden_rate)
        bpnn.train(train,train_label)
        bpnn.test(test_pattern)
    
    
    if __name__ == "__main__":
        run()
    
    
    
    

    喜欢我的可以关注我,我们可以一起交流学习

    微信公众号:
    在这里插入图片描述

    让我爱上它Computer

    qq群:473989408

    展开全文
  • 在众多的训练算法中,其中最杰出的代表就是BP算法,它是至今最成功的神经网络学习算法。在实际任务中,大部分都是使用的BP算法来进行网络训练的。值得一提的是,BP算法不仅适用于多层前馈网络,对于其他类型的神经...

      在神经网络中,当我们的网络层数越来越多时,网络的参数也越来越多,如何对网络进行训练呢?我们需要一种强大的算法,无论网络多复杂,都能够有效的进行训练。在众多的训练算法中,其中最杰出的代表就是BP算法,它是至今最成功的神经网络学习算法。在实际任务中,大部分都是使用的BP算法来进行网络训练的。值得一提的是,BP算法不仅适用于多层前馈网络,对于其他类型的神经网络,例如:训练卷积神经网络和递归神经网络。

      由于推导过程太多公式,因而我使用的word的截图。(推导过程参考的是周志华老师的《机器学习》(西瓜书))

      通常,标准BP算法和累积BP算法都很常用,标准BP算法每次更新只使用单个样本,因而参数更新的非常频繁,而且更新的效果可能因为不同的样本出现抵消的情况。因此,达到相同的累积误差极小值,标准BP算法可能需要迭代更多的次数。累积BP算法采用整个训练集的误差进行更新,其更新的频率较低,但累积误差下降到一定的程度后,进一步的下降将会非常缓慢,尤其是在训练集很大的时候,这是标准BP算法可能会获得而较好的效果。

     

     

    转载于:https://www.cnblogs.com/baby-lily/p/10747473.html

    展开全文
  • 卷积神经网络反向BP算法公式推导

    千次阅读 2016-06-28 17:29:10
    此篇博文只涉及到公式推导,如果想了解卷积神经网络的具体工作过程,可查看转载博文博主其它文档或者百度自己去看。转载的文章涉及到的角下标大家注意下,虽然作者进行了解释,但还是注意下,还有原文可能有些错别子...
  • BP算法公式推导

    2018-08-27 17:00:15
    BP算法公式推导 ...
  • BP算法公式推导 (本文为个人学习总结笔记) 原公式: Δθj=−ηgj\Delta \theta_{j}=-\eta g_{j}Δθj​=−ηgj​ 因为: 又:
  • BP算法推导公式

    2019-11-20 16:01:02
    最近在做一个超分辨率的小项目,碰到了关于BP反向传播的问题。于是,就好好查阅了关于BP算法的知识。以前看周志华老师的西瓜书和李航老师的统计学习方法的时候,...我在网上找到了好几篇关于BP算法推导的文章。第一...
  • 这是我见过网上最详细的推导了!! 戳这里 https://theclevermachine.wordpress.com/2014/09/06/derivation-error-backpropagation-gradient-descent-for-neural-networks/
  • BP神经网络:误差反向传播算法公式推导 开端: BP算法提出 1. BP神经网络参数符号及激活函数说明 2. 网络输出误差(损失函数)定义 3. 隐藏层与输出层间的权重更新公式推导 4. 输入层与隐藏层间的权重更新...
  • BP算法公式推导

    2016-12-31 18:50:25
  • BP算法推导

    2017-02-15 21:22:22
    对于BP算法推导目前看到最好的教程是ufldl课程上的推导。网址为http://ufldl.stanford.edu/tutorial/supervised/MultiLayerNeuralNetworks/。涵盖了具体的前向传播和后向传播。 中文比较详细的反向传播公式推导...
  • 一个简单的三层神经网络BP算法公式推导神经网络表示梯度下降法前向误差传播反向误差传播 神经网络表示 让我们来看一个最简单的神经网络,该神经网络只有三层,分别是输入层,隐藏层和输出层。 为了表示方便,我们...
  • 参数定义:  第 (l - 1) 层第 k 个节点与第 l 层第 j 个节点的权重;  第 l 层 第 j 个节点的偏置;  第 l 层 第 j 个节点的输入;...公式推导 1. 第 l 层 第 j 个节点产生的错误​​​:  ...
  • BP——反向传播算法公式推导及代码

    千次阅读 多人点赞 2019-03-14 23:51:19
    BP——反向传播算法计算过程详解人工神经网络的结构前向传播激活函数反向传播梯度下降具体计算过程 本文主要参考吴恩达和李宏毅的深度学习视频,然后自己做的笔记 反向传播计算部分参考李宏毅的视频讲解,要是有...
  • 反向传播算法详细推导 反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法对网络中所有权重计算损失...
  • 注:1)这篇文章主要参考Alex Graves的博士论文《Supervised Sequence Labellingwith Recurrent Neural Networks》 详细介绍其关于BP算法推导过程。 2)论文没有提到过偏差的处理,不过如果能耐心推导出论文给出...
  • 不妨采用最常见的均方差来度量损失。 , 首先求输出层W,b的梯度 提取公共部分,令 接着求第l层W,b的梯度 有了每一层W,b的梯度值,就可以进行反向更新每一层的W,b。  ...
  • 注:1)这篇文章主要参考Alex Graves的博士论文《Supervised Sequence Labelling with Recurrent Neural Networks》 详细介绍其关于BP算法推导过程。   2)论文没有提到过偏差的处理,不过如果能耐心推导出...
  • https://www.cnblogs.com/jsfantasy/p/12177275.html
  • 相信很多人和我一样看了很多的博客,很多书始终对于BP算法都是一头雾水。 其实可以大致总结计算步骤如下: 通过前向传播得到最终的损失。 计算梯度(需要更新的参数的梯度)。 更新梯度。 里面总是出现一些公式...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 193
精华内容 77
关键字:

bp算法公式推导