当前位置: 首页 > article >正文

别再死记公式了!用Python手写一个反向传播,5分钟搞懂链式法则

用Python代码拆解反向传播5分钟可视化链式法则当我在第一次接触神经网络时那些复杂的数学公式让我望而却步。直到有一天我决定用Python代码亲手实现一个简单的反向传播过程才真正理解了链式法则的精妙之处。本文将带你用不到50行代码直观感受误差是如何从输出层逆向流动到每一层权重的。1. 准备工作搭建最小神经网络我们需要构建一个足够简单但又完整的神经网络来演示反向传播。这个网络将包含输入层2个神经元隐藏层3个神经元使用Sigmoid激活函数输出层1个神经元使用Sigmoid激活函数import numpy as np # 随机初始化权重 def initialize_parameters(): np.random.seed(42) W1 np.random.randn(3, 2) * 0.01 b1 np.zeros((3, 1)) W2 np.random.randn(1, 3) * 0.01 b2 np.zeros((1, 1)) return {W1: W1, b1: b1, W2: W2, b2: b2}提示这里使用小随机数初始化权重是为了防止Sigmoid函数在初始阶段就进入饱和区。2. 前向传播计算预测值前向传播就像做一道数学题我们按顺序计算每一层的结果def sigmoid(x): return 1 / (1 np.exp(-x)) def forward_propagation(X, parameters): W1 parameters[W1] b1 parameters[b1] W2 parameters[W2] b2 parameters[b2] # 第一层计算 Z1 np.dot(W1, X) b1 A1 sigmoid(Z1) # 第二层计算 Z2 np.dot(W2, A1) b2 A2 sigmoid(Z2) cache {Z1: Z1, A1: A1, Z2: Z2, A2: A2} return A2, cache让我们用一个简单的输入测试一下X np.array([[0.5], [-0.3]]) # 2维输入 parameters initialize_parameters() A2, cache forward_propagation(X, parameters) print(f预测输出: {A2[0][0]:.4f})3. 反向传播链式法则在行动这才是最精彩的部分我们将一步步拆解误差是如何反向传播的def backward_propagation(parameters, cache, X, Y): m X.shape[1] W2 parameters[W2] A1 cache[A1] A2 cache[A2] # 输出层梯度 dZ2 A2 - Y dW2 (1/m) * np.dot(dZ2, A1.T) db2 (1/m) * np.sum(dZ2, axis1, keepdimsTrue) # 隐藏层梯度 dA1 np.dot(W2.T, dZ2) dZ1 dA1 * A1 * (1 - A1) # Sigmoid导数部分 dW1 (1/m) * np.dot(dZ1, X.T) db1 (1/m) * np.sum(dZ1, axis1, keepdimsTrue) grads {dW1: dW1, db1: db1, dW2: dW2, db2: db2} return grads关键点解析dZ2 A2 - Y这是输出层的误差项dW2 (1/m) * np.dot(dZ2, A1.T)应用链式法则计算W2的梯度dZ1 dA1 * A1 * (1 - A1)这是Sigmoid函数的导数部分4. 参数更新梯度下降实战有了梯度我们就可以更新参数了def update_parameters(parameters, grads, learning_rate0.01): W1 parameters[W1] b1 parameters[b1] W2 parameters[W2] b2 parameters[b2] dW1 grads[dW1] db1 grads[db1] dW2 grads[dW2] db2 grads[db2] W1 W1 - learning_rate * dW1 b1 b1 - learning_rate * db1 W2 W2 - learning_rate * dW2 b2 b2 - learning_rate * db2 return {W1: W1, b1: b1, W2: W2, b2: b2}5. 完整训练循环见证学习过程现在我们把所有部分组合起来观察网络如何学习def train(X, Y, iterations1000, learning_rate0.01): parameters initialize_parameters() for i in range(iterations): # 前向传播 A2, cache forward_propagation(X, parameters) # 计算损失 cost -np.mean(Y * np.log(A2) (1-Y) * np.log(1-A2)) # 反向传播 grads backward_propagation(parameters, cache, X, Y) # 参数更新 parameters update_parameters(parameters, grads, learning_rate) if i % 100 0: print(f迭代 {i}: 损失 {cost:.4f}) return parameters # 训练数据 X np.array([[0.5, -0.3, 0.1], [-0.3, 0.2, -0.1]]) # 3个样本 Y np.array([[1, 0, 1]]) # 3个标签 # 开始训练 final_parameters train(X, Y)运行这段代码你会看到损失值逐渐下降这就是反向传播和链式法则在发挥作用6. 梯度可视化理解链式法则的本质为了更直观地理解让我们打印出关键梯度值# 获取一次前向传播和反向传播的结果 A2, cache forward_propagation(X[:, 0:1], parameters) grads backward_propagation(parameters, cache, X[:, 0:1], Y[:, 0:1]) print(输出层梯度:) print(fdZ2:\n{grads[dZ2]}) print(fdW2:\n{grads[dW2]}) print(\n隐藏层梯度:) print(fdZ1:\n{grads[dZ1]}) print(fdW1:\n{grads[dW1]})观察这些数值你会发现梯度从输出层向输入层反向传播每一层的梯度都是前一层的梯度和当前层激活函数导数的乘积这正是链式法则的直观体现7. 常见问题与调试技巧在实际实现中你可能会遇到以下问题梯度消失当使用Sigmoid激活函数时深层网络的梯度可能会变得非常小解决方案使用ReLU等激活函数或进行梯度裁剪数值不稳定计算过程中可能出现NaN值检查初始化权重是否合适学习率是否过大学习速度慢损失下降不明显尝试调整学习率增加网络容量调试反向传播的一个有效技巧是使用梯度检验Gradient Checking虽然计算成本较高但能确保你的反向传播实现正确def gradient_check(parameters, grads, X, Y, epsilon1e-7): parameters_values parameters.copy() grad_approx {} for key in parameters: # 计算数值梯度 theta_plus parameters_values.copy() theta_plus[key] epsilon J_plus, _ forward_propagation(X, theta_plus) theta_minus parameters_values.copy() theta_minus[key] - epsilon J_minus, _ forward_propagation(X, theta_minus) grad_approx[key] (J_plus - J_minus) / (2 * epsilon) # 比较数值梯度和解析梯度 for key in grad_approx: difference np.linalg.norm(grads[dkey] - grad_approx[key]) print(f{key}梯度差异: {difference:.2e} (应该1e-7))通过这个完整的实现过程相信你已经对反向传播和链式法则有了直观的理解。记住在深度学习中代码实践往往比死记公式更能带来深刻的理解。

相关文章:

别再死记公式了!用Python手写一个反向传播,5分钟搞懂链式法则

用Python代码拆解反向传播:5分钟可视化链式法则 当我在第一次接触神经网络时,那些复杂的数学公式让我望而却步。直到有一天,我决定用Python代码亲手实现一个简单的反向传播过程,才真正理解了链式法则的精妙之处。本文将带你用不到…...

怎样高效压缩视频图片:3步掌握CompressO跨平台压缩神器

怎样高效压缩视频图片:3步掌握CompressO跨平台压缩神器 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compressO …...

VSCode+LLM开发环境搭建,从零到生产级推理仅需8分钟(附可验证配置模板)

更多请点击: https://intelliparadigm.com 第一章:VSCodeLLM开发环境搭建,从零到生产级推理仅需8分钟(附可验证配置模板) 必备工具链安装 确保已安装 VSCode 1.85、Python 3.11 和 Node.js 18。执行以下命令一次性完…...

部署国标GB28181视频平台EasyGBS,授权方式怎么选?激活文件、加密狗、加密机,一次讲清楚

很多朋友第一次部署EasyGBS平台时,都会卡在同一个问题上:“我到底该选哪种授权方式?”激活文件、加密狗、加密机,听起来都不复杂,但各有各的用法和适用场景。选错了,后面换服务器、迁系统时会很麻烦。今天咱…...

C程序员必读的7个内存越界陷阱:2026年LLVM 18+Clang静态分析实测避坑指南

更多请点击: https://intelliparadigm.com 第一章:C程序员必读的7个内存越界陷阱:2026年LLVM 18Clang静态分析实测避坑指南 在 LLVM 18 发布后,Clang 的 -fsanitizeaddress(ASan)与 -Warray-bounds、-Wstr…...

从“拼时间”到“拼结构”:AI 时代的职业跃迁新范式

一、范式迁移:职业竞争的底层规则正在改写如果说过去的职场竞争,本质是“谁更努力、谁更有经验”,那么 AI 时代的核心问题已经变成:你的能力是否处在一个可以被放大的结构中。技术的进步,并没有简单地减少岗位&#xf…...

ABC选择思维:为什么中间价位总是最好卖

有一个卖净水器的商家,产品售价1680元。但每次顾客都要犹豫很久,因为不清楚这个价位是贵还是便宜。 后来,商家做了这样一个调整:引进一款低端净水器售价980元,一款高端净水器售价2980元。三款产品同时销售。 结果神奇的…...

生信小白也能搞定!用miRcode批量预测lncRNA-miRNA互作关系(附保姆级操作截图)

零代码实战:miRcode批量预测lncRNA-miRNA互作全流程指南 刚接触ceRNA网络分析的研究者常面临一个现实问题:手头有几十个候选lncRNA,如何快速找出它们可能结合的miRNA?传统方法需要逐个基因查询,耗时且容易出错。本文将…...

nrf54l15使用I2C驱动SHT40温湿度传感器

Nordic芯片对于驱动传感器这方面我感觉对新手来说是很友好的,因为它的底层驱动集成了市面上 常见的大部分的传感器的驱动,比如说你如果使用I2C接口的传感器,使用 软件I2C的话,根本不用去拼凑时序,六段基本时序还有传感…...

AI安全进阶面试:高阶安全技术面试题与解析

AI安全进阶面试:高阶安全技术面试题与解析📝 本章学习目标:本章聚焦职业发展,帮助读者规划AI安全合规治理的学习与职业路径。通过本章学习,你将全面掌握"AI安全进阶面试:高阶安全技术面试题与解析&quo…...

20260423给万象奥科的开发板HD-RK3576-PI适配瑞芯微原厂的Buildroot时使用weston-screenshooter截屏

Y:\git_RK3576_Linux6.1\buildroot\package\weston\S49weston Y:\git_RK3576_Linux6.1\buildroot\output\rockchip_rk3576\target\etc\init.d\S49weston20260423给万象奥科的开发板HD-RK3576-PI适配瑞芯微原厂的Buildroot时使用weston-screenshooter截屏 2026/4/23 9:081、RK35…...

在openEuler 23.03上,我为什么放弃了直接编辑ifcfg文件,改用nmcli命令配置网卡?

在openEuler 23.03上,我为什么放弃了直接编辑ifcfg文件,改用nmcli命令配置网卡? 凌晨三点,服务器监控突然告警,我的SSH连接毫无征兆地断开。通过控制台查看,发现网络接口莫名其妙地失去了IP配置。这次事故…...

机器学习工程师的纳达尔式训练法

1. 项目概述:像纳达尔一样精通机器学习在职业网坛,拉斐尔纳达尔以"红土之王"著称——他通过独特的旋转球技术、惊人的体能储备和战术智慧,在法网创下14次夺冠的传奇纪录。这种将天赋、训练和策略完美结合的特质,正是机器…...

LayerDivider:如何实现智能图像分层与PSD文件自动生成?

LayerDivider:如何实现智能图像分层与PSD文件自动生成? 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider LayerDivider是一款基于色…...

手把手教你用CLIP模型构建一个简易的“以图搜图”或“文搜图”系统(基于transformers 4.25.0)

从零构建基于CLIP的跨模态搜索引擎:图像与文本的语义桥梁 在数字内容爆炸式增长的时代,如何在海量图片库中快速找到符合语义需求的图像?传统的关键词搜索已经无法满足我们对图像理解的深层需求。想象一下,当你手头有十万张产品图片…...

产品经理必看:如何利用GB/T 4754-2017行业分类,做好你的用户画像与市场分析?

产品经理实战指南:用GB/T 4754-2017构建精准商业决策框架 当产品经理面对一个模糊的B端需求时,最常遇到的困境是:"我们的目标客户到底属于哪个细分行业?"去年我负责一款企业级SaaS产品重构时,销售团队反馈&q…...

手把手教你部署GEO推广系统,在线扫码授权配置,手机PC双端自适应

温馨提示:文末有资源获取方式为什么要关注GEO?AI搜索正在改变用户获取信息的方式。过去大家习惯在传统搜索引擎里找答案,现在越来越多的人直接问AI。如果你的品牌和产品无法出现在AI的答案里,就等于失去了一块新流量阵地。源码获取…...

虚拟电厂平台化运营与生态构建实战指南

1. 虚拟电厂平台化运营的核心逻辑 虚拟电厂本质上是一个能源互联网时代的"资源调度平台",就像滴滴整合私家车、美团整合餐厅一样,它把分散的储能电站、充电桩、工商业用电设备等资源聚合起来,形成一个可调控的"巨型电厂"…...

免费的可以读取.iso文件的软件——虚拟光驱-下载

免费的可以读取.iso文件的软件——虚拟光驱-下载 通过网盘分享的文件:虚拟光驱.exe 链接: https://pan.baidu.com/s/1YOaktl6D38LMVxu_MvyiDA?pwdpgnn 提取码: pgnn...

微电网多层控制架构设计的发展趋势

在“双碳”战略深入推进与新型电力系统加速建设的背景下,高比例分布式新能源(光伏、风电等)规模化渗透,交直流混合微网、多能互补微网、集群微网成为主流形态,微电网的运行场景日益复杂,对控制架构的稳定性…...

CVAT在线数据标注

CVAT支持矩形、多边形、视频插值的数据标注平台,支持团队协作、复杂项目、视频标注等,可导出YOLO格式 一、平台地址 https://app.cvat.ai/ 必须先登录在进入系统 二、创建项目 主要用于管理多个共享同一套标签体系的任务 三、创建任务与配置 任务是实…...

告别‘Unable to find suitable Visual Studio toolchain’:一份给Flutter开发者的Windows环境自查清单

Flutter开发者的Windows环境终极自查指南:从工具链报错到健壮环境搭建 当你在Windows上运行flutter run -d windows时,那个刺眼的红色错误信息"Unable to find suitable Visual Studio toolchain"是否让你感到沮丧?这不仅仅是安装…...

抖音无水印视频下载神器:5分钟掌握批量下载的完整解决方案

抖音无水印视频下载神器:5分钟掌握批量下载的完整解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback s…...

用Logitech G Hub写Lua脚本:手把手教你为PUBG M416调一个专属压枪宏

用Logitech G Hub打造专属压枪宏:从Lua脚本到PUBG实战优化 罗技G系列外设的G Hub软件为游戏玩家打开了一扇自定义操作的大门。想象一下,当你手中的M416在连续射击时,弹道像被无形的手稳稳控制着——这不是外挂,而是通过G Hub的Lua…...

别再只玩Arduino了!用STM32的HAL库驱动RDA5807收音机模块,I2C通信保姆级教程

从Arduino到STM32:HAL库驱动RDA5807收音机模块的实战指南 在创客圈里,Arduino因其简单易用而广受欢迎,但当项目需求变得更加复杂时,许多开发者会发现Arduino的性能和资源开始捉襟见肘。这时候,转向更强大的STM32平台就…...

抖音视频批量下载神器:从新手到高手的完整指南

抖音视频批量下载神器:从新手到高手的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

学术论文PDF怎么转结构化数据

做过文献调研的人都深有体会:面对成百上千篇PDF格式的学术论文,想要系统性地提取其中的数据、公式、表格,简直是一场噩梦。传统OCR工具不是把公式识别成乱码,就是把双栏排版的段落顺序彻底打乱。合合信息推出的TextIn文档解析&…...

代谢组学找差异物别再只画火山图了!试试用R语言做OPLS-DA,VIP筛选更精准

代谢组学差异分析进阶:用OPLS-DA和VIP值突破火山图局限 在代谢组学研究中,找到真正有生物学意义的差异代谢物就像大海捞针。传统火山图虽然直观,但往往漏掉关键信号或混杂过多噪声。最近处理一批尿液代谢组数据时,我反复对比发现…...

Vulkan开发环境搭建全记录:从SDK下载到第一个窗口弹出,我踩过的那些坑(Win11/VS2022实测)

Vulkan开发环境搭建全记录:从SDK下载到第一个窗口弹出,我踩过的那些坑(Win11/VS2022实测) 作为一名刚接触图形编程的开发者,当我第一次听说Vulkan这个高性能图形API时,内心既兴奋又忐忑。相比OpenGL&#x…...

蓝桥杯单片机DS1302时钟不走?手把手教你排查硬件连接与驱动代码问题

蓝桥杯DS1302时钟模块深度排错指南:从硬件连接到代码优化的全流程解析 当你在蓝桥杯单片机竞赛中遇到DS1302时钟模块"罢工"时,那种看着数码管上凝固的时间数字的焦虑感,相信每个参赛者都深有体会。本文将带你走进时钟模块故障排查的…...