⚡可行梯度方向法⚡(Feasible Gradient Direction Method ,FGDM)

article/2025/9/9 21:56:40

⚡最近很烦⚡

有一阵子没更新了,感觉整个暑假被忽悠了,六月份找Boss指明了一个Direction,然后整个暑假都在忙于补充Proposal相关的Knowledge,但是,被忽悠局局长Boss给忽悠了(谁人能明白其中的难受),干工科的master怎么可能不依靠数据,本来就知道拿不到数据,还跟着让指哪儿打哪儿,最终项目还是拿不到,唉~,Project always Project(Boss),一心就只有Project,这还让等到Sep去Proposal,调研的都白费了,谁爱去Proposal谁去。终究或许还是自己太菜了。


Sometimes one pays most for the things one gets for nothing.

最近看到算法比较多,其中发现一个FGD(Feasible Gradient Direction)方法,可行梯度方向法,很是疑惑,到处寻找答案,找不到。和Zoutendijk可行方向法相比好像又有所区别,下面根据Paper的SEDA(sparse exponential discrimination analysis)稀疏指数判别分析算法求解其目标函数进行解释一下(菜鸡的自我修养)。


背景

首先,先介绍一下背景,之前出过一篇LDA的解释Blog,LDA主要用于降维和简单分类,在多分类问题上比较有用。

在过去的几十年里,针对LDA方法提出过很多中改进的方法,如惩罚判别分析(PDA)、两阶段主成分判别分析(PCA+LDA)、零空间LDA(NLDA)、指数判别分析(EDA)、灵活判别分析(FDA)、混合判别分析(HDA)、稀疏判别分析(SDA)等等…一系列改进方法。

最近研究到一篇是关于对指数判别分析(EDA)的改进方法—稀疏指数判别分析(sparse exponential discrimination analysis,SEDA)。

简单来说一下作者的改进路线。

EDA

指数判别分析(EDA)则是将LDA的类内类间协方差矩阵 S b 、 S w \mathbf{S_b、S_w} SbSw分别进行了指数化操作(这里所说的指数化操作可能在专业上描述的不太准确,理解万岁),如下

原本LDA的目标函数长这样:
J = w T S b w w T S w w J=\frac{\boldsymbol{w}^{\mathrm{T}} \mathbf{S}_{b} \boldsymbol{w}}{\boldsymbol{w}^{\mathrm{T}} \mathbf{S}_{w} \boldsymbol{w}} J=wTSwwwTSbw

而改进的EDA的目标函数长这样:
J = w T Σ b w w T Σ w w J=\frac{\boldsymbol{w}^{\mathrm{T}} \mathbf{\Sigma}_{b} \boldsymbol{w}}{\boldsymbol{w}^{\mathrm{T}} \mathbf{\Sigma}_{w} \boldsymbol{w}} J=wTΣwwwTΣbw
注意,其中
Σ b = e x p ( S b ) Σ w = e x p ( S w ) \mathbf{\Sigma}_{b}=exp(\mathbf{S}_{b}) \\ \\ \mathbf{\Sigma}_{w}=exp(\mathbf{S}_{w}) Σb=exp(Sb)Σw=exp(Sw)

此为改进的地方,可使用类间距离与类内距离的比率来评估判别分析方法的性能。

SEDA

现在我们加上EDA的约束条件,
max ⁡ w k w k T Σ b w k s.t.  w k T Σ w w k = 1 w k T Σ w w i = 0 ( ∀ i < k ) \max _{w_{k}} \ \ \ \ w_{k}^{T} \Sigma_{b} w_{k}\\ \\ \begin{aligned} \text { s.t. } w_{k}^{T} \Sigma_{w} w_{k}&=1 \\ w_{k}^{T} \Sigma_{w} w_{i}&=0(\forall i<k) \end{aligned} wkmax    wkTΣbwk s.t. wkTΣwwkwkTΣwwi=1=0(i<k)
将其进一步等价为,
max ⁡ w k w k T Σ b w k s.t.  w k T Σ w w k ≤ 1 w k T Σ w w i = 0 ( ∀ i < k ) \max _{w_{k}} \ \ \ \ w_{k}^{T} \Sigma_{b} w_{k}\\ \\ \begin{aligned} \text { s.t. } w_{k}^{T} \Sigma_{w} w_{k}&\le 1 \\ w_{k}^{T} \Sigma_{w} w_{i}&=0(\forall i<k) \end{aligned} wkmax    wkTΣbwk s.t. wkTΣwwkwkTΣwwi1=0(i<k)
加上lasso(套索)惩罚后得到SEDA,
max ⁡ w k w k T Σ b w k − γ ∥ w k ∥ 1 s.t.  w k T Σ w w k ≤ 1 w k T Σ w w i = 0 ( ∀ i < k ) \max _{w_{k}} w_{k}^{T} \Sigma_{b} w_{k}-\gamma\left\|w_{k}\right\|_{1} \\ \begin{aligned} \text { s.t. } w_{k}^{T} \Sigma_{w} w_{k} &\leq 1 \\ w_{k}^{T} \Sigma_{w} w_{i}&=0(\forall i<k) \end{aligned} wkmaxwkTΣbwkγwk1 s.t. wkTΣwwkwkTΣwwi1=0(i<k)
其中, γ \gamma γ为一个非负调谐参数,应予以指定。

一般来说,随着lasso惩罚因子 γ \gamma γ的增加,SEDA算法的模型可解释性和判别性能有所提高,但当 γ \gamma γ超过一定程度时,情况正好相反。

(中间过程过于复杂已忽略

最终变形为下面这样的目标函数(为凸函数,原本为非凸函数,估计是为了增加一个创新点吧或许,本来可以直接拉格朗日干起来,搞非凸函数求其最优解,现在改进使用最小化-最大化(MM)算法将其重新表达为一个迭代凸优化问题变为凸函数,学到了):
max ⁡ v v T Σ b k w k i − γ ∥ v ∥ 1 s.t.  v T Σ w v ≤ 1 (*) \begin{array}{cc} \max _{v} v^{T} \Sigma_{b}^{k} w_{k}^{i}-\gamma\|v\|_{1} \\ \text { s.t. } \quad v^{T} \Sigma_{w} v \leq 1 \end{array}\tag{*} maxvvTΣbkwkiγv1 s.t. vTΣwv1(*)

可行梯度方向法

这里主要针对稀疏判别优化的可行梯度方向法,将(*)式的约束优化问题转变为无约束优化问题,(公式太多了,就不打公式了哈)


上式的Hessian矩阵显然是对称正定的。因此,上式的无约束优化问题是严格凸的,这意味着其极值点对应于最优解。首先将上式的优化问题简化为一个标准的二次规划问题,然后利用一种可行的梯度方向法来有效地求解该问题。

将上式进行进一步优化,
在这里插入图片描述在这里插入图片描述,其中 ( x ) + (x)_+ x+表示正部分运算符, ( x ) + = m a x { 0 , x } (x)_+=max\{0,x\} x+=max{0,x},因此,向量v可以重写为,


同理,原无约束优化函数变为,


再将二次项重新表述为,


同样的,


因此,无约束优化的问题可以简化为一个标准的二次规划(二次规划凸优化有个好处,就是,局部最优解即为全局最优解),


其中,


下面是关于可行梯度方向法核心观点:


可行梯度方向法的思想如下图所示。在图中,我们假设点 O O O是上式无约束优化问题最简化公式后的最优解。黑色虚线是点 O O O的轮廓线,红色实线是优化问题的约束条件。对于如图所示的满足目标函数约束条件的给定初始迭代点 ρ 0 ρ_0 ρ0,其可行方向 f ( ρ 0 ) f(ρ_0) fρ0显然是 ρ 0 ρ_0 ρ0的梯度方向, f ( ρ 0 ) = ▽ F ( ρ 0 ) f(ρ_0)=\bigtriangledown F(ρ_{0}) fρ0=F(ρ0)。让 ρ 1 = ρ 0 − κ × τ × f ( ρ 0 ) ρ_1=ρ_0-\kappa\times\tau\times f(ρ_0) ρ1=ρ0κ×τ×f(ρ0),其中 τ 0 τ_0 τ0 ρ 0 ρ_0 ρ0的最佳步长, κ κ κ是调谐参数 ( 0 ≤ κ ≤ 1 ) (0≤ κ ≤ 1) 0κ1). 在 ρ 1 ρ_1 ρ1在约束条件内的情况下,选择尽可能大的 κ κ κ,这样我们就可以计算点 ρ 1 ρ_1 ρ1。正如点 ρ 1 ρ_1 ρ1 y y y方向的 ∇ F ( ρ 1 ) ∇F(ρ_1) Fρ1将导致点不满足约束条件,因此选择 x x x方向上的 ∇ F ( ρ 1 ) ∇F(ρ_1) Fρ1作为可行方向 F ( ρ 1 ) F(ρ_1) Fρ1,这就是所谓的可行梯度方向法。对点 ρ 1 ρ_1 ρ1执行与 对 ρ 0 对ρ_0 ρ0相同的操作,并递归执行此过程,直到收敛。

简单说来,就是在图中,找一个起始点作为开始的出发点 ρ 0 ρ_0 ρ0,然后按照目标函数的梯度方向进行寻找,其中有两个超参数(暂且这么称呼吧) k 、 τ k、\tau kτ,用于对下一次寻找做参数调节作用。在到达如图 ρ 1 ρ_1 ρ1的地方后,红色实线是我们的约束条件,要使得更快的找到最优解 O O O,可以按照图中 y y y或者 x x x的方向进行寻找,图中的按照 y y y方向的话, ∇ F ( ρ 1 ) ∇F(ρ_1) Fρ1将导致点不满足约束条件,故就换方向,按照 x x x的方向作为可行方向 F ( ρ 1 ) F(ρ_1) Fρ1,然后再不断的重复 ρ i + 1 = ρ i − κ × τ × f ( ρ i ) ρ_{i+1}=ρ_i-\kappa\times\tau\times f(ρ_i) ρi+1=ρiκ×τ×f(ρi)的过程,使其达到收敛,简单的说就是使得求其 ∇ F ( ρ i ) ∇F(ρ_i) Fρi最终为0,则使得目标函数收敛。


可行梯度方向法示意图

关于迭代式子 ρ i + 1 = ρ i − κ × τ × f ( ρ i ) ρ_{i+1}=ρ_i-\kappa\times\tau\times f(ρ_i) ρi+1=ρiκ×τ×f(ρi)中的超参数 k 、 τ k、\tau kτ ,在此处的公式为如下<注意,在不同的目标函数和约束条件下的 k 、 τ k、\tau kτ一定是不同的,需要结合具体优化的算法(如此处的SDEA算法的目标函数)公式进行优化求解>

可行方向 f ( ρ i ) f(ρ_i) fρi定义为


其中, τ \tau τ表示为


以上就是可行梯度方向法的基本思想了,如有描述不清,欢迎三连+骚扰啦


❤坚持读Paper,坚持做笔记,坚持学习❤!!!
To Be No.1

⚡⚡


创作不易⚡,过路能❤关注收藏点个赞三连就最好不过了

ღ( ´・ᴗ・` )


Miracles sometimes occur, but one has to work terribly for them.


http://chatgpt.dhexx.cn/article/Pv2ifKpX.shtml

相关文章

梯度方向为何变化率最大

梯度(本质上是一个向量&#xff09;是机器学习里面的重要基础&#xff0c;借助梯度下降才能最小化损失函数&#xff0c;逐步更新网络参数&#xff0c;得到最佳的函数表示。梯度方向的变化率最大&#xff0c;沿着梯度的反方向&#xff0c;可以最大效率的降低损失函数。在对梯度的…

梯度下降算法过程及为什么负梯度方向是下降最快方向(附代码)

对于梯度下降算法我们熟知的一个例子就是下山问题&#xff0c;当我们位于山的某一点处&#xff0c;沿着当前位置寻找山坡最陡方向以一定步长进行移动&#xff0c;直到走到山脚。那么这个过程具体是怎么做到的&#xff1f;为什么说负梯度方向是下降最快方向呢&#xff1f; 首先…

微积分:如何理解方向导数与梯度?

文章目录 前言方向导数梯度方向导数公式的证明 前言 前文介绍了多元函数微分的实质&#xff0c;接下来介绍多元函数中的方向导数与梯度&#xff0c;以二元函数为例 方向导数 方向导数的实质&#xff1a;自变量沿着xoy平面上的某个方向变化时&#xff0c;f的变化率&#xff0…

Opencv中计算梯度、梯度幅值以及梯度方向的相关函数

在进行图像处理中&#xff0c;经常会计算图像的梯度、梯度幅值以及梯度等&#xff0c;对于不太了解opencv的&#xff0c;可能会自己写计算梯度、梯度幅值和梯度方向的函数&#xff0c;其实这些工作OpenCV都已经为我们做了。下面来看看Opencv中的相关函数&#xff1a; 1&#xf…

梯度方向,梯度下降法,牛顿法

梯度、等高线切线、方向导数 一、直观理解梯度方向与等高线的切线方向垂直 二、方向导数梯度是函数上升的方向&#xff0c;且在该方向上的方向导数最大 三、从泰勒级数展开来看四、牛顿法五、梯度下降与牛顿法的区别 一、直观理解 梯度方向与等高线的切线方向垂直 假设一函数为…

函数的梯度方向和切线方向_导数、方向导数与梯度

导数,方向导数,切线、梯度是从高中就开始接触的概念,然而对这几个概念的认识不清,困惑了我很长时间,下面我将以图文并茂的形式,对这几个概念做详细的解释。 1, 导数 定义:设函数y=f(x)在点x0的某个邻域内有定义,当自变量x在x0处有增量Δx,(x0+Δx)也在该邻域内时,相…

梯度方向与等高线方向垂直的理解

项目github地址&#xff1a;bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star&#xff0c;留言&#xff0c;一起学习进步 1.前言 在讲解梯度下降算法时&#xff0c;经常可以看到下面这张图(图片来自Wiki百科): 这张图后面一般都会再接一句&#xff0c;梯度…

为什么梯度方向一定是函数增大的方向?

前言 今年是很幸运的一年&#xff0c;准备了大半年的研究生终于考上了&#xff01;但问题随着就来了&#xff0c;我选择的导师方向是深度学习有关的&#xff0c;我从前觉得这个东西十分的高大上&#xff0c;一直敬而远之&#xff0c;没想到今天自己也要参与进来成为它的从业者&…

为什么梯度是上升方向,梯度下降要取负?

讨论 这个问题是很容易忽略&#xff0c;也就一个负号的问题&#xff0c;大多是记下来&#xff0c;但是确实也一个搞不懂的问题。 方向导数 简单说明方向导数&#xff0c;毕竟梯度与方向导数是有关系的。   上图 l l l 对 x x x, y y y的偏导&#xff0c;分别在 x x x和 y y…

深入浅出理解HOG特征---梯度方向直方图

梯度方向直方图 原文路径&#xff1a;https://www.learnopencv.com/histogram-of-oriented-gradients/ 最近在搞车牌识别的时候&#xff0c;训练样本去识别车牌的时候用到HOG特征。国外一篇文章让我受益良多 什么是特征描述符&#xff1f; 特征描述符是指通过提取有用的信息并…

函数的梯度方向和切线方向_方向导数和梯度是什么?

原标题:方向导数和梯度是什么? 为什么梯度的方向是函数在该点的方向导数最大的方向,梯度的模是最大方向导数的值?大家在看复习全书时,有认真想过这个问题吗?小编在本文以二元函数为例详细讲解方向导数和梯度,并试图以尽可能通俗地语言回答上述问题。 1.梯度 首先看看二…

机器学习--什么是梯度?为什么梯度方向就是函数上升最快的方向?本文将给你解惑

本打算把梯度放在神经网络来讲&#xff0c;学习机器学习实战时发现用到梯度下降最优算法&#xff0c;所以就把这个知识点深入讲一下&#xff0c;等后面实战到神经网络时&#xff0c;直接复制这里的&#xff0c;这次讲解会深入讲解&#xff0c;简明易懂是目的&#xff0c;虽然网…

如何理解梯度方向是增长最快的方向

前言&#xff1a; 最近在看关于机器学习的书&#xff0c;里面提到了梯度下降算法&#xff0c;里面提到了梯度方向是增长最快的方向&#xff0c;虽然说很早之前就知道了这个概念&#xff0c;但是一直也没有仔细想过为什么&#xff0c;今天突然想弄懂这个问题&#xff0c;所以有…

什么是梯度?为什么梯度的方向总是指向函数值增大的方向?

闲谈 对于梯度这个概念&#xff0c;我是这样的&#xff0c; 学习时&#xff0c;正序&#xff1a;导数–>偏导数–>方向导数–>梯度&#xff0c;从导数开始一步一步学到梯度这个概念&#xff0c;脑子里想 着&#xff1a;“梯度这个玩意儿有什么用&#xff0c;得记下…

【梯度,方向导数,以及梯度方向为什么是函数增长最快的方向】

梯度&#xff0c;方向导数&#xff0c;以及梯度方向为什么是函数增长最快的方向 结论&#xff01;&#xff01;&#xff01;多元函数的偏导数梯度的直观展示梯度与方向导数参考链接 结论&#xff01;&#xff01;&#xff01; 对一元函数而言&#xff0c;梯度是标量&#xff0…

各种梯度下降法的简单理解

微分 如何看待微分的直观含义&#xff0c;有以下两种最普遍的理解&#xff1a; 1.函数图像中&#xff0c;某点的斜率 2.函数的变化率 单变量微分&#xff1a; 多变量微分&#xff08;分别对多个变量求偏导数&#xff09;&#xff1a; 梯度 梯度其实就是变量偏导数的一般化…

AcWing 16. 替换空格

文章目录 AcWing 16. 替换空格AC代码 AcWing 16. 替换空格 本题链接&#xff1a;AcWing 16. 替换空格 本博客给出本题截图&#xff1a; AC代码 代码&#xff1a; class Solution { public:string replaceSpaces(string &str) {string res;for (auto x : str)if (x …

c++替换空格

请实现—个函数&#xff0c;把字符串s中的每个空格替换成”%20""。 示例1: 输入:s "we are happy ."输出:""Me%20are%20happy ." #define _CRT_SECURE_NO_WARNINGS //vs2017下使用strcpy #include <iostream> #include <string…

替换空格符

任务描述 本关任务&#xff1a;替换文本流中的空格符。 相关知识 参照第一关&#xff0c;第三关相关知识。 编程要求 在右侧编辑器中的 Begin-End 之间补充代码 &#xff0c;读入一行文本&#xff0c;将输入复制到输出&#xff0c;要求将其中连续的多个空格用一个空格代替…

~替换空格~

问题描述&#xff1a;请实现一个函数&#xff0c;将一个字符串中的空格替换成“%20”。 例如&#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 问题分析&#xff1a; 1.解决这道题应该关注的点&#xff1a; 1&#xff09;字符串的长度 2&…