当前位置: 首页 > news >正文

第七章、优化算法

优化是应用数学的一个分支,也是机器学习的核心组成部分。实际上,机器 学习算法 = 模型表征 + 模型评估 + 优化算法。其中,优化算法所做的事情就是在 模型表征空间中找到模型评估指标最好的模型。不同的优化算法对应的模型表征 和评估指标不尽相同,比如经典的支持向量机对应的模型表征和评估指标分别为 线性分类模型和最大间隔,逻辑回归对应的模型表征和评估指标则分别为线性分 类模型和交叉熵。
随着大数据和深度学习的迅猛发展,在实际应用中面临的大多是大规模、高 度非凸的优化问题,这给传统的基于全量数据、凸优化的优化理论带来了巨大的 挑战。如何设计适用于新场景的、高效的、准确的优化算法成为近年来的研究热 点。优化虽然是一门古老的学科,但是大部分能够用于训练深度神经网络的优化 算法都是近几年才被提出,如Adam算法等。
虽然,目前大部分机器学习的工具已经内置了常用的优化算法,实际应用时 只需要一行代码即可完成调用。但是,鉴于优化算法在机器学习中的重要作用, 了解优化算法的原理也很有必要。

有监督学习的损失函数

机器学习算法的关键一环是模型评估,而损失函数定义了模型的评估指标。 可以说,没有损失函数就无法求解模型参数。不同的损失函数优化难度不同,最 终得到的模型参数也不同,针对具体的问题需要选取合适的损失函数。

二分类问题

对二分类问题,Y={1,−1},最自然的损失函数是0-1损失,即预测值和目标值不相等为1, 否则为0。该损失函数能够直观地刻画分类的错误率,但是由于其非凸、非光滑的特点, 使得算法很难直接对该函数进行优化。
0-1损失的一个代理损失函数是 Logistic损失函数
在这里插入图片描述
Logistic损失函数也是0-1损失函数的凸上界,且该函数处处光滑,因此可以用梯度下降法进行优化。但是,该损失函数对所有的样本点都有所惩罚,因此对异常值相对更敏感一些。
另一个常用的代理损失函数是交叉熵损失函数:
在这里插入图片描述
交叉熵损失函数也是0-1损失函数的光滑凸上界。

回归

对于回归问题,最常用的损失函数是平方损失函数
在这里插入图片描述
平方损失函数是光滑函数,能够用梯度下降法进行优化。然而,当预测值距离真实值越远时,平方损失函数的惩罚力度越大,因此它对异常点比较敏感。为了解 决该问题,可以采用绝对损失函数
在这里插入图片描述
绝对损失函数相当于是在做中值回归,相比做均值回归的平方损失函数,绝对损 失函数对异常点更鲁棒一些。但是,绝对损失函数在f=y处无法求导数。综合考虑 可导性和对异常点的鲁棒性,可以采用Huber损失函数
在这里插入图片描述
Huber损失函数在|f−y|较小时为平方损失,在|f−y|较大时为线性损失,处处可导, 且对异常点鲁棒。这三种损失函数的曲线如图所示。
在这里插入图片描述

机器学习中的优化问题

机器学习中的优化问题,哪些是凸优化问题,哪些是非凸优化问题?请各举一个例子。

逻辑回归对应的优化问题就是凸优化问题、主成分分析对应的优化问题是非凸优化问题。

经典优化算法

针对不同的优化问题和应用场景,研究者们提出了多种不同的求解算法,并逐渐发展出了有严格理论支撑的研究领域—凸优化。在这众多的算法中,有几种经典的优化算法是值得被牢记的,了解它们的适用场景有助于我们在面对新的优化问题时有求解思路。
经典的优化算法可以分为直接法和迭代法两大类。
直接法,顾名思义,就是能够直接给出优化问题最优解的方法。这个方法听 起来非常厉害的样子,但它不是万能的。直接法要求目标函数需要满足两个条件。
第一个条件是,L(·)是凸函数。若L(·)是凸函数,那么θ是最优解的充分必要条 件是L(·)在θ处的梯度为0。在这里插入图片描述
第二个条件是,上式有闭式解。

直接法要满足的这两个条件限制了它的应用范围。因此,在很多实际问题中,会采用迭代法。迭代法就是迭代地修正对最优解的估计。假设当前对最优解的估计值为θt,希望求解优化问题
在这里插入图片描述
迭代法又可以分为一阶法和二阶法两类。一阶法对函数L(θt+δ)做一阶泰勒展开,二阶法对函数L(θt+δ)做二阶泰勒展开。二阶法也称为牛顿法,Hessian矩阵就是目标函数的二阶信息。二阶法的收敛 速度一般要远快于一阶法,但是在高维情况下,Hessian矩阵求逆的计算复杂度很 大,而且当目标函数非凸时,二阶法有可能会收敛到鞍点(Saddle Point)。

梯度验证

随机梯度下降

经典的优化方法,如梯度下降法,在每次迭代时需要使用所有的训练数据, 这给求解大规模数据的优化问题带来了挑战。如何克服这个挑战,对于掌握机器 学习,尤其是深度学习至关重要。

当训练数据量特别大时,经典的梯度下降法存在什么问题,需要做如何改进?

经典的梯度下降法采用所有训练数据的平均损失来近似目标函数,因此,经典的梯度下降法在每次对模型参数进行更新时,需要遍历所有的训练数据。这需要很大的计算量,耗费很长的计算时间,在实际应用中基本不可行。
为了解决该问题,随机梯度下降法(Stochastic Gradient Descent,SGD)用单个训练样本的损失来近似平均损失,因此,随机梯度下降法用单个训练数据即可对模型参数进行一次更新,大大加快了收敛速率。该方法也非常适用于数据源源不断到来的在线更新场景。
为了降低随机梯度的方差,从而使得迭代算法更加稳定,也为了充分利用高度优化的矩阵运算操作,在实际应用中我们会同时处理若干训练数据,该方法被称为小批量梯度下降法(Mini-Batch Gradient Descent)。
对于小批量梯度下降法的使用,有以下三点需要注意的地方。
(1)如何选取参数m?在不同的应用中,最优的m通常会不一样,需要通过调参选取。一般m取2的幂次时能充分利用矩阵运算操作,所以可以在2的幂次中挑 选最优的取值,例如32、64、128、256等。
(2)如何挑选m个训练数据?为了避免数据的特定顺序给算法收敛带来的影 响,一般会在每次遍历训练数据之前,先对所有的数据进行随机排序,然后在每 次迭代时按顺序挑选m个训练数据直至遍历完所有的数据。
(3)如何选取学习速率α?为了加快收敛速率,同时提高求解精度,通常会 采用衰减学习速率的方案:一开始算法采用较大的学习速率,当误差曲线进入平 台期后,减小学习速率做更精细的调整。最优的学习速率方案也通常需要调参才 能得到。
综上,通常采用小批量梯度下降法解决训练数据量过大的问题。每次更新模 型参数时,只需要处理m个训练数据即可,其中m是一个远小于总数据量M的常 数,这样能够大大加快训练过程。

随机梯度下降法的加速

提到深度学习中的优化方法,人们通常会想到随机梯度下降法。但是,随机梯度下降法并不是万金油,有时候反而会成为一个坑。当你设计出一个深度神经网络时,如果只知道用随机梯度下降法来训练模型,那么当你得到一个比较差的 训练结果时,你可能会放弃在这个模型上继续投入精力。然而,造成训练效果差 的真正原因,可能并不是模型的问题,而是随机梯度下降法在优化过程中失效 了,这可能会导致你丧失一次新发现的机会。

随机梯度下降法失效的原因:

可以看出,批量梯度下降法的每一步都把整个训练集载入进来进行计算,时间花费和内存开销都非常大,无法应用于大数据集、大模型的场景。相反,随机梯度下降法则放弃了对梯度准确性的追求,每步仅仅随机采样一个(或少量)样本来估计当前梯度,计算速度快,内存开销小。但由于每步接受的信息量有限,随机梯度下降法对梯度的估计常常出现偏差,造成目标函数曲线收敛得很不稳定,伴有剧烈波动,有时甚至出现不收敛的情况。
下图展示了两种方法在优化过程中的参数轨迹,可以看出,批量梯度下降法稳定地逼近最低点,而随机梯度下降法的参数轨迹曲曲折折简直是“黄河十八弯”。
在这里插入图片描述
进一步地,有人会说深度学习中的优化问题本身就很难,有太多局部最优点的陷阱。没错,这些陷阱对随机梯度下降法和批量梯度下降法都是普遍存在的。 但对随机梯度下降法来说,可怕的是山谷和鞍点两类地形。 山谷顾名思义就是狭长的山间小道,左右两边是峭壁;鞍点的形状像是一个马鞍,一个方向上两头翘,另一个方向上两头垂,而中心区域是一片近乎水平的平地。为什么随机梯度下降法最害怕遇上这两类地形呢?在山谷中,准确的梯度方向是沿山道向下,稍有偏离就会撞向山壁,而粗糙的梯度估计使得它在两山壁间 来回反弹震荡,不能沿山道方向迅速下降,导致收敛不稳定和收敛速度慢。在鞍点处,随机梯度下降法会走入一片平坦之地(此时离最低点还很远,故也称 plateau)。想象一下蒙着双眼只凭借脚底感觉坡度,如果坡度很明显,那么基本 能估计出下山的大致方向;如果坡度不明显,则很可能走错方向。同样,在梯度近乎为零的区域,随机梯度下降法无法准确察觉出梯度的微小变化,结果就停滞下来。

解决之道——惯性保持和环境感知

随机梯度下降法的更新公式表示为
在这里插入图片描述
其中,当前估计的负梯度−gt表示步子的方向,学习速率η控制步幅。改造的随机梯度下降法仍然基于这个更新公式。

动量方法

为了解决随机梯度下降法山谷震荡和鞍点停滞的问题,我们做一个简单的思维实验。想象一下纸团在山谷和鞍点处的运动轨迹,在山谷中纸团受重力作用沿山道滚下,两边是不规则的山壁,纸团不可避免地撞在山壁,由于质量小受山壁 弹力的干扰大,从一侧山壁反弹回来撞向另一侧山壁,结果来回震荡地滚下;如果当纸团来到鞍点的一片平坦之地时,还是由于质量小,速度很快减为零。纸团的情况和随机梯度下降法遇到的问题简直如出一辙。直观地,如果换成一个铁球,当沿山谷滚下时,不容易受到途中旁力的干扰,轨迹会更稳更直;当来到鞍 点中心处,在惯性作用下继续前行,从而有机会冲出这片平坦的陷阱。因此,有了动量方法,模型参数的迭代公式为
在这里插入图片描述
具体来说,前进步伐−vt由两部分组成。一是学习速率η乘以当前估计的梯度gt;二是带衰减的前一次步伐vt−1。这里,惯性就体现在对前一次步伐信息的重利用上。
类比中学物理知识,当前梯度就好比当前时刻受力产生的加速度,前一次步伐好 比前一时刻的速度,当前步伐好比当前时刻的速度。为了计算当前时刻的速度, 应当考虑前一时刻速度和当前加速度共同作用的结果,因此vt直接依赖于vt−1和gt, 而不仅仅是gt。另外,衰减系数γ扮演了阻力的作用。

AdaGrad方法

惯性的获得是基于历史信息的,那么,除了从过去的步伐中获得一股子向前冲的劲儿,还能获得什么呢?我们还期待获得对周围环境的感知,即使蒙上双眼,依靠前几次迈步的感觉,也应该能判断出一些信息,比如这个方向总是坑坑 洼洼的,那个方向可能很平坦。
随机梯度下降法对环境的感知是指在参数空间中,根据不同参数的一些经验 性判断,自适应地确定参数的学习速率,不同参数的更新步幅是不同的。在应用中,我们希望更新频率低的参数可以拥有较大的更新步幅,而更新频率高的参数 的步幅可以减小。AdaGrad方法采用“历史梯度平方和”来衡量不同参数的梯度的稀 疏性,取值越小表明越稀疏。

Adam方法

Adam方法将惯性保持和环境感知这两个优点集于一身。一方面,Adam记录梯度的一阶矩,即过往梯度与当前梯度的平均,这体现了惯性保 持;另一方面,Adam还记录梯度的二阶矩,即过往梯度平方与当前梯度平方的平均,这类似AdaGrad方法,体现了环境感知能力,为不同参数产生自适应的学习速率。一阶矩和二阶矩采用类似于滑动窗口内求平均的思想进行融合,即当前梯度和近一段时间内梯度的平均值,时间久远的梯度对当前平均值的贡献呈指数衰减。

L1正则化与稀疏性

L1正则化就是一范数、L2正则化就是二范数。
L1正则化对所有参数的惩罚力度都一样,可以让一部分权重变为零,因此产生稀疏模型,能够去除某些特征(权重为0则等效于去除)。
L2正则化减少了权重的固定比例,使权重平滑。L2正则化不会使权重变为0(不会产生稀疏模型),所以选择了更多的特征。
在这里插入图片描述
在这里插入图片描述

L1正则化使得模型参数具有稀疏性的原理是什么?

在二维的情况下,黄色的部分是L2和L1正则项约束后的解空间,绿色的等高线是凸优化问题中目标函数的等高线,如图所示。由图可知,L2正则项约束后的解空间是圆形,而L1正则项约束的解空间是多边形。 显然,多边形的解空间更容易在尖角处与等高线碰撞出稀疏解。
在这里插入图片描述
L2正则化相当于为参数定义了一个圆形 的解空间(因为必须保证L2范数不能大于m),而L1正则化相当于为参数定义了 一个棱形的解空间。如果原问题目标函数的最优解不是恰好落在解空间内,那么 约束条件下的最优解一定是在解空间的边界上,而L1“棱角分明”的解空间显然更 容易与目标函数等高线在角点碰撞,从而产生稀疏解。

相关文章:

  • 关于HashMap中重写equals与hashcode的一下问题
  • 互亿无线语音通知平台常用使用场景及接入指南
  • 01 LaTeX命令环境和源代码结构
  • 浏览一个网站时的整个过程
  • 一条 sql 了解 MYSQL 的架构设计
  • 秋招还没offer,正常吗?
  • 什么是悬空 Docker 镜像?
  • 深度学习05——线性回归模型
  • 前端element-ui组件库el-card卡片【hover效果与点击事件(点击无效用@click.native=““)解决】
  • 基于JSP+java的酒店预订系统
  • 塑料检测项目和标准
  • SSM+网上书城系统 毕业设计-附源码180919
  • 6课题研究心得4
  • 【Java】Apache HttpClient调用微信支付API v3报错:找不到证书序列号对应的证书
  • 数据中心如何实现跨SD-WAN融合组网?
  • @angular/forms 源码解析之双向绑定
  • Android交互
  • Angular Elements 及其运作原理
  • CSS 提示工具(Tooltip)
  • Javascript编码规范
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • js面向对象
  • Laravel Telescope:优雅的应用调试工具
  • oldjun 检测网站的经验
  • React系列之 Redux 架构模式
  • Redash本地开发环境搭建
  • 听说你叫Java(二)–Servlet请求
  • UI设计初学者应该如何入门?
  • ​一些不规范的GTID使用场景
  • # Swust 12th acm 邀请赛# [ K ] 三角形判定 [题解]
  • #includecmath
  • #vue3 实现前端下载excel文件模板功能
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (10)STL算法之搜索(二) 二分查找
  • (3)(3.5) 遥测无线电区域条例
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)ssm码农论坛 毕业设计 231126
  • (三)uboot源码分析
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一) springboot详细介绍
  • (转)Scala的“=”符号简介
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转载)深入super,看Python如何解决钻石继承难题
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET6实现破解Modbus poll点表配置文件
  • .NET处理HTTP请求
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .net中调用windows performance记录性能信息
  • [20161214]如何确定dbid.txt
  • [20170728]oracle保留字.txt