深度学习笔记——手稿推导BP算法(附代码实现)

本文深入解析BP(BackPropagation)反向传播算法,为深度学习爱好者提供清晰的数学推导和神经网络工作原理。通过手推过程和基于numpy的代码实现,帮助读者理解BP算法的具体流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

相信很多小伙伴在学习深度学习的过程中,都无法逃避BP(Back Propagation)反向传播算法的学习,确实如此,BP算法是ML、DL的经典算法之一,想深入研究深度学习,那就有必要去深入了解BP算法了。
接下来将是简洁而详细的手推过程。此处假设你对BP已经有了神经网络的基本概念,并且最好已经看过BP算法。看完这篇文章后,能够帮助你弄懂BP算法的具体流程,以及BP算法的数学推导过程。

神经网络BP算法例子

在这里插入图片描述

神经网络FP、BP的推算过程:(原理不难,对上号代公式即可)

在这里插入图片描述

基于numpyBP反向传播算法代码实现

"""
**利用numpy实现BP算法
@author: <Colynn Johnson>
@direct: https://www.bilibili.com/video/BV1yx411f7LF?p=2
@date: 2020-9-6
"""
import numpy as np

#已知标签
target_o1 = 0.01
target_o2 = 0.99

#随机初始化w、b
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 = [0.35, 0.65]

X = [5, 10]

#定义sigmoid函数
def sigmoid(z):
    return 1.0 / (1+np.e**(-z))

#定义Bp函数
def f(w, b, x):
    #FP过程
    out_h1 = sigmoid(w[0]*x[0] + w[1]*x[1] + b[0])
    out_h2 = sigmoid(w[2]*x[0] + w[3]*x[1] + b[0])
    out_h3 = sigmoid(w[4]*x[0] + w[5]*x[1] + b[0])

    out_o1 = sigmoid(w[6]*out_h1 + w[8]*out_h2 + w[10]*out_h3 + b[1])
    out_o2 = sigmoid(w[7]*out_h1 + w[9]*out_h2 + w[11]*out_h3 + b[1])

    #BP过程
    #求E_total/net_o[i]的偏导, i=1,2
    partial_derivate1 = -(target_o1-out_o1)*out_o1*(1-out_o1)
    partial_derivate2 = -(target_o2-out_o2)*out_o2*(1-out_o2)

    w[6] = w[6] - 0.5*partial_derivate1*out_h1
    w[8] = w[8] - 0.5*partial_derivate1*out_h2
    w[10] = w[10] - 0.5*partial_derivate1*out_h3

    w[7] = w[7] - 0.5*partial_derivate2*out_h1
    w[9] = w[9] - 0.5*partial_derivate2*out_h2
    w[11] = w[11] - 0.5*partial_derivate2*out_h3

    #下面求w[0]到w[5]其实跟上面原理一样,不同的是每个w[i]的偏导都与out_o1和out_o2有关
    #稍微细心一点推算即可
    w[0] = w[0] - 0.5*(partial_derivate1*w[6] + partial_derivate2*w[7])*out_h1*(1-out_h1)*x[0]
    w[1] = w[1] - 0.5*(partial_derivate1*w[6] + partial_derivate2*w[7])*out_h1*(1-out_h1)*x[1]
    w[2] = w[2] - 0.5*(partial_derivate1*w[8] + partial_derivate2*w[9])*out_h2*(1-out_h2)*x[0]
    w[3] = w[3] - 0.5*(partial_derivate1*w[8] + partial_derivate2*w[9])*out_h2*(1-out_h2)*x[1]
    w[4] = w[4] - 0.5*(partial_derivate1*w[10] + partial_derivate2*w[11])*out_h3*(1-out_h3)*x[0]
    w[5] = w[5] - 0.5*(partial_derivate1*w[10] + partial_derivate2*w[11])*out_h3*(1-out_h3)*x[1]

    print("-"*20)
    print(w)
    print("-"*20)
    return w

if __name__ == '__main__':
    for i in range(1000):
        print('第%d个'%i)
        w = f(w, b, X)

ToDo: 将w、b可视化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值