首页 > 其他分享 >降低零阶方法对维度的依赖

降低零阶方法对维度的依赖

时间:2024-02-13 23:22:05浏览次数:21  
标签:依赖 零阶 复杂度 nabla xi rho 维度

零阶方法简介

简单地说,零阶方法是通过访问函数值或者计算函数值的差值来得到下降方向,以此来优化目标函数。

此篇考虑一个 \(L\) 光滑且无约束的函数 \(f\),

\[\min_{x\in \mathbb{R}^d} f(x). \]

根据Yurri Nesterov等人提出的高斯光滑技巧,我们可以通过

\[\tilde{\nabla}_{\rho} f(x) = \frac{f(x+\rho \xi) - f(x)}{\rho} \cdot \xi, \]

来获得随机下降方向。其中向量\(\xi \sim \mathcal{N}(0, I_d)\),\(\rho\)是一个比较小的光滑系数。

不难看出,上式子基本是按照定义来近似方向导数的。当光滑系数 \(\rho\to 0\),那么我们就可以得到

\[\tilde{\nabla} f(x) \stackrel{\Delta}{=} \lim_{\rho \to 0} \tilde{\nabla}_{\rho} f(x) = \langle \nabla f(x), \xi \rangle \cdot \xi, \]

也就是函数 \(f\) 在 \(x\) 点沿着 \(\xi\) 方向的方向导数。

根据Yurri Nesterov等人的结论,沿着获得的 \(\tilde{\nabla}_{\rho} f(x)\) 进行梯度下降,

  • 对于光滑且强凸的函数 \(f\), 复杂度为\(\mathcal{O}(d\kappa\log(\frac{1}{\epsilon}))\);
  • 对于光滑且凸的函数 \(f\),复杂度为\(\mathcal{O}(\frac{dL}{\epsilon})\)。

相比于梯度下降法的复杂度,上面的结果都多出来一个\(d\)。对于零阶优化的一个共识就是,由于其只近似一个方向的方向导数,其复杂度是与维度有关的。

降低维度依赖

从上面的结果可以看出,如果当维度比较大的时候,比如对于13B的一个大模型而言,其维度贡献的复杂度就要 \(\mathcal{O}(10^{10})\)。这个复杂度基本是处理不了的,但是Malladi他们实验证明零阶方法是可以微调的,是可以在这种情况下work的。这样的实验结果是跟上面的理论是有一定出入的。

之前研究人员为了降低零阶方法的复杂度与维度的关系,提出过利用 \(l_1\) 范数等方法,将复杂度降低到 \(s\log(d)\) 这种程度。Yue等人对 \(vanilla\) 的零阶方法对于维度的依赖进行了分析。

在他们的分析中,他们引入

\[{\rm{ED}}_{\alpha}=\sup_{x\in \mathbb{R}^d}\sum_{i=1}^d \sigma_i^{\alpha} (\nabla^2 f(x)), \]

其中\(\sigma_{i}\)表示按照降序排列的第\(i\)个奇异值。
同时通过广义的 \(mahalanobis\) 范数,\(\Vert \cdot \Vert_{\nabla^2 f(x)}\)通过如上定义,他们将对维度 \(d\) 的依赖转化为对 \({\rm{ED}}_\alpha\)的依赖。

这样转化的一个好处是,通常 \(Hessian\) 矩阵的奇异值除了一些极个别的比较大之外,其他的都很小。所以奇异值的加和也远小于维度和 \(L\) 的乘积,即 \({\rm{ED}}_{\alpha} \ll dL\)。

参考

标签:依赖,零阶,复杂度,nabla,xi,rho,维度
From: https://www.cnblogs.com/DemonHunter/p/18014920

相关文章

  • 架构设计:千万级流量下的数据强依赖降级
    1背景互联网场景下,我们经常会面临一个产品流量从初创时期的小流量到全盛大流量的过程。这时候,原本的架构设计就显得很不合理,变成你追求服务稳定性阻碍。然而这一切并不一定是你的架构能力的问题,而是在小流量场景下,不能过高的去评估容量和架构冗余性,避免造成不必要的资源和维护......
  • javacv模块依赖简化
    前言JavaCV更新到1.5.x版本,依赖包也迎来了很大变化,体积也变大了不少。由于javacv跨平台,那么全部javacv依赖包下载下来后,整个javacv的包会特别巨大,接近1G.显然很多平台依赖包我们并不需要,而且我们开发时只需要自己本身开发平台的依赖包就可以了JavaCV1.5.x和之前版本已经不兼容J......
  • [spring] spring学习笔记(3): 通过注解实现依赖注入
    注解Annotation注解是代码中的一种特殊标记,java中的格式为@Anno_Name(pro=value)注解可以被使用在方法,类和属性上;在spring中,使用注解来实现自动装配,可以简化Bean的配置,基本步骤如下:引入依赖开启组件扫描使用注解定义Bean注入依赖引入依赖在新建的spring项目下的src/main......
  • .NET Core 依赖注入 - IServiceProvider和IServiceScope
    要说起.NETCore,我想没有人会不知道依赖注入(DI),同时,这也真是一个被说烂的话题,如果你关注.NETCore,总会有人不厌其烦的给你讲什么是依赖,什么是注入,什么是控制反转,同时会给你举例.NETCoreDI三种生命周期(Transient,Scoped还有Singleton),并且通过打印hashcode的方式来说明彼此之......
  • dotnet_sqlite_sqlhelper_数据库连接_数据库依赖注入
    DI魅力渐显_依赖注入\Program.csservices.AddScoped<IDbConnection>(sp=>{stringconnStr="DataSource=test.db";varconn=newSqliteConnection(connStr);conn.Open();returnconn;});DI魅力渐显_依赖注入\UserDAO.csprivatereadonly......
  • dotnet 依赖注入 注入方式
    依赖注入的基本使用1/Program.csusingMicrosoft.Extensions.DependencyInjection;ServiceCollectionservices=newServiceCollection();//AddTransient的两种方式//services.AddTransient<ITestService,TestServiceImpl>();//services.AddTransient(typeof(ITestSer......
  • dotnet 依赖注入 服务定位器
    依赖注入的基本使用1/Program.csusingMicrosoft.Extensions.DependencyInjection;ServiceCollectionservices=newServiceCollection();//瞬态服务services.AddTransient<TestServiceImpl>();//=>false//作用域服务//services.AddScoped<TestServiceImpl>();......
  • 对时间强依赖的方法如何做单元测试
    背景项目当中需要进行业务时间的校验,如上午9:00-下午17:00,在9:00前或17:00后是不能处理相关业务的。因此在业务校验的Service中定义了一个checkBizTime()方法。原本代码如下:publicvoidcheckBizTime(){DatecurrentTime=newDate();//DateUtil.parse的......
  • 2月摸鱼计划04 Go语言依赖管理
    2.0依赖管理这一章我们主要讲解go的依赖管理,主要涉及go依赖管理的演进路线和gomodule实践依赖指各种开发包对于helloworld以及类似的单体函数只需要依赖原生SDK,而实际工程会相对复杂,我们不可能基于标准库0~1编码搭建,而更多的关注业务逻辑的实现,而其他的涉及框架、日志、driver......
  • 解决golang依赖库被删库问题
    调用的开源库引用了github个人仓库,如果作者删除了仓库或者改成私人仓库,那么gomodtidy就会失败以github.com/mitchellh/osext为例,作者因为某些原因删除了仓库,并给出了替代的官方仓库github.com/kardianos/osext使用replace命令gomodedit-replace[oldgitpackage]@[versi......