优化算法——截断梯度法(TG)

一、L1正则的表达形式

在机器学习中,几乎无人不知无人不晓L1正则与L2正则,L1正则与L2正则都有参数控制的作用,对模型起到约束的作用,防止过拟合。但是L1正则与L2正则也有区别,L1正则更容易产生稀疏解,使得某些参数等于0,而L2正则却没有这样的优势,只能使得参数趋近于0。利用这样的优势可以使得L1具有特征选择的作用,若某些特征的系数为0表示该维特征对于模型没什么作用,故此可以丢弃。

L1正则与L2正则相比具有了更多的优点,同时,L1正则的优化相对L2正则来讲,也变得更加难。对于L2正则,由于正则项是可导的,因此博客中的基于梯度的优化算法,如梯度下降法,牛顿法,拟牛顿法(DFP算法,BFGS算法,L-BFGS算法)都可以直接用于求解带有L2正则的优化问题。L1正则项是不可导的,因此前面的这些算法无法直接对其进行求解,因此需要对其进行修改才能用来求解带有L1约束的优化问题。带有L1正则的表达式主要有以下两种:

1、convex-constraint formulation

其中,表示损失函数

2、soft-regularization

当选择合适的参数时,正两种表达形式是等价的。

二、处理大数据的方法

由于数据量比较大,可能已经超出了内存的大小,此时无法将数据全部装入到内存中参与计算,主要有两种方法处理大数据问题

  1. 在很多机器上并行批学习
  2. 利用流式的在线学习

1、流式在线学习的流程

本文所要介绍的截断梯度法(Truncated Gradient)是采用的第二种策略。流式的在线学习算法的流程大致为:

  1. 对于一个样本到达后;
  2. 我们利用计算好的权重向量计算出样本对应的输出
  3. 对于样本的实际标签,令,计算出权重下的损失
  4. 根据某种策略更新现在的权重:

2、随机梯度下降法

随机梯度下降(Stochastic Gradient Descent)是最简单的在线学习算法,其基本的更新策略为:

其中,表示学习率,通常可以取为某个常数:

也可以取为迭代代数的函数:

其中,表示当前的迭代代数。

三、截断梯度法(Truncated Gradient)

正如上面所讲,L1正则可以使得某些特征的系数为0,具有特征选择的能力,这便称为稀疏性(Sparsity)。L1正则能够产生稀疏的解。为了能够在利用在线学习的同时产生稀疏解,最直接的想法是采用截断的方法,截断,即通过某个阈值来控制系数的大小,若系数小于某个阈值便将该系数设置为0,这便是简单截断的含义。

1、简单截断(Simple coefficient Rounding)

简单截断的含义是给定某个阈值,在在线学习的过程中,没隔步进行一次截断,截断是指将小于阈值的系数直接赋值为0,具体的形式如下:

其中,表示的是阈值,函数的具体形式如下所示:

其中,是指示性函数,其具体形式如下:

该方法的主要缺点是对于值得选择是很难解决的问题,其次是通过简单截断,有点太暴力。

2、L1-Regularized Subgradient(次梯度)

有关次梯度的概念将会在另一篇文章中涉及,L1-Regularized Subgradient形式也比较直观,具体的形式如下:

其中,函数是一个符号函数,其具体形式如下:

这样的次梯度的方法的主要缺点是在很少的情况下能够产生稀疏的解,主要的原因是前后两部分做加减法能够等于0的概率很小。

3、截断梯度法(Truncated Gradient)

在简单截断方法中,直接的截断太过于暴力,在截断梯度法中,将截断的步骤适当放缓,其具体的更新公式如下:

其中,称为重力参数(gravity
parameter),截断函数的具体形式如下:

与简单截断类似,每隔次对参数进行更新,其更新公式如下:

其中,。可以通过调节参数和参数控制稀疏度,参数和参数越大,解越稀疏。

参考文献

[1] Sparse Online Learning via Truncated Gradient

[2] 在线最优化求解(Online Optimization)之二:截断梯度法(TG)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 22:17:20

优化算法——截断梯度法(TG)的相关文章

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

MOPSO 多目标例子群优化算法

近年来,基于启发式的多目标优化技术得到了很大的发展,研究表明该技术比经典方法更实用和高效.有代表性的多目标优化算法主要有NSGA.NSGA-II.SPEA.SPEA2.PAES和PESA等.粒子群优化(PSO)算法是一种模拟社会行为的.基于群体智能的进化技术,以其独特的搜索机理.出色的收敛性能.方便的计算机实现,在工程优化领域得到了广泛的应用,多目标PSO(MOPSO)算法应用到了不同的优化领域[9~11],但存在计算复杂度高.通用性低.收敛性不好等缺点. 多目标粒子群(MOPSO)算法是由Ca

优化算法—梯度下降

转自:https://www.cnblogs.com/shixiangwan/p/7532858.html 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战. 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent) 随机梯度下降

Scipy优化算法--scipy.optimize.fmin_tnc()/minimize()

scipy中的optimize子包中提供了常用的最优化算法函数实现,我们可以直接调用这些函数完成我们的优化问题. scipy.optimize包提供了几种常用的优化算法. 该模块包含以下几个方面 使用各种算法(例如BFGS,Nelder-Mead单纯形,牛顿共轭梯度,COBYLA或SLSQP)的无约束和约束最小化多元标量函数(minimize()) 全局(蛮力)优化程序(例如,anneal(),basinhopping()) 最小二乘最小化(leastsq())和曲线拟合(curve_fit()

粒子群优化算法

2011-12-05 19:49:55 标签:群智能 休闲 蚁群优化 粒群优化 粒子群优化 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://nxlhero.blog.51cto.com/962631/734212 粒子群优化算法属于群智能(swarm intelligence)优化算法.群智能分两种,一种是粒群优化,另一种是蚁群优化. 群智能概念 假设你和你的朋友正在寻宝,每个人有个探测器,这个探测器可以知道宝藏到探测器的距离

量子粒子群优化算法

参考文献: 量子行为粒子群优化算法研究[D] ,孙俊,博士论文2.4节. #include <iostream> #include <math.h> #include <time.h> using namespace std; #define M 50 //群体数目50 #define N 4 //每个粒子的维数4 //测试类 class TestFunction { public: double resen(double x1,double x2,double x3,

基本粒子群优化算法(PSO)的matlab实现

粒子群优化算法是一种模拟鸟群社会行为的群体搜素算法.它分为全局最佳粒子优化和局部最佳粒子优化,对于全局最佳PSO,或者叫做gbest PSO,每个粒子的邻域都是整个群,其算法伪代码如下: 创建并初始化一个n维的粒子群 repeat for 每个粒子i=1,2,-n do //设置个体最佳位置 if f(i)<y then y=f(i); end //设置全局最佳位置 if y<Y then Y=y; end end for 每个粒子i=1,2,-n do 用速度方程更新速度 用位置方程更新位置

优化算法——拟牛顿法之DFP算法

一.牛顿法 在博文"优化算法--牛顿法(Newton Method)"中介绍了牛顿法的思路,牛顿法具有二阶收敛性,相比较最速下降法,收敛的速度更快.在牛顿法中使用到了函数的二阶导数的信息,对于函数,其中表示向量.在牛顿法的求解过程中,首先是将函数在处展开,展开式为: 其中,,表示的是目标函数在的梯度,是一个向量.,表示的是目标函数在处的Hesse矩阵.省略掉最后面的高阶无穷小项,即为: 上式两边对求导,即为: 在基本牛顿法中,取得最值的点处的导数值为,即上式左侧为.则: 求出其中的:

性能优化——算法优化

背景 由于某种原因,我们系统需要记录另一个系统中一个表里的id.但是,当我们记录完了以后,别人系统可能会删除那个表里的一些数据,这样的话,我们这边就多了一些无效数据,所以,我们必须的找到这些无效的id,然后将其删除. 开始,我们的实现是这样:我们将记录下来的所有id放在一个list里,然后传到另一个系统,他将他们已经删除的id返回.具体处理代码如下: <pre name="code" class="java">public String findDele