机器学习之数学系列(三)逻辑回归反向传播梯度计算公式推导

一、简介

  在深度学习领域,我们往往采用梯度下降(或上升)法来优化训练函数模型,梯度下降法尤其是在解决凸优化问题上表现极佳。模型优化涉及到反向传播过程,反向传播过程需要先推导出梯度计算公式然后利用机器进行代数运算。这篇博文的工作是详细推导了逻辑回归反向传播梯度计算公式(什么是梯度?简单来讲就是成本函数对所有未知参数所组成向量的导数,梯度是成本函数变化最快的方向),最后使用标准梯度下降算法来优化逻辑回归并附上逻辑回归优化实现代码。


逻辑回归描述

  逻辑回归问题描述如Figure1所示,它是在多元线性回归的基础上对回归结果使用sigmoid函数进行激活计算得到条件概率 p ( y = 0 ∣ x ) 或 p ( y = 1 ∣ x ) p(y=0|x)或p(y=1|x) p(y=0x)p(y=1x),用来解决二分类问题。这里多说一点如果你想实现多分类可以使用softmax,soft就体现在每一类别都有非零置信度(条件概率),而不是像hard那样只有一个类别有1置信度其余置信度均为0。以一个样本作为输入的logistic regression forward propagation数学形式化表达为:


单个输入样本下的逻辑回归前向传播数学形式化表达

二、反向传播梯度计算公式推导

  接下来是logistic regression back propagation,反向传播梯度计算要求1.熟知前向传播代数计算过程,2.复合函数偏导数的链式法则[3],3.函数矩阵或函数向量微分理论[4]。在反向传播推导梯度时可以(1)先计算一个输入样本的梯度,然后根据变量与变量的偏导数有相同shape(形式)来推广计算多个输入样本的梯度也就是实现梯度的向量化或叫矩阵化[1][2],之所以要将梯度向量化是为了使用相关矩阵理论来简化代数运算。(2)直接对向量化后的多输入样本根据链式法则和向量求导理论推导梯度即可。接下来我将使用这两种方法来详细的推导梯度计算公式。
  首先,按方法(1)推导梯度。由于逻辑回归parameters就只有 w w w b b b,故而反向传播过程只需计算 ∂ L ∂ w ≡ d w \frac {∂L} {∂w}\equiv dw wLdw ∂ L ∂ b ≡ d b \frac {∂L} {∂b}\equiv db bLdb,从而获得梯度 g r a d ( L ) = ( d w , d b ) grad(L)=(dw,db) grad(L)=(dw,db)。过程如下所示。

一个输入样本下的链式法则
求单样本输入梯度到求多样本输入梯度
  其次,按方法(2)计算得到梯度 g r a d ( J ) = ( d w , d b ) grad(J)=(dw,db) grad(J)=(dw,db),推导过程如下所示。
直接求多输入样本的梯度

三、逻辑回归标准梯度下降优化算法

在这里插入图片描述
  逻辑回归优化实现,详见我的github仓库:https://github.com/yiguanxian/implement-logistic-regression 。关于优化算法除了标准梯度下降法还有很多据此法改进的深度学习优化算法,我后面会写一篇关于深度学习中的优化算法的文章,待续…
  由于博主水平有限,博文中难免有错误和不当之处,欢迎小伙伴们给与批评和指正,也欢迎小伙伴们补充其他更简单的方法,可以直接留言评论。希望我的这篇博文能对你有所帮助,祝好!

参考:
[1]https://mooc.study.163.com/learn/2001281002?tid=2001392029#/learn/content?type=detail&id=2001702011
[2]https://mooc.study.163.com/learn/2001281002?tid=2001392029#/learn/content?type=detail&id=2001702012
[3] 欧阳光中,朱学炎等.数学分析下册[M].北京:高等教育出版社,2007:168.
[4]吴孟达,李兵等.高等工程数学[M].北京:科学出版社,2004:71-75.

<think>嗯,用户想了解Windbg命令的相关信息和使用方法。首先,我需要回顾一下之前提供的引用内容,看看有哪些相关的信息可以提取。引用[1]提到了Windbg的命令汇总,但链接似乎有问题,可能需要用户自行查找。引用[2]里提到掌握常用Windbg命令和IDA工具,但用户主要关注的是命令的使用方法。引用[3]详细说明了.reload和!analyze -v命令,这两个是关键点。引用[4]举了一些常用命令,比如.scriptload、.scriptrun和.foreach,这些也需要涵盖进去。 用户可能需要一个结构化的回答,分门别类地介绍命令。比如分为基本调试命令、堆栈分析、内存操作、符号文件管理、异常分析以及脚本与自动化。这样用户查找起来更方便。另外,用户可能希望有具体的例子,比如如何加载符号文件,如何查看调用堆栈,如何分析内存泄漏等。需要确保每个命令都有示例,并说明其用途。 还要注意用户可能遇到的常见问题,比如符号路径设置不正确,如何强制加载pdb文件,分析dump文件时的步骤。引用[3]中的.reload /f命令和!analyze -v命令都是解决这些问题的关键,需要详细说明。同时,用户可能对如何自动化任务感兴趣,所以.scriptload和.foreach这样的命令也要提到。 另外,考虑到用户可能不太熟悉Windbg,回答中需要加入一些实用技巧,比如如何快速定位崩溃点,如何查看寄存器和内存内容。这些都能帮助用户更高效地使用Windbg。最后,生成的相关问题要围绕用户可能进一步的需求,比如符号配置、分析崩溃、内存泄漏检测等,这样用户可以根据问题继续深入学习。</think>### Windbg命令使用详解 #### 一、Windbg基础命令框架 1. **调试会话控制** - `.attach <PID>`:附加到进程 - `.detach`:分离调试进程 - `g`:继续运行程序(Go) - `q`:退出Windbg 2. **符号文件配置** - `.sympath srv*C:\Symbols*https://msdl.microsoft.com/download/symbols`:设置符号服务器路径[^2] - `.reload /f <模块名>`:强制加载指定模块的符号(如`.reload /f hwcodec.dll`)[^3] --- #### 二、核心调试命令详解 1. **堆栈分析** - `k`:显示当前线程调用堆栈 - `!analyze -v`:自动分析异常原因(如崩溃时触发)[^3] ```windbg 0:000> !analyze -v ``` 2. **内存操作** - `dd <地址>`:显示双字(4字节)内存内容 - `!address <地址>`:分析内存页属性 - `s -d 0 L?80000000 0xdeadbeef`:全内存搜索特定数值 3. **寄存器与线程** - `r`:显示所有寄存器值 - `~*k`:显示所有线程堆栈 --- #### 、高级调试场景 1. **异常分析** - 使用`!analyze -v`自动定位崩溃点后,结合`.exr <异常记录地址>`查看异常详情[^3] - 示例输出: ``` FAULTING_IP: MyApp!SomeFunction+3a [c:\src\file.cpp @ 123] 0046a8d3 8b08 mov ecx,dword ptr [eax] ``` 2. **内存泄漏检测** - `!heap -s`:显示堆内存统计 - `!heap -p -a <地址>`:追踪堆块分配路径 --- #### 四、自动化与脚本 1. **JavaScript脚本** - `.scriptload C:\Scripts\MyScript.js`:加载脚本 - `.scriptrun`:执行脚本[^4] 2. **循环操作** - `.foreach (addr {dd 01000000 L4}) {.echo ${addr}}`:遍历内存地址[^4] --- #### 五、实用技巧 1. **快速定位崩溃点** 崩溃后立即执行: ```windbg .exr -1 # 查看最后异常记录 !analyze -v # 自动分析上下文 kv 3 # 显示详细堆栈参数 ``` 2. **混合源码与汇编** - `l+t`:开启源码模式 - `u MyApp!CrashFunction`:反汇编指定函数 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值