[干货]基础机器学习算法

by admin on 2020年3月12日

大多数机器学习任务——从自然语言处理、图像分类到翻译以及大量其他任务,都依赖于无梯度优化来调整模型中的参数和/或超参数。为了使得参数/超参数的调整更快、更简单,Facebook
创建了一个名叫
Nevergrad(https://github.com/facebookresearch/nevergrad)
的 Python 3 库,并将它开源发布。Nevergrad
提供了许多不依赖梯度计算的优化算法,并将其呈现在标准的问答 Python
框架中。此外,Nevergrad 还包括了测试和评估工具。

我首先学习的是keras,据说这个比较简单一点,比较靠近应用层,我的学习之路是从高往下学。否则立马去死抠算法,我想我一天都坚持不下去。先了解一些基础概念和常识。

来源:阿里技术

Nevergrad
现已对外开放,人工智能研究者和其他无梯度优化相关工作者马上就可以利用它来协助自己的工作。这一平台不仅能够让他们实现最先进的算法和方法,能够比较它们在不同设置中的表现,还将帮助机器学习科学家为特定的使用实例找到最佳优化器。在
Facebook 人工智能研究院(FAIR),研究者正将 Nevergrad
应用于强化学习、图像生成以及其他领域的各类项目中,例如,它可以代替参数扫描来帮助更好地调优机器学习模型。

1.Keras的底层库使用Theano或TensorFlow,这两个库也称为Keras的后端

本篇内容主要是面向机器学习初学者,介绍常见的机器学习算法,当然,欢迎同行交流。

这个库包含了各种不同的优化器,例如:

2.符号计算:(符号计算能够提供关键的计算优化、自动求导等功能)

a.先定义各种变量。

b.建立计算图(规定各个变量之间的计算关系),并编译。

c.填充实际数据,产生输出值

哲学要回答的基本问题是从哪里来、我是谁、到哪里去,寻找答案的过程或许可以借鉴机器学习的套路:组织数据->挖掘知识->预测未来。组织数据即为设计特征,生成满足特定格式要求的样本,挖掘知识即建模,而预测未来就是对模型的应用。

  • 差分进化算法(Differential evolution)

  • 序列二次规划(Sequential quadratic programming)

  • FastGA

  • 协方差矩阵自适应(Covariance matrix adaptation)

  • 噪声管理的总体控制方法(Population control methods for noise
    management)

  • 粒子群优化算法(Particle swarm optimization)

在此之前,使用这些算法往往需要研究者自己编写算法的实现,这就让他们很难在各种不同的最新方法之间进行比较,有时候甚至完全无法比较。现在,AI
开发者通过使用
Nevergrad,可以轻易地在特定的机器学习问题上对不同方法进行测试,然后对结果进行比较。或者,他们也可以使用众所周知的基准来评估——与当前最先进的方法相比,新的无梯度优化方法怎么样。

3.data_format

100张RGB三通道的16×32(高为16宽为32)彩色图:

a.theano风格:(100,3,16,32)称为“channels_first”,即通道维靠前

b.TensorFlow:  (100,16,32,3)称为“channels_last”,即通道维靠后

特征设计依赖于对业务场景的理解,可分为连续特征、离散特征和组合高阶特征。本篇重点是机器学习算法的介绍,可以分为监督学习和无监督学习两大类。

Nevergrad 中所包含的无梯度优化方法可用于各类机器学习问题,例如:

4.函数式模型

a.一种叫Sequential,称为序贯模型,也就是单输入单输出,一条路通到底,层与层之间只有相邻关系,跨层连接统统没有。这种模型编译速度快,操作上也比较简单。

b.第二种模型称为Graph,即图模型,这个模型支持多输入多输出,层与层之间想怎么连怎么连,但是编译速度慢。

总而言之,只要这个东西接收一个或一些张量作为输入,然后输出的也是一个或一些张量,那不管它是什么鬼,统统都称作“模型”。

无监督学习算法很多,最近几年业界比较关注主题模型,LSA->PLSA->LDA为主题模型三个发展阶段的典型算法,它们主要是建模假设条件上存在差异。LSA假设文档只有一个主题,PLSA假设各个主题的概率分布不变(theta都是固定的),LDA假设每个文档和词的主题概率是可变的。

  • 多模态问题,比如说拥有多个局部极小值的问题。(如用于语言建模的深度学习超参数化。)

  • 病态问题,通常在优化多个具有完全不同的动态特性的变量的时候,该问题就会出现(如,未对特定问题进行调整的丢弃和学习率)。

  • 可分离或旋转问题,其中包括部分旋转问题。

  • 部分可分离问题,可以考虑通过几个变量块来解决这类问题。示例包括深度学习或其他设计形式的架构搜索,以及多任务网络的参数化。

  • 离散的、连续的或混合的问题。这些问题可以包括电力系统(因为有些发电站具有可调连续输出,而其他发电站则具有连续或半连续输出)或者要求同时选择每层的学习速率、权值衰减以及非线性类型的神经网络任务。

  • 有噪声的问题,即针对这一问题,函数被完全相同的参数调用时可以返回不同结果,例如强化学习中的不同关卡。

在机器学习中,Nevergrad
可用于调整参数,例如学习率、动量、权值衰减(或许每一层)、dropout(丢弃)算法、深度网络每个部分的层参数及其他等。更为普遍地,非梯度方法同样被用于电网管理(https://www.sciencedirect.com/science/article/pii/S0142061597000409)、航空(https://www.sciencedirect.com/science/article/pii/S0142061597000409)、镜头设计(https://www.researchgate.net/publication/222434804_Human-competitive_lens_system_design_with_evolution_strategies)以及许多其他的科学和工程应用中。

5.batch

深度学习的优化算法,说白了就是梯度下降。每次的参数更新有两种方式。

a.批梯度下降:遍历全部数据集算一次损失函数,然后算函数对各个参数的梯度,更新梯度

优点:收敛性好,比较精确  缺点:计算量开销大,计算速度慢

b.随机梯度下降:每看一个数据就算一下损失函数,然后求梯度更新参数

优点:计算速度快 
缺点:收敛性不好,可能在最优点附近晃来晃去,hit不到最优点

LDA算法本质可以借助上帝掷骰子帮助理解,详细内容可参加Rickjin写的《LDA数据八卦》文章,浅显易懂,顺便也科普了很多数学知识,非常推荐。

为什么有无梯度优化的需求

在某些场景中,例如在神经网络权重优化中,以分析法去计算函数的梯度是简单的。然而,在其他场景中,例如当计算函数
f
的速度慢,或者域不连续的时候,函数的梯度就无法预估出来。在这些应用实例中,无梯度方法提供了解决方案。

一个简单的无梯度解决方案是随机搜索,它由随机采样大量的搜索点、对每个搜索点进行评估、选择最佳搜索点三个步骤组成。随机搜索在许多简单场景中表现很好,但在高维场景中却表现不佳。通常被用于机器学习参数调整的网格搜索,也面临类似的限制。不过,也还有许多替代方法:其中一些来自应用数学,如序列二次规划,它对模拟器的二次近似进行更新;贝叶斯优化也建立目标函数模型,其中包括不确定性模型;进化计算包含大量关于选择、变异以及混合有前景的变体的工作。

图片 1

这个示例展示了进化算法如何运行。在函数空间中采样搜索点,并选择最佳点的群落,然后在已有点的周围推荐出新的点来尝试优化当前的点群落。

6.epochs:训练过程中数据将被“轮”多少次

监督学习可分为分类和回归,感知器是最简单的线性分类器,现在实际应用比较少,但它是神经网络、深度学习的基本单元。

使用 Nevergrad 生成算法基准

Facebook 研究团队使用了 Nevergrad
实现几个基准测试,来展示特定算法在特定情况下的表现最佳。这些众所周知的示例对应着各种不同设置(多峰或非多峰,噪声或非噪声,离散或非离散,病态或非病态),并展示了如何使用
Nevergrad 来确定最佳优化算法。

在每个基准测试中,Facebook 研究团队对不同的 X
值进行了独立实验。这确保了在几个 X
值上的各个方法之间的一致排序在统计上是显著的。除了下面的两个基准示例,这里(https://github.com/facebookresearch/nevergrad/blob/master/docs/benchmarks.md)还有一份更全面的清单,并附上了如何使用简单的命令行重新运行这些基准的指南。

图片 2

这个图展示了一个噪声优化示例

这个示例展示了使用 pcCMSA-ES
噪声管理原理(https://homepages.fhv.at/hgb/New-Papers/PPSN16_HB16.pdf)的
TBPSA 如何在表现上胜过几种替代方案。Facebook 研究团队在这里只将 TBPSA
与算法的一个有限示例进行了对比,不过,比起其他的方法,它的表现同样更好。

Nevergrad
平台还可以执行在很多机器学习场景中都会出现的离散目标函数。这些场景包括,举例来说,在一组有限的选项中进行选择(例如神经网络中的激活函数)和在层的各个类型中进行选择(例如,决定在网络中的某些位置是否需要跳过连接)。

现有的替代平台(Bbob 和 Cutest)并不包含任何离散的基准。Nevergrad
可以执行经过 softmax
函数(将离散问题转换成有噪声的连续问题)或连续变量离散化进行处理了的离散域。

Facebook
研究团队注意到在这个场景中,FastGA(https://arxiv.org/abs/1703.03334)的表现最好。DoubleFastGA
对应的是 1/dim 和 (dim-1)/dim 之间的突变率,而不对应 1/dim 和
1/2。这是因为原始范围对应于二进制域,而在这里,他们考虑的是任意域。在几种场景中,简单一致的突变率混合(https://arxiv.org/abs/1606.05551)表现良好。

7.深度学习中的一些基本概念

线性函数拟合数据并基于阈值分类时,很容易受噪声样本的干扰,影响分类的准确性。逻辑回归(Logistic
Regression)利用sigmoid函数将模型输出约束在0到1之间,能够有效弱化噪声数据的负面影响,被广泛应用于互联网广告点击率预估。

图片 3

a.有监督学习,无监督学习,分类,聚类,回归

解释:https://www.zhihu.com/question/23194489

有监督学习:从标签化训练数据集中推断出函数的机器学习任务

无监督学习:根据类别未知(没有被标记)的训练样本解决模式识别中的各种问题

逻辑回归模型参数可以通过最大似然求解,首先定义目标函数L(theta),然后log处理将目标函数的乘法逻辑转化为求和逻辑(最大化似然概率
-> 最小化损失函数),最后采用梯度下降求解。

为研究者和机器学习科学家扩展工具箱

Faacebook 将会持续为 Nevergrad
增加功能,从而帮助研究者创建和评估新算法。最初的版本拥有基本的人工测试功能,不过
Facebook
计划为其增加更多功能,其中包括表示物理模型的功能。在应用方面,他们将继续让
Nevergrad 变得更易用,并尝试用它来对无法很好地确定梯度的 PyTorch
增强学习模型中的参数进行优化。Nevergrad 还可以帮助 A/B
测试以及作业调度等其他任务进行参数扫描。

  • 本文转载自雷锋网:

  • 作者:丛末

  • 原标题:Facebook 发布无梯度优化开源工具
    Nevergrad,可应用于各类机器学习问题

简而言之:

有监督学习:训练数据有标准答案的,如训练集是1+1=2;2+4=6;…..通过学习,让你做2+3=?

无监督学习:让你听一百首莫扎特的曲子,归纳一下莫扎特的曲风是怎么样的?

有监督学习里面分回归分析和分类:

回归分析和分类的本质:其数据集是给定一个函数和它的一些坐标点,然后通过算法,来估计原函数的模型,求出一个最符合这些已知数据集的函数解析式

分类和回归的区别在于输出变量的类型。

定量输出称为回归,或者说是连续变量预测;

定性输出称为分类,或者说是离散变量预测。

举个例子:

预测明天的气温是多少度,这是一个回归任务;线性函数

预测明天是阴、晴还是雨,就是一个分类任务。非线性函数

无监督学习:有聚类(即把这些没有标签的数据分成一个一个组合)

就是说把有一定特征的数据归为一类。

相比于线性分类去,决策树等非线性分类器具有更强的分类能力,ID3和C4.5是典型的决策树算法,建模流程基本相似,两者主要在增益函数(目标函数)的定义不同。

b.神经元模型,多层感知器,BP算法

解释:https://zhuanlan.zhihu.com/p/23937778

神经元模型(节点):节点从其他节点接收输入,或者从外部源接收输入,然后计算输出。

多层感知器——多层感知器有至少一个隐藏层。

单层感知器只能学习线性函数,而多层感知器也可以学习非线性函数

BP算法:反向传播算法。最初,所有的边权重(edge
weight)都是随机分配的。对于所有训练数据集中的输入,人工神经网络都被激活,并且观察其输出。这些输出会和我们已知的、期望的输出进行比较,误差会「传播」回上一层。该误差会被标注,权重也会被相应的「调整」。该流程重复,直到输出误差低于制定的标准

线性回归和线性分类在表达形式上是类似的,本质区别是分类的目标函数是离散值,而回归的目标函数是连续值。目标函数的不同导致回归通常基于最小二乘定义目标函数,当然,在观测误差满足高斯分布的假设情况下,最小二乘和最大似然可以等价。

c.目标函数(损失函数),激活函数,梯度下降法

目标函数(损失函数):最优的函数。

激活函数:将非线性引入神经元的输出。就是一个神经元从输入到输出所经过的函数。

梯度下降法:最速下降法是用负梯度方向为搜索方向的,最速下降法越接近目标值,步长越小,前进越慢。

举例:https://baike.baidu.com/item/梯度下降/4864937?fr=aladdin

当梯度下降求解模型参数时,可以采用Batch模式或者Stochastic模式,通常而言,Batch模式准确性更高,Stochastic模式复杂度更低。

d.全连接网络、卷积神经网络、递归神经网络

递归神经网络RNN),是两种人工神经网络的总称,一种是时间递归神经网络,另一种是结构递归神经网络。

卷积神经网络,是一种前馈神经网络,人工神经元可以响应周围单元,可以大型图像处理。卷积神经网络包括卷积层和池层

上文已经提到,感知器虽然是最简单的线性分类器,但是可以视为深度学习的基本单元,模型参数可以由自动编码(Auto
Encoder)等方法求解。

e.训练集,测试集,交叉验证,欠拟合,过拟合

训练集用于建立模型,测试集评估模型的预测等能力

泛化即是,机器学习模型学习到的概念在它处于学习的过程中时模型没有遇见过的样本时候的表现。

过拟合:当某个模型过度的学习训练数据中的细节和噪音,以至于模型在新的数据上表现很差。

欠拟合:模型在训练和预测时表现都不好的情况

好的拟合:这个完美的临界点就处于测试集上的错误率开始上升时,此时模型在训练集和测试集上都有良好的表现

当评价机器学习算法时我们有两者重要的技巧来限制过拟合:使用重采样来评价模型效能和保留一个验证数据集

重采样技术是k折交叉验证。指的是在训练数据的子集上训练和测试模型k次,同时建立对于机器学习模型在未知数据上表现的评估。

验证集只是训练数据的子集,你把它保留到你进行机器学习算法的最后才使用。

交叉验证:在给定的建模样本中,拿出大部分样本进行建模型,留小部分样本用刚建立的模型进行预报,并求这小部分样本的预报误差,记录它们的平方加和。

深度学习的优势之一可以理解为特征抽象,从底层特征学习获得高阶特征,描述更为复杂的信息结构。例如,从像素层特征学习抽象出描述纹理结构的边缘轮廓特征,更进一步学习获得表征物体局部的更高阶特征。

俗话说三个臭皮匠赛过诸葛亮,无论是线性分类还是深度学习,都是单个模型算法单打独斗,有没有一种集百家之长的方法,将模型处理数据的精度更进一步提升呢?当然,Model
Ensembel就是解决这个问题。Bagging为方法之一,对于给定数据处理任务,采用不同模型/参数/特征训练多组模型参数,最后采用投票或者加权平均的方式输出最终结果。

Boosting为Model
Ensemble的另外一种方法,其思想为模型每次迭代时通过调整错误样本的损失权重提升对数据样本整体的处理精度,典型算法包括AdaBoost、GBDT等。

不同的数据任务场景,可以选择不同的Model
Ensemble方法,对于深度学习,可以对隐层节点采用DropOut的方法实现类似的效果。

介绍了这么多机器学习基础算法,说一说评价模型优劣的基本准则。欠拟合和过拟合是经常出现的两种情况,简单的判定方法是比较训练误差和测试误差的关系,当欠拟合时,可以设计更多特征来提升模型训练精度,当过拟合时,可以优化特征量降低模型复杂度来提升模型测试精度。

特征量是模型复杂度的直观反映,模型训练之前设定输入的特征量是一种方法,另外一种比较常用的方法是在模型训练过程中,将特征参数的正则约束项引入目标函数/损失函数,基于训练过程筛选优质特征。模型调优是一个细致活,最终还是需要能够对实际场景给出可靠的预测结果,解决实际问题。期待学以致用!


发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图