Loading [MathJax]/jax/output/CommonHTML/jax.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度模型中的优化(一)、学习和纯优化有什么不同

深度模型中的优化(一)、学习和纯优化有什么不同

作者头像
狼啸风云
修改于 2022-09-03 13:53:12
修改于 2022-09-03 13:53:12
3.8K0
举报

深度学习在许多情况下都涉及优化。例如,模型中的进行推断(如PCA)涉及求解优化问题。我们经常使用解析优化去证明或设计算法。在深度学习涉及到的诸多优化问题中,最难的是神经网络训练,甚至是几百台机器投入几天到几个月来解析单个神经网络训练问题,也是很常见的。因为这其中的优化问题很重要,代价也很高,因此研究者们开发了一组专门为此设计的优化技术。下面关注一类特定的优化问题:寻找神经网络上的一组参数 ,它能显著的降低代价函数 ,该代价函数通常包括整个训练集上的性能评估和额外的正则化。

1、学习和纯优化有什么不同

用于深度模型训练的优化算法与传统的优化算法在几个方面有所不同。机器学习通常是间接作用的。在大多数机器学习问题中,我们关注某些性能度量P,其定义域测试集上并且可能是不可解的。因此,我们只是间接的优化P。我们希望通过降低代价函数 来提高P。这一点与纯优化不同,纯优化最小化目标J本身。训练深度模型的优化算法通常也会包括一些针对机器学习目标函数的特定结构进行的特化。

通常,代价函数可写为训练集上的平均,如

其中L是每个样本的损失函数, 是输入时所预测的输出, 是经验分布。监督学习中,是目标输出,的变量是。不难将这种监督学习扩展成其他形式,如包括 或者 作为参数,或是去掉参数 ,以发展不同形式的正则化或是无监督学习。式(1)定义了训练集上的目标函数。通常,我们更希望最小化取自数据生成分布 的期望,而不仅仅是有限训练集上的对应目标函数:

2、经验风险最小化

机器学习算法的目标是降低式(2)所示的期望泛化误差。这个数据量被称为风险(risk)。在这里,我么强调该期望取自真实的潜在分布 。如果我们知道了真实分布 ,那么最小化风险变成了一个可以被优化算法解决的优化问题。然而,我们遇到的机器学习问题,通常是不知道 ,只知道训练集中的样本。将机器学习问题转化问题的最简单方法是最小化训练集上的期望损失。这意味着用训练集上的经验分布 替代真实分布 。现在,我们将最小化经验风险(empirical risk):

其中m表示训练样本的数目。

基于最小化这种平均训练误差的训练过程被称为经验风险最小化(empirical risk minimization)在这种情况下,机器学习仍然和传统的直接优化很相似。我们并不直接最优化风险,而是最优化经验风险,希望也能够很大的降低风险。一系列不同的理念构成了一些条件,使得在这些条件下真实风险的期望可以下降不同的量。然而,经验风险最小化最容易导致过拟合。高容量的模型会简单地记住训练集。在很多情况下,经验风险最小化并非真的可行。最有效的现代优化算法是基于梯度下降的,但是很多有用的损失函数,如0-1损失,没有有效的导数(导数要么为0,要么处处未定义)。这两个问题说明,在深度学习中,我们很少使用经验风险最小化。反之,我们会使用一个稍有不同的方法,我们真正优化的目标会更加不同于我们希望优化的目标。

3、代理损失函数和提前终止

有时,我们真正关注的损失函数(比如分类误差)并不能被有效地优化。例如,即使对于线性分类器而言,精确地最小化0-1损失通常是不可解的(复杂度是输入维数的指数级别)。在这种情况下,我们通常会优化代理损失函数(surrogate loss function)。代理损失函数作为原目标的代理,还具备一些优点。例如,正确类别的负对数似然通常用作0-1损失的代替。负对数似然允许模型估计给定样本的类别的条件概率,如果该模型效果好,那么它能够输出期望最小分类误差所对应的类别。

在某些情况下,代理损失函数比原函数学到的更多。例如,使用对数似然替代函数时,在训练集上的0-1损失达到0之后,测试集上的0-1损失还能持续下降很长一段时间。这是因为即使0-1损失期望是零时,我们还能来开不同类别的距离以改进分类器的鲁棒性,获得一个更强壮的、更值得信赖的分类器,从而,相对于简单地最小化训练集上的平均0-1损失,它能够从训练集数据中抽取更多信息。

一般的优化和我们用于训练算法的优化有一个重要不同,训练算法通常不会停止在局部极小点。反之,机器学习通常优化代理损失函数,但是在基于提前终止的收敛条件满足停止。通常,提前终止使用真实潜在损失函数,如验证集上的0-1损失,并设计为在过拟合发生之前终止。与纯优化不同的是,提前终止时代理损失函数仍然有较大的导数,而纯优化终止时导数较小。

4、批量算法和小批量算法

机器学习算法和一般优化算法不同的一点是,机器学习算法的目标函数通常可以分解为训练样本上的求和。机器学习中的优化算法在计算参数的每一次更新时通常仅使用整个代价函数中一部分项来估计代价函数的期望值。

例如,最大似然估计问题可以在对数空间中分解成各个样本的总和:

最大化这个总和等价于最大化训练集在经验分布上的期望:

优化算法用到的目标函数J中的大多数属性也是训练集上的期望。例如,最常用的属性是梯度:

准确计算这个期望的计算代价非常大,因为我们需要在整个数据集上的每个样本上评估模型。在实践中,我们可以从数据集中随机采样少量的样本,然后样本少量的样本,然后计算这些样本上的平均数。回想一下,n个样本均值的标准差是 ,其中 是样本真实的标准差。分母 表明使用更多样本来估计梯度的方法的回报是低于线性的。比较两个假设的梯度计算,一个基于100个样本,另一个基于10000个样本。后者需要的计算量是前者的100倍,却只降低了10倍的均值标准差。如果能够快速地计算出梯度估计值,而不是缓慢地计算准确值,那么大多数优化算法会收敛地更快(就总的计算量而言,而不是指更新次数)。

另一个促使我们从小数目样本中获得梯度的统计估计的动机是训练集的冗余。在最坏的情况下,训练集中所有的m个样本都是彼此相同拷贝。基于采样的梯度估计可以使用单个样本计算出正确的梯度,而比原来的做法少花了m倍时间。实践中,我们不大可能真的遇到这种最坏情况,但可能会发现大量样本都对梯度做出了非常相似的贡献。

使用整个训练集的优化算法被称为批量(batch)或确定性(deterministic)梯度算法,因为它们会在一个大批量中同时处理所有样本。这个术语可能有点令人困惑,因为这个词“批量”也经常被用来描述小批量中同时处理所以卤样本。这个术语可能有点令人困惑,因为这个词“批量”也经常被用来描述小批量中同时处理所有样本,这个术语可能有点令人困惑,因为这个词“批量”也经常被用来描述小批量随机梯度下降算法中用到的小批量样本。通常,术语“批量梯度下降”指使用全部训练集,而术语“批量”单独出现时指一组样本。例如,我们普遍使用术语“批量大小”表示小批量的大小。

每次只使用单个样本的优化算法被称为批量(batch)或确定性(deterministic)梯度算法,因为它们会在一个大批量中同时处理所有样本。这个术语可能有点令人困惑,因为这个词“批量”单独出现时指一组样本。例如,我们普遍使用术语“批量大小”表示小批量的大小。每次只使用单个样本的优化算法有时被称为随机(stochastic)或者在线(online)算法。术语“在线”通常是指从连续产生样本的数据流中抽取样本的情况,而不是从一个固定大小训练集中遍历多次采样的情况。大多数用于深度学习的算法介于两者之间,使用一个以上而又不是全部的训练样本。传统上,这些会被称为小批量(minibatch)或小批量随机(minibatch stochastic)方法,现在通常将它们简单地称为随机(stochastic)方法。

随机方法的典型示例是随机梯度下降,小批量的大小通常由以下几个因素决定:

  • 更大的批量会计算更精确的梯度估计,但是回报却小于线性的。
  • 极小批量通常难以充分利用多核架构,这促使我们使用一些绝对最小批量,低于这个值的小批量处理不会减少计算时间。
  • 如果小批量处理中的所有样本可以并行地处理(通常确实是如此),那么内存消耗和批量大小会正比。对于很多硬件设施,这是批量大小的限制因素。
  • 在某些硬件上使用特定大小的数组时,运行时间会更少。尤其是在使用GPU时,通常使用2的幂数作为批量大小可以获得更少的运行时间。一般,2的幂数的取值范围是 ,16有时在尝试大模型时使用。
  • 可能由于小批量在学习过程中加入了噪声,它们会有一些正则化效果。泛化误差通常在批量大小为1时最好。因为梯度估计的高方差,小批量训练需要较小的学习率以保持稳定性。因为降低的学习率和消耗更多步骤来遍历整个训练集都会产生更多的步骤,所以会导致总的运行时间非常大。

不同的算法使用不用的方法从小批量中获取不同的信息。有些算法对采样误差比其他算法更敏感,这通常有两个可能原因。一个是它们使用了很难在少量样本上精确估计的信息,另一个是它们以放大采样误差的方式使用了信息。仅基于梯度g的更新方法通常相对鲁棒,并能使用较小的批量获得成功,如100。使用Hessian矩阵H,计算如 更新的二阶方法通常需要更大的批量,如10000。这些大批量通常需要最小化估计 的波动。假设H被精确估计,但是有病态条件数。乘以H或者是其逆会放大之前存在的误差(这个示例中是指g的精确估计)。即使H被精确估计,g中非常小的变化也会导致更新值 中非常大的变化。当然,我们通常只会近似地估计H,因此相对于我们使用具有较差条件的操作去估计g,更新 会含有更多的误差。

小批量是随机抽取的这点也很重要。从一组样本中计算出梯度期望的无偏估计要求这样的样本是独立的。我们也希望两个连续的梯度估计是相互独立的,因此两个连续的小批量样本也应该是独立的,因此两个连续的小批量样本也应该是彼此独立的。很多现实的数据集自然排列,从而得到连续样本之间具有高度先关性。例如,假设我们有一个很长的血液样本测试结果清单。清单上的数据有可能是这样获取再随后的血液样本取自第3个病人,等等。如果从这个清单上顺序抽取样本,那么我们的每个小批量数据都很大,因为这个小批量很可能只代表着数据集上众多患者中的某一个患者。在这种数据集中的顺序有很大影响的情况下,很有必要在抽取小批量样本前打乱样本顺序。对于非常大的数据集,如数据中心含有几十亿样本的数据集,我们每次构建小批量样本时都将样本完全均匀地抽取出来时不太现实的。幸运的是,实践中通常将样本顺序打乱一次,然后按照这个顺序存储起来就足够了。之后训练模型时都会重复用到的一组组小批量连续样本是固定的,每个独立的模型每次遍历训练数据时都会重复使用这个顺序。然而,这种偏差真实随机采样的方法并没有很严重的有害影响。不以某种范式打乱样本顺序才会极大地降低算法的性能。很多机器学习上的优化问题都可以分解成并行地计算不同样本上单独的更新。换言之,我们在计算小批量样本X上最小化J(X)的更新时,同时可以计算其他小批量样本上的更新。

小批量随机梯度下降的一个有趣动机是,只要没有重复使用样本,它将遵循着真实泛化误差的梯度。很多小批量随机梯度下降方法的实现都会打乱数据顺序一次,然后多次遍历数据来更新参数。第一次遍历时,每个小批量样本都用来计算真实泛化误差的无偏估计。第二次遍历时,估计将会是有偏的,因为它重新抽取了已经用过的样本,而不是从和原先样本相同的数据生成分布中获取新的无偏的样本。

我们不难从在线学习的情况中看出随机梯度下降最小化泛化误差的原因。这样样本或者小批量都是数据流(stream)中抽取出来的。换言之,学习器好像是一个每次看到新样本的人,每个样本 都来自数据生成分布 ,而不是使用大小固定的训练集。这种情况下,样本永远不会重复:每次更新的样本是从分布 中采样获得的无偏样本。

是离散时,以上的等价性很容易得到。在这种情况下,泛化误差可以表示为

上式的准确梯度为

在式(5)和(6)中,我们已经在对数似然中看到了相同的结果,现在我们发现这一点在包括似然的其他函数L上也是成立的。在一些关于的温和假设下,在x和y是连续时也能得到类似的结果。

因此,我们可以从数据生成分布 中抽取小批量样本 以及对应的目标 ,然后计算该小批量损失函数关于对应参数的梯度

以此获得泛化误差准确梯度的无偏估计。最后,在泛化误差上使用SGD方法在方向 上更新

当然,这个解释只能用于样本没有重复使用的情况。然而,除非训练集特别大,通常最好是多次遍历训练集。当然多次遍历数据集更新时,只有第一遍满足泛化误差梯度的无偏估计。但是,额外的遍历更新当然会由于减小训练误差而得到足够的好处,以抵消其带来的训练误差和测试误差之间差距的增加。

随着数据集规模的迅速曾铮,超越了计算能力的增速,机器学习应用每个样本只使用一次的情况变得越来越常见,甚至是不完全使用训练集。在使用一个非常大的训练集时。过拟合不再是问题,而欠拟合和计算效率变成了主要的顾虑。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年09月10日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
拇指记者打探事件分发机制背后的秘密(下)
上一期跟随拇指记者,发现了Android公司在指派具体的人之前的种种机制,今天就继续探索,看看任务具体的处理消费逻辑。
码上积木
2021/04/16
4450
图解 Android 事件分发机制
在Android开发中,事件分发机制是一块Android比较重要的知识体系,了解并熟悉整套的分发机制有助于更好的分析各种点击滑动失效问题,更好去扩展控件的事件功能和开发自定义控件,同时事件分发机制也是Android面试必问考点之一,如果你能把下面的一些事件分发图当场画出来肯定加分不少。废话不多说,总结一句:事件分发机制很重要。 Android 事件分发流 关于Android 事件分发机制网上的博文很多,但是很多都是写个Demo然后贴一下输出的Log或者拿源码分析,然后一堆的注释和说明,如果用心的去看肯定是收
非著名程序员
2018/02/02
1.3K0
图解 Android 事件分发机制
android viewgroup事件分发机制
今天给大家代码ViewGroup事件分发的源码解析~~凡是自定义ViewGroup实现各种滑动效果的,不可避免的会出现很多事件的冲突,对ViewGroup事件分发机制的了解,也有益于大家了解冲突产生的原因,以及对冲突进行处理~ 1、案例 首先我们接着上一篇的代码,在代码中添加一个自定义的LinearLayout: package com.example.zhy_event03;   import android.content.Context;   import android.util.Attrib
xiangzhihong
2018/01/30
9950
一文读懂Android View事件分发机制
Android View 虽然不是四大组件,但其并不比四大组件的地位低。而View的核心知识点事件分发机制则是不少刚入门同学的拦路虎。ScrollView嵌套RecyclerView(或者ListView)的滑动冲突这种老大难的问题的理论基础就是事件分发机制。
陈宇明
2020/12/15
3760
一文读懂Android View事件分发机制
Android View的事件分发机制
在用户触摸屏幕时,总是离用户触摸点最近的控件来响应触摸事件,如果最近的控件没有实现响应事件,那这个事件会不断的向父类传递,直到有view响应时,就会将触摸反馈的事件流传递给这个view的onTouchEvent()方法,如下图: 如果CustmoView中不响应onTouchEvent(),那面事件会传递给LayoutView中,如果在LayoutView中响应了onTouchEvent(),那面事件就不会再传递给RootView了。
艳龙
2021/12/16
3830
Android View的事件分发机制
Android查缺补漏(View篇)--事件分发机制
事件分发机制是Android中非常重要的一个知识点,同时也是难点,相信到目前为止很多Android开发者对事件分发机制并没有一个非常系统的认识,当然也包括博主个人在内。可能在平时的开发工作中我们并没有意识到事件分发机制起到的作用,其实它是时刻存在的只是我们不知道而已,就像一些滑动冲突、点击事件之间的冲突等等大多是因为事件分发处理不当导致的。想起了博主大学时做过一个小项目,里面就出现了滑动冲突的问题,虽然最后在网上一步步看着别人的教程也糊里糊涂的解决了,但终究不知其所以然,那么今天就让我们一起来深入的探索一下
codingblock
2018/03/30
6520
进阶必备-Android事件分发机制
或许你会问,“为什么我一定要知道View的事件分发机制?”。因为我们在实际开发的过程中,经常会遇到多层的View互相嵌套以后,对某一个View进行滑动的时候,特别不灵敏,甚至于没法滑动。这种滑动冲突的解决需要我们清楚的掌握View的事件分发机制。那下面我们详细的讲解下View的整个事件机制。 Android将View的事件封装到MotionEvent这个类中,这也是监听touch事件中回调给我们的参数public boolean onTouchEvent(MotionEvent event) 。通常事件我们主要关心下面几种类型:
吴延宝
2018/10/18
9510
进阶必备-Android事件分发机制
笔记(四)——事件分发机制
1、事件分发机制:整个事件分发是一个U形传递的,递归传递。图解 Android 事件分发机制
木溪bo
2020/03/27
1.3K0
View事件分发机制源码解析
注:本文解析的源码基于 API 25,部分内容来自于《Android开发艺术探索》。
俞其荣
2022/07/28
3970
重新复习Android View事件分发
一个Activity包含了一个Window对象,这个对象是由PhoneWindow来实现的。PhoneWindow将DecorView作为整个应用窗口的根View,而这个DecorView又将屏幕划分为两个区域:一个是TitleView,另一个是ContentView,而我们平时所写的就是展示在ContentView中
老马的编程之旅
2022/06/22
3800
重新复习Android View事件分发
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
其实我一直准备写一篇关于Android事件分发机制的文章,从我的第一篇博客开始,就零零散散在好多地方使用到了Android事件分发的知识。也有好多朋友问过我各种问题,比如:onTouch和onTouc
用户1158055
2018/01/05
1.3K0
Android事件分发机制完全解析,带你从源码的角度彻底理解(上)
Android高级进阶之路【二】十分钟彻底弄明白 View 事件分发机制
此处需要特别说明:事件列,即指从手指接触屏幕至手指离开屏幕这个过程产生的一系列事件。一般情况下,事件列都是以DOWN事件开始、UP事件结束,中间有无数的MOVE事件。
做个快乐的码农
2021/11/18
6840
Android高级进阶之路【二】十分钟彻底弄明白 View 事件分发机制
开发笔记-自定义View(十)-View的事件分发机制
关于自定义View系列的文章,好久没有写了。今天抽空看了下Android开发艺术探索。正好看到了View的事件分发机制,所以将它写成笔记记录下来。 关于View的事件分发,我起初是学习郭神的2篇文章。感觉其实也没有什么。大致也就了解下。不过看完其他很多优秀的文章和书籍后,才知道自己too young too simple。下面我们就一起来分析下Android的时间分发机制。
g小志
2018/09/11
6620
开发笔记-自定义View(十)-View的事件分发机制
Android必知必会--事件分发机制
所谓的安卓事件是什么?具体来说的就是点击和滑动两个操作;抽象着来说就是下面的表格。
ClericYi
2020/07/21
6140
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
记得在前面的文章中,我带大家一起从源码的角度分析了Android中View的事件分发机制,相信阅读过的朋友对View的事件分发已经有比较深刻的理解了。 还未阅读过的朋友,请先参考 Android事件分
用户1158055
2018/01/05
1.3K0
Android事件分发机制完全解析,带你从源码的角度彻底理解(下)
事件分发机制三问
只要有点击,就会涉及到事件分发机制,点击屏幕后,view会怎么反应?今天一起来看看事件分发机制的三问:
码上积木
2020/10/10
4620
View的事件分发机制
当一个点击事件产生后,他的传递过程遵循Activity->Window->View的逐级传递。我们这里讨论的是在Android系统View里事件传递。
1025645
2018/08/23
4220
笔记——事件分发机制(四)
1、事件分发机制:整个事件分发是一个U形传递的,递归传递。图解 Android 事件分发机制
木溪bo
2018/12/27
8501
这次,我把Android事件分发机制翻了个遍
作者:积木zz 链接:https://juejin.im/post/5eb3e0d6f265da7c002028cd 以下是原文:
胡飞洋
2020/07/23
2.2K0
这次,我把Android事件分发机制翻了个遍
高级 UI 成长之路 (二) 深入理解 Android 8.0 View 触摸事件分发机制
在上一篇文章中我们介绍了 View 的基础知识以及 View 滑动的实现,本篇将为大家带来 View 的一个核心知识点 事件分发机制。事件分发机制不仅仅是核心知识点也是 Android 中的一个难点,下面我们就从源码的角度来分析事件的传递还有最后是如何解决滑动冲突的。
做个快乐的码农
2021/11/12
7510
高级 UI 成长之路 (二) 深入理解 Android 8.0 View 触摸事件分发机制
推荐阅读
相关推荐
拇指记者打探事件分发机制背后的秘密(下)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档