A. 机器学习
机器学习是人工智能的一个子集。
这项技术的主要任务是指导计算机从数据中学习,然后利用经验来改善自身的段猛袭性能,不需要进行明确的编程。在机器学习中,算法会不断进行训练,从大型数据集中发现模式和知指相关性,然后根据数据分析结果做出最佳决策和预测。
特点
机器学习应用具有自我演进能力,它们获得的数据越多,准确性会越高。机器学习技术握兄的应用无处不在,比如我们的家居生活、购物车、娱乐媒体以及医疗保健等。
机器学习算法能够识别模式和相关性,这意味着它们可以快速准确地分析自身的投资回报率。对于投资机器学习技术的企业来说,他们可以利用这个特性,快速评估采用机器学习技术对运营的影响。
B. 机器学习的算法和普通《算法导论》里的算法有什么本质上的异同
作者:董可人
链接:http://www.hu.com/question/24976006/answer/29682806
来源:知乎
着作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
算法导论里的算法本质上是对有精确解的问题,如何更有效率地求得这个解。这个效率可以是计算时间更短,也可以是计算过程所需要的空间更少。
一个简单的例子是,给定一个乱序数组,如何快速的将其按从小到大的顺序重新排列,或者找到其中的中位数。这些问题都有确定且唯一的答案,一般都会有一个笨方法(穷举或遍历),只要一步一步来就可以解,所谓算法只是如何精简步骤,更快更省事地找到这个解。这些算法处理的数据也都是结构简洁且干净的类型,比如数组,二叉树,图之类的数据结构。数据规模对于这些算法而言,影响的是计算所需的时间和空间,不会因为规模改变而影响算法本身的逻辑以及计算的结果。
机器学习要解决的问题一般没有精确解,也不能用穷举或遍历这种步骤明确的方法找到解,而且需要强调的是“学习”这个属性,即希望算法本身能够根据给定的数据或计算环境的改变而动态的发现新的规律,甚至改变算法程序的逻辑和行为。
举例来说,可以是把一千份文档归类到不同的几个类别里。最简单的可以是给定几个类别,比如新闻,小说,诗歌等,算法来根据文章内容自动划分到对应的类别里。这里可以看出这个问题即使让人做,也有很多模糊不能确定的地方,比如一篇法制晚报上的犯罪纪实是应该划到新闻,还是小说呢?或者说一篇长诗比如荷马史诗是应该归在小说还是诗歌呢?机器学习算法想要解决的,就是根据从文章内容里找到的规律,来自动的给出一个划分。而不同算法可以给出不同的解,这些解都可以是“正确”的,所以一般还需要人为设计一个评判标准来决定孰优孰劣。
也可以不事先给定类别,而是让算法自己去发现文章中的规律,把相似度高的文章划分到一起。这样不同的算法可能给出不同数量的类别划分,可能是三个,四个,或者五个,也都可以是“正确”的划分。甚至什么是“相似度”,不同算法也可以给出不同解释,可以是名词动词形容词的词频及比例,也可以是句子的语法结构等。
更进一步的,你可能还希望这个算法能够用来判断一份新的文档的类别。而输入的新文档越多,也会进一步扩大初始数据集的规模,规模变大以后,原来数据中不明显的规律可能就变明显了。比如说原来一千份文档中只有一篇议论文,可能大多算法都无法把它单独划出一个类别,但当你持续输入一百份议论文后,数据中议论文的比例就变成了101/1100,差不多10%,这时候算法就应该划分出单独的议论文类别。在这个意义上,数据本身也对算法有很大的影响,这也是和算法导论中的算法的一个本质区别。
技术上说,算法导论中的算法关注点在数据结构和计算复杂度,属于离散数学的一个分支,不涉及微积分等高等数学概念。机器学习的算法本身是基于概率,统计和优化(optimization)等理论和技术,从这个角度上说给人感觉更“数学”一点。
在具体的实现细节上,机器学习的算法会大量应用算法导论中的技术来改进计算效率。但需要强调这仅仅是对底层实现来说,在算法本身的逻辑上,二者没有太多联系。换句话说,算法导论中的技术可以帮助你写出更快的程序来运行机器学习算法,但是这对机器学习要解决的问题本身是没有什么帮助的。熟练使用二叉树散列表,准确估算一个图算法的复杂度,都没有任何可能帮助你猜到在女朋友过生日时送什么礼物最好(使用了机器学习算法的淘宝君却很可能知道!)。因此不要把它们看成是搭积木拼构件的关系。
最后,如果以上解释仍然让你费解,那么还有一个更通俗的解释:算法导论是教你如何数数,而机器学习基本上相当于星座算命。一个很机械,一个靠忽悠,差不多就是这样吧。
具体分析见链接:http://www.hu.com/question/24976006
C. 什么是机器学习 周志华
医学诊断、检测信用卡欺诈、证券市场分析。训练集中的目标是由人标注的,③ 强化学习,以下分别介绍这三种方法的区别?
广义来说,有三种机器学习算法:① 监督式学习,② 非监督式学习首先关注什么是机器学习?
机器学习有下面几种定义:
机器学习是一门人工智能的科学。这个算法训练机器进行决策。它是这样工作的:机器被放在一个能让它通过反复试错来训练自己的环境中。机器从过去的经验中进行学习,并且尝试利用了解最透彻的知识作出精亏裤确的判断。
强化学习的例子有,当新的数据到来时,可以根据这个函数预测结果、语音和手写识别:通过观察来学习做成如何的动作。每个动作都会对环境有所影响,学习对象根据观察到的周围环境的反馈来做出判断,该领域蔽镇的主要研究对象是人工智能。
机器学习是用数据或以往的经验,以此优化计算机程序的性能标准,特别是如何在经验学习中改善具体算法的性能。
机器学习是对能通过经验自动改进的计算机算法的研究、DNA序列测序。这种分析方式被广泛地用来细分客户,根据干预的方式分为不同的用户组。
非监督式学习的例销并简子有。常见的监督学习算法包括线性回归分析和逻辑回归分析。
监督式学习的例子有:线性回归:马尔可夫决策过程。
常见的机器学习算法有哪些。
一种经常引用的英文定义是:
A computer program is said to learn from experience E with respect to some class of tasks T and performance measure P, if its performance at tasks in T, as measured by P, improves with experience E.
通俗一点的解释就是,机器学习算法可以从过去已知的数据中学习数据隐藏的规律。常见的无监督学习算法有聚类。监督学习的训练集要求是包括输入和输出,也可以说是特征和目标,利用这些学习来的规律,在给定一定输入的情况下,对未来进行预测。
机器学习的应用领域有哪些。
监督式学习
定义?
机器学习已广泛应用于数据挖掘、计算机视觉、自然语言处理、逻辑回归等、生物特征识别、搜索引擎。
机器学习算法的分类以及这些分类之间的区别是什么、战略游戏和机器人等众多领域:关联算法和 K – 均值算法。
强化学习
定义:从给定的训练数据集中学习出一个函数。
非监督式学习
定义:与监督学习相比,训练集没有人为标注的结果、随机森林、K – 近邻算法、决策树
D. 机器学习故事汇-决策树算法
机器学习故事汇-决策树算法
【咱们的目标】系列算法讲解旨在用最简单易懂的故事情节帮助大家掌握晦涩无趣的机器学习,适合对数学很头疼的同学们,小板凳走起!
决策树模型是机器学习中最经典的算法之一啦,用途之广泛我就不多吹啦,其实很多机器学习算法都是以树模型为基础的,比如随机森林,Xgboost等一听起来就是很牛逼的算法(其实用起来也很牛逼)。
首先我们来看一下在上面的例子中我想根据人的年龄和性别(两个特征)对5个人(样本数据)进行决策,看看他们喜不喜欢玩电脑游戏。首先根据年龄(根节点)进行了一次分支决策,又对左节点根据性别进行了一次分支决策,这样所有的样本都落到了最终的叶子节点,可以把每一个叶子节点当成我们最终的决策结果(比如Y代表喜欢玩游戏,N代表不喜欢玩游戏)。这样我们就通过决策树完成了非常简单的分类任务!
再来看一下树的组成,主要结构有根节点(数据来了之后首先进行判断的特征),非叶子节点(中间的一系列过程),叶子节点(最终的结果),这些都是我们要建立的模块!
在决策中树中,我们刚才的喜欢玩电脑游戏的任务看起来很简单嘛,从上往下去走不就OK了吗!但是难点在于我们该如何构造这棵决策树(节点的选择以及切分),这个看起来就有些难了,因为当我们手里的数据特征比较多的时候就该犹豫了,到底拿谁当成是根节点呢?
这个就是我们最主要的问题啦,节点究竟该怎么选呢?不同的位置又有什么影响?怎么对特征进行切分呢?一些到这,我突然想起来一个段子,咱们来乐呵乐呵!
武林外传中这个段子够我笑一年的,其实咱们在推导机器学习算法的时候,也需要这么去想想,只有每一步都是有意义的我们才会选择去使用它。回归正题,我们选择的根节点其实意味着它的重要程度是最大的,相当于大当家了,因为它会对数据进行第一次切分,我们需要把最重要的用在最关键的位置,在决策树算法中,为了使得算法能够高效的进行,那么一开始就应当使用最有价值的特征。
接下来咱们就得唠唠如何选择大当家了,我们提出了一个概念叫做熵(不是我提出的。。。穿山甲说的),这里并不打算说的那么复杂,一句话解释一下,熵代表你经过一次分支之后分类的效果的好坏,如果一次分支决策后都属于一个类别(理想情况下,也是我们的目标)这时候我们认为效果很好嘛,那熵值就很低。如果分支决策后效果很差,什么类别都有,那么熵值就会很高,公式已经给出,log函数推荐大家自己画一下,然后看看概率[0,1]上的时候log函数值的大小(你会豁然开朗的)。
不确定性什么时候最大呢?模棱两可的的时候(就是你犹豫不决的时候)这个时候熵是最大的,因为什么类别出现的可能性都有。那么我们该怎么选大当家呢?(根节点的特征)当然是希望经过大当家决策后,熵值能够下降(意味着类别更纯净了,不那么混乱了)。在这里我们提出了一个词叫做信息增益(就当是我提出的吧。。。),信息增益表示经过一次决策后整个分类后的数据的熵值下降的大小,我们希望下降越多越好,理想情况下最纯净的熵是等于零的。
一个栗子:准备一天一个哥们打球的时候,包括了4个特征(都是环境因素)以及他最终有木有去打球的数据。
第一个问题:大当家该怎么选?也就是我们的根节点用哪个特征呢?
一共有4个特征,看起来好像用谁都可以呀,这个时候就该比试比试了,看看谁的能力强(使得熵值能够下降的最多)
在历史数据中,首先我们可以算出来当前的熵值,计算公式同上等于0.940,大当家的竞选我们逐一来分析,先看outlook这个特征,上图给出了基于天气的划分之后的熵值,计算方式依旧同上,比如outlook=sunny时,yes有2个,no有三个这个时候熵就直接将2/5和3/5带入公式就好啦。最终算出来了3种情况下的熵值。
再继续来看!outlook取不同情况的概率也是不一样的,这个是可以计算出来的相当于先验概率了,直接可以统计出来的,这个也需要考虑进来的。然后outlook竞选大当家的分值就出来啦(就是信息增益)等于0.247。同样的方法其余3个特征的信息增益照样都可以计算出来,谁的信息增益多我们就认为谁是我们的大当家,这样就完成了根节点的选择,接下来二当家以此类推就可以了!
我们刚才给大家讲解的是经典的ID3算法,基于熵值来构造决策树,现在已经有很多改进,比如信息增益率和CART树。简单来说一下信息增益率吧,我们再来考虑另外一个因素,如果把数据的样本编号当成一个特征,那么这个特征必然会使得所有数据完全分的开,因为一个样本只对应于一个ID,这样的熵值都是等于零的,所以为了解决这类特征引入了信息增益率,不光要考虑信息增益还要考虑特征自身的熵值。说白了就是用 信息增益/自身的熵值 来当做信息增益率。
我们刚才讨论的例子中使用的是离散型的数据,那连续值的数据咋办呢?通常我们都用二分法来逐一遍历来找到最合适的切分点!
下面再来唠一唠决策树中的剪枝任务,为啥要剪枝呢?树不是好好的吗,剪个毛线啊!这个就是机器学习中老生常谈的一个问题了,过拟合的风险,说白了就是如果一个树足够庞大,那么所有叶子节点可能只是一个数据点(无限制的切分下去),这样会使得我们的模型泛化能力很差,在测试集上没办法表现出应有的水平,所以我们要限制决策树的大小,不能让枝叶太庞大了。
最常用的剪枝策略有两种:
(1)预剪枝:边建立决策树边开始剪枝的操作
(2)后剪枝:建立完之后根据一定的策略来修建
这些就是我们的决策树算法啦,其实还蛮好的理解的,从上到下基于一种选择标准(熵,GINI系数)来找到最合适的当家的就可以啦!
E. 降本增效,企业该如何释放数据价值
当今,数字化浪潮席卷全球,数字经济正在成为全球可持续增长的引擎。据 IDC 预测,到 2023 年,数字经济产值将占到全球 GDP 的 62%,全球进入数字经济时代。
在中国,数字经济加速发展,以 2020 年为例,数字经济是 GDP 增速的 3 倍多。为促进数字经济更好更快发展,国家一方面提出 加快培育数据要素市场 ,激活数据要素潜能,聚焦数据价值释放;另一方面,出台了 《数据安全法》和《个人信息保护法》 ,满足数字经济时代和 社会 发展的迫切需求,为数据安全保障和个人权益保护奠定基础。
在 5G、物联网、大数据、云计算和 AI 等新技术的推动下,新应用、新场景纷纷涌现,企业发展也进入一个新阶段。
我们看到, 数据呈现爆炸式增长,数据量越来越大 ,且以视频、音频、图像等为代表的 多模态数据快速发展。 对企业来说,为更好地了解客户需求,推动业务发展,对 实时数据分析的需求越来越强烈。 并且,企业不单单进行数据可视化,而是希望深入剖析手中数据,分析这些数据对业务的价值,让数据赋能。
如何应对数据挑战,满足企业诉求? 一站式数据智能分析平台成为许多企业的破局之道。 比如海洋石油富岛股份公司,它选择利用星环 Sophon Base 建设工旅简隐艺过程监测平台,实现公司尿素装置生产过程的实时在线监控,为一线工艺人员提供生产和设备运行数据异常实时告警,并借助人工智能技术对告警数据进行智能化实时分析,第一时间为工艺人员提供有关工艺操作的优化建议。
除了海洋石油富岛股份公司,越来越多的公司视星环 Sophon Base 为一站式数据智能分析平台的首选。
据悉,Sophon Base 提供 强大的多源异构数据接入能力, 针对不同来源、不同模态、不同数据体量的智能分析任务,支持统计分析和图形化数据 探索 ,便于用户高效、直观了解数据集信息;在建模能力方面,支持用户通过编程编码或低代码拖拉拽的交互方式,使咐御用平台内置的两百多种分布式机器学习算子快速搭建机器学习模型的训练流程;支持推荐式建模,在建模的每一步过程中,提供算子推荐,降低使用门槛,同时提升建模效率。
其次,它 提供统一的模型管理仓库。 用户可以集中统一管理模型文件、模型镜像等类型的 AI 模型资产,通过 Sophon Base 模型运管平台,用户能以低代码的方式快速便捷的将 AI 模型部署为模型服务,实现 AI 模型的生产力转化。
第三,Sophon Base 提供模型全流程监控预警。 模型服务在监控预警方面的能力,致力于帮助用户更全面掌握机器学习模型服务的运行状态,并通过自定义监控指标及时发现处理异常情况,规避因数据偏移等原因引起的风险。
同时,Sophon Base 还支持 可视化的模型应用构建。 通过简单的拖拽操作和少量的参数配置,即可通过图形交互方式、流程化快速构建能服务于业务系统的多模型复杂应用,释放模型价值,大幅节省模型配置成本。在最新的版本中,Sophon Base 还推出了模型可解释性分析模块,让用户可以精细地分析特征的重要性、特征的可解释性、特征与结果之间的影响关系,从而帮助用户精准地提升以数据为中的 AI(Data Centric-AI) 数据全生命周期能力,并针对性优化模型精度,帮助用户快速定位、优化影响业务结果的重要因子,促进业务成功。
当然,Sophon Base 不仅自身非常强大,背后还有个更强悍的平台,即 Sophon。作为星环 科技 自主研发的一站式智能分析工具平台, Sohpon 可以实现从计算智能、感知智能到认知智能的数据全链路智能分析。
它具备六大特性:覆盖数据分析建模全流程,提供数百种分布式机器学习算法,拥有多模态数据集成、融合和知识推理能力;提供分析即服务的能力;提供边缘计算能力和拥有隐私计算技术为核心的数据要素流通平台。
据悉,Sophon 涵盖三大部分: 数据科学平台 Sophon Base、知识图谱平台 Sophon KG 和边缘拆厅计算平台 Sophon Edge。
在计算智能方面,除了上文介绍 Sophon Base,平台还提供了分布式联邦学习平台 Sophon P²C, 其集隐私计算、加密网络通信等多种功能,为多方安全建模提供完整的解决方案。通过联邦学习使多个参与方在不共享数据的基础上实现 AI 协作,解决数据孤岛问题,使跨企业、跨数据、跨领域的大数据 AI 生态建设成为可能。
比如,在安全合规要求下,某数字化营销平台的痛点是出于用户 360 画像需要对支付机构和企业数据进行统计查询和联合行为及营销数据分析。同时,为提升营销模型效果,需扩充特征维度,与支付机构进行联合建模。应对举措有二,一是数据可用不可见:该公司使用各方的本地数据交易门户(星环产品名为 Datamall) 和 Sophon P²C 实现联合分析,为老客运营、拉新、ROI 分析等业务,提升了数据安全防护和联合分析能力;二是数据不动但模型动:基于 Sophon P²C 提供的隐私计算功能,提升了在客户画像、营销预估、产品推荐、POI 分析、个性化联邦等场景中,在隐私和数据安全保护要求下的业务处理能力。
在感知智能方面,随着标准模型市场的日趋成熟,更高精度的模型诉求和多种场景的快速建模成为企业数智化转型的第二战场。许多企业的当务之急是找到一款能满足“业务快速迭代” 和“新场景落地”的需求的端到端的模型生产落地应用平台。为此,星环 科技 边缘计算平台 Sophon Edge 应运而生。
它有两大重要特性:全流程特性和高效率特性。具体而言,全流程特性可提供数据到模型再到应用的全流程构建、发布能力;高效率特性则在数据到模型和应用流程之上的全流程引导式和低代码式操作能力。
基于这两大特性,Sophon Edge 可实现多业务系统的模型统一管理、动态运维与长稳迭代,助力客户提高效率、资源共享、模型迭代。除此,它还提供厚实的技术底座,能在工业级边缘计算、图像、流媒体等领域一站式支撑丰富的上层应用。
在认知智能方面,知识图谱平台 Sophon KG 正好能发挥“用武之地”。认知智能的底层技术支撑是知识图谱和自然语言处理,从而帮助机器实现抽取、分析、理解、解释和推理的能力。其中,知识图谱用图模型和图数据库来描述和存储知识和建模万物关系的语义网络,并展现实体间的复杂关系。基于知识图谱能够深入分析复杂的关联信息和语义信息,并挖掘和推理潜在的联结(静态)、行为(动态)、事理(时 - 空 - 人 - 物 - 场)特征和模式,进而辅助业务决策。
据了解,Sophon KG 可以覆盖知识全生命周期,是一款集知识的建模、抽取、融合、存储、计算、推理以及应用为一体的知识图谱产品。平台支持低代码图谱构建、智能化知识抽取、多模态知识存储与融合、多形式知识计算和推理以及多维度的图谱分析。除了具备上述的链路完备性,平台还从业务场景出发,沉淀了广泛适配多个行业和场景的知识图谱蓝图和本体库、图模型、规则模型和算法模型,可以帮助客户快速解决相似场景下的业务问题。
例如,在多家股份制银行的知识图谱中台实践中,星环 科技 基于 Sophon KG 及底层的分布式图数据库构建知识图谱中台,实现了从知识获取、图谱构建与存储、图谱更新迭代、图谱计算与分析的全流程,且可以保证系统的高可用和健壮性。基于知识图谱中台,银行梳理了交易、股东、任职、实控、账户持有等关系,构建了审计知识图谱、交易反欺诈图谱、关联关系图谱和小微事件等图谱,用于风控、审计、信贷场景的异常模式洞察与挖掘,不仅大大提升了工作效率,也产生了巨大的业务价值。
Sophon Base、Sophon KG 和 Sophon Edge 构成的一站式智能分析工具平台 Sophon 可以很好地帮助企业释放数据潜力,充分发挥数据价值。
为降低数据智能分析应用的使用门槛和部署安装成本,让更多企业、机构、开发爱好者、高校师生以及其他专业人员提供更为便捷、轻量化的数据智能分析及机器学习建模环境,星环 科技 推出 Sophon CE 社区版。它具备功能全、轻量化、易运维等特点,提供机器学习可视化建模能力,无缝衔接星环底层大数据平台,可轻松处理大规模数据的 探索 分析及机器学习建模分析应用。并且,用户可免费获取,零成本快速体验可视化机器学习建模。
目前, Sophon CE 社区版已上线,欢迎更多用户试用。 点击阅读原文,立即申请试用。
除了构建强大的一站式智能分析工具平台,星环 科技 也一直推动大数据和 AI 的产业发展及生态建设,比如 Sophon 曾作为 AIIA 杯人工智能大学生应用创新大赛、新加坡大学生人工智能创新大赛、广西大学生人工智能设计大赛等国内外人工智能大赛的 AI 平台提供方,为近千只队伍的竞技提供了稳定且高效的分布式数据科学平台。
Sophon 的出现,不仅是星环 科技 自主创新,满足客户需求的结果,而且代表了新一代数据智能分析平台的发展方向。那就是以客户需求为本,不断创新,融合云计算、AI 等技术,提供更好的工具。正所谓,“工欲善其事,必先利其器”。 以强大工具赋能企业,释放数据价值,才能在数据时代“如鱼得水”。
F. 机器学习几个重要概念
机器学习几个重要概念
统计学习的算法可以分为以下几个类别:监督学习、非监督学习、半监督学习以及强化学习。
监督学习的输入数据都有对应的类标签或是一个输出值,其任务是学习一个模型,使模型能够对任意给定的输入,对其相应的输出做出一个好的预测。
非监督学习就是没有对应的类标签或是输出值。学习中并没有任何标准来告诉你,某个概念是否正确,需要学习器自身形成和评价概念。就是自动地从数据中挖掘出结构信息或是抽取出一些规则。近年来,非监督学习被认为是解决一些重要问题的突破口所在。因为科学的产生就是人类中无监督学习的最佳案例。
半监督学习就是介于监督学习和非监督学习之间。这在最近的研究领域也是被大家所热烈探讨的,因为对于现实数据来说,有标签的数据总是少量的,往往都需要人工来进行标注。而无标签数据是能够大量获得的。
增强学习强调如何基于环境而行动,以取得最大化的预期利益。其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予的奖励或惩罚的刺激下,逐步形成对刺激的预期,产生能获得最大利益的习惯性行为。强化学习和标准的监督式学习之间的区别在于,它并不需要出现正确的输入/输出对,也不需要精确校正次优化的行为。(以上内容摘自维基网络)这在机器人、无人机领域中应用的还是非常广泛的。
在线学习与离线学习
对于机器学习算法的分类,站在不同的角度就能有不同的分类方法。在具体的应用中还有一种常用的分类方法是:在线学习与离线学习。
在线学习,是在获取到新的数据后就能够输入到模型中进行学习。这需要学习算法能够在处于任何状态时都能进行参数的更新。而且需要算法对噪声数据有很好的鲁棒性。
离线学习就正好与在线学习相反,当数据有更新时,需要将其与原来的数据一起对模型的参数进行重新地训练。这时,整个训练的过程能够被很好的控制,因为所有的数据都是已知的,能够对数据进行细致的预处理过程。
生成模型与判别模型
这种分类方式是针对于监督学习来进行分类的。这个在我腾讯面试的时候还被问到过这个问题。
生成模型
生成方法由数据学习联合概率分布P(X,Y)
,然后求出条件概率分布P(Y|X)
作为预测的模型,即生成模型:
模型表示了给定输入X产生输出Y的生成关系。典型的生成模型有:朴素贝叶斯方法和隐马尔可夫模型。
生成模型能够还原出联合概率分布P(X,Y)
;生成模型的收敛速度快,当样本容量增加的时候,学到的模型可以更快地收敛于真实模型;当存在隐变量时,仍可以使用生成学习方法,此时判别方法就不能用。
判别模型
判别方法由数据直接学习决策函数f(x)
或者条件概率分友卜中布P(Y|X)
作为预测的模型,即判别模型。典型的判别模型包括:k近邻法、感知机、决策树、logistic回归模型、最大熵模型、支持向量机、提升方法和条件随机场。
判别模型直接面对预测,往往学习的准确率越高。可以对数据进行各种程度上的抽好山象、定义特征并使用特征,因此可以简化学习问题。
算法的归纳偏好
机器学习算法在学习过程中对某种类型假设的偏好称为‘归纳偏好’。这个‘假设’包含了一个算法方方面面的内容。
任何一个有效的机器学习算法必有其归纳的偏好,否则它将被假设空间中看似在训练集上‘等效’的假设所迷惑,而无法产生确定的学习结果。例如在分类问题中,如果随机抽选训练集上等效的假设(可以认为所有的正反例并没有区别),那么它的分类结果其实是不确定的,这要根据它所选取的样本来决定,这样的学习显然是没有意义的。
归纳偏好对应了学习算法本身所做出的关于‘什么样的模型更好’的假设。在具弊睁体的问题中,这个假设是否成立,即算法的归纳偏好是否与问题本身匹配,大多数时候直接决定了算法能否取得好的性能。
‘奥卡姆剃刀’就是一个常用的原则,‘若有多个假设与观察一致,则选择最简单的那个’。对于一些以简洁为美的人来说是再正确不过了。在一些工程技术中有一些问题也确实是这样,一个较为简单的方法所取得的效果虽然不是最好,但是它的代价与其效果之比已然是最优。
对于一个线性回归问题,如下图所示:
根据‘奥卡姆剃刀’原则,你肯定会选择中间那条经过回归处理之后的直线作为之后预测的标准。在一些场景下,这样选择自然是正确的。如果再给你更多的数据点,你发现这些点正好是在穿过所有红色点的曲线之上,你还会选择那条回归的直线吗?这就牵扯出一个非常有意思的定理,‘没有免费的午餐’。
这个定理所描述的是,对于任意两个学习算法A和B,它们在任意分布数据上的误差其实是相等的。仔细想想的话确实是那么回事。这个定理有一个重要的前提:所有问题出现的机会相同或是所有问题都是同等重要的。
这时候你肯定会有疑问,既然所有的学习算法的期望性能都和随机猜测差不多,那学习的过程岂不是并没有什么用。注意到一点,上面所说的相等是在所有数据的分布之下,但是我们所处理的问题的数据往往是某一特定分布的。
欠拟合与过拟合
当目标函数给定时,基于目标函数的模型训练误差和模型测试误差就自然成为学习方法的评估标准。注意,学习方法具体采用的目标函数未必是评估时所使用的标准。关于评估标准这一问题会在之后的博客中提到。
假设学习到的模型是Y=f^(x)
,训练误差是模型关于训练数据数据集的平均损失:
其中N是训练样本容量。
测试误差是模型关于测试数据集的平均损失:
其中N’是测试样本容量。
通常将学习方法对未知数据的预测能力称为泛化能力。显然,我们希望得到泛化误差小的学习器。然而,事先我们并不知道新样本是什么样的,实际能做的是努力使在训练集上的误差最小化。
如果一味追求提高对训练数据的预测能力,所选模型的复杂度往往会比真模型要高。这种现象称为过拟合。过拟合是指学习时选择的模型包含参数过多,以致于出现这一模型对已知数据预测的很好,但对未知数据预测得很差的现象。与过拟合相对的是欠拟合,这是指对训练样本的一般性质尚未学好。
欠拟合比较容易克服,一般只需要增加训练的次数。而过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一些针对过拟合的措施;然而必须认识到,过拟合是无法彻底避免的,我们所能做的只是缓解。这是因为,机器学习面临的问题一般是NP难甚至是更难的,而有效的学习算法必然是在多项式时间内完成的。若可以彻底避免过拟合,这就意味着我们构造性地证明了‘NP = P’,那么你就可以获得图灵奖了。只要相信‘P != NP’,过拟合就无法避免。
关于过拟合与欠拟合图形化的解释,下面那张图中有具体说明。
方差与偏差
偏差方差-分解试图对学习算法的期望泛化误差进行分解。推导的过程这里就不写了,直接给出公式。
这个式子表示的是泛化误差可以分解为偏差、方差与噪声之和。偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。为什么一个算法会有偏差呢,下面这句话给出了答案:
Biases are introced by the generalizations made in the model including the configuration of the model and the selection of the algorithm to generate the model.
我个人的理解是,因为对于算法的选择乃至于调整参数方法的选择导致了算法是有偏差的。因为算法的选择中就蕴含着偏好。
方差度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响;噪声则表达了在当前任务上任何学习算法所能到达的期望泛化误差的下界,即刻画了问题本身的难度。
泛化能力是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。
但偏差与方差是不能同时达到最优的,这称为偏差方差窘境。
这个图所表达的含义相信不用过多地解释了吧。
G. 机器学习的常用方法有哪些
梯度下降是非常常用的优化算法。作为机器学习的基础知识,这是一个必须要掌握的算法。借助本文,让我们来一起详细了解一下这个算法。
前言
本文的代码可以到我的Github上获取:
https://github.com/paulQuei/gradient_descent
本文的算法示例通过Python语言实现,在实现中使用到了numpy和matplotlib。如果你不熟悉这两个工具,请自行在网上搜索教程。
关于优化
大多数学习算法都涉及某种形式的优化。优化指的是改变x以最小化或者最大化某个函数的任务。
我们通常以最小化指代大多数最优化问题。最大化可经由最小化来实现。
我们把要最小化或最大化的函数成为目标函数(objective function)或准则(criterion)。
我们通常使用一个上标*表示最小化或最大化函数的x值,记做这样:
[x^* = arg; min; f(x)]
优化本身是一个非常大的话题。如果有兴趣,可以通过《数值优化》和《运筹学》的书籍进行学习。
模型与假设函数
所有的模型都是错误的,但其中有些是有用的。– George Edward Pelham Box
模型是我们对要分析的数据的一种假设,它是为解决某个具体问题从老洞数据中学习到的,因此它是机器学习最核心的概念。
针对一个问题,通常有大量的模型可以选择。
本文不会深入讨论这方面的内容,关于各种模型请参阅机器学习的相关书籍。本文仅以最简单的线性模型为基础来讨论梯度下降算法。
这里我们先介绍一下在监督学习(supervised learning)中常见的三个符号:
m,描述训练样本的数量
x,描述输入变量或特征
y,描述输出变量或者叫目标值
训练集会包含很多的样本,我们用 表示其中第i个样本。
x是数据样本的特征,y是其目标值。例如,在预测房价的模型中,x是房子的各种信息,例如:面积,楼层,位置等等,y是房子的价格。在图像识别的任务中,x是图形的所有像素点数据,y是图像中包含的目标对象。
我们是希望寻找一个函数,将x映射到y,这个函数要足够的好,以至于能够预测对应的y。由于历史原因,这个函数叫做假设函数(hypothesis function)。
学习的过程如下图所示。即:首先根据已有的数据(称之为训练集)训练我们的算法模型,然后根据模型的假设函数来进行新数据的预测。
线性模型(linear model)正如其名称那样:是希望通过一个直线的形式来描述模式。线性模型的假设函数如下所示:
[h_{ heta}(x) = heta_{0} + heta_{1} * x]
这个公式对于大家来说应该都是非常简单的。如果把它绘制出来,其实就是一条直线。
下图是一个具体的例子,即: 的图形:
在实际的机器学习工程中碰含伍,你会拥有大量的数据。这些数据会来自于某个数据源。它们存储在csv文件中,或者以其他的形式打包。
但是本文作为演示使用,我们通过一些简单的代码自动生成了需要的数据。为了便于计算,演示的数据量也很小。
import numpy as np
max_x = 10
data_size = 10
theta_0 = 5
theta_1 = 2
def get_data:
x = np.linspace(1, max_x, data_size)
noise = np.random.normal(0, 0.2, len(x))
y = theta_0 + theta_1 * x + noise
return x, y
这段代码很简单,我们生成了x范围是 [1, 10] 整数的10条数据。对应的y是以线性模型的形式计算得到,其函数是:。现实中的数据常常受到各种因素的干扰,所以对于y我们故意加上了一些高斯噪声。因此最终的y值为比原先会有轻微的偏离。
最后我们的数据如下所示:
x = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
y = [6.66, 9.11, 11.08, 12.67, 15.12, 16.76, 18.75, 21.35, 22.77, 24.56]
我们可以把这10条数据绘制出来这样就有一个直观的了解了,如下图所示:
虽然演示用的数据是我们通过公式计算得到的。但在实际的工程中,模型的参数是需要我们通过数据学习到的。所以下文我们假设我们不知道这里线性模式的两个参数是什么,而是通过算法的形式求得。
最后再跟已知的参数进行对比以验证我们的算法是否正确。
有了上面的数据,我们可以尝试画一条直线来描述我们的模型。
例如,像下面这样画一条水平的直线:
很显然,这条水平线离数据太远了,非常的不匹配。
那我们可以再画一条斜线。
我们初次画的斜线可能也不贴切,它可能像下面这样:
最后我们通过不断尝试,找到了最终最合适的那条,如下所示:
梯度下降算法的计算过程,就和这种本能式的试探是类似的,它就是不停的迭代,一步步的接近最终的结果。
代价函数
上面我们尝试了几次通过一条直线来拟合(fitting)已有的数据。
二维平面上的一条直线可以通过两个参数唯一的确定,两个参数的确定也即模型的确定。那如何描述模型与数据的拟合程度呢?答案就是代价函数。
代价函数(cost function)描述了学习到的模型与实际结果的偏差程度。以上面的三幅图为例,最后一幅图中的红线相比第一条水平的绿线,其偏离程度(代价)应该是更小的。
很显然,我们希望我们的假设函数与数据尽可能的贴近,也就是说:希望代价函数的结果尽可能的小。这就涉及到结果的优化,而梯度下降就是寻找最小值的方法之一。
对于每一个样本,假设函数会依据计算出一个估算值,我们常常用来表示。即 。
很自然的,我们会想到,通过下面这个公式来描述我们的模型与实际值的偏差程度:
[(h_ heta(x^i) - y^i)^2 = (widehat{y}^{i} - y^i)^2 = ( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
请注意, 是实际数据的值, 是我们的模型的估算值。前者对应了上图中的离散点的y坐标,后者对应了离散点在直线上投影点的y坐标。
每一条数据都会存在一个偏差值,而代价函数就是对所有样本的偏差求平均值,其计算公式如下所示:
[L( heta) = frac {1}{m} sum_{i=1}^{m}(h_ heta(x^i) - y^i)^2 = frac {1}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i})^2]
当损失函数的结果越小,则意味着通过我们的假设函数估算出的结果与真实值越接近。这也就是为什么我们要最小化损失函数的原因。
借助上面这个公式,我们可以写一个函数来实现代价函数:
def cost_function(x, y, t0, t1):
cost_sum = 0
for i in range(len(x)):
cost_item = np.power(t0 + t1 * x[i] - y[i], 2)
cost_sum += cost_item
return cost_sum / len(x)
这个函数的代码应该不用多做解释,它就是根据上面的完成计算。
我们可以尝试选取不同的 和 组合来计算代价函数的值,然后将结果绘制出来:
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
theta_0 = 5
theta_1 = 2
def draw_cost(x, y):
fig = plt.figure(figsize=(10, 8))
ax = fig.gca(projection='3d')
scatter_count = 100
radius = 1
t0_range = np.linspace(theta_0 - radius, theta_0 + radius, scatter_count)
t1_range = np.linspace(theta_1 - radius, theta_1 + radius, scatter_count)
cost = np.zeros((len(t0_range), len(t1_range)))
for a in range(len(t0_range)):
for b in range(len(t1_range)):
cost[a][b] = cost_function(x, y, t0_range[a], t1_range[b])
t0, t1 = np.meshgrid(t0_range, t1_range)
ax.set_xlabel('theta_0')
ax.set_ylabel('theta_1')
ax.plot_surface(t0, t1, cost, cmap=cm.hsv)
在这段代码中,我们对 和 各自指定了一个范围进行100次的采样,然后以不同的 组合对来计算代价函数的值。
如果我们将所有点的代价函数值绘制出来,其结果如下图所示:
从这个图形中我们可以看出,当 越接近 [5, 2]时其结果(偏差)越小。相反,离得越远,结果越大。
直观解释
从上面这幅图中我们可以看出,代价函数在不同的位置结果大小不同。
从三维的角度来看,这就和地面的高低起伏一样。最高的地方就好像是山顶。
而我们的目标就是:从任意一点作为起点,能够快速寻找到一条路径并以此到达图形最低点(代价值最小)的位置。
而梯度下降的算法过程就和我们从山顶想要快速下山的做法是一样的。
在生活中,我们很自然会想到沿着最陡峭的路往下行是下山速度最快的。如下面这幅图所示:
针对这幅图,细心的读者可能很快就会有很多的疑问,例如:
对于一个函数,怎么确定下行的方向?
每一步该往前走多远?
有没有可能停留在半山腰的平台上?
这些问题也就是本文接下来要讨论的内容。
算法描述
梯度下降算法最开始的一点就是需要确定下降的方向,即:梯度。
我们常常用 来表示梯度。
对于一个二维空间的曲线来说,梯度就是其切线的方向。如下图所示:
而对于更高维空间的函数来说,梯度由所有变量的偏导数决定。
其表达式如下所示:
[ abla f({ heta}) = ( frac{partial f({ heta})}{partial heta_1} , frac{partial f({ heta})}{partial heta_2} , ... , frac{partial f({ heta})}{partial heta_n} )]
在机器学习中,我们主要是用梯度下降算法来最小化代价函数,记做:
[ heta ^* = arg min L( heta)]
其中,L是代价函数,是参数。
梯度下降算法的主体逻辑很简单,就是沿着梯度的方向一直下降,直到参数收敛为止。
记做:
[ heta ^{k + 1}_i = heta^{k}_i - lambda abla f( heta^{k})]
这里有几点需要说明:
收敛是指函数的变化率很小。具体选择多少合适需要根据具体的项目来确定。在演示项目中我们可以选择0.01或者0.001这样的值。不同的值将影响算法的迭代次数,因为在梯度下降的最后,我们会越来越接近平坦的地方,这个时候函数的变化率也越来越小。如果选择一个很小的值,将可能导致算法迭代次数暴增。
公式中的 称作步长,也称作学习率(learning rate)。它决定了每一步往前走多远,关于这个值我们会在下文中详细讲解。你可以暂时人为它是一个类似0.01或0.001的固定值。
在具体的项目,我们不会让算法无休止的运行下去,所以通常会设置一个迭代次数的最大上限。
线性回归的梯度下降
有了上面的知识,我们可以回到线性模型代价函数的梯度下降算法实现了。
首先,根据代价函数我们可以得到梯度向量如下:
[ abla f({ heta}) = (frac{partial L( heta)}{ partial heta_{0}}, frac{ partial L( heta)}{ partial heta_{1}}) = (frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) , frac {2}{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i})]
接着,将每个偏导数带入迭代的公式中,得到:
[ heta_{0} := heta_{0} - lambda frac{partial L( heta_{0})}{ partial heta_{0}} = heta_{0} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) heta_{1} := heta_{1} - lambda frac{partial L( heta_{1})}{ partial heta_{1}} = heta_{1} - frac {2 lambda }{m} sum_{i=1}^{m}( heta_{0} + heta_{1} * x^{i} - y^{i}) x^{i}]
由此就可以通过代码实现我们的梯度下降算法了,算法逻辑并不复杂:
learning_rate = 0.01
def gradient_descent(x, y):
t0 = 10
t1 = 10
delta = 0.001
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
t0_ = t0 - 2 * learning_rate * sum1 / len(x)
t1_ = t1 - 2 * learning_rate * sum2 / len(x)
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
这段代码说明如下:
我们随机选择了 都为10作为起点
设置最多迭代1000次
收敛的范围设为0.001
学习步长设为0.01
如果我们将算法迭代过程中求得的线性模式绘制出来,可以得到下面这幅动态图:
最后算法得到的结果如下:
Times: 657, gradient: [5.196562662718697, 1.952931052920264]
Times: 658, gradient: [5.195558390180733, 1.9530753071808193]
Times: 659, gradient: [5.194558335124868, 1.9532189556399233]
Times: 660, gradient: [5.193562479839619, 1.9533620008416623]
Gradient descent finish
从输出中可以看出,算法迭代了660次就收敛了。这时的结果[5.193562479839619, 1.9533620008416623],这已经比较接近目标值 [5, 2]了。如果需要更高的精度,可以将delta的值调的更小,当然,此时会需要更多的迭代次数。
高维扩展
虽然我们举的例子是二维的,但是对于更高维的情况也是类似的。同样是根据迭代的公式进行运算即可:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=1}^{m}(h_ heta(x^{k})-y^k)x_i^k]
这里的下标i表示第i个参数,上标k表示第k个数据。
梯度下降家族BGD
在上面的内容中我们看到,算法的每一次迭代都需要把所有样本进行遍历处理。这种做法称为之Batch Gradient Descent,简称BGD。作为演示示例只有10条数据,这是没有问题的。
但在实际的项目中,数据集的数量可能是几百万几千万条,这时候每一步迭代的计算量就会非常的大了。
于是就有了下面两个变种。
SGD
Stochastic Gradient Descent,简称SGD,这种算法是每次从样本集中仅仅选择一个样本来进行计算。很显然,这样做算法在每一步的计算量一下就少了很多。
其算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - lambda(h_ heta(x^k)-y^k)x_i^k]
当然,减少算法计算量也是有代价的,那就是:算法结果会强依赖于随机取到的数据情况,这可能会导致算法的最终结果不太令人满意。
MBGD
以上两种做法其实是两个极端,一个是每次用到了所有数据,另一个是每次只用一个数据。
我们自然就会想到两者取其中的方法:每次选择一小部分数据进行迭代。这样既避免了数据集过大导致每次迭代计算量过大的问题,也避免了单个数据对算法的影响。
这种算法称之为Mini-batch Gradient Descent,简称MBGD。
其算法公式如下:
[ heta_{i} = heta_{i} - lambda frac {partial L( heta)}{partial heta_i} = heta_{i} - frac{2lambda}{m} sum_{i=a}^{a + b}(h_ heta(x^k)-y^k)x_i^k]
当然,我们可以认为SGD是Mini-batch为1的特例。
针对上面提到的算法变种,该如何选择呢?
下面是Andrew Ng给出的建议:
如果样本数量较小(例如小于等于2000),选择BGD即可。
如果样本数量很大,选择 来进行MBGD,例如:64,128,256,512。
下表是 Optimization for Deep Learning 中对三种算法的对比
方法准确性更新速度内存占用在线学习BGD好慢高否SGD好(with annealing)快低是MBGD好中等中等是
算法优化
式7是算法的基本形式,在这个基础上有很多人进行了更多的研究。接下来我们介绍几种梯度下降算法的优化方法。
Momentum
Momentum是动量的意思。这个算法的思想就是借助了动力学的模型:每次算法的迭代会使用到上一次的速度作为依据。
算法的公式如下:
[v^t = gamma v^{t - 1} + lambda abla f( heta) heta = heta - v_t]
对比式7可以看出,这个算法的主要区别就是引入了,并且,每个时刻的受前一个时刻的影响。
从形式上看,动量算法引入了变量 v 充当速度角色——它代表参数在参数空间移动的方向和速率。速度被设为负梯度的指数衰减平均。名称动量来自物理类比,根据牛顿运动定律,负梯度是移动参数空间中粒子的力。动量在物理学上定义为质量乘以速度。在动量学习算法中,我们假设是单位质量,因此速度向量 v 也可以看作是粒子的动量。
对于可以取值0,而是一个常量,设为0.9是一个比较好的选择。
下图是momentum算法的效果对比:
对原来的算法稍加修改就可以增加动量效果:
def gradient_descent_with_momentum(x, y):
t0 = 10
t1 = 10
delta = 0.001
v0 = 0
v1 = 0
gamma = 0.9
for times in range(1000):
sum1 = 0
sum2 = 0
for i in range(len(x)):
sum1 += (t0 + t1 * x[i] - y[i])
sum2 += (t0 + t1 * x[i] - y[i]) * x[i]
v0 = gamma * v0 + 2 * learning_rate * sum1 / len(x)
v1 = gamma * v1 + 2 * learning_rate * sum2 / len(x)
t0_ = t0 - v0
t1_ = t1 - v1
print('Times: {}, gradient: [{}, {}]'.format(times, t0_, t1_))
if (abs(t0 - t0_) < delta and abs(t1 - t1_) < delta):
print('Gradient descent finish')
return t0_, t1_
t0 = t0_
t1 = t1_
print('Gradient descent too many times')
return t0, t1
以下是该算法的输出:
Times: 125, gradient: [4.955453758569991, 2.000005017897775]
Times: 126, gradient: [4.955309381126545, 1.9956928964532015]
Times: 127, gradient: [4.9542964317327005, 1.9855674828684156]
Times: 128, gradient: [4.9536358220657, 1.9781180992510465]
Times: 129, gradient: [4.95412496254411, 1.9788858350530971]
Gradient descent finish
从结果可以看出,改进的算法只用了129次迭代就收敛了。速度比原来660次快了很多。
同样的,我们可以把算法计算的过程做成动态图:
对比原始的算法过程可以看出,改进算法最大的区别是:在寻找目标值时会在最终结果上下跳动,但是越往后跳动的幅度越小,这也就是动量所产生的效果。
Learning Rate 优化
至此,你可能还是好奇该如何设定学习率的值。
事实上,这个值的选取需要一定的经验或者反复尝试才能确定。
关键在于,这个值的选取不能过大也不能过小。
如果这个值过小,会导致每一次迭代的步长很小,其结果就是算法需要迭代非常多的次数。
那么,如果这个值过大会怎么样呢?其结果就是:算法可能在结果的周围来回震荡,却落不到目标的点上。下面这幅图描述了这个现象:
事实上,学习率的取值未必一定要是一个常数,关于这个值的设定有很多的研究。
下面是比较常见的一些改进算法。
AdaGrad
AdaGrad是Adaptive Gradient的简写,该算法会为每个参数设定不同的学习率。它使用历史梯度的平方和作为基础来进行计算。
其算法公式如下:
[ heta_i = heta_i - frac{lambda}{sqrt{G_t + epsilon}} abla f( heta)]
对比式7,这里的改动就在于分号下面的根号。
根号中有两个符号,第二个符号比较好理解,它就是为了避免除0而人为引入的一个很小的常数,例如可以设为:0.001。
第一个符号的表达式展开如下:
[G_t = sum_{i = 1}^{t} abla f( heta){i} abla f( heta){i}^{T}]
这个值其实是历史中每次梯度的平方的累加和。
AdaGrad算法能够在训练中自动的对learning rate进行调整,对于出现频率较低参数采用较大的学习率;相反,对于出现频率较高的参数采用较小的学习率。因此,Adagrad非常适合处理稀疏数据。
但该算法的缺点是它可能导致学习率非常小以至于算法收敛非常的慢。
关于这个算法的直观解释可以看李宏毅教授的视频课程:ML Lecture 3-1: Gradient Descent。
RMSProp
RMS是Root Mean Square的简写。RMSProp是AI教父Geoff Hinton提出的一种自适应学习率方法。AdaGrad会累加之前所有的梯度平方,而RMSProp仅仅是计算对应的平均值,因此可缓解Adagrad算法学习率下降较快的问题。
该算法的公式如下:
[E[ abla f( heta_{i})^2]^{t} = gamma E[ abla f( heta_{i})^2]^{t - 1} + (1-gamma)( abla f( heta_{i})^{t})^{2} heta_i = heta_i - frac{lambda}{sqrt{E[g^2]^{t+1} + epsilon}} abla f( heta_{i})]
类似的,是为了避免除0而引入。 是衰退参数,通常设为0.9。
这里的 是t时刻梯度平方的平均值。
Adam
Adam是Adaptive Moment Estimation的简写。它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。
Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
该算法公式如下:
[m^{t} = eta_{1} m^{t-1} + (1-eta_{1}) abla f( heta) v^{t} = eta_{2} v^{t-1} + (1-eta_{2}) abla f( heta)^2 widehat{m}^{t} = frac{m^{t}}{1 - eta^{t}_1} widehat{v}^{t} = frac{v^{t}}{1 - eta^{t}_2} heta = heta - frac{lambda}{sqrt{widehat{v}^{t}} + epsilon}widehat{m}^{t}]
,分别是对梯度的一阶矩估计和二阶矩估计。, 是对,的校正,这样可以近似为对期望的无偏估计。
Adam算法的提出者建议 默认值为0.9,默认值为0.999,默认值为 。
在实际应用中 ,Adam较为常用,它可以比较快地得到一个预估结果。
优化小结
这里我们列举了几种优化算法。它们很难说哪种最好,不同的算法适合于不同的场景。在实际的工程中,可能需要逐个尝试一下才能确定选择哪一个,这个过程也是目前现阶段AI项目要经历的工序之一。
实际上,该方面的研究远不止于此,如果有兴趣,可以继续阅读 《Sebastian Ruder: An overview of gradient descent optimization algorithms》 这篇论文或者 Optimization for Deep Learning 这个Slides进行更多的研究。
由于篇幅所限,这里不再继续展开了。
算法限制
梯度下降算法存在一定的限制。首先,它要求函数必须是可微分的,对于不可微的函数,无法使用这种方法。
除此之外,在某些情况下,使用梯度下降算法在接近极值点的时候可能收敛速度很慢,或者产生Z字形的震荡。这一点需要通过调整学习率来回避。
另外,梯度下降还会遇到下面两类问题。
局部最小值
局部最小值(Local Minima)指的是,我们找到的最小值仅仅是一个区域内的最小值,而并非全局的。由于算法的起点是随意取的,以下面这个图形为例,我们很容易落到局部最小值的点里面。
这就是好像你从上顶往下走,你第一次走到的平台未必是山脚,它有可能只是半山腰的一个平台的而已。
算法的起点决定了算法收敛的速度以及是否会落到局部最小值上。
坏消息是,目前似乎没有特别好的方法来确定选取那个点作为起点是比较好的,这就有一点看运气的成分了。多次尝试不同的随机点或许是一个比较好的方法,这也就是为什么做算法的优化这项工作是特别消耗时间的了。
但好消息是:
对于凸函数或者凹函数来说,不存在局部极值的问题。其局部极值一定是全局极值。
最近的一些研究表明,某些局部极值并没有想象中的那么糟糕,它们已经非常的接近全局极值所带来的结果了。
鞍点
除了Local Minima,在梯度下降的过程中,还有可能遇到另外一种情况,即:鞍点(Saddle Point)。鞍点指的是我们找到点某个点确实是梯度为0,但它却不是函数的极值,它的周围既有比它小的值,也有比它大的值。这就好像马鞍一样。
如下图所示:
多类随机函数表现出以下性质:在低维空间中,局部极值很普遍。但在高维空间中,局部极值比较少见,而鞍点则很常见。
不过对于鞍点,可以通过数学方法Hessian矩阵来确定。关于这点,这里就不再展开了,有兴趣的读者可以以这里提供的几个链接继续探索。
参考资料与推荐读物
Wikipeida: Gradient descent
Sebastian Ruder: An overview of gradient descent optimization algorithms
吴恩达:机器学习
吴恩达:深度学习
Peter Flach:机器学习
李宏毅 - ML Lecture 3-1: Gradient Descent
PDF: 李宏毅 - Gradient Descent
Intro to optimization in deep learning: Gradient Descent
Intro to optimization in deep learning: Momentum, RMSProp and Adam
Stochastic Gradient Descent – Mini-batch and more
刘建平Pinard - 梯度下降(Gradient Descent)小结
多元函数的偏导数、方向导数、梯度以及微分之间的关系思考
[Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD
H. 什么叫机器学习
机器学习(machine learning)
根据已知数据来不断学习和积累经验,然后总结出规律并尝试预测未知数据的属性,是一门综合性非常强的多领域交叉学科,涉及线性代数、概率论、逼近论、凸分析和算法复杂度理论等学科。目前机器学习已经有了十分广泛的应用,例如数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、信用卡欺诈检测、证券市场分析、DNA序列樱侍测序、语音和手写识别、推荐系统、战略游戏和机器人运用等。
I. 深度学习和机器学习到底是什么
简单来说,机器学习是实现人工智能的方法枯拦,深度学习是实现机器学习的技术。机器学习在实现人工智能时中需要人工辅助(半自动),而深度学习使悉纯该过程完全自动化
三者关系:
举个例子:通过机器学习算法来识别水果是橘子还是苹果,需要人工输入水果的特征数据,生成一定的算法模型,进而可以准确预测具有这些特征的水果的类型,而深度睁败咐学习则能自动的去发现特征进而判断。
J. 什么是机器学习和深度学习是什么关系
机器学习(Machine Learning,ML)是人工智能的子领域,也是人工智能的核心。它囊括了几乎所有对世界影响最大的方法(包括深度学习)。机器学习理论主并伏要是设计和分析一些让计算机可以自动学习的算法。
深度学习(DeepLearning,DL)属于机器学习的子类。它的灵感来源于人类大脑的工作方式,是利用深度神经网绝销携络来解决特征表达的一种学习过程。深度神经网络本身并非是一个全新的概念,可理解为包含多个隐含层的神经网络结构。为了提高深层神经网络的训练效果,人们对神经元的连接方法以及激活函数等方面做出了调整。其目的在于建立、模拟人脑进行分析学习的神经网络,模仿人脑的机制来解释数据,如文本、图像、声音。
1、应用场景
机器学习在指纹识别、特征物体检测等领域的应用基本达到了商业化的要求。
深度学习主要应用于文字识别、人脸技术、语义分析、智能监控等领域。目前在智能硬件、教育、医疗等行业也在快速布局。
2、所需数据量
机器学习能够适应各种数据量,特别是数据量较小的场景。如果数据量迅速增加,那么深度学习的效果将更加突出,这是因为深度学习算法需要大量数据才能完美理解。
3、执行时间
执行时间是指训练算法所需要的时间量。一般来说,深度学习算法需斗简要大量时间进行训练。这是因为该算法包含有很多参数,因此训练它们需要比平时更长的时间。相对而言,机器学习算法的执行时间更少。
4、解决问题的方法
机器学习算法遵循标准程序以解决问题。它将问题拆分成数个部分,对其进行分别解决,而后再将结果结合起来以获得所需的答案。深度学习则以集中方式解决问题,而不必进行问题拆分。