TensorFlow可微分编程实践3---交叉熵与代价函数微分

深度学习损失函数选择指南:交叉熵与均方误差的对比与应用 在机器学习与深度学习领域,损失函数是模型训练的核心组件,它量化了预测值与真实值之间的差异,指导模型通过优化算法(如梯度下降)进行参数更新。从原理上看,损失函数的设计基于不同的概率分布假设和误差度量视角,直接影响模型的收敛速度与最终性能。其技术价值在于为不同任务类型提供了针对性的优化目标,例如分类任务关注概率分布的差异,而回归任务则强调数值预测的精确性。在应用场景上,交叉熵损失函数因其对概率分布差异的敏感性和稳定的梯度特性,成为分类任务(如图像识别、文本分类)的首选;而均方误差损失函数则凭借其对大误差的严厉惩 阅读详情

在上篇博文中,我们讲述怎样处理第l−1l−1层到第ll层的前向传输和反向求导,我们还没有讲述关于输出层的处理技术。在这里,我们还以MNIST手写数字识别为例,网络计算图如下所示:
这里写图片描述
当我们计算出输出层的输出y∈R10时,表示输入图像xx是0~9这10个数字的概率。此时输入图像xx对应的正确结果y^∈R10y^∈R10,假设该数为rr,则y^r=1,其余维0,即y^={0,0,...,1,...,0}y^={0,0,...,1,...,0},其中主1的是第rr维。
我们首先处理损失函数,这里我们假设不考虑添加调整项的情况,我们的代价函数取交叉熵(cross entropy)函数,根据交叉熵定义:

(1)H(p,q)=Ep(−log⁡q)=H(p)+KL(p‖q)

对离散值情况,交叉熵(cross entropy)可以表示为:

H(p,q)=−∑k=1Kp(k)logq(k)(2)(2)H(p,q)=−∑k=1Kp(k)log⁡q(k)

在这里我们设正确值y^y^的分布为p,而计算值y=a2y=a2的分布为q,假设共有K=10K=10个类别,并且假设第rr维为正确数字,则代价函数的值为:
(3)C=H(p,q)=−∑k=1Kp(k)log⁡q(k)=−(0∗log⁡y1+0∗log⁡y2+...+1∗log⁡yr+...+0∗log⁡y10)=−log⁡yr

我们可以将代价函数值视为R1R1的向量,我们对yy求偏导,根据Jacobian矩阵定义,结果为R1×N2=R1×10R1×N2=R1×10的1行10列的矩阵。结果如下所示:
∂C∂y=[00...−1yr...0](4)(4)∂C∂y=[00...−1yr...0]

其只有正确数字对应的第r维不为0,其余均为零。
接下来我们来求:∂y∂z2∂y∂z2,因为yy和a2a2均为向量,可以直接使用Jacobian矩阵定义得:

∂y∂z2=⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢∂y1∂z21∂y2∂z21...∂yN2∂z21∂y1∂z22∂y2∂z22...∂yN2∂z22............∂y1∂z2N2∂y2∂z2N2...∂yN2∂z2N2⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥(5)(5)∂y∂z2=[∂y1∂z12∂y1∂z22...∂y1∂zN22∂y2∂z12∂y2∂z22...∂y2∂zN22............∂yN2∂z12∂yN2∂z22...∂yN2∂zN22]

接下来∂z2∂W2∂z2∂W2、∂z2∂a1∂z2∂a1、∂z2∂b2∂z2∂b2就是上一篇博文中讲述的内容。这里我们简单讲解下代价函数和代价函数反向求导的问题。代码如下所示:
@tf.custom_gradient
def cross_entropy(y, y_):
    # 找出y_中不等于0的下标值
    idx = np.nonzero(y_)[0][0]
    def grad_fn(dy):
        grad_C = np.zeros(y.shape[0])
        grad_C[idx] = - 1.0 / y[idx]
        return tf.constant(grad_C)
    return -math.log(y[idx]), grad_fn

def test003(args={}):
    tf.enable_eager_execution()
    tfe = tf.contrib.eager
    print('代价函数求导...')
    y = np.zeros((10))
    for idx in range(10):
        y[idx] = 0.01
    y[2] = 0.31
    y[3] = 0.11
    y[8] = 0.21
    y[1] = 0.11
    y[4] = 0.21
    y_ = np.array([0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
    print('y:{0}'.format(y))
    print('y_:{0}'.format(y_))
    C = cross_entropy(y, y_)
    print('代价函数值:{0}'.format(C.numpy()))
    grad_C1 = tfe.gradients_function(cross_entropy)
    pC_py = grad_C1(y, y_)
    print('pC_py:{0}'.format(pC_py[0].numpy()))

运行结果如下所示:
这里写图片描述
在求∂y2∂z2∂y2∂z2时,根据我们的定义,输出层采用的是交叉熵(Cross Entropy)函数,形式为:

yi=ez2i∑N2k=1ez2k(3.3.001)(3.3.001)yi=ezi2∑k=1N2ezk2

下面我们来求∂yi∂z2j∂yi∂zj2,我们分为i≠ji≠j和i=ji=j两种情况来讨论。
当i=ji=j时:
∂yi∂z2i=∂∂z2i(ez2i∑N2k=1ez2k)=ez2i∑N2k=1ez2k−(ez2i∑N2k=1ez2k)2(3.3.002)(3.3.002)∂yi∂zi2=∂∂zi2(ezi2∑k=1N2ezk2)=ezi2∑k=1N2ezk2−(ezi2∑k=1N2ezk2)2

当i≠ji≠j时:
∂yi∂z2j=∂∂z2j(ez2i∑N2k=1ez2k)=−ez2iez2j(∑N2k=1ez2k)2(3.3.002)(3.3.002)∂yi∂zj2=∂∂zj2(ezi2∑k=1N2ezk2)=−ezi2ezj2(∑k=1N2ezk2)2

按照上面的公式,我们可以求出∂y∂z2∈R10×10∂y∂z2∈R10×10的方阵。
根据定义有:
∂C∂W2=∂C∂y⋅∂y∂z2⋅∂z2∂W2(3.3.003)(3.3.003)∂C∂W2=∂C∂y⋅∂y∂z2⋅∂z2∂W2

其维数为R1×10×R10×10×R10×10×512=R1×10×512R1×10×R10×10×R10×10×512=R1×10×512,即可得到每个第1层到第2层连接权值的导数,根据梯度下降算法,就可以求出新的连接权值了。
到目前为止,我们已经将所有多层感知器(MLP)模式中用到的技术,全部讲述完成了,有了这些基本知识之后,我们就可以搭建一个完整的多层感知器(MLP)模型了,在下一节中我们将搭建一个最基本的多层感知器模型用于MNIST手写数字识别。
TensorFlow损失函数 TensorFlow损失函数 正如前面所讨论的,在回归中定义了损失函数或目标函数,其目的是找到使损失最小化的系数。本文将介绍如何在 TensorFlow 中定义损失函数,并根据问题选择合适的损失函数。 声明一个损失函数需要将系数定义为变量,将数据集定义为占位符。可以有一个常学习率或变化的学习率和正则化常数。 在下面的代码中,设 m 是样本数量,n 是特征数量,P 是类别数量。这里应该在代码之前定义这些全局参数: 在标准线性回归的情况下,只有一个输入变量和一个输出变量: 在多元线性回归的情况下,输入变量不 阅读详情

相关推荐

Mac用户必看:PD虚拟机网络初始化失败的3分钟修复指南(附详细截图)

本文针对Mac用户在Parallels Desktop(PD虚拟机)启动时遇到的“网络初始化失败”问题,提供了快速诊断与修复指南。核心原因是macOS系统更新后权限未正确授予。文章通过详细的三步修复法(关闭进程、修改配置文件、重新授权重启),帮助用户在3分钟内恢复虚拟机网络连接,并附有排查清单与预防建议。

weixin_29231027的博客 538

MorphNet:神经网络结构的可微分主动进化方法

神经网络结构优化是模型压缩与边缘部署的核心技术,其本质是在精度与计算成本间寻求最优平衡。传统剪枝方法依赖训练后人工干预,存在不可预测性与高耦合成本;而基于可微分结构正则化的主动进化范式,如MorphNet,将通道缩放因子嵌入训练过程,通过L1稀疏约束与梯度驱动实现结构自适应塑形。该方法兼具数学可解释性与工程落地性,天然支持FLOPs、内存访问量、端到端延迟等多维硬件资源建模,广泛应用于移动端视觉模型瘦身、实时视频分析及嵌入式AI推理场景。

weixin_30588675的博客 382

华为防火墙介绍和原理,配置详细解析

在出向外网的流量中,我们使用默认路由来指定默认的出口,并且使用nat地址转换,而在外网中,我们使用ISIS协议来进行路由的学习和更新,让外网可以访问到dmz非军事化区域的server1服务器。并进行NAT转换,实现了内部IP地址和外部IP地址之间的映射,以便内部网络可以与外部网络进行通信。网络地址转换(NAT):防火墙可实现网络地址转换,将内部私有IP地址转换成公共IP地址,以隐藏网络拓扑结构,增加网络安全性。确定安全需求:根据企业的安全需求和策略,确定防火墙的配置目标和规则。

外游者 5098

【可微编程(Differentiable Programming)】

传统的编程是程序员写出的一行行代码,然后机器按照代码运行指令,输入根据这个代码得到输出。可微编程相当于是用神经网络代替程序员的工作,自己生成编程语言,或者程序员只提供少量的high-level的代码。因此可微编程可以简单理解成是把神经网络看作一门,而不是一个机器学习方法,从而描述我们客观世界的概念以及概念之间的关系。

hello 771

用示波器抓一次MIPI D-PHY的波形,手把手教你读懂HS模式和LP模式的切换时序

本文详细解析了MIPI D-PHY信号的双模切换机制,包括高速模式(HS)和低功耗模式(LP)的波形捕获与诊断技巧。通过示波器设置、关键状态分析和实战案例,帮助工程师快速定位信号完整性问题,提升调试效率。

weixin_30696427的博客 456

逆向分析踩坑记:当Frida在x86模拟器上‘看不见’ARM的so文件时,我们该如何手动定位与验证?

本文探讨了在x86模拟器上使用Frida进行逆向分析时,无法检测到ARM架构so文件的解决方案。通过分析内存映射、Frida的视觉盲区及手动定位技术,提供了兼容层、混合调试和原生ARM环境三种实用方案,帮助逆向工程师突破工具限制,实现精准定位与验证。

weixin_27697385的博客 221

自动求导与可微分编程

可微分编程(Differentiable Programming)是一种编程范式,它允许程序中的计算过程能够进行自动求导(Automatic Differentiation)。在这一框架下,程序不仅可以执行常规的数值计算,而且其内部包含的函数和运算符都能够支持梯度的计算。这意味着整个程序可以被视为一个复杂的数学表达式或函数,可以方便地对其中任何一个参数或变量进行微分。在深度学习领域,可微分编程发挥着至关重要的作用。例如,在训练神经网络时,需要计算损失函数关于模型参数的梯度以更新这些参数。

xw555666的博客 1405

基于KiCad的STM32最小系统设计实战案例(含PCB布线)

手把手带你用KiCad完成STM32最小系统设计,涵盖原理图绘制、封装匹配、规则约束设置及关键信号PCB布线技巧;全程基于开源EDA工具KiCad,强调实操细节与常见坑点规避。

weixin_42452483的博客 357

Tensorflow中的梯度和自动微分:tf.GradientTape理解

GradientTape,自动梯度

November、Chopin 3030

基于OSPF技术的某企业网络设计(完整文档+ENSP拓扑图)

主要对网络规划与设计,以企业网络为背景,对某个中型企业网络进行规划设计,该企业总部在南京,在常州有一个分公司,需要实现总部和分公司能够访问外网,能够让分公司内的用户或主机访问总部服务器的资源,并且保证数据的安全性。在这次总部企业网络设计中,考虑到资金的问题,核心层部署2台核心三层交换机,负责转发总部内部用户的流量,并充当内部用户网关,能够实现内部不同网段的用户之间的连通性。对于一些对网络比较敏感的企业或用户,对网络的要求较高,对于网络的稳定性和安全性也有较高的要求。

qq1325513482的博客 2万+

Win11 系统下 VisualStudio2022 配置点云库 PCL1.11.1

安装完成之后打开文件夹E:\PCL 1.11.1\3rdParty\OpenNI2双击 并选择路径 (E:\PCL 1.11.1\3rdParty\OpenNI2) 安装即可全部安装完成之后,将pcl-1.11.1-pdb-msvc2019-win64.zip解压后的 .pdb文件拷贝到(E:\PCL 1.11.1\bin)中设置环境变量:到此,环境变量配置完成。

qq_53545309的博客 1126

美赛 4:微分方程(编程篇)

一、Python求解微分方程 二、Matlab求解微分方程

Destiny坠明的博客 2888

9.16华为OD机试真题 新系统 - 统计特殊数字 (Java/Py/C/C++/Js/Go)

9.16华为OD机试真题 新系统 - 统计特殊数字 (Java/Py/C/C++/Js/Go)

算法大师! 758

可微分编程:将编程语言引入到神经网络中,以提高效率和可重用性

综上所述,随着深度学习技术的不断发展,可微分编程成为了提高神经网络效率和可重用性的一种有效方法。通过将编程语言引入到神经网络中,可微分编程提高了神经网络模型的开发效率、可重用性、可读性和可维护性。此外,编程语言提供了一些高级的编程特性,例如循环和条件语句等,可以更加方便地进行复杂的操作。可微分编程是一种将编程语言引入到神经网络中的方法,通过定义可执行的计算图来构建神经网络。与传统的神经网络开发方法不同的是,可微分编程允许使用编程语言进行灵活的操作,从而提高了神经网络模型的可读性、可维护性和可重用性。

559

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

tensorflow的交叉熵函数_TensorFlow可微分编程实践3---交叉熵与代价函数微分

在上篇博文中,我们讲述怎样处理第l−1l−1层到第ll层的前向传输和反向求导,我们还没有讲述关于输出层的处理技术。在这里,我们还以MNIST手写数字识别为例,网络计算图如下所示: 当我们计算出输出层的输出y∈R10y∈R10时,表示输入图像xx是0~9这10个数字的概率。此时输入图像xx对应的正确结果y^∈R10y^∈R10,假设该数为rr,则y^r=1y^r=1,其余维0,即y^={0,0,.....

weixin_34184682的博客 196

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

下一代自动微分工具Trace:实现AI系统级可微分与全局优化

自动微分是现代深度学习框架的核心技术,它通过链式法则自动计算梯度,极大简化了神经网络训练过程。其原理基于计算图的构建与反向传播,为模型参数优化提供了高效支持。在AI工程实践中,自动微分不仅加速了模型训练,还推动了架构搜索、元学习等前沿领域发展。然而,随着AI系统日益复杂,传统自动微分在应对系统级优化、动态控制流和非传统参数时面临瓶颈。Trace作为下一代工具,通过统一计算表示、代理梯度和分层微分等机制,将可微分性扩展到整个系统生命周期,支持从数据预处理到业务规则的全链路优化。该技术特别适用于推荐系统、广告排

weixin_34080951的博客 282

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

超简单!用Ivy实现可微分强化学习策略梯度(实战教程)

你还在为不同深度学习框架间的代码转换头疼吗?想快速实现强化学习算法却被复杂的梯度计算劝退?本文将用不到200行代码,带你零基础掌握基于Ivy的策略梯度实现,跨框架兼容特性让你的代码一次编写到处运行! 读完本文你将获得: - 用Ivy统一API实现策略梯度的完整流程 - 跨PyTorch/TensorFlow/JAX的强化学习代码 - 可微分强化学习的核心原理与简化实现 - 基于真实环境的训练与评...

gitblog_00648的博客 394

TensorFlow可微分编程实践3---计算图模型

在这篇博文中,我们将探讨怎样通过可微分编程技术,实现深度学习中最常用的多层感知器(MLP)模型。我们在这里使用TensorFlow Eager Execution API,并使用多层感知器模型来进行MNIST手写数字识别任务。...

Yt7589的专栏 1019

量子-AI混合架构实战:PQC如何作为可微分协处理器嵌入PyTorch

量子机器学习(QML)并非替代经典AI,而是面向特定瓶颈问题的精准增强技术。其核心原理在于利用参数化量子电路(PQC)构建可微分黑盒模块,通过量子特征映射与参数偏移法实现梯度回传,在组合优化、高维核计算和小样本表征等场景展现不可替代性。技术价值体现在将量子硬件降维为类NPU的专用协处理器,无缝接入PyTorch训练流;典型应用包括动态损失加权、量子核SVM加速及分子构象采样。本文聚焦NISQ时代下可复现的混合架构落地——以PQC为量子模块、PyTorch为主干框架,解决噪声鲁棒性、梯度稳定性与硬件校准漂移等

562

tensorflow python损失函数, my write

如果你需要根据特定需求自定义损失函数,可以使用TensorFlow提供的基础函数进行构建。例如,可以结合MSE和MAE来创建一个自定义损失函数:python自定义损失函数需要确保其是可微分的,以便在反向传播过程中计算梯度。复制再试一次分享。

小硕算法工程师 909

如何选择.NET架构?dotnet-claude-kit四架构顾问实战指南

刚开始一个 .NET 项目时,最让人纠结的问题往往不是"用什么框架",而是"用什么架构"——用 Vertical Slice(垂直切片)?Clean Architecture(整洁架构)?DDD?还是 Modular Monolith(模块化单体)?**dotnet-claude-kit** 是一个让 Claude Code 成为 .NET 10 专家的开源工具集,它的核心能力之一就是内置的 **

gitblog_00003的博客 348

用Python和TensorFlow复现通信物理层Autoencoder:从汉明码到端到端训练实战

本文通过Python和TensorFlow实战,详细演示了如何构建并训练一个端到端的通信物理层Autoencoder。文章从经典的汉明码通信系统入手,逐步实现神经网络对编码、调制、信道传输及解码的联合优化,探索了深度学习在通信物理层应用的潜力与挑战,为AI驱动的通信系统设计提供了实践指南。

book8的博客 1002

Lovász-Softmax损失函数:突破图像分割精度瓶颈的终极方案

还在为图像分割的边界模糊问题而苦恼吗?当你的模型在像素准确率上表现出色,却在实际分割质量上差强人意时,问题可能出在损失函数的选择上。传统交叉熵损失与IoU评价指标之间的鸿沟,正是阻碍分割精度进一步提升的关键瓶颈。 ## 问题诊断:为什么你的分割模型总是差一口气? 我们常常遇到这样的困境:训练过程中损失值稳步下降,验证集上的像素准确率也很高,但实际的分割效果却不尽如人意。边界区域模糊、目标断裂、

gitblog_00159的博客 907

从‘集合相似度’到损失函数:一文搞懂Dice Loss的数学原理与PyTorch/Caffe/TensorFlow三大框架实现对比

本文深入解析Dice Loss的数学原理及其在图像分割中的应用,对比PyTorch、TensorFlow和Caffe三大框架的实现差异。通过详细代码示例和性能分析,帮助开发者高效解决类别不平衡问题,提升医学影像分割的准确率。

weixin_30314813的博客 409

如何在TensorFlow中实现自定义损失函数?

在深度学习任务中,通用损失函数常难以满足实际业务需求。通过TensorFlow,我们可以灵活设计自定义损失函数,将业务代价直接编码进模型优化过程。无论是简单的加权调整,还是实现Focal Loss、Soft Dice等复杂可微形式,只需确保使用可导的TensorFlow操作,即可无缝集成到训练流程中,并通过梯度反传有效提升模型表现。

weixin_36238982的博客 595

能量结构化世界模型与神经时间场:开放世界物理一致运动规划新范式

运动规划是机器人、自动驾驶等领域的核心问题,旨在为智能体在复杂环境中寻找一条从起点到目标的安全高效路径。其基本原理涉及对环境状态、智能体动力学以及约束条件的建模与优化。传统方法依赖精确环境模型,在动态开放世界中面临挑战。新兴的“能量结构化潜在世界模型”与“神经时间场”技术,通过构建可微分、连续的世界表示,为解决这一问题提供了新思路。能量模型在潜在空间中学习世界动态并评估状态合理性,神经时间场则提供精细的时空连续表征(如占用场、速度场)。二者结合,能在规划中自然融入物理一致性约束,实现更符合动力学规律的轨迹优

weixin_33725807的博客 398
上一篇: TensorFlow可微分编程实践3---向量微分和Jacobian矩阵
下一篇: 在Ubuntu上使用GSL库
最老程序员闫涛
博客等级 码龄22年 1869粉丝 221原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值