堆叠泛化算法
Ⅰ 人工智能学什么
作为一名计算机专业的教育工作者,我来回答一下这个问题。
首先,人工智能专业属于计算机大类专业之一,虽然是新兴专业,但是由于当前人工智能领域的发展前景比较广阔,同时一系列人工智能技术也进入到了落地应用的阶段,所以当前人工智能专业也是热点专业之一。
人工智能专业有三个特点,其一是多学科交叉,涉及到计算机、数学、控制学、经济学、神经学、语言学等诸多学科,因此整体的知识量还是比较大的,其二是学习难度较大,人工智能本身的知识体系尚处在完善当中,很多领域还有待突破,其三是实践场景要求高。
基于这三个特点,要想在本科阶段有较好的学习效果,要有针对性的解决方案。针对于多学科交叉的情况,在大一期间一定要多做加法,尤其要重视编程语言的学习,基于编程语言来打开计算机技术大门,进而学习机器学习,而机器学习则被称为是打开人工智能技术大门的钥匙。
其三是要重视为自己营造一个较好的交流和实践场景,这对于学习效果有较大的影响,建议在大一、大二期间积极参加人工智能相关的课题组。在选择课题组的时候,要考虑到自己的兴趣爱好、课题周期、实践资源等因素,从这个角度来看,学校的科研资源对于人工智能专业的同学有较大的影响。
如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以私信我!
很荣幸曾经参加过一次江苏省人工智能论坛,论坛上认真聆听了行业大佬周志华教授的报告,受益匪浅,首先呢,如果你是在校大学生,想要以后从事人工智能专业相关工作,我这里给你分享下 南京大学人工智能学院院长周志华教授 曾经在论坛上分享的南京大学人工智能专业本科生教育培养大纲的相关课程。
首先是基础数学部分:
数学分析、高等数学、高等代数、概率论与数理统计、最优化方法、数理逻辑。
其次是学科基础课程:
人工智能导引、数据结构与算法分析、程序设计基础、人工智能程序设计、机器学习导论、知识表示与处理、模式识别与计算机视觉、自然语言处理、数字系统设计基础、操作系统。
专业方向课程:
泛函分析、数字信号处理、高级机器学习、计算方法、控制理论方法、机器人学导论、多智能体系统、分布式与并行计算。
专业选修课课程:
数学建模、矩阵计算、随机过程、组合数学。博弈论及其应用、时间序列分析、编译原理、随机算法、数据库概论。
这是南京大学人工智能学院本科生四年的课程安排,看起来课程非常多,但这是一个培养体系,现在国内只有南京大学针对人工智能专业开设了如此系统的培养方案,专业涉及人工智能的各个领域方向。学生可以根据自己的兴趣爱好,选择想要学习的领域方向。
如果你已经毕业,想要转行从事人工智能行业,那么下面这套课程可能比较适合你:
1.莫烦python教程(网络可搜): 莫烦python有很多专栏,可以学习到python基础、以及人工智能相关的软件框架教程,包括相关人工智能相关的一些实战小项目。
2.吴恩达机器学习(网易云课堂): 人工智能机器学习理论部分,非常适合零基础的小白学习
3.吴恩达卷积神经网络(网易云课堂): 人工智能深度学习理论部分,非常适合零基础的小白学习
4.李飞飞CS231n(网易云课堂): 人工智能深度学习和机器学习理论,适合有一定基础的学习者。
5.吴恩达cs229(blibli): 人工智能深度学习和机器学习理论,适合有一定基础的学习者。
这些基础课程学会了,可能就算是跨入了半个门槛,当然面试的时候还欠缺实战经验,于是你可以去kaggle或者天池参加一些比赛,有了这些比赛经验,简历上也算是多了一块实战经验,增加了你的面试成功率。最后,不要参加什么培训机构区培训,既花钱又学不到什么东西,最后毕业还会给你简历造假,得不偿失,我给你推荐的这些课程绝对比市面上99.99%的培训机构课程靠谱!
接下来文章会侧重在以下几方面
1、零基础如何进行人工智能的自学(以找工作为目的),包括路径规划,怎么学等等。
2、我的个人感悟,关于转行、工作、创业、希望能给大家一些启发。
3、好的学习资源分享
先说一下个人背景,一本,经济学毕业,上学时从未学过编程。我这里指的零基础指的是,没有编程基础、没有数学基础(数学需要一些基本的,如果没有,后续也会帮助大家的)。
刚毕业第一年时,迷茫,不知道做什么。
第一阶段:边工作边自学爬虫,失败
毕业一年后,觉得编程可能是自己想要的,所以开始自学编程。
最开始学的是爬虫,python语言。每天学6个小时,一周五到六天。学了4个月后,去面了五六家企业,没有成功。原因是爬虫的知识够,可是计算机的基础太薄弱。什么算法、计算机网络这些,统统没学。因为我当时是完全自学,没有人带,导致我也不知道要学这些。第一阶段,失败,说实话,有点气馁,那可是每天没日没夜的学习啊,最后却换来一场空。可是生活还得继续,怨天尤人有什么用。
第二阶段:边工作边自学人工智能,成功
面试失败后,考虑了要把编程基础学一下再去面试,还是学点别的。我的决定是学人工智能,当时对这个比较感兴趣。好了,又是学了半年多,每天学6个小时,一周6天。从机器学习学到深度学习再学回机器学习。面试,成功地去公司从事机器学习深度学习方面的基础工作。不过实力肯定没有那些编程出身,数学、统计出身的人强,所以很多时候也是边学边做,打打杂。
其实我说的很简单很轻松的样子,但其中的艰辛只有自己是最清楚。所以我很希望通过我未来经验学习的分享,帮助大家少走一些弯路。
第三阶段:自己干
现在,已从公司辞职,自己开发网站,做社群,开网店。就是觉得,其实编程也只是我的一个工具,这个人就是比较喜欢自己做点事情,编程挺累的,哈哈哈。如果大家有什么合作的好点子,也欢迎随时来找我哦。
十问十答:
1、零基础转行学编程可以吗?可以,要做好吃苦的准备。学习是个漫长的过程,你上班的话,能否保证一定时间的学习呢,这个是你要问自己的。我也是边工作边学习,不同的是,我工作很清闲,所以我基本可以在上班时间学习。如果你还在上学,恭喜你这是你最好的机会了。
2、该自学还是去培训班?我觉得自学就够了,培训班真是又贵又水。这是我进过培训班的朋友告诉我的。其实你工作之后会发现,很多东西都是要自学的。如果你连自学都没办法自学的话,你又怎么能工作。而且,自学的效率会更高,当然前提是路径不能错。
3、转行编程,就业率怎么样?说实话,如果你不是编程出身的,要转行编程其实是比较难的,毕竟人家4年的正统学习不是白学的。但这不意味着就没办法。找准目标,规划好路径,学习最必要的知识,这样就有机会。但是,请做好学完仍找不到工作的心理准备。
4、最理想的自学环境是怎么样的?清晰的学习路径+自学+交流讨论的环境+有人指导
5、人工智能零基础可以学吗?可以,但是比一般转行编程的要难,因为要自学的东西更多,要求的门槛也会更高。这个后续会着重讲到。
6、学人工智能需要数学吗?不要因为数学而望而切步,数学是需要的,但没有要求的高不可攀,通过必要的学习,是可以达到入门水准的。
7、以前没接触过编程,怎么办?可以学习python,这真的是一门对零基础的人来说很友好的语言了,其他的我不懂。
8、一般转行编程的周期要多久?按我跟我周边朋友的经验来看。一周5-6天,一天6小时学习时间,4-7个月,这应该是比较正常的。
9、我是怎么坚持下来的?期间有很多次想要放弃,有的时候是真的看不懂,也没人教,纯自学,安装个工具有什么时候就要安装半天,不多说,都是泪啊。你的欲望有多强烈,就能有多坚持。
10、现在学编程还来得及吗?永远都来得及,学编程不一定是为了好工作,它更是一个全新的世界,你会发现很多对自己有帮助的东西。就算以后你不做这个,我相信这个学习的过程也会有所收获。
这是我之后会写的文章的大概目录,大家可以参考一下。
以下系列是暂定的,一篇文章可能会写成好几篇。这个系列不仅仅以学习为目的,目的是为了达到机器学习的工作入门标准。并不简单,但努力就有可能。网上的教程我看了很多,路径大部分都没有错。只是我觉得第一,太贵,明明网上有很多免费的更好的资源。第二,练习的量远远不够达到能去找工作的标准。
目录:
零基础自学人工智能系列(1):机器学习的最佳学习路径规划(亲身经验)
零基础自学人工智能系列(2):机器学习的知识准备(数学与python,附学习资源)
零基础自学人工智能系列(3):机器学习的知识准备(数学篇详解)
零基础自学人工智能系列(4):机器学习的知识准备(python篇详解)
零基础自学人工智能系列(5):机器学习的理论学习规划(附资源)
零基础自学人工智能系列(6):深度学习的理论学习规划(附资源)
零基础自学人工智能系列(7):机器学习的实战操作(附资源和代码)
零基础自学人工智能系列(8):深度学习的实战操作(附资源和代码)
零基础自学人工智能系列(9):找工作篇,需加强的部分(类似数据结构与算法)
最后,我希望我能给大家树立一些信心。不管你现在处于什么水平,只要肯努力,什么都有可能的。
首先我们需要一定的数学基础,如:高数、线性代数、概率论、统计学等等。很多人可能要问,我学习人工智能为什么要有数学基础呢?二者看似毫不相干,实则不然。线性代数能让我们了解如何将研究对象形象化,概率论能让我们懂得如何描述统计规律,此外还有许多其他数学科目,这些数学基础能让我们在学习人工智能的时候事半功倍。
1、学习并掌握一些数学知识
高等数学是基础中的基础,一切理工科都需要这个打底,数据挖掘、人工智能、模式识别此类跟数据打交道的又尤其需要多元微积分运算基础
线性代数很重要,一般来说线性模型是你最先要考虑的模型,加上很可能要处理多维数据,你需要用线性代数来简洁清晰的描述问题,为分析求解奠定基础
概率论、数理统计、随机过程更是少不了,涉及数据的问题,不确定性几乎是不可避免的,引入随机变量顺理成章,相关理论、方法、模型非常丰富。很多机器学习的算法都是建立在概率论和统计学的基础上的,比如贝叶斯分类器、高斯隐马尔可夫链。
再就是优化理论与算法,除非你的问题是像二元一次方程求根那样有现成的公式,否则你将不得不面对各种看起来无解但是要解的问题,优化将是你的GPS为你指路
有以上这些知识打底,就可以开拔了,针对具体应用再补充相关的知识与理论,比如说一些我觉得有帮助的是数值计算、图论、拓扑,更理论一点的还有实/复分析、测度论,偏工程类一点的还有信号处理、数据结构。
2、掌握经典机器学习理论和算法
如果有时间可以为自己建立一个机器学习的知识图谱,并争取掌握每一个经典的机器学习理论和算法,我简单地总结如下:
1) 回归算法:常见的回归算法包括最小二乘法(OrdinaryLeast Square),逻辑回归(Logistic Regression),逐步式回归(Stepwise Regression),多元自适应回归样条(MultivariateAdaptive Regression Splines)以及本地散点平滑估计(Locally Estimated Scatterplot Smoothing);
2) 基于实例的算法:常见的算法包括 k-Nearest Neighbor(KNN), 学习矢量量化(Learning Vector Quantization, LVQ),以及自组织映射算法(Self-Organizing Map , SOM);
3) 基于正则化方法:常见的算法包括:Ridge Regression, Least Absolute Shrinkage and Selection Operator(LASSO),以及弹性网络(Elastic Net);
4) 决策树学习:常见的算法包括:分类及回归树(ClassificationAnd Regression Tree, CART), ID3 (Iterative Dichotomiser 3), C4.5, Chi-squared Automatic Interaction Detection(CHAID), Decision Stump, 随机森林(Random Forest), 多元自适应回归样条(MARS)以及梯度推进机(Gradient Boosting Machine, GBM);
5) 基于贝叶斯方法:常见算法包括:朴素贝叶斯算法,平均单依赖估计(AveragedOne-Dependence Estimators, AODE),以及Bayesian Belief Network(BBN);
6) 基于核的算法:常见的算法包括支持向量机(SupportVector Machine, SVM), 径向基函数(Radial Basis Function ,RBF), 以及线性判别分析(Linear Discriminate Analysis ,LDA)等;
7) 聚类算法:常见的聚类算法包括 k-Means算法以及期望最大化算法(Expectation Maximization, EM);
8) 基于关联规则学习:常见算法包括 Apriori算法和Eclat算法等;
9) 人工神经网络:重要的人工神经网络算法包括:感知器神经网络(PerceptronNeural Network), 反向传递(Back Propagation), Hopfield网络,自组织映射(Self-OrganizingMap, SOM)。学习矢量量化(Learning Vector Quantization, LVQ);
10) 深度学习:常见的深度学习算法包括:受限波尔兹曼机(RestrictedBoltzmann Machine, RBN), Deep Belief Networks(DBN),卷积网络(Convolutional Network), 堆栈式自动编码器(Stacked Auto-encoders);
11) 降低维度的算法:常见的算法包括主成份分析(PrincipleComponent Analysis, PCA),偏最小二乘回归(Partial Least Square Regression,PLS), Sammon映射,多维尺度(Multi-Dimensional Scaling, MDS), 投影追踪(ProjectionPursuit)等;
12) 集成算法:常见的算法包括:Boosting, Bootstrapped Aggregation(Bagging),AdaBoost,堆叠泛化(Stacked Generalization, Blending),梯度推进机(GradientBoosting Machine, GBM),随机森林(Random Forest)。
3、掌握一种编程工具,比如Python
一方面Python是脚本语言,简便,拿个记事本就能写,写完拿控制台就能跑;另外,Python非常高效,效率比java、r、matlab高。matlab虽然包也多,但是效率是这四个里面最低的。
4、了解行业最新动态和研究成果,比如各大牛的经典论文、博客、读书笔记、微博微信等媒体资讯。
5、买一个GPU,找一个开源框架,自己多动手训练深度神经网络,多动手写写代码,多做一些与人工智能相关的项目。
6、选择自己感兴趣或者工作相关的一个领域深入下去
人工智能有很多方向,比如NLP、语音识别、计算机视觉等等,生命有限,必须得选一个方向深入的专研下去,这样才能成为人工智能领域的大牛,有所成就。
再回答第二个问题,人工智能到底是不是一项技术?
根据网络给的定义,人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的还能的理论、方法、技术及应用系统的一门新的技术科学。
网络关于人工智能的定义详解中说道:人工智能是计算机的一个分支,二十世纪七十年代以来被称为世界三大尖端技术之一(空间技术、能源技术、人工智能)。也被认为是二十一世纪三大尖端技术(基因工程、纳米科学、人工智能)之一。这是因为近三十年来它获得了迅速的发展,在很多学科领域都获得了广泛应用,并取得了丰硕的成果,人工智能已逐步成为一个独立的分支,无论在理论和实践上都已自成一个系统。
综上,从定义上讲,人工智能是一项技术。
希望能帮到你。
人工智能需要学习的主要内容包括:数学基础课学科基础课,包括程序设计基础、数据结构、人工智能导论、计算机原理、 数字电路 、系统控制等;专业选修课,比如 神经网络 、深度学习以及认知科学、神经科学、计算金融、计算生物学、计算语言学等交叉课程。
一、人工智能专业学什么
1.认知与神经科学课程群
具体课程:认知心理学、神经科学基础、人类的记忆与学习、语言与思维、计算神经工程
2.人工智能伦理课程群
具体课程:《人工智能、 社会 与人文》、《人工智能哲学基础与伦理》
3.科学和工程课程群
新一代人工智能的发展需要脑科学、神经科学、认知心理学、信息科学等相关学科的实验科学家和理论科学家的共同努力,寻找人工智能的突破点,同时必须要以严谨的态度进行科学研究,让人工智能学科走在正确、 健康 的发展道路上。
4.先进机器人学课程群
具体课程:《先进机器人控制》、《认知机器人》、,《机器人规划与学习》、《仿生机器人》
5.人工智能平台与工具课程群
具体课程:《群体智能与自主系统》《无人驾驶技术与系统实现》《 游戏 设计与开发》《计算机图形学》《虚拟现实与增强现实》。
6.人工智能核心课程群
具体课程:《人工智能的现代方法I》《问题表达与求解》、《人工智能的现代方法II》《机器学习、自然语言处理、计算机视觉等》。
二、人工智能专业培养目标及要求
以培养掌握人工智能理论与工程技术的专门人才为目标,学习机器学习的理论和方法、深度学习框架、工具与实践平台、自然语言处理技术、语音处理与识别技术、视觉智能处理技术、国际人工智能专业领域最前沿的理论方法,培养人工智能专业技能和素养,构建解决科研和实际工程问题的专业思维、专业方法和专业嗅觉。
探索 实践适合中国高等人工智能人才培养的教学内容和教学方法,培养中国人工智能产业的应用型人才。
三、人工智能专业简介
人工智能专业是中国高校人计划设立的专业,旨在培养中国人工智能产业的应用型人才,推动人工智能一级学科建设。2018年4月,教育部在研究制定《高等学校引领人工智能创新行动计划》,并研究设立人工智能专业,进一步完善中国高校人工智能学科体系。2019年3月,教育部印发了《教育部关于公布2018年度普通高等学校本科专业备案和审批结果的通知》,根据通知,全国共有35所高校获首批“人工智能”新专业建设资格。
2020年3月3日,教育部公布2019年度普通高等学校本科专业备案和审批结果,“人工智能”专业成为热门。
人工智能是一个综合学科,其本身涉及很多方面,比如神经网络、机器识别、机器视觉、机器人等,因此,我们想要学好整个人工智能是很不容易的。
首先我们需要一定的数学基础,如:高数、线性代数、概率论、统计学等等。很多人可能要问,我学习人工智能为什么要有数学基础呢?二者看似毫不相干,实则不然。线性代数能让我们了解如何将研究对象形象化,概率论能让我们懂得如何描述统计规律,此外还有许多其他数学科目,这些数学基础能让我们在学习人工智能的时候事半功倍。
然后我们需要的就是对算法的累积,比如人工神经网络、遗传算法等。人工智能的本身还是通过算法对生活中的事物进行计算模拟,最后做出相应操作的一种智能化工具,算法在其中扮演的角色非常重要,可以说是不可或缺的一部分。
最后需要掌握和学习的就是编程语言,毕竟算法的实现还是需要编程的,推荐学习的有Java以及Python。如果以后想往大数据方向发展,就学习Java,而Python可以说是学习人工智能所必须要掌握的一门编程语言。当然,只掌握一门编程语言是不够的,因为大多数机器人的仿真都是采用的混合编程模式,即采用多种编程软件及语言组合使用,在人工智能方面一般使用的较多的有汇编和C++,此外还有MATLAB、VC++等,总之一句话,编程是必不可少的一项技能,需要我们花费大量时间和精力去掌握。
人工智能现在发展得越来越快速,这得益于计算机科学的飞速发展。可以预料到,在未来,我们的生活中将随处可见人工智能的产品,而这些产品能为我们的生活带来很大的便利,而人工智能行业的未来发展前景也是十分光明的。所以,选择人工智能行业不会错,但正如文章开头所说,想入行,需要我们下足功夫,全面掌握这个行业所需要的技能才行。
,首先呢,如果你是在校大学生,想要以后从事人工智能专业相关工作,我这里给你分享下 南京大学人工智能学院院长周志华教授 曾经在论坛上分享的南京大学人工智能专业本科生教育培养大纲的相关课程。
首先是基础数学部分:
人工智能亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。通常人工智能是指通过普通计算机程序来呈现人类智能的技术。通过医学、神经科学、机器人学及统计学等的进步,有些预测则认为人类的无数职业也逐渐被人工智能取代。
Ⅱ 堆栈有哪两种基本操作,它的含义是什么
机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。数据结构是数据存在的形式。 数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
?
数据结构主要研究什么?
?
数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。通常,算法的
?
设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。
?
什么是数据结构?什么是逻辑结构和物理结构?
?
数据是指由有限的符号(比如,"0"和"1",具有其自己的结构、操作、和相应的语义)组成的元素的集合。结构是元素之间的关系的集合。通常来说,一个数据结构DS 可以表示为一个二元组:
?
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part) 这里D是数据元素的集合(或者是“结点”,可能还含有“数据项”或“数据域”),S是定义在D(或其他集合)上的关系的集合,S = ,称之为元素的逻辑结构。 逻辑结构有四种基本类型:集合结构、线性结构、树状结构和网络结构。表和树是最常用的两种高效数据结构,许多高效的算法可以用这两种数据结构来设计实现。表是线性结构的(全序关系),树(偏序或层次关系)和图(局部有序(weak/local orders))是非线性结构。
?
数据结构的物理结构是指逻辑结构的存储镜像(image)。数据结构 DS 的物理结构 P对应于从 DS 的数据元素到存储区M(维护着逻辑结构S)的一个映射:
?
(PD,S) -- > M 存储器模型:一个存储器 M 是一系列固定大小的存储单元,每个单元 U 有一个唯一的地址 A(U),该地址被连续地编码。每个单元 U 有一个唯一的后继单元 U'=succ(U)。 P 的四种基本映射模型:顺序(sequential)、链接(linked)、索引(indexed)和散列(hashing)映射。
?
因此,我们至少可以得到4×4种可能的物理数据结构:
?
sequential (sets)
linked lists
indexed trees
hash graphs
?
(并不是所有的可能组合都合理)
?
??? 数据结构DS上的操作:所有的定义在DS上的操作在改变数据元素(节点)或节点的域时必须保持DS的逻辑和物理结构。
?
DS上的基本操作:任何其他对DS的高级操作都可以用这些基本操作来实现。最好将DS和他的所有基本操作看作一个整体——称之为模块。我们可以进一步将该模块抽象为数据类型(其中DS的存储结构被表示为私有成员,基本操作被表示为公共方法),称之为ADT。作为ADT,堆栈和队列都是一种特殊的表,他们拥有表的操作的子集。 对于DATs的高级操作可以被设计为(不封装的)算法,利用基本操作对DS进行处理。
?
好的和坏的DS:如果一个DS可以通过某种“线性规则”被转化为线性的DS(例如线性表),则称它为好的DS。好的DS通常对应于好的(高效的)算法。这是由计算机的计算能力决定的,因为计算机本质上只能存取逻辑连续的内存单元,因此如何没有线性化的结构逻辑上是不可计算的。比如对一个图进行操作,要访问图的所有结点,则必须按照某种顺序来依次访问所有节点(要形成一个偏序),必须通过某种方式将图固有的非线性结构转化为线性结构才能对图进行操作。
?
树是好的DS——它有非常简单而高效的线性化规则,因此可以利用树设计出许多非常高效的算法。树的实现和使用都很简单,但可以解决大量特殊的复杂问题,因此树是实际编程中最重要和最有用的一种数据结构。树的结构本质上有递归的性质——每一个叶节点可以被一棵子树所替代,反之亦然。实际上,每一种递归的结构都可以被转化为(或等价于)树形结构。
?
从机器语言到高级语言的抽象
?
我们知道,算法被定义为一个运算序列。这个运算序列中的所有运算定义在一类特定的数据模型上,并以解决一类特定问题为目标。这个运算序列应该具备下列四个特征。 有限性,即序列的项数有限,且每一运算项都可在有限的时间内完成;确定性,即序列的每一项运算都有明确的定义,无二义性;可以没有输入运算项,但一定要有输出运算项;可行性,即对于任意给定的合法的输入都能得到相应的正确的输出。这些特征可以用来判别一个确定的运算序列是否称得上是一个算法。 但是,我们现在的问题不是要判别一个确定的运算序列是否称得上是一个算法,而是要对一个己经称得上是算法的运算序列,回顾我们曾经如何用程序设计语言去表达它。
?
算法的程序表达,归根到底是算法要素的程序表达,因为一旦算法的每一项要素都用程序清楚地表达,整个算法的程序表达也就不成问题。
?
作为运算序列的算法,有三个要素。 作为运算序列中各种运算的运算对象和运算结果的数据;运算序列中的各种运算;运算序列中的控制转移。这三种要素依序分别简称为数据、运算和控制。 由于算法层出不穷,变化万千,其中的运算所作用的对象数据和所得到的结果数据名目繁多,不胜枚举。最简单最基本的有布尔值数据、字符数据、整数和实数数据等;稍复杂的有向量、矩阵、记录等数据;更复杂的有集合、树和图,还有声音、图形、图像等数据。 同样由于算法层出不穷,变化万千,其中运算的种类五花八门、多姿多彩。最基本最初等的有赋值运算、算术运算、逻辑运算和关系运算等;稍复杂的有算术表达式和逻辑表达式等;更复杂的有函数值计算、向量运算、矩阵运算、集合运算,以及表、栈、队列、树和图上的运算等:此外,还可能有以上列举的运算的复合和嵌套。 关于控制转移,相对单纯。在串行计算中,它只有顺序、分支、循环、递归和无条件转移等几种。
?
我们来回顾一下,自从计算机问世以来,算法的上述三要素的程序表达,经历过一个怎样的过程。
?
最早的程序设计语言是机器语言,即具体的计算机上的一个指令集。当时,要在计算机上运行的所有算法都必须直接用机器语言来表达,计算机才能接受。算法的运算序列包括运算对象和运算结果都必须转换为指令序列。其中的每一条指令都以编码(指令码和地址码)的形式出现。与算法语言表达的算法,相差十万八千里。对于没受过程序设计专门训练的人来说,一份程序恰似一份"天书",让人看了不知所云,可读性
?
极差。
?
用机器语言表达算法的运算、数据和控制十分繁杂琐碎,因为机器语言所提供的指令太初等、原始。机器语言只接受算术运算、按位逻辑运算和数的大小比较运算等。对于稍复杂的运算,都必须一一分解,直到到达最初等的运算才能用相应的指令替代之。机器语言能直接表达的数据只有最原始的位、字节、和字三种。算法中即使是最简单的数据如布尔值、字符、整数、和实数,也必须一一地映射到位、字节和字
中,还得一一分配它们的存储单元。对于算法中有结构的数据的表达则要麻烦得多。机器语言所提供的控制转移指令也只有无条件转移、条件转移、进入子程序和从子程序返回等最基本的几种。用它们来构造循环、形成分支、调用函数和过程得事先做许多的准备,还得靠许多的技巧。 直接用机器语言表达算法有许多缺点。
?
大量繁杂琐碎的细节牵制着程序员,使他们不可能有更多的时间和精力去从事创造性的劳动,执行对他们来说更为重要的任务。如确保程序的正确性、高效性。程序员既要驾驭程序设计的全局又要深入每一个局部直到实现的细节,即使智力超群的程序员也常常会顾此失彼,屡出差错,因而所编出的程序可靠性差,且开发周期长。 由于用机器语言进行程序设计的思维和表达方式与人们的习惯大相径庭,只有经过
较长时间职业训练的程序员才能胜任,使得程序设计曲高和寡。因为它的书面形式全是"密"码,所以可读性差,不便于交流与合作。因为它严重地依赖于具体的计算机,所以可移植性差,重用性差。这些弊端造成当时的计算机应用未能迅速得到推广。
?
克服上述缺点的出路在于程序设计语言的抽象,让它尽可能地接近于算法语言。 为此,人们首先注意到的是可读性和可移植性,因为它们相对地容易通过抽象而得到改善。于是,很快就出现汇编语言。这种语言对机器语言的抽象,首先表现在将机器语言的每一条指令符号化:指令码代之以记忆符号,地址码代之以符号地址,使得其含义显现在符号上而不再隐藏在编码中,可让人望"文"生义。其次表现在这种语言摆脱了具体计算机的限制,可在不同指令集的计算机上运行,只要该计算机配上汇编语言的一个汇编程序。这无疑是机器语言朝算法语言靠拢迈出的一步。但是,它离算法语言还太远,以致程序员还不能从分解算法的数据、运算和控制到汇编才能直接表达的指令等繁杂琐碎的事务中解脱出来。 到了50年代中期,出现程序设计的高级语言如Fortran,Algol60,以及后来的PL/l, Pascal等,算法的程序表达才产生一次大的飞跃。
?
诚然,算法最终要表达为具体计算机上的机器语言才能在该计算机上运行,得到所需要的结果。但汇编语言的实践启发人们,表达成机器语言不必一步到位,可以分两步走或者可以筑桥过河。即先表达成一种中介语言,然后转成机器语言。汇编语言作为一种中介语言,并没有获得很大成功,原因是它离算法语
?
言还太远。这便指引人们去设计一种尽量接近算法语言的规范语言,即所谓的高级语言,让程序员可以用它方便地表达算法,然后借助于规范的高级语言到规范的机器语言的"翻译",最终将算法表达为机器语言。而且,由于高级语言和机器语言都具有规范性,这里的"翻译"完全可以机械化地由计算机来完成,就像汇编语言被翻译成机器语言一样,只要计算机配上一个编译程序。 上述两步,前一步由程序员去完成,后一步可以由编译程序去完成。在规定清楚它们各自该做什么之后,这两步是完全独立的。它们各自该如何做互不相干。前一步要做的只是用高级语言正确地表达给定的算法,产生一个高级语言程序;后一步要做的只是将第一步得到的高级语言程序翻译成机器语言程序。至于程序员如何用高级语言表达算法和编译程序如何将高级语言表达的算法翻译成机器语言表达的算法,显然毫不相干。
?
处理从算法语言最终表达成机器语言这一复杂过程的上述思想方法就是一种抽象。汇编语言和高级语言的出现都是这种抽象的范例。 与汇编语言相比,高级语言的巨大成功在于它在数据、运算和控制三方
?
面的表达中引入许多接近算法语言的概念和工具,大大地提高抽象地表达算法的能力。 在运算方面,高级语言如Pascal,除允许原封不动地运用算法语言的四则运算、逻辑运算、关系运算、算术表达式、逻辑表达式外,还引入强有力的函数与过程的工具,并让用户自定义。这一工具的重要性不仅在于它精简了重复的程序文本段,而且在于它反映出程序的两级抽象。
?
在函数与过程调用级,人们只关心它能做什么,不必关心它如何做。只是到函数与过程的定义时,人们才给出如何做的细节。用过高级语言的读者都知道,一旦函数与过程的名称、参数和功能被规定清楚,那么,在程序中调用它们便与在程序的头部说明它们完全分开。你可以修改甚至更换函数体与过程体,而不影响它们的被调用。如果把函数与过程名看成是运算名,把参数看成是运算的对象或运算的结果,那么
?
,函数与过程的调用和初等运算的引用没有两样。利用函数和过程以及它们的复合或嵌套可以很自然地表达算法语言中任何复杂的运算。
?
在数据方面,高级语言如Pascal引人了数据类型的概念,即把所有的数据加以分类。每一个数据(包括表达式)或每一个数据变量都属于其中确定的一类。称这一类数据为一个数据类型。 因此,数据类型是数据或数据变量类属的说明,它指示该数据或数据变量可能取的值的全体。对于无结构的数据,高级语言如Pascal,除提供标准的基本数据类型--布尔型、字符型、整型和实型外,还提供用户可自定义的枚举类、子界类型和指针类型。这些类型(除指针外),其使用方式都顺应人们在算法语言中使用的习惯。对于有结构的数据,高级语言如Pascal,提供了数组、记录、有限制的集合和文件等四种标准的结构数据类型。其中,数组是科学计算中的向量、矩阵的抽象;记录是商业和管理中的记录的抽象;有限制的集合是数学中足够小的集合的势集的抽象;文件是诸如磁盘等外存储数据的抽象。
?
人们可以利用所提供的基本数据类型(包括标准的和自定义的),按数组、记录、有限制的集合和文件的构造规则构造有结构的数据。 此外,还允许用户利用标准的结构数据类型,通过复合或嵌套构造更复杂更高层的结构数据。这使得高级语言中的数据类型呈明显的分层。 高级语言中数据类型的分层是没有穷尽的,因而用它们可以表达算法语言中任何复杂层次的数据。 在控制方面,高级语言如Pascal,提供了表达算法控制转移的六种方式。
?
(1)缺省的顺序控制";"。
?
(2)条件(分支)控制:"if表达式(为真)then S1 else S2;" 。
?
(3)选择(情况)控制:
?
"Case 表达式 of
?
值1: S1
值2: S2
...
值n: Sn
end"
?
(4)循环控制:
?
"while 表达式(为真) do S;" 或
"repeat S until 表达式(为真);" 或
"for变量名:=初值 to/downto 终值do S;"
?
(5)函数和过程的调用,包括递归函数和递归过程的调用。
?
(6)无条件转移goto。
这六种表达方式不仅覆盖了算法语言中所有控制表达的要求,而且不再像机器语言或汇编语言那样原始、那样繁琐、那样隐晦,而是如上面所看到的,与自然语言的表达相差无几。 程序设计语言从机器语言到高级语言的抽象,带来的主要好处是: 高级语言接近算法语言,易学、易掌握,一般工程技术人员只要几周时间的培训就可以胜任程序员的工作;高级语言为程序员提供了结构化程序设计的环境和工具,使得设计出来的程序可读性好,可维护性强,可靠性高;高级语言远离机器语言,与具体的计算机硬件关系不大,因而所写出来的程序可移植性好,重用率高; 由于把繁杂琐碎的事务交给了编译程序去做,所以自动化程度高,开发周期短,且程、序员得到解脱,可以集中时间和精力去从事对于他们来说更为重要的创造性劳动,以提高、程序的质量。
?
数据结构、数据类型和抽象数据类型
?
数据结构、数据类型和抽象数据类型,这三个术语在字面上既不同又相近,反映出它们在含义上既有区别又有联系。
?
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。它用来反映一个数据的内部构成,即一个数据由哪些成分数据构成,以什么方式构成,呈什么结构。数据结构有逻辑上的数据结构和物理上的数据结构之分。逻辑上的数据结构反映成分数据之间的逻辑关系,物理上的数据结构反映成分数据在计算机内的存储安排。数据结构是数据存在的形式。
?
数据是按照数据结构分类的,具有相同数据结构的数据属同一类。同一类数据的全体称为一个数据类型。在程序设计高级语言中,数据类型用来说明一个数据在数据分类中的归属。它是数据的一种属性。这个属性限定了该数据的变化范围。为了解题的需要,根据数据结构的种类,高级语言定义了一系列的数据类型。不同的高级语言所定义的数据类型不尽相同。Pascal语言所定义的数据类型的种类。
?
其中,简单数据类型对应于简单的数据结构;构造数据类型对应于复杂的数据结构;在复杂的数据结构里,允许成分数据本身具有复杂的数据结构,因而,构造数据类型允许复合嵌套;指针类型对应于数据结构中成分数据之间的关系,表面上属简单数据类型,实际上都指向复杂的成分数据即构造数据类型中的数据,因此这里没有把它划入简单数据类型,也没有划入构造数据类型,而单独划出一类。
?
数据结构反映数据内部的构成方式,它常常用一个结构图来描述:数据中的每一项成分数据被看作一个结点,并用方框或圆圈表示,成分数据之间的关系用相应的结点之间带箭号的连线表示。如果成分数据本身又有它自身的结构,则结构出现嵌套。这里嵌套还允许是递归的嵌套。
?
由于指针数据的引入,使构造各种复杂的数据结构成为可能。按数据结构中的成分数据之间的关系,数据结构有线性与非线性之分。在非线性数据结构中又有层次与网状之分。 由于数据类型是按照数据结构划分的,因此,一类数据结构对应着一种数据类型。数据类型按照该类型中的数据所呈现的结构也有线性与非线性之分,层次与网状之分。一个数据变量,在高级语言中的类型说明必须是读变量所具有的数据结构所对应的数据类型。最常用的数据结构是数组结构和记录结构。数组结构的特点是:
?
成分数据的个数固定,它们之间的逻辑关系由成分数据的序号(或叫数组的下标)来体现。这些成分数据按照序号的先后顺序一个挨一个地排列起来。每一个成分数据具有相同的结构(可以是简单结构,也可以是复杂结构),因而属于同一个数据类型(相应地是简单数据类型或构造数据类型)。这种同一的数据类型称为基类型。所有的成分数据被依序安排在一片连续的存储单元中。 概括起来,数组结构是一个线性的、均匀的、其成分数据可随机访问的结构。
?
由于这、种结构有这些良好的特性,所以最常被人们所采用。在高级语言中,与数组结构相对应的、数据类型是数组类型,即数组结构的数据变量必须说明为array [i] of T0 ,其中i是数组、结构的下标类型,而T0是数组结构的基类型。 记录结构是另一种常用的数据结构。它的特点是:与数组结构一样,成分数据的个数固定。但成分数据之间没有自然序,它们处于平等地位。每一个成分数据被称为一个域并赋予域名。不同的域有不同的域名。不同的域允许有不同的结构,因而允许属于不同的数据类型。与数组结构一样,它们可以随机访问,但访问的途径靠的是域名。在高级语言中记录结构对应的数据类型是记录类型。记录结构的数据的变量必须说明为记录类型。
?
抽象数据类型的含义在上一段已作了专门叙述。它可理解为数据类型的进一步抽象。即把数据类型和数据类型上的运算捆在一起,进行封装。引入抽象数据类型的目的是把数据类型的表示和数据类型上运算的实现与这些数据类型和运算在程序中的引用隔开,使它们相互独立。对于抽象数据类型的描述,除了必须描述它的数据结构外,还必须描述定义在它上面的运算(过程或函数)。抽象数据类型上定义的过程和函
数以该抽象数据类型的数据所应具有的数据结构为基础。
?
泛型设计和数据结构与算法
?
下面我想再说说关于泛型程序设计模型对于数据结构和算法方面的最新推动,泛型思想已经把数据结
?
构和算法方面的基本思想抽象到了一个前所未有的高度,现在有多种程序设计语言支持泛型设计,比如
ADA,C++,而且据说在JAVA的下一版本和C#中也将对泛型设计进行全面的支持。
?
先说说泛型设计的基本思想:泛型编程(generic programming,以下直接以GP称呼)是一种全新的程序设计思想,和OO,OB,PO这些为人所熟知的程序设计想法不同的是GP抽象度更高,基于GP设计的组件之间偶合度底,没有继承关系,所以其组件间的互交性和扩展性都非常高。我们都知道,任何算法都是作用在一种特定的数据结构上的,最简单的例子就是快速排序算法最根本的实现条件就是所排序的对象是存
贮在数组里面,因为快速排序就是因为要用到数组的随机存储特性,即可以在单位时间内交换远距离的对象,而不只是相临的两个对象,而如果用联表去存储对象,由于在联表中取得对象的时间是线性的既O[n],这样将使快速排序失去其快速的特点。也就是说,我们在设计一种算法的时候,我们总是先要考虑其应用的数据结构,比如数组查找,联表查找,树查找,图查找其核心都是查找,但因为作用的数据结构不同
?
将有多种不同的表现形式。数据结构和算法之间这样密切的关系一直是我们以前的认识。泛型设计的根本思想就是想把算法和其作用的数据结构分离,也就是说,我们设计算法的时候并不去考虑我们设计的算法将作用于何种数据结构之上。泛型设计的理想状态是一个查找算法将可以作用于数组,联表,树,图等各种数据结构之上,变成一个通用的,泛型的算法。这样的理想是不是很诱惑人?
?
泛型编程带来的是前所未有的弹性以及不会损失效率的抽象性,GP和OO不同,它不要求你通过额外的间接层来调用函数:它让你撰写完全一般化并可重复使用的算法,其效率与针对特定数据结构而设计的算法旗鼓相当。我们大家都知道数据结构在C++中可以用用户定义类型来表示,而C++中的模板技术就是以类型作为参数,那么我可以想象利用模板技术可以实现我们开始的GP思想,即一个模板函数可以对于各种传递进来的类型起作用,而这些类型就可以是我们定义的各种数据结构。
?
泛型算法抽离于特定类型和特定数据结构之外,使得其适应与尽可能的一般化类型,算法本身只是为了实现算法其需要表达的逻辑本质而不去被为各种数据结构的实现细节所干扰。这意味着一个泛型算法实际具有两部分。1,用来描叙算法本质逻辑的实际指令;2,正确指定其参数类型必须满足的性质的一组需求条件。到此,相信有不少人已经开始糊涂了,呵呵,不要紧。毕竟GP是一种抽象度非常高的程序设计思想,里面的核心就是抽象条件成为成为程序设计过程中的核心,从而取代了类型这在OO里面的核心地位,正是因为类型不在是我们考虑的重点,类型成为了抽象条件的外衣,所以我们称这样的程序思想为泛型思想------把类型泛化。
Ⅲ 网络架构搜索
作为计算智能方法的代表,起源于上个世纪四十年代的人工神经网络经历了五六十年代的繁荣,七十年代的低潮,八十年代的再次复苏,到近十年的广泛关注,如今已经成为理论日趋完善,应用逐步发展的前沿方向。Hinton 等人2006 年在《Science》上发表的文章引发了深度神经网络研究的热潮。面对大数据的诸多挑战,以深度信念网络、卷积神经网络和递归神经网络为代表的深度神经网络模型在很多应用领域展示出明显的优势和潜力,特别是随着数据量和数据维数的增加,深度学习的优势愈加突出。例如,Google 借助深度学习开发的AlphaGo 能从海量的对弈中学习正确的决策,微软语音识别采用深度学习使识别错误率显着降低,网络基于深度学习开发的机器人“小度”在跨年龄人脸识别上超越了人类。
经过多年的研究和发展,基于人工神经网络的识别方法也逐渐取代传统的模式识别方法。神经网络已成为当前比较先进的技术,用来解决许多具有挑战性的识别任务如文字识别、语音识别、指纹识别、遥感图像识别、人脸识别、手写体字符的识别等。其中主流的神经网络模型有卷积网络和递归神经网络,卷积神经网络由 Yann LeCun 在 1998 年提出,自从 AlexNe 在 2012 年的 ImageNet 比赛中使用了这一架构拔得头筹,卷积神经网络迅速流行起来并广泛应用到视觉任务。如今,最先进的卷积神经网络算法在进行图像识别时,甚至可以超过人类肉眼识别的准确率。递归神经网络网络提出于 1990 年,被视为循环神经网络的推广,递归神经网络可以引入门控机制以学习长距离依赖,适用于包含结构关系的机器学习任务,在序列识别方面有重要应用。
深度神经网络和深度学习算法因为在科研工作与工程任务中都取得了显着的效果从而大受欢迎。它取代了传统的手动提取特征方法,够端到端地自动提取和学习特征。而其中取得显着成功的深度神经网络通常是由于它们成功的架构设计,研究的工作重心从提取特征转移到了寻找最优架构上。通常来说,模型的容量越大网络的性能就越好,能够拟合任意函数。因此为了提升网络性能,网络结构被设计的越来越复杂。例如,VGG-16 约有1.4亿浮点数参数,整个网络占用超过500兆存储空间,需要153亿次浮点操作来处理一个$224\times224$大小的图像。虽然更深的网络层次和复杂的拓扑结构能够更有效地学习特征,但是网络规模的增大意味着人工设计网络时需要花费更多时间来反复试验,即使是专家也需要大量的资源和时间来创建性能良好的模型。
神经网络架构搜索(NAS)是一种自动化学习网络结构的新方法,用于减少繁重的网络设计成本。目前为止,NAS方法设计的网络在识别任务上的表现已经超过了人工设计的架构。NAS可以视作自动机器学习(AutoML)的子领域,与超参数优化和元学习有明显的重叠。不同的NAS方法的区别主要在于三个维度:搜索空间、搜索策略和性能评估,我们对此分别进行了调研。
搜索空间:搜索空间定义了网络的所有可选结构和操作,通常指数级大,甚至无界。在设计搜索空间时结合先验知识,即参考现有的针对当前任务的先进结构设计知识,能够有效减小搜索空间并简化搜索。但这也会引入偏好,从而限制网络学习到超越当前人类知识的结构。
搜索策略:定义搜索空间后,搜索策略引导寻找高性能的模型架构,其中的难点是保证探索和利用的平衡。一方面,希望快速找到性能良好的架构,另一方面,需要避免过早收敛到次优的架构。
性能评估:NSA的目的是找到一个在未知数据上具有良好泛化性能的架构,一旦模型生成,就需要对其性能进行评估。直观的方法是在训练集上训练收敛,并在验证集上得到其性能,但是这种方法会耗费巨大的算力,从而限制了可探索的网络结构。一些先进的方法关注于减小性能评估时的计算代价,但会引入误差。因此,平衡评价的效率和效果是一个需要研究的问题。
从计算的角度来看,神经网络代表了一个通过一系列操作将输入变量 x 转换为输出变量 y 的函数。基于计算图语言,神经网络可以表示为一个有向无环图(DAG),其中每个节点表示一个张量 z ,通过边连接其父节点 I(k),每条边表示从候选操作集O中选择的一个操作 o 。节点 k 的计算公式为:
其中候选操作集合$O$主要包括卷积、池化、激活函数、跳跃连接、拼接、加法等基本操作。此外,为了进一步提高模型的性能,一些先进的人工设计模块也可以作为候选操作,如深度可分离卷积、膨胀卷积、组卷积。基于操作的类型可以选择不同的超参数,例如输入节点选取、卷积核数量、尺寸、步长等。不同的搜索空间设计,选择和组合操作的方法也不同所以参数化的形式也不一样。一般来说,一个好的搜索空间应该能够排除人类的偏见,并且足够灵活,能够覆盖更广泛的模型架构。
全局搜索空间搜索一个完整的网络结构,具有很高的自由度。最简单的例子是链式搜索空间,见图1左。固定的数量的节点按顺序堆叠,只有前一个节点的输出提供给后一个节点作为输入,每个节点代表一个层,并具有指定的操作。右图引入更复杂的跳跃链接和多支路结构,此时当前节点可以结合前面所有节点的输出作为输入,使得搜索的自由度显着增大。许多网络都是多分支网络的特例,比如
1)链式网络: ;
2)残差网络: ;
3)DenseNets:
虽然整体结构搜索很容易实现,但它也有一些缺点。首先,搜索空间的大小与网络深度是指数级关系,寻找泛化性能好的深度网络计算成本高。此外,生成的架构缺乏可迁移性和灵活性,在小型数据集上生成的模型可能不适合较大的数据集。有研究提出,初始架构的选择在搜索全局结构时十分重要。在适当的初始条件下,可以获得与单元搜索空间性能相当的架构,但是初始架构选择的指导原则仍然不明确。
基于单元的搜索空间受启发于人工设计知识,许多有效的网络结构都会重复使用固定结构,例如在RNNs中重复LSTM块或堆叠残差模块。因此可以只搜索这样的重复单元(cells),整个神经结构的搜索问题被简化为在单元搜索空间中搜索最优的单元结构,从而极大的减小搜索空间。大多数研究对比了基于全局搜索空间和单元搜索空间的实验结果,证明在基于单元的搜索空间中可以获得良好的性能。单元搜索空间的另一个优势是能方便地在数据集和任务之间进行泛化,因为通过增减卷积核和单元的数量,架构的复杂性几乎可以任意改变。
NASNet是最早提出的单元搜索空间之一,也是当前最热门的选择,之后的大部分改进只是在此基础上对操作选择和单元组合策略进行了少量修改。如图2所示,它由两种单元组成,分别为保持输入特征维度的标准单元(normal cell),和减小空间维度的简化单元(rection cell)。每个单元由b个块组成,每个块由它的两个输入和相应的操作定义。可选的输入包括前两个单元的输出和单元中先前定义的块的输出,所以它支持跨单元的跳跃连接。未使用的块被连接起来并作为单元格的输出,最终通过预定义好的规则级联这些单元。
不同于上面将单元结构按照人工定义的宏结构进行连接,层次结构是将前一步骤生成的单元结构作为下一步单元结构的基本组成部件,通过迭代的思想得到最终的网络结构。Hier提出的层次搜索空间,通过合并低层单元生成高级单元实现单元级别和网络级别的同时优化。此方法具体分为3层。第一层包含一系列的基础操作;第二层通过有向无环图连接第一层的基础操作,构建不同的单元,图结构用邻接矩阵编码;第三层是网络级的编码,决定如何连接第二层的单元,组合成一个完整的网络。基于单元的搜索空间可以看作是这种层次搜索空间的一个特殊情况。
强化学习方法(RL)能够有效建模一个顺序决策的过程,其中代理与环境相互作用,代理学会改善其行为从而使目标回报最大化。(图3)给出了一个基于强化的NAS算法的概述。代理通常是一个递归神经网络(RNN),它在每一步t执行一个动作 来从搜索空间采样一个新的样本,同时接收状态 的观察值和环境中的奖励 ,以更新代理的采样策略。这种方法非常适合于神经结构搜索,代理的行为是生成神经结构,行为空间是搜索空间,环境是指对代理生成的网络进行训练和评估,奖励是训练后的网络结构对未知数据的预测性能,在最后一个行为之后获得。
4.2进化算法
进化算法(EA)是一种成熟的全局优化方法,具有较高的鲁棒性和广泛的适用性。许多研究使用进化算法来优化神经网络结构。进化算法演化了一组模型,即一组网络;在每个世代中,至少从这组模型中选择一个模型,作为亲本在突变后作为生成子代。在对子代进行训练之后,评估它们的适应度并将它们添加到种群中。
典型的进化算法包括选择、交叉、变异和更新等步骤。选择时一般使用联赛选择算法对父类进行采样,其中适应性最好的一个作为亲本。Lemonade对适应度使用核密度估计,使网络被选择的概率与密度成反比。交叉方式因编码方案的不同而不同。突变针对的是亲本的部分操作,例如添加或移除层,改变层的超参数,添加跳跃连接,以及改变训练超参数。对于产生的后代,大多数方法随机初始化子网络权重,而Lemonade把父网络学习到的权重通过使用网络态射传递给其子网络。Real等人让后代继承其父母的所有不受突变影响的参数,虽然这种继承不是严格意义上的功能保留,它可以加速学习。生成新的网络的同时需要从种群中移除一些个体。Real等人从群体中移除最差的个体,AmoebaNet移除最老的个体。也有一些方法定期丢弃所有个体,或者完全不移除个体。EENA通过一个变量调节最坏模型和最老模型的删除概率。
基于代理模型的优化方法(SMBO)用一个代理模型来近似目标函数。即不需要训练采样到的网络结构,只需要训练一个代理模型,使用代理模型预测网络的性能。通常在实践中只需要得到架构的性能排序,而不一定要计算出具体的损失值,因此代理模型只需要预测相对得分并选出有前途的候选架构。然后只对预测性能好的架构进行评估,用它们的验证精度更新代理模型,这样只需要完全训练少量候选架构,大大减少搜索时间。代理模型通常训练为最小化平方误差:
贝叶斯优化(BO)是用于超参数优化的最流行的方法之一。最经典的是基于高斯过程的BO,生成的神经结构的验证结果可以建模为高斯过程,然而,基于高斯的BO方法在观察次数上的推理时间尺度是立方的,并且不擅长处理变长神经网络。有些工作使用基于树或者随机森林的方法来在非常高维的空间中高效的搜索,并且在很多问题上取得了优异的效果。Negrinho利用其搜索空间的树形结构,并使用蒙特卡洛树搜索。虽然没有完整的比较,但初步的证据表明这些方法可以超越进化算法。
上面的搜索策略搜是从一个离散的搜索空间提取神经结构样本。DARTS提出搜索空间的连续松弛,在连续可微的搜索空间上搜索神经架构如图4所示,并使用如下softmax函数来松弛离散空间:
松弛后,架构搜索的任务转化为网络架构与神经权值的联合优化。这两类参数分别在训练集和验证集上交替优化,表示为一个双层优化问题。
为了对搜索过程进行引导,必须对产生的神经网络性能进行评估。一种直观的方法是训练网络至收敛,然后评估其性能。但是,这种方法需要大量的时间和计算资源。因此提出了几种加速模型评估的方法。
为了减少计算负担,可以用实际性能的低质近似来估测性能。实现方法包括: 缩短训练时间、选择数据集的子集、在低分辨率的图像上训练、每层使用更少的通道数、堆叠更少的单元结构。在低质条件下搜索到的最优网络或单元,构建出最终结构在数据集上重新训练,得到目标网络。虽然这些低精度的近似能够减少训练花费,但性能被低估的同时不可避免地引入了误差。最近的研究表明,当这种低质评价与完全评价之间的差异较大时,网络性能的相对排名可能变化很大,并强调这种误差会逐渐增加。
早停技术最初用于防止过拟合。一些研究通过在训练初期预测网络性能,在验证集上预计表现不佳的模型被强制停止训练,以此来加速模型评估。一种在早期估计网络性能的方法是学习曲线外推法。Domhan 等提出训练初期对学习曲线进行插值,并终止那些预测性能不好的网络结构的训练。Swersky等在评估学习曲线的好坏时,把网络架构的超参数作为参考因素。另一种方法根据梯度的局部统计信息实现早期停止,它不再依赖验证集,允许优化器充分利用所有的训练数据。
代理模型可以被训练用预测网络性能。PNAS提出训练一个代理网络(LSTM)来预测网络结构的性能,他不考虑学习曲线而是基于结构的特点来预测性能,并在训练时推断更大的网络结构。SemiNAS是一种半监督NAS方法,利用大量的未标记架构进一步提高搜索效率。不需要在对模型进行训练,只使用代理模型来预测模型精度。预测网络性能的主要难点是:为加快搜索过程,需要在对较大的搜索空间进行较少的评估的基础上进行良好的预测。当优化空间过大且难以量化,且对每个结构的评估成本极高时,基于代理的方法就不适用。
代理模型还可以用来预测网络权重。超网络(Hypernetworks)是一种神经网络,被训练来为各种架构生成网络权值。超网络在搜索过程中节省了候选体系结构的训练时间,因为它们的权值是通过超网络的预测得到的。Zhang等人提出了一种计算图表示,并使用图超网络(GHN)比常规超网络(SMASH)更快更准确地预测所有可能架构的权值。
权重继承是让新网络结构继承之前训练完成的其他网络结构的权值。其中一种方法是网络态射,一般的网络设计方法是首先设计出一个网络结构,然后训练它并在验证集上查看它的性能表现,如果表现较差,则重新设计一个网络。可以很明显地发现这种设计方法会做很多无用功,因此耗费大量时间。而基于网络态射结构方法能够在原有的网络结构基础上做修改,修改后的网络可以重用之前训练好的权重。其特殊的变换方式能够保证新的网络结构还原成原网络,因此子网络的表现至少不会差于原网络,并且能在较短的训练时间内继续成长为一个更健壮的网络。具体地,网络射态能够处理任意非线性激活函数,可以添加跳跃连接,并且支持添加层或通道得到更深或更宽的等效模型。经典的网络态射只能使网络变大,这可能导致网络过于复杂,之后提出的近似网络态射通过知识蒸馏允许网络结构减小。进化算法经常使用基于网络态射的变异,或者直接让孩子继承亲本的权重,再执行一般变异操作,这样产生的网络具有一个更好的初始值,而不用重头开始训练。
Ⅳ 深度学习之卷积神经网络经典模型
LeNet-5模型 在CNN的应用中,文字识别系统所用的LeNet-5模型是非常经典的模型。LeNet-5模型是1998年,Yann LeCun教授提出的,它是第一个成功大规模应用在手写数字识别问题的卷积神经网络,在MNIST数据集中的正确率可以高达99.2%。
下面详细介绍一下LeNet-5模型工作的原理。
LeNet-5模型一共有7层,每层包含众多参数,也就是卷积神经网络中的参数。虽然层数只有7层,这在如今庞大的神经网络中可是说是非常少的了,但是包含了卷积层,池化层,全连接层,可谓麻雀虽小五脏俱全了。为了方便,我们把卷积层称为C层,下采样层叫做下采样层。
首先,输入层输入原始图像,原始图像被处理成32×32个像素点的值。然后,后面的隐层计在卷积和子抽样之间交替进行。C1层是卷积层,包含了六个特征图。每个映射也就是28x28个神经元。卷积核可以是5x5的十字形,这28×28个神经元共享卷积核权值参数,通过卷积运算,原始信号特征增强,同时也降低了噪声,当卷积核不同时,提取到图像中的特征不同;C2层是一个池化层,池化层的功能在上文已经介绍过了,它将局部像素值平均化来实现子抽样。
池化层包含了六个特征映射,每个映射的像素值为14x14,这样的池化层非常重要,可以在一定程度上保证网络的特征被提取,同时运算量也大大降低,减少了网络结构过拟合的风险。因为卷积层与池化层是交替出现的,所以隐藏层的第三层又是一个卷积层,第二个卷积层由16个特征映射构成,每个特征映射用于加权和计算的卷积核为10x10的。第四个隐藏层,也就是第二个池化层同样包含16个特征映射,每个特征映射中所用的卷积核是5x5的。第五个隐藏层是用5x5的卷积核进行运算,包含了120个神经元,也是这个网络中卷积运算的最后一层。
之后的第六层便是全连接层,包含了84个特征图。全连接层中对输入进行点积之后加入偏置,然后经过一个激活函数传输给输出层的神经元。最后一层,也就是第七层,为了得到输出向量,设置了十个神经元来进行分类,相当于输出一个包含十个元素的一维数组,向量中的十个元素即0到9。
AlexNet模型
AlexNet简介
2012年Imagenet图像识别大赛中,Alext提出的alexnet网络模型一鸣惊人,引爆了神经网络的应用热潮,并且赢得了2012届图像识别大赛的冠军,这也使得卷积神经网络真正意义上成为图像处理上的核心算法。上文介绍的LeNet-5出现在上个世纪,虽然是经典,但是迫于种种复杂的现实场景限制,只能在一些领域应用。不过,随着SVM等手工设计的特征的飞速发展,LeNet-5并没有形成很大的应用状况。随着ReLU与dropout的提出,以及GPU带来算力突破和互联网时代大数据的爆发,卷积神经网络带来历史的突破,AlexNet的提出让深度学习走上人工智能的最前端。
图像预处理
AlexNet的训练数据采用ImageNet的子集中的ILSVRC2010数据集,包含了1000类,共1.2百万的训练图像,50000张验证集,150000张测试集。在进行网络训练之前我们要对数据集图片进行预处理。首先我们要将不同分辨率的图片全部变成256x256规格的图像,变换方法是将图片的短边缩放到 256像素值,然后截取长边的中间位置的256个像素值,得到256x256大小的图像。除了对图片大小进行预处理,还需要对图片减均值,一般图像均是由RGB三原色构成,均值按RGB三分量分别求得,由此可以更加突出图片的特征,更方便后面的计算。
此外,对了保证训练的效果,我们仍需对训练数据进行更为严苛的处理。在256x256大小的图像中,截取227x227大小的图像,在此之后对图片取镜像,这样就使得原始数据增加了(256-224)x(256-224)x2= 2048倍。最后对RGB空间做PCA,然后对主成分做(0,0.1)的高斯扰动,结果使错误率下降1%。对测试数据而言,抽取以图像4个角落的大小为224224的图像,中心的224224大小的图像以及它们的镜像翻转图像,这样便可以获得10张图像,我们便可以利用softmax进行预测,对所有预测取平均作为最终的分类结果。
ReLU激活函数
之前我们提到常用的非线性的激活函数是sigmoid,它能够把输入的连续实值全部确定在0和1之间。但是这带来一个问题,当一个负数的绝对值很大时,那么输出就是0;如果是绝对值非常大的正数,输出就是1。这就会出现饱和的现象,饱和现象中神经元的梯度会变得特别小,这样必然会使得网络的学习更加困难。此外,sigmoid的output的值并不是0为均值,因为这会导致上一层输出的非0均值信号会直接输入到后一层的神经元上。所以AlexNet模型提出了ReLU函数,公式:f(x)=max(0,x)f(x)=max(0,x)。
用ReLU代替了Sigmoid,发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid快很多,这成了AlexNet模型的优势之一。
Dropout
AlexNet模型提出了一个有效的模型组合方式,相比于单模型,只需要多花费一倍的时间,这种方式就做Dropout。在整个神经网络中,随机选取一半的神经元将它们的输出变成0。这种方式使得网络关闭了部分神经元,减少了过拟合现象。同时训练的迭代次数也得以增加。当时一个GTX580 GPU只有3GB内存,这使得大规模的运算成为不可能。但是,随着硬件水平的发展,当时的GPU已经可以实现并行计算了,并行计算之后两块GPU可以互相通信传输数据,这样的方式充分利用了GPU资源,所以模型设计利用两个GPU并行运算,大大提高了运算效率。
模型分析
AlexNet模型共有8层结构,其中前5层为卷积层,其中前两个卷积层和第五个卷积层有池化层,其他卷积层没有。后面3层为全连接层,神经元约有六十五万个,所需要训练的参数约六千万个。
图片预处理过后,进过第一个卷积层C1之后,原始的图像也就变成了55x55的像素大小,此时一共有96个通道。模型分为上下两块是为了方便GPU运算,48作为通道数目更加适合GPU的并行运算。上图的模型里把48层直接变成了一个面,这使得模型看上去更像一个立方体,大小为55x55x48。在后面的第二个卷积层C2中,卷积核的尺寸为5x5x48,由此再次进行卷积运算。在C1,C2卷积层的卷积运算之后,都会有一个池化层,使得提取特征之后的特征图像素值大大减小,方便了运算,也使得特征更加明显。而第三层的卷积层C3又是更加特殊了。第三层卷积层做了通道的合并,将之前两个通道的数据再次合并起来,这是一种串接操作。第三层后,由于串接,通道数变成256。全卷积的卷积核尺寸也就变成了13×13×25613×13×256。一个有4096个这样尺寸的卷积核分别对输入图像做4096次的全卷积操作,最后的结果就是一个列向量,一共有4096个数。这也就是最后的输出,但是AlexNet最终是要分1000个类,所以通过第八层,也就是全连接的第三层,由此得到1000个类输出。
Alexnet网络中各个层发挥了不同的作用,ReLU,多个CPU是为了提高训练速度,重叠pool池化是为了提高精度,且不容易产生过拟合,局部归一化响应是为了提高精度,而数据增益与dropout是为了减少过拟合。
VGG net
在ILSVRC-2014中,牛津大学的视觉几何组提出的VGGNet模型在定位任务第一名和分类任务第一名[[i]]。如今在计算机视觉领域,卷积神经网络的良好效果深得广大开发者的喜欢,并且上文提到的AlexNet模型拥有更好的效果,所以广大从业者学习者试图将其改进以获得更好地效果。而后来很多人经过验证认为,AlexNet模型中所谓的局部归一化响应浪费了计算资源,但是对性能却没有很大的提升。VGG的实质是AlexNet结构的增强版,它侧重强调卷积神经网络设计中的深度。将卷积层的深度提升到了19层,并且在当年的ImageNet大赛中的定位问题中获得了第一名的好成绩。整个网络向人们证明了我们是可以用很小的卷积核取得很好地效果,前提是我们要把网络的层数加深,这也论证了我们要想提高整个神经网络的模型效果,一个较为有效的方法便是将它的深度加深,虽然计算量会大大提高,但是整个复杂度也上升了,更能解决复杂的问题。虽然VGG网络已经诞生好几年了,但是很多其他网络上效果并不是很好地情况下,VGG有时候还能够发挥它的优势,让人有意想不到的收获。
与AlexNet网络非常类似,VGG共有五个卷积层,并且每个卷积层之后都有一个池化层。当时在ImageNet大赛中,作者分别尝试了六种网络结构。这六种结构大致相同,只是层数不同,少则11层,多达19层。网络结构的输入是大小为224*224的RGB图像,最终将分类结果输出。当然,在输入网络时,图片要进行预处理。
VGG网络相比AlexNet网络,在网络的深度以及宽度上做了一定的拓展,具体的卷积运算还是与AlexNet网络类似。我们主要说明一下VGG网络所做的改进。第一点,由于很多研究者发现归一化层的效果并不是很好,而且占用了大量的计算资源,所以在VGG网络中作者取消了归一化层;第二点,VGG网络用了更小的3x3的卷积核,而两个连续的3x3的卷积核相当于5x5的感受野,由此类推,三个3x3的连续的卷积核也就相当于7x7的感受野。这样的变化使得参数量更小,节省了计算资源,将资源留给后面的更深层次的网络。第三点是VGG网络中的池化层特征池化核改为了2x2,而在AlexNet网络中池化核为3x3。这三点改进无疑是使得整个参数运算量下降,这样我们在有限的计算平台上能够获得更多的资源留给更深层的网络。由于层数较多,卷积核比较小,这样使得整个网络的特征提取效果很好。其实由于VGG的层数较多,所以计算量还是相当大的,卷积层比较多成了它最显着的特点。另外,VGG网络的拓展性能比较突出,结构比较简洁,所以它的迁移性能比较好,迁移到其他数据集的时候泛化性能好。到现在为止,VGG网络还经常被用来提出特征。所以当现在很多较新的模型效果不好时,使用VGG可能会解决这些问题。
GoogleNet
谷歌于2014年Imagenet挑战赛(ILSVRC14)凭借GoogleNet再次斩获第一名。这个通过增加了神经网络的深度和宽度获得了更好地效果,在此过程中保证了计算资源的不变。这个网络论证了加大深度,宽度以及训练数据的增加是现有深度学习获得更好效果的主要方式。但是增加尺寸可能会带来过拟合的问题,因为深度与宽度的加深必然会带来过量的参数。此外,增加网络尺寸也带来了对计算资源侵占过多的缺点。为了保证计算资源充分利用的前提下去提高整个模型的性能,作者使用了Inception模型,这个模型在下图中有展示,可以看出这个有点像金字塔的模型在宽度上使用并联的不同大小的卷积核,增加了卷积核的输出宽度。因为使用了较大尺度的卷积核增加了参数。使用了1*1的卷积核就是为了使得参数的数量最少。
Inception模块
上图表格为网络分析图,第一行为卷积层,输入为224×224×3 ,卷积核为7x7,步长为2,padding为3,输出的维度为112×112×64,这里面的7x7卷积使用了 7×1 然后 1×7 的方式,这样便有(7+7)×64×3=2,688个参数。第二行为池化层,卷积核为3×33×3,滑动步长为2,padding为 1 ,输出维度:56×56×64,计算方式:1/2×(112+2×1?3+1)=56。第三行,第四行与第一行,第二行类似。第 5 行 Inception mole中分为4条支线,输入均为上层产生的 28×28×192 结果:第 1 部分,1×1 卷积层,输出大小为28×28×64;第 2 部分,先1×1卷积层,输出大小为28×28×96,作为输入进行3×3卷积层,输出大小为28×28×128;第 3部分,先1×1卷积层,输出大小为28×28×32,作为输入进行3×3卷积层,输出大小为28×28×32;而第3 部分3×3的池化层,输出大小为输出大小为28×28×32。第5行的Inception mole会对上面是个结果的输出结果并联,由此增加网络宽度。
ResNet
2015年ImageNet大赛中,MSRA何凯明团队的ResialNetworks力压群雄,在ImageNet的诸多领域的比赛中上均获得了第一名的好成绩,而且这篇关于ResNet的论文Deep Resial Learning for Image Recognition也获得了CVPR2016的最佳论文,实至而名归。
上文介绍了的VGG以及GoogleNet都是增加了卷积神经网络的深度来获得更好效果,也让人们明白了网络的深度与广度决定了训练的效果。但是,与此同时,宽度与深度加深的同时,效果实际会慢慢变差。也就是说模型的层次加深,错误率提高了。模型的深度加深,以一定的错误率来换取学习能力的增强。但是深层的神经网络模型牺牲了大量的计算资源,学习能力提高的同时不应当产生比浅层神经网络更高的错误率。这个现象的产生主要是因为随着神经网络的层数增加,梯度消失的现象就越来越明显。所以为了解决这个问题,作者提出了一个深度残差网络的结构Resial:
上图就是残差网络的基本结构,可以看出其实是增加了一个恒等映射,将原本的变换函数H(x)转换成了F(x)+x。示意图中可以很明显看出来整个网络的变化,这样网络不再是简单的堆叠结构,这样的话便很好地解决了由于网络层数增加而带来的梯度原来越不明显的问题。所以这时候网络可以做得很深,到目前为止,网络的层数都可以上千层,而能够保证很好地效果。并且,这样的简单叠加并没有给网络增加额外的参数跟计算量,同时也提高了网络训练的效果与效率。
在比赛中,为了证明自己观点是正确的,作者控制变量地设计几个实验。首先作者构建了两个plain网络,这两个网络分别为18层跟34层,随后作者又设计了两个残差网络,层数也是分别为18层和34层。然后对这四个模型进行控制变量的实验观察数据量的变化。下图便是实验结果。实验中,在plain网络上观测到明显的退化现象。实验结果也表明,在残差网络上,34层的效果明显要好于18层的效果,足以证明残差网络随着层数增加性能也是增加的。不仅如此,残差网络的在更深层的结构上收敛性能也有明显的提升,整个实验大为成功。
除此之外,作者还做了关于shortcut方式的实验,如果残差网络模块的输入输出维度不一致,我们如果要使维度统一,必须要对维数较少的进行増维。而增维的最好效果是用0来填充。不过实验数据显示三者差距很小,所以线性投影并不是特别需要。使用0来填充维度同时也保证了模型的复杂度控制在比较低的情况下。
随着实验的深入,作者又提出了更深的残差模块。这种模型减少了各个层的参数量,将资源留给更深层数的模型,在保证复杂度很低的情况下,模型也没有出现梯度消失很明显的情况,因此目前模型最高可达1202层,错误率仍然控制得很低。但是层数如此之多也带来了过拟合的现象,不过诸多研究者仍在改进之中,毕竟此时的ResNet已经相对于其他模型在性能上遥遥领先了。
残差网络的精髓便是shortcut。从一个角度来看,也可以解读为多种路径组合的一个网络。如下图:
ResNet可以做到很深,但是从上图中可以体会到,当网络很深,也就是层数很多时,数据传输的路径其实相对比较固定。我们似乎也可以将其理解为一个多人投票系统,大多数梯度都分布在论文中所谓的effective path上。
DenseNet
在Resnet模型之后,有人试图对ResNet模型进行改进,由此便诞生了ResNeXt模型。
这是对上面介绍的ResNet模型结合了GoogleNet中的inception模块思想,相比于Resnet来说更加有效。随后,诞生了DenseNet模型,它直接将所有的模块连接起来,整个模型更加简单粗暴。稠密相连成了它的主要特点。
我们将DenseNet与ResNet相比较:
从上图中可以看出,相比于ResNet,DenseNet参数量明显减少很多,效果也更加优越,只是DenseNet需要消耗更多的内存。
总结
上面介绍了卷积神经网络发展史上比较着名的一些模型,这些模型非常经典,也各有优势。在算力不断增强的现在,各种新的网络训练的效率以及效果也在逐渐提高。从收敛速度上看,VGG>Inception>DenseNet>ResNet,从泛化能力来看,Inception>DenseNet=ResNet>VGG,从运算量看来,Inception<DenseNet< ResNet<VGG,从内存开销来看,Inception<ResNet< DenseNet<VGG。在本次研究中,我们对各个模型均进行了分析,但从效果来看,ResNet效果是最好的,优于Inception,优于VGG,所以我们第四章实验中主要采用谷歌的Inception模型,也就是GoogleNet。
Ⅳ 数据泛化是什么
06-08-21] 来源: 作者: [字体:大 中 小]
黄建国
(合肥幼儿师范 现代教育技术中心 安徽 合肥 230011 )
摘要 为了更有效的进行在线分类挖掘,提出了一种泛化算法。该算法结合了数据立方体技术和面向属性归纳方法中的泛化策略,有效降低了聚合运算的运算量,提高了运算效率,将数据库中的原始数据泛化成用誉裂户感兴趣的概念层次上的、聚合的、具有统计意义的元数据,为在线分类提供了良好的数据环境。
关键词 数据挖掘 数据泛化 数据立方体
1 引言
数据准备是KDD过程中一个很重要的过程,良好的数据准备过程能够为数据挖掘提供清洁、可靠、稳定的数据环境,以保证挖掘算法的有效实施。在线分类理想的数据环境应具备以下几个特点: (1)数据应包含丰富的属性信息,应具备可靠性和稳定性;
(2)数据的属性应具有对于分类任务的相关性。大多数的分类任务只与数据库中部分属性有关,多余的、无关的属性介入分类,常会减慢甚至错误引导分类过程,应此必须去掉无关属性。
(3)数据应具有高层数据信息,以发现清晰的、高层的、具有统计意义的分类规则。在本文的研究中,为了使数据环境达到上庆拍闭述要求,在数据准备阶段采用了数据泛化的策略,这个策略用概念层次作为背景,结合了OLAP技术与Jiawei Han等人的面向属性归纳的方法,明显提高了工作效率。
2 面向属性归纳中的基本泛化策略和算法
随着KDD研究的逐步深入, Jiawei Han等人提出了一种基于归纳的知识发现方法——面向属性的归纳方法[1][2][3],这方法的特点是能够根据概念层次将低概念层的数据泛化到相应的高层次的概念层,以发现多层的或高层的规则。面向属性归纳方法是一种有效的、完整的知识发现算法,该算法将机器学习中示例学习方法与数据库的操作技术相结合[1]。算法的一个关键就是攀升属性所对应的概念层次树以泛化原始数据集的数据到用户感兴趣的概念层上,减少数据集的大小,从而降低知识发现过程的计算复杂度。面向属性归纳方法的进行,必须有两个前提:
(1)必须由用户提出明确的知识发现任务。在Jiawei Han等人的研究中,采用了一种类似SQL语句的知识发现语句DMQL[4]用来让用户定义发现任务,下面便是一个分类任务的语句描述:
要说明的是在本文的研究中采用了一个可视化的向导来引导用户定义发现任务,但为了文章描述方便,在本文的描述中,借用了DMQL来描述发现任务
(2)与发现任务相关的属性应有概念层次,如上文所述,数值型的概念层次可以自动提取,给定的概念层次可以用户的兴趣和发现任务的不同而进行动态调整。
在具备以上两个前提时,面向属性归纳采用了以下一些泛化策略。
●贺迟 泛化策略
策略1 在最小分解单位上泛化
一般而言,泛化都是在数据集的单个属性上进行的。因为单个属性常常是数据集中的最小分解单位。在最小分解单位上进行泛化,更能确定泛化过程中的细微变化,从而达到适度泛化的目的,避免过度泛化。
策略2 属性去除
如果一个属性在相关数据集中有大量不同的值,但是在其对应的概念层次树上,没有比该属性更高的概念层,则该属性将被从发现任务中去除。因为这样的属性是不可能被泛化到更高的概念层的,这是符合示例学习理论的。
策略3 概念树攀升
如果一个属性在概念层次树上有更高层次的概念,那么在泛化后的数据集中将所有记录的该属性值以高层次的属性值替代。
策略4 增加属性CNT
作为策略3的执行结果,必然会有许多不同的纪录由于属性值完全相同而合并成一条纪录。为了反应这一变化,引入属性CNT来纪录最初的表中不同纪录被概括成泛化表中相同纪录的个数。属性CNT在泛化的过程中保存了最初的计数,该值在知识发现的过程中起到了重要作用。
策略5 设立阈值
利用策略2中的CNT可以定义规则的正确率P,P=(符合规则的CNT值)/(符合规则左边属性条件的CNT值)。这样可以定义一阈值L用于取舍规则,若P>L则规则有效,否则丢弃该规则。另外,对一个属性A而言,为了将数据集概括到一定层次,必须沿着A的概念层次向上爬行几次。为了控制这个过程,有必要设置一归纳阈值,若A的取值个数达到这一阈值,则无需进一步概括,否则必须进行进一步的概括。除此之外,我们还可以对泛化表设置一个归纳阈值,如果泛化表的记录树大于该归纳阈值,则进行进一步的泛化直到满足这个归纳阈值为止。以上策略可以总结成算法如下:
算法1 (基本泛化算法)
输入条件:1.一个关系数据集,2 一个学习任务,3 一套相关属性的概念层次,4 每个属性归纳阈值t[i](i=1 to n,于属性相对应)、一个泛化表归纳阈值t2。
输出:一个用户期望的泛化后的数据集。
步骤:本算法可以分为两大步:
Step1. 根据用户提交的学习任务,从原始的关系数据集中收集与任务相关的属性与数据。生成初始泛化集GR;
Step2. 运行基本的泛化算法产生泛化数据集。
注意,step2可以细化成如下算法:
begin
for GR中的每一个属性Ai do
begin
while Ai的不同值的数目>t[i] do
begin
if Ai在概念层次中有高层次的概念 THEN
将Ai的所有值以高层次的概念值取代
else
在GR中移去Ai;
合并同样的记录;
end;
end;
while GR中的记录数>t2 do
begin
选择泛化属性进一步泛化;
合并相同的记录。
end;
end.
3 基于数据立方体的泛化算法
上述泛化算法是针对关系表的,其生成的结果也是关系数据表。对泛化后关系数据表进行分类规则挖掘时仍要进行大量的聚合运算,如计数、求和等。有没有办法降低聚合运算的运算量呢?有,那就是数据立方体。我们知道数据立方体的方格内存放的就是一些聚合值,而且对数据立方体进行聚合运算,其效率远高于对关系数据库进行聚合运算。基于此,本文提出了一种基于数据立方体的算法。
● 基于数据立方体的泛化算法
本算法共分为四步:第一步,初始化。首先,根据用户提出的发现任务,收集相关数据。(这里需说明的一点是此处用户提出的发现任务的相关属性实际上是一个维的概念,它可能对应于数据库中一个或几个有层次关系的实际属性。在下面的例子中我们将看到这一点。)然后确定每维的概念层次(自动提取数值型概念层次或动态调整已有概念层次)。第二步,构造基本立方体(Basecube)。这一步中首先根据数据库的数据分布特性(对于离散属性确定不同值的个数,连续值则确定数值间的最小间隔)确定每维的最初泛化层次,然后进行聚合计算来构造基本立方体。第三步,按照基本泛化策略对每维进行泛化造作,以确定每维理想的泛化层次。第四步,在新的泛化层次上对Basecube进行再计算,以构造最终的泛化立方体Primecube。这一步中将大量使用数据立方体的操作。该算法的形式描述如下:
算法2 基于数据立方体的泛化算法
输入:
1 一个待挖掘的关系数据集;
2 一个学习任务;
3 一个概念层次集合Gen(Ai),Ai是任意维;
4 Ti,任意维Ai的泛化阈值。
输出:一个最终泛化的数据立方体。
方法:
⑴ 始化:
① 根据用户的学习任务,确定每一维对应的属性,并从初始关系数据集中收集相关的数据。
② for 每一维Ai do
begin
if Ai是数值型 and Ai没有概念层次 then 自动生成概念层次(算法2.1)
else 动态调整概念层次以适应当前学习任务;
end;
⑵ 造Basecube:
① 对于每一维的属性计算其在数据库中对应的不同值的个数,如果是数值型则计算数值间的最小间隔,根据不同值的个数或最小间隔确定每一维的最初泛化层次。
② 按最初泛化层次确定每维的维成员,并进行COUNT,SUM等聚合运算。用文[26]中算法构造基本立方体。
⑶ 确定每维的泛化层次。
① 根据每一维的泛化阈值,进行基本泛化(算法2.5)找到最终理想的层次Li。
② 找出每一维Ai的映射<v,v’>,其中v是维成员值,v’是v在泛化层上对应的概念值。
⑷ 构造Primecube。
① 将Basecube的维成员v替换成v’;
② 对Basecube进行数据立方体操作,构造Primecube。
本算法中,第一步的时间复杂度主要依赖于特定数据库的操作和提取或调整概念层次的算法的效率。第二步的主要操作在于立方体的构造上,复杂度为 。第三步和第四步都只对基本立方体进行一次扫描,加上计算量,复杂度也为 。所以本算法中二到四步总的时间复杂度应为 。
下面以一个例子来进一步描述该算法。
例1:从网上下了一个数据库CITYDATA,该数据库记录了美国地区城市的情况。其中有三个表,如下:
表1 CityLocation 记录城市所在地
表2 LaborIncome 记录城市人员的收入
表3 记录犯罪率与教育程度
我们有一个初始概念层次US_LOCATION:
…
现在我们要对数据库进行如下任务的发现:
CLASSIFY CITYDATA
ACCORDING TO UNEMPLOYMENT_RATE
IN RELEVANCE TO US_LOCATION,FAMILY_INCOME,POVERTY_PCT,
CRIME_RATE,BACHELOR_PCT
FROM LABORINCOME,CRIMEEDUCATION
注意到该发现任务中的维US_LOCATION对应着几个有层次关系的数据库属性:area-name→county→state→region→big region→country,这些属性在概念层次Us location中都对应着相应的层次。每一维的阈值为5。
根据算法,我们首先作初始化,对family income,poverty pct,crime_rate,bachelor_pct由于它们是数值型的属性,所以概念层次可以自动提取出来,下面便是自动提取出来的概念层次:
运行算法二、三、四步,得到六维的基本立方体和泛化立方体,为方便起见本文给出其中三维的立方体图。
最后的泛化结果放在了表4。注意到cityid的属性已被移去。
表4 最后的泛化结果
4 结束语
数据泛化在线分类研究中占有重要地位,它是在线分类规则挖掘算法的基础。在线分类任务的一个重要特征就是数据量庞大,且数据中含有一定量的异常信息,这样的数据是不适合直接分类的。通过数据泛化,可以将数据整理、清洁,为分类提供较好的数据环境。另外数据泛化采用了概念层次技术,可以发现高层的分类规则,从而使分类结果更易理解。
本文结合基本的面向属性归纳技术,提出了一种数据立方体的数据泛化算法,给在线分类提供了较好的数据预处理技术。
参考文献
[1] Han J, Fu Y. Exploration of the power of attribute-oriented inction in data mining. In: Fayyad U M et al eds. Advances in Knowledge Discover and Data Mining. Cambridge: AAAI/MIT Press, 1996. 399~421
[2] J. Han, Y. Cai, and N. Cercone. Knowledge discovery in databases: An attribute_Oriented approach. In Proc. 18th Int. Conf. Very Large Data Bases, pages 547--559, Vancouver, Canada, August 1992.
[3] Cheung D W, Fu A W C, Han J. Knowledge discovery in databases: a rule based attribute oriented approach. In: Zbigniew R ed. Methodologies for Intelligent systems: 8th International Symposium. Berlin: Springer-Verlag, 1994. 164~173
[4] Han, J., Chiang, J., Chee, S., Chen, J., Chen, Q., Cheng, S., Gong, W., Kamber, M., Liu, G., Koperski, K., Lu, Y., Stefanovic, N., Winstone, L., Xia, B., Zaiane, O. R., Zhang, S. & Zhu, H. (1997), DBMiner: A system for data mining in relational databases and data warehouses, in `Proc. CASCON'97: Meeting of Minds', Toronto, Canada, pp. 249--260.
作者简介:
黄建国(1974年10月-- ) ,男,安徽省合肥市人,合肥幼儿师范学校讲师,中国科技大学计算机应用工程硕士。
Ⅵ C4.5算法
C4.5是一系列用在机器学习和数据挖掘的分类问题中的算法。它的目标是监督学习:给定一个数据集,其中的每一个元组都能用一组属性值来描述,每一个元组属于一个互斥的类别中的某一类。C4.5的目标是通过学习,找到一个从属性值到类别的映射关系,并且这个映射能用于对新的类别未知的实体进行分类。
C4.5由J.Ross Quinlan在ID3的基础上提出的。ID3算法用来构造决策树。决策树是一种类似流程图的树结构,其中每个内部节点(非树叶节点)表示在一个属性上的测试,每个分枝代表一个测试输出,而每个树叶节点存放一个类标号。一旦建立好了决策树,对于一个未给定类标号的元组,跟踪一条有根节点到叶节点的路径,该叶节点就存放着该元组的预测。决策树的优势在于不需要任何领域知识或参数设置,适合于探测性的知识发现。
决策树呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型;预测时,对新的数据,利用决策模型进行分类。
决策树是一种通过对特征属性的分类对样本进行分类的树形结构,包括有向边以及三类节点:
上图给出了(二叉)决策树的示例。决策树具有以下特点:
决策树学习的本质是从训练集中归纳出一组分类规则。但随着分裂属性次序的不同,所得到的决策树也会不同。如何得到一棵决策树既对训练数据有较好的拟合,又对未知数据有很好的预测呢?
首先,我们要解决两个问题:
一般的,一颗决策树包含一个根节点、若干个内部结点和若干个叶结点;叶结点则对应于一个属性册书;每个叶结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集,从根结点到每个叶结点的路径对饮过了一个判定测试序列。决策树学习的目的是为了产生一颗泛化能力强的决策树,其基本流程遵循简单且只管的“分而治之”(divide-and-conquer)策略,如下图所示:
显然,决策树的生成是一个递归的过程。在决策树基本算法中,有三种情形会导致递归返回:
在第二种情形下,我们把当前结点标记为叶结点,并且将其类别设定为该结点所含样本最多的类别;在第三种情形下,同样把当前结点标记为叶结点,但将其类别设定为其父结点所含样本最多类别。注意这两种情形的处理实质不同:情形二是在利用当前结点的后验分布,而情形三则是把父结点的样本分布当做当前结点的先验分布。
决策树学习的关键在于如何选择最优划分属性。一般而言,随着划分过程的不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。
“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标。假定当前样本集合 中第k类样本所占比例为 ,则 的信息熵定义为
的值越小,则 的纯度越高。
假定离散属性 有 个可能的取值 ,若使用 来对样本集合 进行划分,则会产生 个分支结点,其中第v个分支结点包含了 中所有在属性 上取值为 的样本,记为 ,我们根据上述公式计算出 的信息熵,再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重 ,即样本越多的分支结点影响越大,于是可以计算出用属性 对样本集合 进行划分所获得的"信息增益"(information gain)
一般而言,信息增益越大,则意味着使用属性a来进行划分所获得的“纯度提升越大”。因此,我们可用信息增益来进行决策树的划分属性选择。
实际上,信息增益准则对可取值数目较多的属性有所偏好(如何以序号作为划分属性,每一个事物作为一个单独存在的类别的时候,信息增益往往会很高,但是这样进行划分并没有什么意义),为了减少这种偏好可能带来的不利影响,着名的C4.5算法并不是直接使用信息增益,而是使用增益率(gain ratio)来选择最优的划分属性。增益率的定义为:
值得注意的是: 增益率准则对可取值数目较少的属性有所偏好,因此C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式: 先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的
CART决策树使用“基尼指数”来选择划分属性。数据集 的纯度可用基尼值来度量:
直观来说, 反映了从数据集 中随机抽取两个样本,其类别标记不一致的概率,因此 值越小,则数据集 的纯度就越高。属性 的基尼指数定义为:
于是,我们在候选属性集合 中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即
银行希望能够通过一个人的信息(包括职业、年龄、收入、学历)去判断他是否有贷款的意向,从而更有针对性地完成工作。下表是银行现在能够掌握的信息,我们的目标是通过对下面的数据进行分析建立一个预测用户贷款一下的模型。
上表中有4个客户的属性,如何综合利用这些属性去判断用户的贷款意向?决策树的做法是每次选择一个属性进行判断,如果不能得出结论,继续选择其他属性进行判断,直到能够“肯定地”判断出用户的类型或者是上述属性都已经使用完毕。比如说我们要判断一个客户的贷款意向,我们可以先根据客户的职业进行判断,如果不能得出结论,再根据年龄作判断,这样以此类推,直到可以得出结论为止。决策树用树结构实现上述的判断流程,如图所示:
以熵作为节点复杂度的统计量,分别求出下面例子的信息增益,图3.1表示节点选择属性1进行分裂的结果,图3.2表示节点选择属性2进行分裂的结果,通过计算两个属性分裂后的信息增益,选择最优的分裂属性。
属性一
属性二
由于 ,所以属性1是比属性2更优的分裂属性,故而选择属性1作为分裂属性。
由于 ,故而选择属性2作为分裂属性。
剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有事会造成决策树分支过多,这是就可能因为训练样本学得太好了,以致把训练集自身的一些特点党组哟所有数据都具有的一般性质而导致过拟合。因此,可通过主动去掉一些分支来降低过拟合的风险。
其中{1,2,3,6,7,10,14,15,16,17}为测试集,{4,5,8,9,11,12,13}为训练集。
预剪枝是要对划分前后泛化性能进行评估。对比决策树某节点生成前与生成后的泛化性能。
2.计算训练集的信息增益,得知脐部的信息增益最大,因此按照脐部进行划分。又因为在训练集中,凹陷特征好瓜的占比多,因此凹陷划分为好瓜,稍凹特征好过占比多,因此将其标记为好瓜,因此按照脐部划分的子树结果如下:
划分后,对比结果如下:
由图可知,预剪枝使得很多分支没有展开,这不仅降低了过拟合的风险,还显着减少了决策树的训练时间开销和测试时间。但是,有些分支虽当前不能提升泛化性。甚至可能导致泛化性暂时降低,但在其基础上进行后续划分却有可能导致显着提高,因此预剪枝的这种贪心本质,给决策树带来了欠拟合的风险。
后剪枝表示先从训练集中生成一颗完整决策树。
对比标记节点的划分类与各数据的真实分类,计算准确率,如下表所示:
生成的决策树,在验证集上的准确度为3/7*100%=42.9%.
对比预剪枝与后剪枝生成的决策树,可以看出,后剪枝通常比预剪枝保留更多的分支,其欠拟合风险很小,因此后剪枝的泛化性能往往由于预剪枝决策树。但后剪枝过程是从底往上裁剪,因此其训练时间开销比前剪枝要大。
Ⅶ 在计算机科学中,有哪些非常巧妙的算法
分支界定算法(Branch and Bound)——在多种最优化问题中寻找特定最优化解决方案的算法,特别是针对离散、组合的最优化。Buchberger算法——一种数学算法,可将其视为针对单变量最大公约数求解的欧几里得算法和线性系统中高斯消元法的泛化。
动态规划算法(Dynamic Programming)——展示互相覆盖的子问题和最优子架构算法
欧几里得算法(Euclidean algorithm)——计算两个整数的最大公约数。最古老的算法之一,出现在公元前300前欧几里得的《几何原本》。
期望-最大算法(Expectation-maximization algorithm,又名EM-Training)——在统计计算中,期望-最大算法在概率模型中寻找可能性最大的参数估算值,其中模型依赖于未发现的潜在变量。EM在两个步骤中交替计算,第一步是计算期望,利用对隐藏变量的现有估计值,计算其最大可能估计值;第二步是最大化,最大化在第一步上求得的最大可能值来计算参数的值