随着大数据的出现,确定性优化算法的效率逐渐称为瓶颈。为了说明这一点,我们来看一个用梯度下降法求解线性回归的例子。
给定训练样本\(D = \{(x_i, y_i)\}_{i=1}^n\),线性回归的目标函数如下:
这里\(w\in \mathbb{R}^d\)为模型参数。
梯度下降法的更新规则为:
可见,梯度下降法中每次更新模型所需要的单位计算复杂度为\(\mathcal{O}(nd)\)。
对于更复杂的模型(比如神经网络)和更复杂的优化方法(比如二阶方法),确定性优化方法的计算量会更大。那么如何解决这个问题呢?
统计方法能给我们很大的帮助。虽然大数据的数据量和数据维度都很大,但我们可以通过对样本和维度进行随机采样来得到对更新量的有效估计或者替代。相应地,从确定性优化算法出发,我们可以开发出各种随机优化算法,如随机梯度下降法[1]、随机坐标下降法[2]、随机方差缩减梯度法[3]、随机(拟)牛顿法[4]等。注意,对于随机优化算法而言,收敛性分析与确定性算法不同,需要针对算法中的随机采样取期望。
下面就让我们先介绍经典的随机优化算法。
随机梯度下降法(SGD)[1]对训练数据做随机采样,其更新公式如下:
其中,\(i^t\)是第\(t\)轮随机采样的数据标号。具体算法如下列的伪代码所示:
我们知道,机器学习问题中的经验损失函数定义为所有样本数据对应的损失函数的平均值。而我们这里用有放回随机采用获得的数据来计算梯度,是对用全部数据来计算梯度的一个无偏估计,即\(\mathbb{E}_{i^t} {\nabla_{i^t}f(w^t)} = \nabla f(w^t)\),注意此处\(f(w^t)=\frac{1}{n}\sum_{i=1}^n\nabla f_i(w^t)\))。而由于每次更新只随机采一个样本,随机梯度中的计算量大大减小。因此,随机梯度可以作为梯度的自然替代,从而大大提高学习效率。
不过正如我们前面所说,优化算法的复杂度不仅包括单位计算复杂度,还包括迭代次数复杂度(与收敛率有关)。天下没有免费的午餐,随机梯度下降单位计算复杂度降低,那么也相应地会付出迭代次数复杂度增大的代价。
考虑实际每次只采一个样本比较极端,常用的形式是随机梯度下降法的一个推广:小批量(mini-batch)随机梯度下降法。该方法可以看做是在随机优化算法和确定性优化算法之间寻找某种折中,每次采一个较小的样本集合\(\mathcal{I}^t\in \{1,2,...n\}\)(多于单样本,少于全样本),然后执行更新公式:
我们后面介绍的各种随机优化方法,都有相应的小批量版本。小批量采样可以有效减小方差,从而提高收敛速率,具体我们下一篇博客会讨论。
与梯度下降法类似,对不同性质的目标函数,随机梯度下降法具有不同的收敛速率。
\(L\)-Lipschitz连续凸函数收敛性:假设目标函数\(f: \mathbb{R}^d\rightarrow \mathbb{R}\)是凸函数,并且\(L\)-Lipschitz连续,\(w^* = \underset{\lVert w\rVert\leqslant D}{\text{arg min}}f(w)\),当步长\(\eta^t = \sqrt{\frac{D^2}{L^2t}}\)时,对于给定的迭代步数\(T\),随机梯度下降法具有\(\mathcal{O}(\frac{1}{\sqrt{T}})\)的次线性收敛速率:
光滑强凸函数收敛性:假设目标函数\(f: \mathbb{R}^d\rightarrow \mathbb{R}\)是\(\alpha\)-强凸函数,并且\(\beta\)光滑,如果随机梯度的二阶矩有上界,即\(\mathbb{E}_{i^t}{\lVert\nabla f_{i^t}(w^t) \rVert^2\leqslant G^2}\),当步长\(\eta^t = \frac{1}{\alpha t}\)时,对于给定的迭代步数\(T\),随机梯度下降法具有\(\mathcal{O}(\frac{1}{T})\)的次线性收敛速率:
通过与梯度下降法的收敛速率进行对比,我们可以发现随机梯度下降法的收敛速率更慢。这主要是由于虽然随机梯度是是全梯度的无偏估计,但这种估计存在一定的方差,会引入不确定性,导致最终算法的收敛速率下降。
虽然随机梯度下降法的收敛速率慢于梯度下降法,但因为其每一轮的单位计算复杂度为\(\mathcal{O}(d)\),而梯度下降法每一轮的单位计算复杂度为\(\mathcal{O}(nd)\),所以当样本量很大时,随机梯度下降法的总计算复杂度\(\mathcal{O}(d(\frac{1}{\varepsilon}))\)比梯度下降法的总计算复杂度\(\mathcal{O}\left(ndQ\text{log}(\frac{1}{\epsilon})\right)\)要低。
除了对样本进行随机采样外,还可以对模型的维度进行采样,相应的算法称为随机坐标下降法[2],其更新公式如下:
其中\(j^t\)表示第\(t\)轮迭代中随机采的维度标号。\(\nabla_{j^t}f(w^t)\)是损失函数对于模型\(w^t\)中的第\(j^t\)个维度的偏导数。
随机坐标下降法伪代码如下:
一方面,如果采样方法是又放回采样,那么可以得到\(\mathbb{E}_{j^t}\nabla_{j^t}f(w^t) = \frac{1}{d} \nabla f(w^t)\)(为了不引入新的记号,设\(\nabla_{j^t}f(w^t)\)是\(d\)维向量,其第\(j^t\)个维度是\(\nabla_{j^t}f(w^t)\),其它维度是0)。也就是说,在期望意义上,随机坐标梯度与梯度方向是一致的。另一方面,对于线性模型,计算一个维度的梯度所需要的计算量只有整个梯度向量的\(\frac{1}{d}\)。因此,随机坐标梯度可以作为原始梯度的高效替代品(尤其是在参数维度较高时)。
随机坐标下降法的一个推广版本是随机块坐标下降法,也就是将参数维度分为\(J\)个块,每次采一个块\(J^t\in \{1,2,...J\}\),然后执行更新公式:
我们后面介绍的各种随机优化方法,都有相应的小批量版本。小批量采样可以有效减小方差,从而提高收敛速率,具体我们下一篇博客会讨论。
对于不同性质的目标函数,随机坐标下降法也有不同的收敛速率。
由于模型每次只更新一个维度,为了对随机坐标下降法进行分析,我们先来刻画偏导数的连续性质。
偏导数的连续性质 如果对任意模型\(w\in \mathbb{R}^d\),对于维度\(j\)存在常数\(\beta_j\),使得\(\forall \delta \in \mathbb{R}\)有下面不等式成立:
则称目标函数\(f\)对于维度\(j\)具有\(\beta_j\)-Lipschitz连续的偏导数。
如果\(f\)对于每个维度的偏导数都是Lipchitz连续的,我们记\(\beta_{\text{max}} = \underset{j=1,2,\cdots, d}{\text{max}}\beta_j\)。可以验证,如果目标函数是\(\beta\)光滑的,那么\(\beta_{\text{max}}\leqslant \beta \leqslant \sqrt{d}\beta_j, \forall j=1,2,\cdots, d\)。
偏导数满足\(\beta_j\)-Lipschitz连续的凸函数收敛性分析: 假设目标函数\(\mathbb{R}^d\rightarrow \mathbb{R}\)是凸函数,并且具有具有\(\beta_j\)-Lipschitz连续的偏导数,记\(w^* = \underset{\lVert w\rVert \leqslant D}{\text{arg min}} f(w)\),当步长\(\eta = \frac{1}{\beta_{\text{max}}}\)时,对于给定的迭代步数\(T\),随机坐标下降法具有\(\mathcal{O}(\frac{d\beta_{\text{max}}}{T})\)的次线性收敛速率:
偏导数满足\(\beta_j\)-Lipschitz连续的强凸函数收敛性分析: 假设目标函数\(\mathbb{R}^d\rightarrow \mathbb{R}\)是强凸函数,并且具有具有\(\beta_j\)-Lipschitz连续的偏导数,当步长\(\eta = \frac{1}{\beta_{\text{max}}}\)时,对于给定的迭代步数\(T\),随机坐标下降法具有如下的线性收敛速率:
对比梯度下降法的收敛速率,我们发下随机梯度下降法的收敛速率关于迭代次数\(T\)的阶数与梯度下降法的是一致的。从这个意义上讲,随机坐标下降法的理论性质优于随机梯度下降法。
在计算复杂度上,虽然随机坐标下降法在线性回归问题中的更新公式为
虽然随机坐标下降法每轮迭代也需要像梯度下降法一样计算\(n\)个内积\(\{(w^t)^Tx_i\}_{i=1}^n\),但每个内积的计算量不再是\(\mathcal{O}(d)\) 。因为\(w^t\)每次只更新一维,可通过引入辅助变量的形式将\(\mathcal{O}(d)\)的计算量降为\(\mathcal{O}(1)\),最终得到\(\mathcal{O}(n)\)的单位计算复杂度。这种偏导数的计算量小于梯度的计算量的情形一般被称为“可分离”情形。可以证明,对于线性模型,常用损失函数都是可分离的。
至于随机块坐标下降法的收敛性则与随机坐标下降法基本相同,只是其中的维度数目\(d\)会被块的个数\(J\)所取代。
随机拟牛顿法[4]的思想与一阶随机算法类似,随机采一个样本或者一个小批量样本来计算梯度,然后更新海森逆矩阵。小批量随机拟牛顿法的更新公式如下:
其中\(\mathcal{I}^t\)是所采的小批量数据子集,\(M^t\)为\(\mathcal{I}\)上目标函数的海森逆矩阵。
类似于上一章介绍的拟牛顿法,虽然直接计算海森逆矩阵\(M^t\)的复杂度很高,但是利用历史信息迭代更新上一轮海森逆矩阵\(M^{t-1}\)可以得到对\(M^t\)的良好逼近,其计算复杂度要低很多。具体而言,首先在算法运行过程中记录下表征模型变化量和梯度变化量的修正组合\((\delta^s_1, \delta^s_2)\),也就是
然后依据第\(t\)轮迭代之前的多个修正组合按照如下公式迭代更新海森逆矩阵:
其中\(\rho^s = \frac{1}{(\delta^s_2)^T\delta^s_1}\)。
随机拟牛顿法及海森逆矩阵更新的具体算法的伪代码如下:
在以下四条假设之下,我们可以证明随机拟牛顿法具有与随机梯度下降法相同的收敛速率:
假设上述条件成立,当步长\(\eta^t = \frac{a}{t}\)并且\(a > \frac{1}{2\mu_1\lambda_1}\)时,对于给定的迭代步数\(T\),随机拟牛顿法具有\(\mathcal{O}(\frac{1}{T})\)的次线性收敛速率:
其中\(Q(a) = \max \{ \frac{\lambda_2\mu_2^2a^2G^2}{2(2\mu_1\lambda_1a-1)}, f(w^1) - f(w^*) \}\)。
下面我们以逻辑回归为例对比一下随机拟牛顿法和随机梯度下降法的复杂度。随机拟牛顿法每一轮的计算量(浮点运算次数)为\(2bd+4Sd+\frac{3b_Hd}{L}\),其中\(b\)是随机梯度下降小批量数据子集的大小,\(b_h\)是计算修正项的小批量数据子集的大小,\(S\)是内存参数,\(L\)是修正步骤的轮数。由此,可以得到随机拟牛顿法和随机梯度下降法每一轮计算的复杂度之比为
于是,我们可以通过设置合适的参数使得随机拟牛顿法的复杂度与随机梯度下降法同阶。
依据上面的讨论,二阶随机算法在收敛速率和复杂度上都与一阶随机算法差不多,不像确定性算法那样收敛速率有显著的提高。原因是,对于更精细的二阶算法,随机采样的方差会影响收敛精度。如何提高二阶随机优化算法的效率,仍然是未解决的问题。
考虑线性模型,其对应的正则化风险经验最小化(R-ERM)过程如下:
其中\(\phi_i(w^Tx_i)=\mathcal{l}(w; x_i, y_i)\)为线性模型\(w\in\mathbb{R}^d\)在样本\((x_i, y_i)\)上的损失函数。
上述原始问题的对偶问题为:
其中\(\phi_i^*(u)=\underset{z}{\text{max}}(zu - \phi_i(z))\)。
上述原始问题和对偶问题相比我们在博客《数值优化:经典二阶确定性算法与对偶方法》中介绍的问题更加特殊,利用Fenchel对偶定理,如果定义 \(w(\alpha)= \frac{1}{\lambda n}\sum_{i=1}^n\alpha_ix_i\),并且原始目标函数及其对偶函数分别存在最优解\(w^*\)和\(\alpha^*\)。
优于对偶问题是线性可分的,随机坐标上升法比确定性的梯度上升法更能有效地对其进行优化,我们称之为随机对偶坐标上升法(SDCA)[5]。其主要计算步骤为:
随机对偶坐标上升法伪代码如下:
请注意,对于随机坐标上升法,损失函数的光滑性质对收敛速率有显著的影响,因为如果损失函数\(\phi_i(\alpha)\)是\(\beta\)-光滑的,那么其对偶函数\(\phi^*_i(u)\)是\(\frac{1}{\beta}\)-强凹的,于是对偶问题的凹性得到了加强。
如果损失函数是凸函数且是\(L\)-Lipschitz连续的,随机对偶坐标上升法具有次线性收敛速率\(\mathcal{O}(\frac{L^2}{\lambda n }+\frac{L^2}{\lambda t})\);如果损失函数进一步是\(\beta\)-光滑的,随机对偶坐标上升法具有线性收敛速率\(\mathcal{O}(e^{-\frac{\lambda t}{\beta + \lambda n}})\)。
随机对偶梯度上升法的确定性版本的收敛速率与上面所述相同,但是由于线性模型的正则化损失函数是线性可分的,随机对偶坐标上升法中每次迭代的计算量从\(\mathcal{O}(d)\)减小为\(\mathcal{O}(1)\),从而提高了算法效率。
前面已介绍的几种随机优化算法的收敛速率、单位计算复杂度和总计算复杂度总结如下表所示:
上表中,\(T\)为迭代次数,\(\beta\)和\(\beta_{\text{max}}\)为光滑系数和各个维度对应的最大光滑系数,\(L\)和\(L_{\text{max}}\)为Lipschitz系数和各个维度对应的最大Lipschitz系数,\(Q\)为条件数,\(n\)为数据量,\(d\)为数据维度,\(b\)和\(b_H\)为随机算法中求海森逆矩阵的小批量数据集的大小,\(\lambda\)为拉格朗日系数。
从表中可以得出以下几点结论:
[1] Robbins H, Monro S. A stochastic approximation method[J]. The annals of mathematical statistics, 1951: 400-407.
[2] Nesterov Y. Efficiency of coordinate descent methods on huge-scale optimization problems[J]. SIAM Journal on Optimization, 2012, 22(2): 341-362.
[3] Johnson R, Zhang T. Accelerating stochastic gradient descent using predictive variance reduction[J]. Advances in neural information processing systems, 2013, 26.
[4] Byrd R H, Hansen S L, Nocedal J, et al. A stochastic quasi-Newton method for large-scale optimization[J]. SIAM Journal on Optimization, 2016, 26(2): 1008-1031.
[5] Shalev-Shwartz S, Zhang T. Stochastic dual coordinate ascent methods for regularized loss minimization[J]. Journal of Machine Learning Research, 2013, 14(Feb):567-599.
[6] 刘浩洋,户将等. 最优化:建模、算法与理论[M]. 高教出版社, 2020.
[7] 刘铁岩,陈薇等. 分布式机器学习:算法、理论与实践[M]. 机械工业出版社, 2018.
[8] Stanford CME 323: Distributed Algorithms and Optimization (Lecture 7)
我希望我的UserPrice模型的属性在它们为空或不验证数值时默认为0。这些属性是tax_rate、shipping_cost和price。classCreateUserPrices8,:scale=>2t.decimal:tax_rate,:precision=>8,:scale=>2t.decimal:shipping_cost,:precision=>8,:scale=>2endendend起初,我将所有3列的:default=>0放在表格中,但我不想要这样,因为它已经填充了字段,我想使用占位符。这是我的UserPrice模型:classUserPrice回答before_val
嗨~大家好,这里是可莉!今天给大家带来的是7个C语言的经典基础代码~那一起往下看下去把【程序一】打印100到200之间的素数#includeintmain(){ inti; for(i=100;i 【程序二】输出乘法口诀表#includeintmain(){inti;for(i=1;i 【程序三】判断1000年---2000年之间的闰年#includeintmain(){intyear;for(year=1000;year 【程序四】给定两个整形变量的值,将两个值的内容进行交换。这里提供两种方法来进行交换,第一种为创建临时变量来进行交换,第二种是不创建临时变量而直接进行交换。1.创建临时变量来
目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类
我在加密来self正在使用的第三方供应商的值时遇到问题。他们的指令如下:1)Converttheencryptionpasswordtoabytearray.2)Convertthevaluetobeencryptedtoabytearray.3)Theentirelengthofthearrayisinsertedasthefirstfourbytesontothefrontofthefirstblockoftheresultantbytearraybeforeencryption.4)EncryptthevalueusingAESwith:1.256-bitkeysize,2.25
我正在开发西洋跳棋实现,其中有许多易于测试的方法,但我不确定如何测试我的主要#play_game方法。我的大多数方法都可以很容易地确定输入和输出,因此也很容易测试,但这种方法是多方面的,实际上并没有容易辨别的输出。这是代码:defplay_gameputs@gui.introwhile(game_over?==false)message=nil@gui.render_board(@board)@gui.move_requestplayer_input=getscoordinates=UserInput.translate_move_request_to_coordinates(play
方法应返回-1,0或1分别表示“小于”、“等于”和“大于”。对于某些类型的可排序对象,通常将排序顺序基于多个属性。以下是可行的,但我认为它看起来很笨拙:classLeagueStatsattr_accessor:points,:goal_diffdefinitializepts,gd@points=pts@goal_diff=gdenddefothercompare_pts=pointsother.pointsreturncompare_ptsunlesscompare_pts==0goal_diffother.goal_diffendend尝试一下:[LeagueStats.new(
关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和
深度学习12.CNN经典网络VGG16一、简介1.VGG来源2.VGG分类3.不同模型的参数数量4.3x3卷积核的好处5.关于学习率调度6.批归一化二、VGG16层分析1.层划分2.参数展开过程图解3.参数传递示例4.VGG16各层参数数量三、代码分析1.VGG16模型定义2.训练3.测试一、简介1.VGG来源VGG(VisualGeometryGroup)是一个视觉几何组在2014年提出的深度卷积神经网络架构。VGG在2014年ImageNet图像分类竞赛亚军,定位竞赛冠军;VGG网络采用连续的小卷积核(3x3)和池化层构建深度神经网络,网络深度可以达到16层或19层,其中VGG16和VGG
目录0专栏介绍1平面2R机器人概述2运动学建模2.1正运动学模型2.2逆运动学模型2.3机器人运动学仿真3动力学建模3.1计算动能3.2势能计算与动力学方程3.3动力学仿真0专栏介绍?附C++/Python/Matlab全套代码?课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);曲线优化(贝塞尔曲线、B样条曲线等)。?详情:图解自动驾驶中的运动规划(MotionPlanning),附几十种规划算法1平面2R机器人概述如图1所示为本文的研究本体——平面2R机器人。对参数进行如下定义:机器人广义坐标
网站的日志分析,是seo优化不可忽视的一门功课,但网站越大,每天产生的日志就越大,大站一天都可以产生几个G的网站日志,如果光靠肉眼去分析,那可能看到猴年马月都看不完,因此借助网站日志分析工具去分析网站日志,那将会使网站日志分析工作变得更简单。下面推荐两款网站日志分析软件。第一款:逆火网站日志分析器逆火网站日志分析器是一款功能全面的网站服务器日志分析软件。通过分析网站的日志文件,不仅能够精准的知道网站的访问量、网站的访问来源,网站的广告点击,访客的地区统计,搜索引擎关键字查询等,还能够一次性分析多个网站的日志文件,让你轻松管理网站。逆火网站日志分析器下载地址:https://pan.baidu.