专栏首页算法channel深度学习|反向传播算法(BP)原理推导及代码实现

深度学习|反向传播算法(BP)原理推导及代码实现

《实例》阐述算法,通俗易懂,助您对算法的理解达到一个新高度。包含但不限于:经典算法,机器学习,深度学习,LeetCode 题解,Kaggle 实战。期待您的到来!

01

回顾

昨天,分析了手写字数据集分类的原理,利用神经网络模型,编写了SGD算法的代码,分多个epochs,每个 epoch 又对 mini_batch 样本做多次迭代计算,详细的过程,请参考:

深度学习|神经网络模型实现手写字分类求解思路

这其中,非常重要的一个步骤,便是利用反向传播(BP)算法求权重参数的梯度,偏置量的梯度。下面根据以下几个问题展开BP算法:

  • 什么是BP算法?
  • 为什么叫做反向传播?
  • 如何构思BP算法的切入点?
  • 误差是如何传播开的?
  • 如何求出权重参数的梯度和偏置量的梯度?
  • 链式规则是怎么一回事?

02

统一符号表达

神经网络每个神经元的连接关系,用符合如何表达呢? 下面定义一种表达方式,如下图所示,含有一个隐含层的神经网络,图中标出的w的含义为:第三层的第2个神经元与第二层的第4个神经元间的权重参数。

再看下,标红色箭头的神经元的偏移量 b,如图所示进行标记,第二层中第3个神经元的偏移量;标绿色箭头的神经元的输出 a 为如下图所示标记,为第三层中第一个神经元的输出。

第 L 层第 j 个神经元的输出等于,前1层即 L-1 层中所有神经元的带权的输入和,然后再映射到sigmoid激活函数中,得到如下公式所述:

一定要仔细理解这种上述公式的各个符号表达,它是理解以下对 BP 算法论述的前提。

03

BP算法推导

3.1 公式1

如下图所示,有个精灵跑到了网络中,假设位于第L层,第 j 个神经元的门口处,它引起了一点扰动,

z的含义是加权输入项,容易得出这个扰动项对成本函数造成的损失可以定义为:

那么,类推的,可以看出在输出层 L, 误差项的定义表达为如下,第一个公式

上式是根据链式规则可以推导得出,成本函数的改变首先是有第L层第j个神经元的输出项影响的,然后第 j 个神经元的输出又受到第 L层第 j 个神经元的干扰 z 影响,因此得到上式。这个式子的意义是定义了第 L层第 j个神经元的误差项怎么求,注意这里L可是输出层哦,那么如何求出第 L-1层中某个神经元的损失项(误差项)呢?

3.2 公式2

这就用到第二个公式,它给出了怎么由第 L层的误差推导出第L-1层的误差,先给出第二个公式

那么,这个公式,是如何得出的呢?这里面,这个公式是相对最难想的,推导过程如下:

还是从损失项的定义入手,

由以上这几个式子,就可以得出公式2 。

3.3 公式3

那么有了以上的分析,我们便能求解处任意层的损失项了,可以得出成本函数对某层某个神经元的梯度为,这是第三个公式

还是可以由链式规则得出吧,如下推导过程:

3.4 公式4

成本函数对权重参数的梯度为,这是第四个公式

那么这个公式还是可以由链式规则得出,对其推导如下:

推导第三,四个公式,都用到了以下这个基本知识:

3.5 反向传播代码

根据这四个公式,可以得出BP算法的代码,每个步骤将公式放到上面,方便查看。

def backprop(self, x, y):

01 占位

nabla_b = [np.zeros(b.shape) for b in self.biases]

nabla_w = [np.zeros(w.shape) for w in self.weights]

02 前向传播求出每个神经元的输出项

activation = x

activations = [x] # 分层存储每层的输出项(对应上文中的 a)

zs = [] # 分层存储每层的 z 向量(对应上文中的 z)

for b, w in zip(self.biases, self.weights):

z = np.dot(w, activation)+b

zs.append(z)

activation = sigmoid(z)

activations.append(activation)

#activations[-1] 必须是最后一层

delta = self.cost_derivative(activations[-1], y) * sigmoid_prime(zs[-1])

03 求偏置量的梯度

nabla_b[-1] = delta

04 求权重参数的梯度

nabla_w[-1] = np.dot(delta, activations[-2].transpose())

05 反向传播,依次更新每层的每个神经元的权重和偏移量

# L = 1 表示最后一层神经元, L = 2 倒数第二层神经元

for layer in range(2, self.num_layers):

z = zs[-layer]

sp = sigmoid_prime(z) #sigmoid函数的导数

delta = np.dot(self.weights[-layer+1].transpose(), delta) * sp

nabla_b[-layer] = delta

nabla_w[-layer] = np.dot(delta, activations[-layer-1].transpose())

return (nabla_b, nabla_w)

def cost_derivative(self, output_activations, y):

"""

"""

return (output_activations-y)

好了,以上就是,BP算法的详细推导过程,谢谢您的阅读!

本文分享自微信公众号 - 算法channel(alg-channel)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-12-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ISUX Xcube智能一键生成H5

    腾讯ISUX
  • 中国互联网协会发布:《2018中国互联网发展报告》

    在2018中国互联网大会闭幕论坛上,中国互联网协会正式发布《中国互联网发展报告2018》(以下简称《报告》)。《中国互联网发展报告》是由中国互联网协会与中国互联...

    钱塘数据
  • 【系统设置】CentOS 修改机器名

    ken.io
  • 【倒计时7天】2018教育部-腾讯公司产学合作协同育人项目申请即将截止!

    腾讯高校合作
  • 不只是软件,在线也可以免费下载百度文库了。

    不管是学生,还是职场员工,下载各种文档几乎是不可避免的,各种XXX.docx,XXX.pptx更是家常便饭,人们最常用的就是百度文库,豆丁文库,道客巴巴这些下载...

    课代表
  • 理工男图解零维到十维空间,烧脑已过度,受不了啦!

    让我们从一个点开始,和我们几何意义上的点一样,它没有大小、没有维度。它只是被想象出来的、作为标志一个位置的点。它什么也没有,空间、时间通通不存在,这就是零维度。

    钱塘数据
  • 知识体系解决迷茫的你

    最近在星球里群里都有小伙伴说道自己对未来的路比较迷茫,一旦闲下来就不知道自己改干啥,今天我这篇文章就是让你觉得一天给你 25 个小时你都不够用,觉得睡觉都是浪费...

    桃翁
  • 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录

    从毕业到现在第一次接触到超过30万条数据导入MySQL的场景(有点low),就是在顺丰公司接入我司EMM产品时需要将AD中的员工数据导入MySQL中,因此楼主负...

    haifeiWu
  • 考研英语-1-导学

    英二图表作文要重视。总体而言,英语一会比英语二难点。不过就写作而言,英语二会比英语一有难度,毕竟图表作文并不好写。

    用户1335799
  • SQL中GROUP BY用法示例

    GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类...

    Awesome_Tang

扫码关注云+社区

领取腾讯云代金券