Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深入机器学习系列之BFGS & L-BFGS

深入机器学习系列之BFGS & L-BFGS

作者头像
数据猿
发布于 2019-07-16 14:36:34
发布于 2019-07-16 14:36:34
6.4K00
代码可运行
举报
文章被收录于专栏:数据猿数据猿
运行总次数:0
代码可运行

前言

牛顿法及拟牛顿法是机器学习最常用的一类优化算法,今天我们就从牛顿法开始,介绍拟牛顿法算法及源码解析。

1 牛顿法

设f(x)是二次可微实函数,又设

是f(x)一个极小点的估计,我们把f(x)在

处展开成Taylor级数, 并取二阶近似。

上式中最后一项的中间部分表示f(x)在

处的Hesse矩阵。对上式求导并令其等于0,可以的到下式:

设Hesse矩阵可逆,由上式可以得到牛顿法的迭代公式如下**(1.1)**

值得注意 , 当初始点远离极小点时,牛顿法可能不收敛。原因之一是牛顿方向不一定是下降方向,经迭代,目标函数可能上升。此外,即使目标函数下降,得到的点也不一定是沿牛顿方向最好的点或极小点。因此,我们在牛顿方向上增加一维搜索,提出阻尼牛顿法。其迭代公式是**(1.2)**:

其中,lambda是由一维搜索(参考文献【1】了解一维搜索)得到的步长,即满足

2 拟牛顿法

2.1 拟牛顿条件

前面介绍了牛顿法,它的突出优点是收敛很快,但是运用牛顿法需要计算二阶偏导数,而且目标函数的Hesse矩阵可能非正定。为了克服牛顿法的缺点,人们提出了拟牛顿法,它的基本思想是用不包含二阶导数的矩阵近似牛顿法中的Hesse矩阵的逆矩阵。由于构造近似矩阵的方法不同,因而出现不同的拟牛顿法。

下面分析怎样构造近似矩阵并用它取代牛顿法中的Hesse矩阵的逆。上文**(1.2)**已经给出了牛顿法的迭代公式,为了构造Hesse矩阵逆矩阵的近似矩阵

,需要先分析该逆矩阵与一阶导数的关系。

设在第k次迭代之后,得到

,我们将目标函数f(x)在点

展开成Taylor级数, 并取二阶近似,得到

由此可知,在

附近有,

则有

又设Hesse矩阵可逆,那么上式可以写为如下形式。

这样,计算出p和q之后,就可以通过上面的式子估计Hesse矩阵的逆矩阵。因此,为了用不包含二阶导数的矩阵

取代牛顿法中Hesse矩阵的逆矩阵,有理由令

满足公式**(2.1)**:

公式**(2.1)**称为拟牛顿条件。

2.2 秩1校正

当Hesse矩阵的逆矩阵是对称正定矩阵时,满足拟牛顿条件的矩阵

也应该是对称正定矩阵。构造这样近似矩阵的一般策略是,

取为任意一个n阶对称正定矩阵,通常选择n阶单位矩阵I,然后通过修正

给定

。令,

秩1校正公式写为如下公式**(2.2)**形式。

2.3 DFP算法

著名的DFP方法是Davidon首先提出,后来又被Feltcher和Powell改进的算法,又称为变尺度法。在这种方法中,定义校正矩阵为公式**(2.3)**

那么得到的满足拟牛顿条件的DFP公式如下**(2.4)**

查看文献【1】,了解DFP算法的计算步骤。

2.4 BFGS算法

前面利用拟牛顿条件**(2.1)推导出了DFP公式(2.4)。下面我们用不含二阶导数的矩阵

近似Hesse矩阵,从而给出另一种形式的拟牛顿条件(2.5)**:

将公式**(2.1)的H换为B,p和q互换正好可以得到公式(2.5)。所以我们可以得到B的修正公式(2.6)**:

这个公式称关于矩阵B的BFGS修正公式,也称为DFP公式的对偶公式。设

可逆,由公式**(2.1)以及(2.5)**可以推出:

这样可以得到关于H的BFGS公式为下面的公式**(2.7)**:

这个重要公式是由Broyden,Fletcher,Goldfard和Shanno于1970年提出的,所以简称为BFGS。数值计算经验表明,它比DFP公式还好,因此目前得到广泛应用。

2.5 L-BFGS(限制内存BFGS)算法

在BFGS算法中,仍然有缺陷,比如当优化问题规模很大时,矩阵的存储和计算将变得不可行。为了解决这个问题,就有了L-BFGS算法。L-BFGS即Limited-memory BFGS。L-BFGS的基本思想是只保存最近的m次迭代信息,从而大大减少数据的存储空间。对照BFGS,重新整理一下公式:

之前的BFGS算法有如下公式**(2.8)**

那么同样有

将该式子带入到公式**(2.8)**中,可以推导出如下公式

假设当前迭代为k,只保存最近的m次迭代信息,按照上面的方式迭代m次,可以得到如下的公式**(2.9)**

上面迭代的最终目的就是找到k次迭代的可行方向,即

为了求可行方向r,可以使用two-loop recursion算法来求。该算法的计算过程如下,算法中出现的y即上文中提到的t:

算法L-BFGS的步骤如下所示。

2.6 OWL-QN算法

2.6.1 L1 正则化

机器学习算法中,使用损失函数作为最小化误差,而最小化误差是为了让我们的模型拟合我们的训练数据,此时, 若参数过分拟合我们的训练数据就会有过拟合的问题。正则化参数的目的就是为了防止我们的模型过分拟合训练数据。此时,我们会在损失项之后加上正则化项以约束模型中的参数:

公式右边的第一项是损失函数,用来衡量当训练出现偏差时的损失,可以是任意可微凸函数(如果是非凸函数该算法只保证找到局部最优解)。第二项是正则化项。用来对模型空间进行限制,从而得到一个更“简单”的模型。

根据对模型参数所服从的概率分布的假设的不同,常用的正则化一般有L2正则化(模型参数服从Gaussian分布)、L1正则化(模型参数服从Laplace分布)以及它们的组合形式。

L1正则化的形式如下

L2正则化的形式如下

L1正则化和L2正则化之间的一个最大区别在于前者可以产生稀疏解,这使它同时具有了特征选择的能力,此外,稀疏的特征权重更具有解释意义。如下图

图左侧是L2正则,右侧为L1正则。当模型中只有两个参数,即

时,L2正则的约束空间是一个圆,而L1正则的约束空间为一个正方形,这样,基于L1正则的约束会产生稀疏解,即图中某一维(

)为0。而L2正则只是将参数约束在接近0的很小的区间里,而不会正好为0(不排除有0的情况)。对于L1正则产生的稀疏解有很多的好处,如可以起到特征选择的作用,因为有些维的系数为0,说明这些维对于模型的作用很小。

这里有一个问题是,L1正则化项不可微,所以无法像求L-BFGS那样去求。微软提出了OWL-QN(Orthant-Wise Limited-Memory Quasi-Newton)算法,该算法是基于L-BFGS算法的可用于求解L1正则的算法。简单来讲,OWL-QN算法是指假定变量的象限确定的条件下使用L-BFGS算法来更新,同时,使得更新前后变量在同一个象限中(使用映射来满足条件)。

2.6.2 OWL-QN算法的具体过程

  • 1 次微分

是一个实变量凸函数,定义在实数轴上的开区间内。这种函数不一定是处处可导的,例如绝对值函数

。但是,从下面的图中可以看出(也可以严格地证明),对于定义域中的任何

,我们总可以作出一条直线,它通过点(

,

),并且要么接触f的图像,要么在它的下方。这条直线的斜率称为函数的次导数。推广到多元函数就叫做次梯度。

凸函数

在点

的次导数,是实数c使得:

对于所有I内的x。我们可以证明,在点

的次导数的集合是一个非空闭区间

,其中a和b是单侧极限。

它们一定存在,且满足

。所有次导数的集合

称为函数f在

的次微分。

  • 2 伪梯度

利用次梯度的概念推广了梯度,定义了一个符合上述原则的伪梯度,求一维搜索的可行方向时用伪梯度来代替L-BFGS中的梯度。

其中

我们要如何理解这个伪梯度呢?对于不是处处可导的凸函数,可以分为下图所示的三种情况。

左侧极限小于0:

右侧极限大于0:

其它情况:

结合上面的三幅图表示的三种情况以及伪梯度函数公式,我们可以知道,伪梯度函数保证了在

处取得的方向导数是最小的。

  • 3 映射

有了函数的下降的方向,接下来必须对变量的所属象限进行限制,目的是使得更新前后变量在同一个象限中,定义函数:

上述函数

直观的解释是若x和y在同一象限则取x,若两者不在同一象限中,则取0。

  • 4 线搜索

上述的映射是防止更新后的变量的坐标超出象限,而对坐标进行的一个约束,具体的约束的形式如下:

其中

是更新公式,

表示

所在的象限,

表示伪梯度下降的方向,它们具体的形式如下:

上面的公式中,

为负伪梯度方向,

选择

的方式有很多种,在OWL-QN中,使用了backtracking line search的一种变种。选择常数

,对于

,使得

满足:

  • 5 算法流程

与L-BFGS相比,第一步用伪梯度代替梯度,第二、三步要求一维搜索不跨象限,也就是迭代前的点与迭代后的点处于同一象限,第四步要求估计Hessian矩阵时依然使用损失函数的梯度。

3 源码解析

3.1 BreezeLBFGS

spark Ml调用breeze中实现的BreezeLBFGS来解最优化问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1val optimizer = new BreezeLBFGS[BDV[Double]]($(maxIter), 10, $(tol))
2val states =
3      optimizer.iterations(new CachedDiffFunction(costFun), initialWeights.toBreeze.toDenseVector)

(可左右滑动)

下面重点分析lbfgs.iterations的实现。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1def iterations(f: DF, init: T): Iterator[State] = {
 2    val adjustedFun = adjustFunction(f)
 3    infiniteIterations(f, initialState(adjustedFun, init)).takeUpToWhere(_.converged)
 4}
 5//调用infiniteIterations,其中State是一个样本类
 6def infiniteIterations(f: DF, state: State): Iterator[State] = {
 7    var failedOnce = false
 8    val adjustedFun = adjustFunction(f)
 9    //无限迭代
10    Iterator.iterate(state) { state => try {
11        //1 选择梯度下降方向
12        val dir = chooseDescentDirection(state, adjustedFun)
13        //2 计算步长
14        val stepSize = determineStepSize(state, adjustedFun, dir)
15        //3 更新权重
16        val x = takeStep(state,dir,stepSize)
17        //4 利用CostFun.calculate计算损失值和梯度
18        val (value,grad) = calculateObjective(adjustedFun, x, state.history)
19        val (adjValue,adjGrad) = adjust(x,grad,value)
20        val oneOffImprovement = (state.adjustedValue - adjValue)/(state.adjustedValue.abs max adjValue.abs max 1E-6 * state.initialAdjVal.abs)
21        //5 计算s和t
22        val history = updateHistory(x,grad,value, adjustedFun, state)
23        //6 只保存m个需要的s和t
24        val newAverage = updateFValWindow(state, adjValue)
25        failedOnce = false
26        var s = State(x,value,grad,adjValue,adjGrad,state.iter + 1, state.initialAdjVal, history, newAverage, 0)
27        val improvementFailure = (state.fVals.length >= minImprovementWindow && state.fVals.nonEmpty && state.fVals.last > state.fVals.head * (1-improvementTol))
28        if(improvementFailure)
29          s = s.copy(fVals = IndexedSeq.empty, numImprovementFailures = state.numImprovementFailures + 1)
30        s
31      } catch {
32        case x: FirstOrderException if !failedOnce =>
33          failedOnce = true
34          logger.error("Failure! Resetting history: " + x)
35          state.copy(history = initialHistory(adjustedFun, state.x))
36        case x: FirstOrderException =>
37          logger.error("Failure again! Giving up and returning. Maybe the objective is just poorly behaved?")
38          state.copy(searchFailed = true)
39      }
40    }
41  }

(可左右滑动)

看上面的代码注释,它的流程可以分五步来分析。

3.1.1 选择梯度下降方向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1protected def chooseDescentDirection(state: State, fn: DiffFunction[T]):T = {
2    state.history * state.grad
3}

(可左右滑动)

这里的*是重写的方法,它的实现如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1def *(grad: T) = {
 2     val diag = if(historyLength > 0) {
 3       val prevStep = memStep.head
 4       val prevGradStep = memGradDelta.head
 5       val sy = prevStep dot prevGradStep
 6       val yy = prevGradStep dot prevGradStep
 7       if(sy < 0 || sy.isNaN) throw new NaNHistory
 8       sy/yy
 9     } else {
10       1.0
11     }
12     val dir = space.copy(grad)
13     val as = new Array[Double](m)
14     val rho = new Array[Double](m)
15     //第一次递归
16     for(i <- 0 until historyLength) {
17       rho(i) = (memStep(i) dot memGradDelta(i))
18       as(i) = (memStep(i) dot dir)/rho(i)
19       if(as(i).isNaN) {
20         throw new NaNHistory
21       }
22       axpy(-as(i), memGradDelta(i), dir)
23     }
24     dir *= diag
25     //第二次递归
26     for(i <- (historyLength - 1) to 0 by (-1)) {
27       val beta = (memGradDelta(i) dot dir)/rho(i)
28       axpy(as(i) - beta, memStep(i), dir)
29     }
30     dir *= -1.0
31     dir
32    }
33  }

(可左右滑动)

非常明显,该方法就是实现了上文提到的two-loop recursion算法。

3.1.2 计算步长

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1protected def determineStepSize(state: State, f: DiffFunction[T], dir: T) = {
 2    val x = state.x
 3    val grad = state.grad
 4    val ff = LineSearch.functionFromSearchDirection(f, x, dir)
 5    val search = new StrongWolfeLineSearch(maxZoomIter = 10, maxLineSearchIter = 10) // TODO: Need good default values here.
 6    val alpha = search.minimize(ff, if(state.iter == 0.0) 1.0/norm(dir) else 1.0)
 7    if(alpha * norm(grad) < 1E-10)
 8      throw new StepSizeUnderflow
 9    alpha
10  }

(可左右滑动)

这一步对应L-BFGS的步骤的Step 5,通过一维搜索计算步长。

3.1.3 更新权重

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1protected def takeStep(state: State, dir: T, stepSize: Double) = state.x + dir * stepSize

(可左右滑动)

这一步对应L-BFGS的步骤的Step 5,更新权重。

3.1.4 计算损失值和梯度

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1protected def calculateObjective(f: DF, x: T, history: History): (Double, T) = {
2     f.calculate(x)
3  }

(可左右滑动)

这一步对应L-BFGS的步骤的Step 7,使用传人的CostFun.calculate方法计算梯度和损失值。并计算出s和t。

3.1.5 计算s和t,并更新history

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1//计算s和t
 2protected def updateHistory(newX: T, newGrad: T, newVal: Double,  f: DiffFunction[T], oldState: State): History = {
 3    oldState.history.updated(newX - oldState.x, newGrad :- oldState.grad)
 4}
 5//添加新的s和t,并删除过期的s和t
 6protected def updateFValWindow(oldState: State, newAdjVal: Double):IndexedSeq[Double] = {
 7    val interm = oldState.fVals :+ newAdjVal
 8    if(interm.length > minImprovementWindow) interm.drop(1)
 9    else interm
10  }

(可左右滑动)

3.2 BreezeOWLQN

BreezeOWLQN的实现与BreezeLBFGS的实现主要有下面一些不同点。

3.2.1 选择梯度下降方向

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1override protected def chooseDescentDirection(state: State, fn: DiffFunction[T]) = {
 2    val descentDir = super.chooseDescentDirection(state.copy(grad = state.adjustedGradient), fn)
 3
 4    // The original paper requires that the descent direction be corrected to be
 5    // in the same directional (within the same hypercube) as the adjusted gradient for proof.
 6    // Although this doesn't seem to affect the outcome that much in most of cases, there are some cases
 7    // where the algorithm won't converge (confirmed with the author, Galen Andrew).
 8    val correctedDir = space.zipMapValues.map(descentDir, state.adjustedGradient, { case (d, g) => if (d * g < 0) d else 0.0 })
 9
10    correctedDir
11  }

(可左右滑动)

此处调用了BreezeLBFGS的chooseDescentDirection方法选择梯度下降的方向,然后调整该下降方向为正确的方向(方向必须一致)。

3.2.2 计算步长

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1override protected def determineStepSize(state: State, f: DiffFunction[T], dir: T) = {
 2    val iter = state.iter
 3
 4    val normGradInDir = {
 5      val possibleNorm = dir dot state.grad
 6      possibleNorm
 7    }
 8    val ff = new DiffFunction[Double] {
 9       def calculate(alpha: Double) = {
10         val newX = takeStep(state, dir, alpha)
11         val (v, newG) =  f.calculate(newX)  // 计算梯度
12         val (adjv, adjgrad) = adjust(newX, newG, v) // 调整梯度
13         adjv -> (adjgrad dot dir)
14       }
15    }
16    val search = new BacktrackingLineSearch(state.value, shrinkStep= if(iter < 1) 0.1 else 0.5)
17    val alpha = search.minimize(ff, if(iter < 1) .5/norm(state.grad) else 1.0)
18
19    alpha
20  }

(可左右滑动)

takeStep方法用于更新参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1// projects x to be on the same orthant as y
 2  // this basically requires that x'_i = x_i if sign(x_i) == sign(y_i), and 0 otherwise.
 3
 4  override protected def takeStep(state: State, dir: T, stepSize: Double) = {
 5    val stepped = state.x + dir * stepSize
 6    val orthant = computeOrthant(state.x, state.adjustedGradient)
 7    space.zipMapValues.map(stepped, orthant, { case (v, ov) =>
 8      v * I(math.signum(v) == math.signum(ov))
 9    })
10  }

(可左右滑动)

calculate方法用于计算梯度,adjust方法用于调整梯度。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 1// Adds in the regularization stuff to the gradient
 2  override protected def adjust(newX: T, newGrad: T, newVal: Double): (Double, T) = {
 3    var adjValue = newVal
 4    val res = space.zipMapKeyValues.mapActive(newX, newGrad, {case (i, xv, v) =>
 5      val l1regValue = l1reg(i)
 6      require(l1regValue >= 0.0)
 7
 8      if(l1regValue == 0.0) {
 9        v
10      } else {
11        adjValue += Math.abs(l1regValue * xv)
12        xv match {
13          case 0.0 => {
14            val delta_+ = v + l1regValue   //计算左导数
15            val delta_- = v - l1regValue   //计算右导数
16            if (delta_- > 0) delta_- else if (delta_+ < 0) delta_+ else 0.0
17          }
18          case _ => v + math.signum(xv) * l1regValue
19        }
20      }
21    })
22    adjValue -> res
23  }
24

(可左右滑动)

参考文献

【1】陈宝林,最优化理论和算法

【2】[Updating Quasi-Newton Matrices with Limited Storage](docs/Updating Quasi-Newton Matrices with Limited Storage.pdf)

【3】[On the Limited Memory BFGS Method for Large Scale Optimization](docs/On the Limited Memory BFGS Method for Large Scale Optimization.pdf)

【4】L-BFGS算法

【5】BFGS算法

【6】逻辑回归模型及LBFGS的Sherman Morrison(SM) 公式推导

【7】Scalable Training of L1-Regularized Log-Linear Models

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据猿 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【技术分享】L-BFGS算法
  设f(x)是二次可微实函数,又设$x^{(k)}$是f(x)一个极小点的估计,我们把f(x)在$x^{(k)}$处展开成Taylor级数, 并取二阶近似。
腾讯云TI平台
2020/01/15
4K0
【机器学习InAction系列】机器学习如何解决问题
前言 随着大数据时代的到来,机器学习成为解决问题的一种重要且关键的工具。不管是工业界还是学术界,机器学习都是一个炙手可热的方向,但是学术界和工业界对机器学习的研究各有侧重,学术界侧重于对机器学习理论的研究,工业界侧重于如何用机器学习来解决实际问题。我们结合美团在机器学习上的实践,进行一个实战(InAction)系列的介绍(带“机器学习InAction系列”标签的文章),介绍机器学习在解决工业界问题的实战中所需的基本技术、经验和技巧。本文主要结合实际问题,概要地介绍机器学习解决实际问题的整个流程,包括对问题
美团技术团队
2018/03/12
1K0
【机器学习InAction系列】机器学习如何解决问题
【数学应用】机器学习常用最优化算法小结
本文主要是从通俗直观的角度对机器学习中的无约束优化算法进行对比归纳,详细的公式和算法过程可以看最后附的几个链接,都是干货。 机器学习基本概念 统计机器学习整个流程就是:基于给定的训练数据集,由实际需求,需要解决的问题来选择合适的模型;再根据确定学习策略,是最小化经验风险,还是结构风险,即确定优化目标函数;最后便是采用什么样的学习算法,或者说优化算法来求解最优的模型。参照《统计机器学习方法》所讲,统计机器学习(特指有监督学习)的三要素为: 1)模型 模型是指基于训练数据集,所要学习到的概率分布
陆勤_数据人网
2018/02/27
1.8K0
­­-机器学习和深度学习中值得弄清楚的一些问题 SIGAI飞跃计划答疑精华问题汇总
原创声明:本文为 SIGAI 原创文章,仅供个人学习使用,未经允许,不得转载,不能用于商业目的。
SIGAI学习与实践平台
2018/08/03
6300
­­-机器学习和深度学习中值得弄清楚的一些问题 SIGAI飞跃计划答疑精华问题汇总
机器学习算法实现解析——liblbfgs之L-BFGS算法
liblbfgs的主页:http://www.chokkan.org/software/liblbfgs/
felixzhao
2019/01/31
1.9K0
机器学习算法实现解析——liblbfgs之L-BFGS算法
机器学习中导数最优化方法(基础篇)
1. 前言 熟悉机器学习的童鞋都知道,优化方法是其中一个非常重要的话题,最常见的情形就是利用目标函数的导数通过多次迭代来求解无约束最优化问题。实现简单,coding 方便,是训练模型的必备利器之一。这篇文章主要总结一下使用导数的最优化方法的几个基本方法,梳理相关的数学知识,本人也是一边写一边学,如有问题,欢迎指正,共同学习,一起进步。 2. 几个数学概念 1) 梯度(一阶导数) 考虑一座在 (x1, x2) 点高度是 f(x1, x2) 的山。那么,某一点的梯度方向是在该点坡度最陡的方向,而梯度的大小告诉我
IT派
2018/03/29
1.6K0
机器学习中导数最优化方法(基础篇)
机器学习从零开始系列连载(10)——最优化原理(下)
SGD相对简单并且被证明有较好的收敛性质和精度,所以自然而然就想到将其扩展到大规模数据集上,就像Hadoop/Spark的基本框架是MapReduce,并行机器学习的常见框架有两种:AllReduce 和 Parameter Server(PS)。
lujohn3li
2020/02/29
6490
机器学习中牛顿法凸优化的通俗解释
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/red_stone1/article/details/80821760
红色石头
2019/05/25
8930
AAAI 2018 | 腾讯AI Lab现场陈述论文:训练L1稀疏模型的象限性消极下降算法
机器之心发布 演讲者:王倪剑桥 腾讯 AI Lab 共有 12 篇论文入选在美国新奥尔良举行的国际人工智能领域顶级学术会议 AAAI 2018。腾讯技术工程官方号独家编译了论文《训练 L1 稀疏模型的象限性消极下降算法》(Training L1-Regularized Models with Orthant-Wise Passive Descent Algorithms),该论文被 AAAI 2018 录用为现场陈述论文 (Oral Presentation),由腾讯 AI Lab 独立完成,王倪剑桥为论文
机器之心
2018/05/10
8650
机器学习算法实现解析——liblbfgs之L-BFGS算法
1、liblbfgs简介 liblbfgs是L-BFGS算法的C语言实现,用于求解非线性优化问题。 liblbfgs的主页:http://www.chokkan.org/software/liblbfgs/ 下载链接(见上面的主页链接): https://github.com/downloads/chokkan/liblbfgs/liblbfgs-1.10.tar.gz 用于Linux平台 https://github.com/chokkan/liblbfgs 用于Windows平台 2、liblb
felixzhao
2018/03/20
1.4K0
机器学习算法实现解析——liblbfgs之L-BFGS算法
看完这篇,逻辑回归80%都懂了
逻辑回归是用来做分类算法的,大家都熟悉线性回归,一般形式是Y=aX+b,y的取值范围是[-∞, +∞],有这么多取值,怎么进行分类呢?不用担心,伟大的数学家已经为我们找到了一个方法。
mantch
2019/07/30
7880
看完这篇,逻辑回归80%都懂了
【仿真环境】开源 | 一种基于ROS、Gazebo和PX4的可定制多旋翼无人机仿真平台
在本文中,提出了一种基于ROS、Gazebo和PX4的可定制多旋翼无人机仿真平台。该平台名为XTDrone,集成了动态模型、传感器模型、控制算法、状态估计算法和3D场景。该平台支持多架无人机和其他机器人。平台是模块化的,每个模块都可以进行修改,这意味着用户可以测试自己的算法,如SLAM、目标检测与追踪、视觉惯性导航、运动规划、姿态控制、多机协同等。平台运行是同步的,仿真速度可根据计算机性能进行调整。在本文中,以评价不同视觉SLAM算法和实现无人机编队为例,说明了该平台的工作原理。
CNNer
2020/06/19
3.5K0
【仿真环境】开源 | 一种基于ROS、Gazebo和PX4的可定制多旋翼无人机仿真平台
最全的机器学习中的优化算法介绍
在机器学习中,有很多的问题并没有解析形式的解,或者有解析形式的解但是计算量很大(譬如,超定问题的最小二乘解),对于此类问题,通常我们会选择采用一种迭代的优化方式进行求解。
大数据技术与机器学习
2021/04/01
1.1K0
最全的机器学习中的优化算法介绍
划重点!十分钟掌握牛顿法凸优化
我们知道,梯度下降算法是利用梯度进行一阶优化,而今天我介绍的牛顿优化算法采用的是二阶优化。本文将重点讲解牛顿法的基本概念和推导过程,并将梯度下降与牛顿法做个比较。
红色石头
2022/01/12
1.4K0
划重点!十分钟掌握牛顿法凸优化
深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)
作者灯会为21届中部985研究生,凭借自己整理的面经,去年在腾讯优图暑期实习,七月份将入职百度cv算法工程师。在去年灰飞烟灭的算法求职季中,经过30+场不同公司以及不同部门的面试中积累出了CV总复习系列,此为深度学习上篇。
昱良
2021/07/01
9050
深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)
理解牛顿法
牛顿法是数值优化算法中的大家族,她和她的改进型在很多实际问题中得到了应用。在机器学习中,牛顿法是和梯度下降法地位相当的的主要优化算法。在本文中,SIGAI将为大家深入浅出的系统讲述牛顿法的原理与应用。
SIGAI学习与实践平台
2018/08/07
1.6K0
理解牛顿法
[机器学习必知必会]牛顿法与拟牛顿法
同梯度下降法一样,牛顿法和拟牛顿法也是求解无约束最优化问题的常用方法。牛顿法本身属于迭代算法,每一步需要求解目标函数的海赛矩阵的逆矩阵,计算比较复杂。拟牛顿法通过正定矩阵近似海赛矩阵的逆矩阵或海赛矩阵,简化了这一计算过程。
TOMOCAT
2020/06/09
1.1K0
[机器学习必知必会]牛顿法与拟牛顿法
Optimization of Machine Learning
机器学习就是需要找到模型的鞍点,也就是最优点。因为模型很多时候并不是完全的凸函数,所以如果没有好的优化方法可能会跑不到极值点,或者是局部极值,甚至是偏离。所以选择一个良好的优化方法是至关重要的。首先是比较常规的优化方法:梯度下降。以下介绍的这些算法都不是用于当个算法,可以试用于能可微的所有算法。
西红柿炒鸡蛋
2018/10/10
4960
Optimization of Machine Learning
NO.2 《机器学习期末复习篇》以题(问答题)促习(人学习),满满干huo,大胆学大胆补!
现有一组某市的房价与其位置数据如表 2-12 所示,其中 D 表示房屋到市中心的直线距离,单位为 km,R 表示房屋单价,单位为元/m²。
用户11315985
2025/01/09
1660
NO.2 《机器学习期末复习篇》以题(问答题)促习(人学习),满满干huo,大胆学大胆补!
从浅层模型到深度模型:概览机器学习优化算法
选自arxiv 机器之心编译 参与:乾树、蒋思源 学习算法一直以来是机器学习能根据数据学到知识的核心技术。而好的优化算法可以大大提高学习速度,加快算法的收敛速度和效果。该论文从浅层模型到深度模型纵览监
机器之心
2018/05/08
1.2K0
从浅层模型到深度模型:概览机器学习优化算法
推荐阅读
相关推荐
【技术分享】L-BFGS算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验