【机器学习:十九、反向传播】
1. 计算图和导数
计算图的概念
计算图(Computation Graph)是一种有向无环图,用于表示数学表达式中的计算过程。每个节点表示一个操作或变量,每条边表示操作的依赖关系。通过计算图,可以轻松理解和实现反向传播。
计算图的意义
- 直观地展示复杂计算过程。
- 支持自动微分,通过链式规则计算导数。
- 应用于神经网络中梯度的高效计算。
例如,对于函数 z = ( x + y ) ⋅ w z = (x + y) \cdot w z=(x+y)⋅w ,其计算图包括三个节点(加法、乘法、输入变量)和两条边。
2. 计算代价函数的偏导 - 单神经元
代价函数的定义
代价函数衡量模型输出与真实值之间的差距,例如平方误差:
L = 1 2 ( y − y ^ ) 2 L = \frac{1}{2} (y - \hat{y})^2 L=21(y−y^)2
其中, y ^ \hat{y} y^ 是模型输出, y y y 是目标值。
单神经元的导数推导
假设输出为 y ^ = σ ( w x + b ) \hat{y} = \sigma(wx + b) y^=σ(wx+b) ,其中 σ \sigma σ 是激活函数(如 Sigmoid),导数计算如下:
-
对于权重 w w w :
∂ L ∂ w = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ z ⋅ ∂ z ∂ w \frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial w} ∂w∂L=∂y^∂L⋅∂z∂y^⋅∂w∂z -
对于偏置 b b b :
∂ L ∂ b = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ z ⋅ ∂ z ∂ b \frac{\partial L}{\partial b} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial b} ∂b∂L=∂y^∂L⋅∂z∂y^⋅∂b∂z
意义
通过计算偏导数,可以更新参数 w w w 和 b b b 以最小化损失函数。
3. 链导法则求导
链导法则是反向传播的核心,其定义如下:
∂ L ∂ x = ∂ L ∂ y ⋅ ∂ y ∂ x \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} ∂x∂L=∂y∂L⋅∂x∂y
步骤:
- 先计算从输出到隐藏层的梯度。
- 再计算从隐藏层到输入的梯度。
例如,对于两层网络的损失函数 L = f ( g ( x ) ) L = f(g(x)) L=f(g(x)) ,使用链导法则:
∂ L ∂ x = ∂ f ∂ g ⋅ ∂ g ∂ x \frac{\partial L}{\partial x} = \frac{\partial f}{\partial g} \cdot \frac{\partial g}{\partial x} ∂x∂L=∂g∂f⋅∂x∂g
4. 过程解释
反向传播过程包括以下步骤:
- 前向传播:计算网络输出和损失函数。
- 反向传播:从输出层开始,逐层计算梯度。
- 更新参数:使用梯度下降或其变体更新参数。
假设两层网络的权重为 W 1 W_1 W1 和 W 2 W_2 W2 ,反向传播过程为:
-
计算输出层梯度 δ 2 \delta_2 δ2 :
δ 2 = ∂ L ∂ z 2 = ∂ L ∂ y ^ ⋅ σ ′ ( z 2 ) \delta_2 = \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial \hat{y}} \cdot \sigma'(z_2) δ2=∂z2∂L=∂y^∂L⋅σ′(z2) -
计算隐藏层梯度 δ 1 \delta_1 δ1 :
δ 1 = ( δ 2 ⋅ W 2 T ) ⋅ σ ′ ( z 1 ) \delta_1 = (\delta_2 \cdot W_2^T) \cdot \sigma'(z_1) δ1=(δ2⋅W2T)⋅σ′(z1) -
更新权重和偏置:
W 2 = W 2 − α ⋅ δ 2 ⋅ h 1 T W_2 = W_2 - \alpha \cdot \delta_2 \cdot h_1^T W2=W2−α⋅δ2⋅h1TW 1 = W 1 − α ⋅ δ 1 ⋅ x T W_1 = W_1 - \alpha \cdot \delta_1 \cdot x^T W1=W1−α⋅δ1⋅xT
5. 神经网络中的反向传播
多层网络中的反向传播
多层网络通过将链导法则逐层应用,从输出层反向传播至输入层。每层的梯度依赖于后一层的梯度。
实现代码示例
import numpy as np# 定义激活函数及其导数
def sigmoid(x):return 1 / (1 + np.exp(-x))def sigmoid_derivative(x):return sigmoid(x) * (1 - sigmoid(x))# 前向传播
x = np.array([1, 2]) # 输入
w1 = np.array([[0.1, 0.2], [0.3, 0.4]]) # 权重
b1 = np.array([0.5, 0.5]) # 偏置
z1 = np.dot(w1, x) + b1
a1 = sigmoid(z1)# 反向传播
delta = (a1 - 1) * sigmoid_derivative(z1)
grad_w1 = np.outer(delta, x)
6. 计算代价函数的偏导 - 两层神经网络
两层神经网络的反向传播在单层基础上扩展,每层分别计算:
∂ L ∂ W 1 , ∂ L ∂ W 2 , ∂ L ∂ b 1 , ∂ L ∂ b 2 \frac{\partial L}{\partial W_1}, \frac{\partial L}{\partial W_2}, \frac{\partial L}{\partial b_1}, \frac{\partial L}{\partial b_2} ∂W1∂L,∂W2∂L,∂b1∂L,∂b2∂L
总结与意义
反向传播是神经网络训练的核心,通过计算梯度并更新参数,使得网络能够有效学习复杂的映射关系,从而提高模型的泛化能力。
相关文章:
【机器学习:十九、反向传播】
1. 计算图和导数 计算图的概念 计算图(Computation Graph)是一种有向无环图,用于表示数学表达式中的计算过程。每个节点表示一个操作或变量,每条边表示操作的依赖关系。通过计算图,可以轻松理解和实现反向传播。 计算…...
线形回归与小批量梯度下降实例
1、准备数据集 import numpy as np import matplotlib.pyplot as pltfrom torch.utils.data import DataLoader from torch.utils.data import TensorDataset######################################################################### #################准备若干个随机的x和…...
SpringCloud微服务:基于Nacos组件,整合Dubbo框架
dubbo和fegin的差异 一、Feign与Dubbo概述 Feign是一个声明式的Web服务客户端,使得编写HTTP客户端变得更简单。通过简单的注解,Feign将自动生成HTTP请求,使得服务调用更加便捷。而Dubbo是一个高性能、轻量级的Java RPC框架,提供了…...
Golang 简要概述
文章目录 1. Golang 的学习方向2. Golang 的应用领域2.1 区块链的应用开发2.2 后台的服务应用2.3 云计算/云服务后台应用 1. Golang 的学习方向 Go 语言,我们可以简单的写成 Golang 2. Golang 的应用领域 2.1 区块链的应用开发 2.2 后台的服务应用 2.3 云计算/云服…...
web前端第三次作业---制作可提交的用户注册表
制作可提交的用户注册表: 代码: <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…...
教育邮箱的魔力:免费获取Adobe和JetBrains软件
今天想和大家聊聊一个超级实用的话题——如何利用Edu教育邮箱来免费获取Photoshop等Adobe系列软件,以及JetBrains的各种开发工具。 Edu邮箱的价值 首先,Edu邮箱真的是个宝藏!如果你在学校或教育机构注册过,通常会获得一个这样的…...
sympy常用函数与错误笔记
文章目录 前言一、sympy基本函数介绍变量定义1. sp.Symbol("x") 或 sp.symbols("m n")2. sp.Function("y")3. func(x).diff(x, n) 定义方程与求解符号1. sp.Eq(lhs, rhs)2. 求解函数(*代表了常用且重要,其他部分作为拓展&…...
47_Lua文件IO操作
文件I/O(Input/Output)操作在Lua中用于与外部文件进行交互,包括读取文件中的数据和将数据写入文件。Lua提供了两种模式来进行文件操作:简单模式和完全模式。下面将详细介绍这两种模式的基本使用。 1.简单模式 1.1 简单模式介绍 简单模式提供了基本的文件操作功能,它主要…...
nginx-lua模块处理流程
一. 简述: nginx的模块化设计使得每一个http模块可以只专注于完成一个独立的,简单的功能。一个请求的完整处理过程可以由多个http模块共同协作完成,这种设计具有简单性,测试性,扩展性,灵活性。关于nginx 的…...
【大数据】机器学习-----最开始的引路
以下是关于机器学习的一些基本信息,包括基本术语、假设空间、归纳偏好、发展历程、应用现状和代码示例: 一、基本术语 样本(Sample): 也称为实例(Instance)或数据点(Data Point&…...
【前端】自学基础算法 -- 21.图的广度优先搜索
图的广度优先搜索 简介 图的广度优先搜索,沿着图的宽度遍历图的节点,先访问离起始节点最近的节点,然后逐渐向外扩展。 基本步骤: 选择一个起始节点作为当前节点。将当前节点加入队列。当队列不为空时,重复以下步骤…...
ChatGPT与Claude AI:两大生成式对话模型的比较分析
自ChatGPT推出以来,这款强大的AI聊天机器人迅速吸引了全球的关注。其出色的对话能力和多样化的应用场景,成为许多人初次体验基于大规模语言模型的潜力。然而,在这个快速发展的领域中,另一款AI也在悄然崭露头角,那就是由…...
前端开发:盒子模型、块元素
1.border边框 *{box-sizing:border-box; } //使所有边框不再撑大盒子模型 粗细 : border-width 样式 : border-style, 默认没边框 . solid 实线边框 dashed 虚线边框 dotted 点线边框 颜色 : border-color div { width : 200px ; height : 200px ; border : …...
升级 CentOS 7.x 系统内核到 4.4 版本
问题描述 在 CentOS 7.x 系统中,默认内核版本是 3.10.x,这个版本可能会带来一些与 Docker 和 Kubernetes 兼容性的问题,导致系统性能不稳定或功能异常。为了提高系统的稳定性和兼容性,建议升级到更高版本的内核,例如 …...
播放音频文件同步音频文本
播放音频同步音频文本 对应单个文本高亮显示 使用audio音频文件对应音频文本资源 音频文本内容(Json) [{"end": 4875,"index": 0,"speaker": 0,"start": 30,"text": "70号二啊,","tex…...
springboot使用Easy Excel导出列表数据为Excel
springboot使用Easy Excel导出列表数据为Excel Easy Excel官网:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write 主要记录一下引入时候的pom,直接引入会依赖冲突 解决方法: <!-- 引入Easy Excel的依赖 -->&l…...
day07_Spark SQL
文章目录 day07_Spark SQL课程笔记一、今日课程内容二、Spark SQL函数定义(掌握)1、窗口函数2、自定义函数背景2.1 回顾函数分类标准:SQL最开始是_内置函数&自定义函数_两种 2.2 自定义函数背景 3、Spark原生自定义UDF函数3.1 自定义函数流程&#x…...
高性能现代PHP全栈框架 Spiral
概述 Spiral Framework 诞生于现实世界的软件开发项目是一个现代 PHP 框架,旨在为更快、更清洁、更卓越的软件开发提供动力。 特性 高性能 由于其设计以及复杂精密的应用服务器,Spiral Framework框架在不影响代码质量以及与常用库的兼容性的情况下&a…...
LeetCode - #182 Swift 实现找出重复的电子邮件
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》
在当今数字化时代,鸿蒙Next系统与人工智能的融合为开发者带来了前所未有的机遇,开发一款人工智能语音助手应用更是备受关注。以下是在鸿蒙Next系统上开发人工智能语音助手应用的关键步骤: 环境搭建与权限申请 安装开发工具:首先需…...
黑盒LLM幻觉抑制:10大落地方案全解析
面向API调用黑盒LLM的幻觉抑制落地方案 一、零成本提示工程与推理引导类(仅修改Prompt,直接API调用即可生效) 方案1:Self-Consistency(自一致性投票)- SelfCheckGPT 论文基础信息 标题:SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generativ…...
边缘检测数据集BSDS500的‘坑’与优化:多标注者标签融合与阈值选择的经验谈
边缘检测数据集BSDS500的‘坑’与优化:多标注者标签融合与阈值选择的经验谈 第一次接触BSDS500数据集时,我以为这不过又是一个标准的边缘检测基准——直到我的RCF网络在验证集上输出了支离破碎的边缘图。那个深夜调试参数的场景至今记忆犹新:…...
Lisk SDK安全最佳实践:保护区块链应用免受攻击的10个技巧
Lisk SDK安全最佳实践:保护区块链应用免受攻击的10个技巧 【免费下载链接】lisk-sdk 🔩 Lisk software development kit 项目地址: https://gitcode.com/gh_mirrors/li/lisk-sdk Lisk SDK是一款强大的区块链应用开发工具包,专为构建安…...
GCC扩展语法在嵌入式开发中的高效应用
1. GCC扩展语法深度解析在嵌入式开发领域,GCC编译器因其强大的功能和灵活的扩展特性而广受欢迎。作为一名长期从事嵌入式系统开发的工程师,我发现掌握GCC的扩展语法能显著提升代码效率和可维护性。今天我将分享几个在实际项目中特别实用的GCC扩展语法特性…...
典型的TCP客户端单次事务处理VI 通过已建立的TCP连接,发送一段数据(命令/字符串),等待设备响应后读取指定字节数的返回数据
这个VI程序框图详细解析(LabVIEW TCP通信事务VI)这是一个典型的TCP客户端单次事务处理VI(常命名为“TCP Send & Receive.vi”或“TCP通信子VI”)。 它的核心功能是:通过已建立的TCP连接,发送一段数据&a…...
实战指南:基于快马平台用PostgreSQL的JSONB字段构建灵活的产品管理系统
今天想和大家分享一个实战项目经验:如何用PostgreSQL的JSONB字段为电商网站构建灵活的产品管理系统。这个方案特别适合产品属性差异大的场景,比如同时卖手机和书籍的电商平台。 为什么选择JSONB字段 电商网站经常遇到一个头疼问题:不同品类的…...
STM32实战:S曲线加减速算法在步进电机控制中的实现与调优
1. 为什么需要S曲线加减速控制 我第一次用步进电机做3D打印机时,电机启动瞬间总会发出刺耳的"咔咔"声,打印头也会轻微抖动。后来发现这是典型的梯形加减速带来的冲击问题——速度突变导致电机扭矩不足。而S曲线加减速就像老司机踩油门&#x…...
多组学联合分析揭示转录因子调控网络:ATAC-seq与RNA-seq的协同应用
1. 多组学联合分析的技术基础 在基因组学研究领域,ATAC-seq和RNA-seq已经成为揭示基因调控网络的两大核心技术。ATAC-seq全称是转座酶可及性染色质测序,它能够精准定位基因组中开放的染色质区域。想象一下,DNA就像一条紧密缠绕的毛线…...
Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案
Palworld存档工具:高效解决游戏存档格式转换与数据解析的技术方案 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools Palworld存档工具是…...
Electron Webpack Dashboard 高级用法:WebSocket 实时通信与数据流处理
Electron Webpack Dashboard 高级用法:WebSocket 实时通信与数据流处理 【免费下载链接】electron-webpack-dashboard Electron Desktop GUI for Webpack Dashboard 项目地址: https://gitcode.com/gh_mirrors/el/electron-webpack-dashboard Electron Webpa…...
