LR算法(基础及核心概念)

本文深入讲解了Logistic Regression(LR)模型的理论基础及其参数求解过程,包括极大似然估计与梯度下降算法的应用,并探讨了正则化的概念。

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

前言

首先需要清楚的是,LR(Logistic Regression)虽然是回归模型,但却是经典的分类方法。 为什么分类不用SVM呢?我们对比一下SVM,在二分类问题中,如果你问SVM,它只会回答你该样本是正类还是负类;而你如果问LR,它则会回答你该样本是正类的概率是多少~

  • 文章主要内容如下:

    • LR的理论基础

    • LR的参数求解过程

    • 正则化

LR的理论基础

Logistic

如指数分布、高斯分布等分布一样,logistic是一种变量的分布,它也有自己的概率分布函数和概率密度函数,其中概率分布函数如下:

F(x)=P(Xx)=11+e(xμ)/γ

对概率分布函数求导,记得到对应的概率密度函数:

f(x)=e(xμ)/γγ(1+e(xμ)/γ)2

其中, μ 就是分布对应的均值, γ 是对应的形状参数。

对应示例图如下:
这里写图片描述

Regression

为什么我们说LR(Logistic Regression)是个分类模型而不是回归模型呢?对于二项LR模型,设因变量的Y为0或者1,得到如下条件概率分布:

P(Y=1|X)=ewx1+ewx

P(Y=0|X)=11+ewx

  • 一个事件的几率(odds),定义为该事件发生与不发生的概率比值,若事件发生概率为p:

    odds=p1p

  • 那么该事件的对数几率(log odds或者logit)如下:

    logit(p)=logp1p

那么,对于上述二项LR逻,Y=1的对数几率就是:

logP(Y=1|x)1P(Y=1|x)=logP(Y=1|x)P(Y=0|x)=w.x

也就是说,输出Y=1的对数几率是由输入x的线性函数表示的模型,这就是逻辑回归模型。易知,当 w.x的值越大,P(Y=1|x) 越接近1;w.x越小(f负无穷大),P(Y=1|x) 越接近0。

其实,LR就是一个线性分类的模型。与线性回归不同的是:LR将线性方程输出的很大范围的数压缩到了[0,1]区间上;更优雅地说:LR就是一个被logistic方程归一化后的线性回归

LR的参数求解过程

极大似然估计

接下来便是参数估计过程,统计学中,常根据最大化似然函数的值来估计总体参数。其实,在机器学习领域,我们听到的更多是损失函数的概念,常通过构建损失函数,然后最小化损失函数求得目标参数。在这里,最大化对数似然函数与最小化对数似然损失函数其实是等价的,下面我们可以看到。


  • 假设我们有n个独立的训练样本 {(x1,y1),(x2,y2),(x3,y3),...,(xn,yn)},y=0,1 ,那么每一个观察到的样本 (xi,yi) 出现的概率是:

    P(yi,xi)=P(yi=1|xi)yi(1P(yi=1|xi))1yi

    显然, yi 为1时,保留前半部分; yi 为0时,保留后半部分。

  • 构建似然函数:

    L(θ)=P(yi=1|xi)yi(1P(yi=1|xi))1yi

  • OK,对似然函数取对数,得到对数似然函数:
    LL(θ)=log(L(θ))=log(P(yi=1|xi)yi(1P(yi=1|xi))1yi)

    =ni=1yilogP(yi=1|xi)+(1yi)log(1P(yi=1|xi))

    =ni=1yilogP(yi=1|xi)1P(yi=1|xi)+ni=1log(1P(yi=1|xi))

    =ni=1yi(w.x)+ni=1logP(yi=0|xi)

    =ni=1yi(w.x)ni=1log(1+ew.x)

    =ni=1yi(θT.xi)ni=1log(1+eθT.xi)

  • LL(θ) θ 求偏导,得:
    LL(θ)θ=ni=1yixini=1eθT.xi1+eθT.xi.xi

    =ni=1(yiP(yi=1|xi))xi
    该式是无法解析求解,故下面会用到一个常见的优化算法–梯度下降(Gradient Descent).

梯度下降

Gradient Descent 又叫 Steepest Descent,是利用函数一阶的梯度信息找到函数局部最优解的一种方法,机器学习中最简单最常用的一种优化方法。

它的思想很简单:要找最小值,我只需要每一步都往下走(也就是每一步都可以让代价函数更小一点),然后不断地迭代,最终达到最小值的地方。


这里,附上一个网站,可以直观地看出各种优化算法地迭代路径,附上几张效果图如下:

Long Valley:

这里写图片描述


Saddle Point:

这里写图片描述


Beale’s Function:
这里写图片描述


但同时我们也希望能更快地到达最小值,这时我们便需要每一步都是坡度下降最快的地方,而这个坡度下降最快的方向,就是梯度的负方向了,所以参数迭代更新公式如下:

θnew=θoldαLL(θ)θ=θoldαi=1n(yiP(yi=1|xi))xi

  • 其中,参数α叫学习率,这个参数设置很关键。如果设置的太大。缺点:那么很容易就在最优值附加徘徊;优点:能很快的从远离最优值的地方回到最优值附近。如果设置的太小。缺点:那么就跟蜗牛似的,迭代速度太慢了。所以通常的技巧是开始迭代时,学习率大,慢慢的接近最优值的时候,学习率变小就可以了。

  • 第二点是,梯度下降算法在每次迭代更新参数时都需要遍历整个数据集,计算复杂度太高。改进的方法是一次仅随机采用一个样本数据的回归误差来更新回归系数。这个方法叫随机梯度下降算法。

综合以上两点,给出改进的随机梯度下降算法的伪代码:

-------------------------------------------------
1.初始化回归系数
2.重复下面步骤直到收敛{
       对随机遍历的数据集中的每个样本
              随着迭代的逐渐进行,减小$\alpha$的值
              计算该样本的梯度
              使用$\alpha$ x 梯度来更新回归系数
    }
3.返回回归系数值
-------------------------------------------------

正则化

当模型参数很多,而我们可用的数据非常少时,极易出现过拟合的问题。在机器学习领域,通常可以对损失函数引入正则项,其目的是使得参数空间受到一定的限制。

正则化是奥卡姆剃刀(Occam’s Razor)原理的一个体现:在所有可能选择(能很好地解释已知数据)的模型中,更倾向于选择尽量简单的模型。

正则项(范数)的概念已经在博文中说过一次了,这里不再赘述。只八股一下两个正则项的特点吧:

  • L1范数:也称叫“稀疏规则算子”(Lasso Regularization)。为什么能稀疏呢?关键原因在于它能实现特征的自动选择。一般来说,训练集中的某些特征和输出 yi 之间并没有多大关系。在训练时引入这些特征,当然能获得更小的训练误差,但其泛化能力比较差,即造成过拟合!L1范数的引入就是为了实现特征自动选择,它会将没有信息的特征对应的权重置为0

  • L2范数:在回归里面中又称岭回归”(Ridge Regression),也有的叫法为“权值衰减”(Weight Decay)。同样是为了解决过拟合问题,但与 L1 范数不同的是L2是使得特征对应的权重尽量的小,接近于0(但不会等于0)。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。为什么呢?这里给出一个说法:参数越小,表示模型不会过分地学习训练集的某个特征,也即更不容易造成过拟合。

附上一张图片,在二维特征空间中,分别加L1和L2范数的情况:
这里写图片描述

两者的区别可以从图中看出来,L1正则化(左图)更容易与突出的角相切,可以想象在高纬特征空间中,会有许多向外突出的角;L1倾向于使某些特征对应的参数变为0,因此能产生稀疏解。而 L2 使 w 接近0

<think>好的,用户想了解ARM架构中的LR寄存器,也就是链接寄存器(Link Register)的用途和功能。首先,我需要回忆一下ARM架构的基础知识,尤其是关于寄存器的部分。LR寄存器在函数调用和子程序处理中扮演重要角色,通常用于保存返回地址。 根据引用[2],ARM的过程调用标准中提到了参数传递的方式,包括通用寄存器和堆栈的使用。虽然LR寄存器本身不是参数传递的一部分,但它在函数调用时保存返回地址,确保子程序执行完毕后能正确返回到调用点。例如,当使用BL指令调用函数时,LR会自动被设置为下一条指令的地址,这样函数结束后可以通过BX LR返回。 另外,引用[4]提到Thumb-2指令集中的分支指令,比如B.N,以及通过LDR和POP指令修改PC寄存器的情况。这涉及到LR在异常处理或中断中的使用,例如发生异常时,LR会保存异常返回地址,但可能需要进行模式切换,这时候LR的值可能需要调整。 引用[3]中讨论了启动代码中的函数,如cstartup.s,这些启动代码可能涉及初始化LR的值,确保程序正确跳转到main函数。启动流程中的函数调用链需要正确维护返回地址,LR在这里的作用不可忽视。 此外,引用[5]提到的Arm虚拟硬件中的开发工具,可能涉及调试和跟踪LR寄存器的使用情况,帮助开发者理解程序流程。在调试过程中,查看LR的值可以追踪函数调用路径,尤其是在处理崩溃或异常时,LR的值有助于定位问题。 需要注意的是,不同ARM模式(如ARM和Thumb模式)下,LR的行为可能有所不同。例如,在Thumb模式下,某些指令可能会影响LR的最低有效位,用于模式切换。同时,异常处理(如中断或系统调用)会使用特定模式的LR,这时需要保存和恢复现场,可能涉及堆栈操作。 用户可能还关心LR在嵌套函数调用中的处理。当一个函数内部调用另一个函数时,需要先将当前的LR值压入堆栈,以防止被覆盖。这通常在函数序言(prologue)中完成,通过PUSH {LR}保存,然后在函数尾声(epilogue)中使用POP {PC}恢复,从而返回到正确的位置。 总结一下,LR的主要功能包括: 1. 保存函数调用的返回地址。 2. 在异常处理中保存异常返回地址,可能涉及模式切换。 3. 需要手动管理嵌套调用时的保存与恢复,通常通过堆栈操作实现。 可能用户没有直接问及但相关的内容包括LR与其他寄存器(如PC、SP)的交互,以及在调试中的实际应用。此外,不同ARM架构版本(如ARMv7与ARMv8)中LR的使用是否有差异,可能也是潜在的问题点。</think>### ARM架构中LR寄存器的功能与使用 在ARM架构中,**LR寄存器(Link Register)** 是核心寄存器之一,主要用于保存函数调用或子程序执行后的返回地址。其具体功能和使用场景如下: 1. **函数调用返回地址存储** 当使用 `BL`(Branch with Link)指令调用子程序时,处理器会自动将下一条指令的地址(即返回地址)存入LR寄存器。子程序执行完毕后,通过 `BX LR` 或 `MOV PC, LR` 指令跳转回调用点[^4]。 示例代码片段: ```assembly BL subroutine ; 调用子程序,LR = 当前PC + 4 ... ; 主程序继续执行 subroutine: ... ; 子程序逻辑 BX LR ; 返回主程序 ``` 2. **异常处理与模式切换** 在发生中断或异常时,LR会被设置为特定的异常返回地址(如 `LR_irq` 或 `LR_svc`)。由于不同处理器模式(如ARM模式、Thumb模式)的切换,返回时可能需要手动调整LR的值。例如,Thumb-2指令集中使用 `.n` 后缀明确指令模式[^4]。 3. **嵌套调用的堆栈保护** 若子程序内部再次调用其他函数,LR的值会被覆盖,因此需在子程序入口将LR压入堆栈保存,退出前弹出恢复。 示例: ```assembly subroutine: PUSH {LR} ; 保存LR到堆栈 BL another_func ; 嵌套调用 POP {PC} ; 从堆栈恢复LR到PC,实现返回 ``` 4. **与PC寄存器的交互** LR和PC(Program Counter)紧密关联。通过修改PC的值(如 `LDR PC, [Rn]` 或 `POP {PC}`),可实现间接跳转,而LR在此过程中充当临时存储角色。 --- ### 相关问题 1. **ARM架构中如何通过LR寄存器实现异常返回?** (提示:涉及处理器模式切换和LR值修正)[^4] 2. **Thumb-2指令集下LR寄存器的行为与ARM模式有何差异?** (提示:关注指令后缀和位对齐问题) 3. **函数调用时为何需要手动保存LR寄存器?** (提示:嵌套调用导致LR被覆盖的风险) 4. **ARMv8架构中LR寄存器的作用是否发生变化?** (提示:对比ARMv7与ARMv8的寄存器设计) --- 通过理解LR寄存器的核心功能,开发者可以更好地优化代码流程和调试异常场景[^2]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值