机器学习 神经网络 在信息安全领域有哪些应用

93机器学习在信息安全领域应用
上亿文档资料,等你来发现
93机器学习在信息安全领域应用
机器学习在计算机信息安全领域的;应用综述;前言;从计算机短短几十年的历史进程中,人们都看到了计算;但是,以机器学习为代表的在信息有效利用率和信息安;本文将从机器学习的相关概念、发展现状、分类、所面;主题;一、机器学习;(1)机器学习的相关概念;学习是生物中枢神经系统的高级整合技能之一,是人类;(2)机器学习的发展;机器学习在相关的学科领域一直起着主导的作用,
机器学习在计算机信息安全领域的
从计算机短短几十年的历史进程中,人们都看到了计算机硬件和软件惊人的发展能力,但是硬件的利用率只有3%-5%;而且海量数据源源不断的涌入人们的视野,导致信息的有效利用率也只有1%[WD03]。依托于互联网的发展,人们不分地域、时域的分享硬件、软件、信息资源,然而生产效率没有得到应有的提升。同时,无论是硬件安全还是信息安全,都遇到了前所未有的威胁,资产的安全也没有得到应有的保证。
但是,以机器学习为代表的在信息有效利用率和信息安全领域的应用使人们看到了希望。机器学习可以让我们的计算机变得更聪明,变得更具有人的智慧,从而使我们在处理海量数据和复杂多变的安全威胁面前更有自信。机器学习,正在发挥着举足轻重的作用!
本文将从机器学习的相关概念、发展现状、分类、所面临的问题几个方面介绍机器学习的相关知识,然后从与计算机信息安全有关的三个方面:入侵检测、木马检测、漏洞扫描介绍了机器学习和信息安全的契合点。通过以上几个方面的叙述,为将来研究打好基础。
一、机器学习
(1)机器学习的相关概念
学习是生物中枢神经系统的高级整合技能之一,是人类获取知识的重要途径和人类智能的重要标志。按照人工智能大师H?Simon的观点:学习就是系统在不断重复的工作中对本身能力的增强或改进,使得系统在下一次执行同样或相类似的任务时,会比原来做得更好或效率更高。机器学习,顾名思义,是让机器(也可以理解为常见的计算机)具有人类学习的能力。一般认为,机器学习是一个有特定目的的知识获取过程,其内部表现为从未知到已知这样一个知识增长过程,其外部表现为系统的某些性能和适应性的改善,使得系统能完成原来不能完成或更好地完成原来可以完成的任务[AZ07]。机器学习则是计算机获取知识的重要途径和人工智能的重要标志,是一门研究怎样用计算机来模拟或实现人类学习活动的学科,是研究如何使机器通过识别和利用现有知识来获取新知识和新技能。它既注重知识本身的增加,也注重获取知识的技能的提高。
(2)机器学习的发展
机器学习在相关的学科领域一直起着主导的作用,但是对于机器学习的实质还没有最终的定论。从机器学习的发展历史中可以看出,机器学习大致经历了4个阶段[AZ07]:
1) 20 世纪50 年代的神经模拟和决策理论技术,学习系统在运行时很少具有结构或知识。主要是建造神经网络和自组织学习系统,,学习表现为阈值逻辑单元传送信号的反馈调整。
2) 20 世纪60 年代早期开始研究面向概念的学习,即符号学习。使用的工具
是语义网络或谓词逻辑,不再是数值或者统计方法。在概念获取中,学习系统通过分析相关概念的大量正例和反例来构造概念的符号表示。在这一阶段,人们认识到学习是个复杂而循序渐进的过程;如果不要任何初始知识,则学习系统无法学到高层次的概念。
3) 20 世纪70 年代中期, 研究活动日趋兴旺,各种学习方法不断推出,实验系统大量涌现,1980 年在卡内基?梅隆大学( CMU) 召开的第一届机器学习专题研讨会,标志着机器学习正式成为人工智能的一个独立研究领域。
4) 从20 世纪80 年代中后期到现在, 可以认为机器学习研究进入一个新阶段,已经趋向成熟。神经网络的复苏,带动着各种非符号学习方法与符号学习并驾齐驱,并且已超越研究范围,进入到自动化及模式识别等领域,掀起一场联结主义的热潮,各种学习方法开始继承,多策略学习已经使学习系统愈具有应用价值,开始从实验室走向应用领域。
(3)机器学习的分类
按照传统的分类方法,机器学习可以分为:
-归纳机器学习
-解释机器学习
-遗传机器学习
-连接机器学习
按照现代的分类方法,机器学习可以分为:
-符号机器学习
-统计机器学习
-集成机器学习
-增强机器学习[TY05]
对于传统的机器学习分类,本文中不做过多的叙述。下面对以上现代机器学习的分类做简要的介绍。
符号机器学习,Samuel将分段划分引入对符号域的数据处理, 形成了一类基
于符号数据集合的约简算法,这是现代符号机器学习的基础。但是,由于算法定义在符号域,连续量必须被映射到这样的域上,算法才有效。而且学习算法本身无法刻画泛化能力,而依赖于与算法本身无关的上述映射[TY05]。
统计机器学习有三个衡量要素,分别是一致性假设,样本空间的划分,泛化能力。所谓一致性假设,就是我们所能观察到的样本所具有的性质,在世界集合中同样使用,也就是说世界W和被观察的对象集合Q具有某种相同的性质,而且世界W的所有对象独立同分布[WD03]。样本空间的划分,也是机器学习主要研究的内容,即我们需要找到一个超平面,把样本空间在一个N维欧式空间中划分为不相交的区域。泛化能力,是一个确定的划分对世界的分类能力,也可以理解为我们从样本中得到的划分在世界集合中的适用能力。由于可能存在不同的划分样本集合的方法,划分能力各不相同,泛化能力最强的划分就是我们所要的分类器。对于线性不可分的问题,我们需要找到一个映射,把非线性问题映射到线性空间,以便于问题可以在线性空间中可分。这样这个映射就是核函数。目前,算法的理论研究已经基本完成,主要的研究集中的下述两个问题:(1)泛化不等式需要样本集满足独立同分布,这样严苛的条件是否可以放宽。(2)如何根据领域需求选择核函数,是否存在一定的基本原则。
集成机器学习被国际机器学习界的权威Dietterich列为ML四大研究方向之首。1990年Shapire证明,如果将多个弱分类器(泛化能力稍大于50%)集成在一起,它将具有强分类器的泛化能力[TY05]。由于集成学习可以有效的提高泛化能力,因此集成学习仍然是机器学习中最热门的研究领域之一[ZZH08]。
增强机器学习最早提出是考虑“从变化环境中”学习蕴含在环境中的知识,其本质是对环境的适应。1975年,Holland首先将这个概念引入计算机科学。1990
年左右,MIT的Sutton等青年计算机科学家,结合动态规划等问题,统称其为增强机器学习。
(4)机器学习的最新进展
依赖于算法的驱动,机器学习迎来了快速的发展。
-海量非线性数据(108-10)
-算法的泛化能力考虑
- 学习结果数据的解释
-代价加权的处理方法
- 不同数据类型的学习方法
这些都促使机器学习快速的发展。而依赖于应用的驱动,为了解决实际问题的需要,机器学习也出现了很多不同领域的方法
-流形机器学习
-半监督机器学习
- 多实例机器学习
- Ranking机器学习
- 数据流机器学习
-图模型机器学习
但是,正是由于依赖于应用,主要是以任务为驱动力,学习方法还有待创新。有些机器学习还处在实验观察阶段,缺乏坚实的理论基础,实际应用效果也有待研究。
(5)机器学习面临的挑战
随着应用的不断深入,出现了很多被传统机器学习研究忽视但非常重要的问题。机器学习正与众多学科领域产生了交叉,交叉领域越多,问题也越多,也正是大有可为之处。机器学习现阶段主要面临下面一些问题:
1、传统的ML技术基本上只考虑同一代价,而“将盗用误认为正常使用的代价”与“将正常使用误认为盗用的代价”是不同的。如何处理代价敏感性问题,也是机器学习要解决的困难。
2、传统的ML技术基本上只考虑平衡数据,而以信用卡盗用检测为例,“正
三亿文库包含各类专业文献、生活休闲娱乐、外语学习资料、中学教育、高等教育、文学作品欣赏、93机器学习在信息安全领域应用等内容。 
 机器学习、草图理解、网络性能分析与协议设计、网络管 理与安全、计算机图形学、...类博士点,主要从事计算机技术 在其它领域应用中核心技术问题研究及相关信息系统...  论文要求:论文选题涉及计算机在各领域应用的理论研究、尖端技术开发、以 及在国民...高级人工智能、 模式识别与理解、 机器学习、 密码学与信息安全、 统一建模语言...  社会培养从事计算机与计算机网络信息安全方面以及系统软硬件的研究开发和 应用的...机器学习 信号与系统 企业资源计划 ERP 2 2 2 2 2 2 2 3 2 2 30 30 ...  高斯过程在机器学习中的应用_数学_自然科学_专业资料...对于有效使用站台屏蔽门、保证乘客安全、较少乘客换乘...在本文中,将研究机器学习领域的高斯过程(Gaussian ...  [小木虫]推荐几个机器学习算法及应用领域相关的中国大牛_计算机软件及应用_IT/计算机...Mining Group 高级研究员和主管,主要研究领域是信息检索,自然语言处理和统计学习...  这个领 域是应用前景非常火热的, 同时也是研究的热门方向。随着机器学习的新领域...通过降维算法我们就可以去除冗余信息,将特征减少为面积与房间数 量两个特征,即...  中国机器学习白皮书_计算机软件及应用_IT/计算机_专业资料。2015年中国机器学习...强化学习的状态连接 学习、信息检索与推荐、身份验证、甚至医疗效果评估等方面都...  该应用是基于安卓平台下开发,做到对网络环境信息进行...这些危险特征在用户接入时主要具体表现在以下几个方面...相关安全数据,通过机器学习,建立一个 Wi-Fi 安全...  机器学习大作业_计算机软件及应用_IT/计算机_专业资料。机器学习大作业支持向量机...由于 SVM 方法不仅考虑了对渐 进性能的要求,而且在现有有限信息的条件下得到...本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-!
从云端到终端 机器学习也能在嵌入式设备上实现
不撩妹不讲段子 网易推出如此正经的聊天机器人
最新声明:韩春雨论文调查明年1月底前完成
雄心不再?传谷歌放弃开发全自动无人驾驶汽车
科技讯11月28日消息,据英国《独立报》网站报道,如今世界对科技和创新如此关注,是因为人们渴望找到能够解决当前经济、社会和政治问题的解...
上周,科大讯飞、搜狗、百度先后召开发布会,对外公布语音识别准确率均达到「97%」。 而一如阑夕所言「一旦语音识别的准确率达到99%,那将...
想象AI的未来是很有趣的:家庭服务机器人、亚马逊的智能家庭中枢(Echo)等设备将走进每家每户,还有无人机快递和更加精准的医学诊断。这些...
中国AI产业大会12月16日举行:这里有你要的未来,人工智能 中国人工智能学会 机器人 院士 智能机器人 深度学习 AI 报名 ...原文:http://emuch.net/html/2092.html
李航:/en-us/people/hangli/,是MSRA Web Search and Mining Group高级和主管,主要研究领域是,自然语言处理和统计。近年来,主要与人合作使用机器学习方法对信息检索中排序,相关性等问题的研究。曾在人大听过一场他的讲座,对实际应用的问题抽象,转化和解决能力值得学习。
周志华:http://cs./zhouzh/,是南京大学的杰青,机器学习和数据挖掘方面国内的领军人物,其好几个生都进入了美国一流高校如uiuc,cmu等学习和深造。周教授在半监督学习,multi-label学习和集成学习方面在国际上有一定的影响力。另外,他也是ACML的创始人。人也很nice,曾经发邮件咨询过一个naive的问题,周老师还在百忙之中回复了我,并对我如何发邮件给了些许建议。
杨强:http://www.cse.ust.hk/~qyang/,香港科技大学教授,也是KDD 2012的会议主席,可见功力非同一般。杨教授是迁移的国际领军人物,曾经的中国第一位acm全球冠军上交的戴文渊硕士期间就是跟他合作发表了一系列高水平的文章。还有,杨教授曾有一个关于和有意思的比喻:比如你训练一只狗,若干年后,如果它忽然有一天能帮你擦鞋洗衣服,那么这就是数据挖掘;要是忽然有一天,你发现狗发装成一个老太婆消失了,那么这就是机器学习。
李建中:http://db./jianzhongli/,哈工大和黑大共有教授,是分布式数据库的领军人物。近年来,其团队在不确定性数据,sensor network方面也发表了一系列有名文章。李教授为人师表,教书育人都做得了最好,在圈内是让人称道的好老师和好学者。
唐杰:http://keg.cs./jietang/,清华大学副教授,是图挖掘方面的专家。他主持设计和实现的Arnetminer是国内领先的图挖掘系统,该系统也是多个会议的支持商。
张钹:http://www.csai./personal_homepage/zhang_bo/index.html 清华大学教授,中科院院士,。现任清华大学信息技术研究院指导委员会主任,微软亚洲院技术顾问等。主要从事人工智能、、遗传算法、智能机器人、以及智能控制等的研究工作。在过去二十多年中,张钹教授系统地提出了问题求解的商空间理
论。近年来,他建立了神经与认知计算研究中心以及多媒体信息处理研究组。该研究组已在图像和视频的分析与检索方面取得一些重要研究成果。
刘铁岩:/en-us/people/tyliu/ MSRA研究主管,是learning to rank的国际知名学者。近年逐步转向管理,研究兴趣则开始关注计算广告学方面。
王海峰:http://ir./~wanghaifeng/
,自然语言处理,机器翻译方面的专家,ACL的副主席,百度高级科学家。近年,在百度主持研发了百度翻译产品。
何晓飞:http://people.cs.uchicago.edu/~xiaofei/ 浙江大学教授,多媒体处理,图像检索以及流型的国际领先学者。
朱军:http://www.ml-thu.net/~jun/ 清华大学副教授,机器学习绝对重量级新星。主要领域是latent
variable models, large-margin learning, Bayesian nonparametrics, and sparse learning in high dimensions. 他也是今年龙星计划的领域的主讲人之一。
吴军:http://www.cs.jhu.edu/~junwu/ 腾讯副总裁,前google研究员。著名《数学之美》和《浪潮之巅》系列的作者。
张栋:/machinelearning 前百度科学家和google,机器学习工业界的代表人物之一。
戴文渊:http://apex./apex_wiki/Wenyuan_Dai 现百度凤巢ctr预估组leader。前ACM大赛冠军,硕士期间一系列transfer learning方面的高水平论文让人瞠目结舌。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:517557次
积分:7866
积分:7866
排名:第2563名
原创:201篇
转载:155篇
评论:166条
阅读:3056
阅读:12427
阅读:13974
文章:66篇
阅读:197643
(13)(10)(2)(1)(8)(6)(1)(1)(1)(4)(8)(5)(56)(18)(8)(13)(17)(26)(15)(7)(4)(11)(8)(17)(12)(6)(11)(14)(13)(19)(20)(9)热门搜索:
关注软件产品网
办公、管理
软件开发、网站建设
网管、安全
图形图像、多媒体
工具软件、游戏娱乐
您现在的位置: >
> 如何用自动机器学习实现神经网络进化
如何用自动机器学习实现神经网络进化
  对大多数从事机器学习工作的人来说,设计一个神经网络无异于制作一项艺术作品。神经网络通常始于一个常见的架构,然后我们需要对参数不断地进行调整和优化,直到找到一个好的组合层、激活函数、正则化器和优化参数。在一些知名的神经网络架构,如VGG、Inception、ResNets、DenseNets等的指导下,我们需要对网络的变量进行重复的操作,直到网络达到我们期望的速度与准确度。随着网络处理能力的不断提高,将网络优化处理程序自动化变得越来越可行。  在像Random Forests和SVMs这样的浅模型中,我们已经能够使超参数优化的操作自动化进行了。一些常用的工具包,比如sk-learn,向我们提供了搜索超参数空间的方法。在其最简单的、最基础的格式中,“超参数”是我们在所有可能的参数中搜索得到的,或者是通过从参数分布中任意采样得到的。(详情请点击此链接查看。)这两种方法都面临着两个问题:第一,在错误参数区域进行搜索时会造成资源浪费;第二,处理大量的动态特征参数集将导致效率过低。因此,改变处理器的架构变得相当困难。虽然现在有很多看似高效的方法,比如Bayesian优化方法。但Bayesian优化法虽然能够解决了第一个问题,却对第二个问题无能为力;另外,在Bayesian优化设置中也很难进行探索模型。  自动识别最佳模型的想法就现在来说已经不算新鲜了,再加上最近大幅度提升的处理能力,实现这一想法比以往任何时候都要容易。  问题设定  考虑超参数优化的方式之一,就是将它看做一个“元学习问题”。  我们究竟能否打造出一个可以用于判断网络性能好坏的算法呢?  注意:接下来我将继续使用“元学习”这个术语,即使将这个问题描述为“元学习”有点混淆视听,但我们千万不能把它与“学习”相关的一些方法弄混了。  我们的目标是定义网络隐含层(绿色)的数量以及每个隐含层的参数。  具体而言,就是探究模型架构和模型的参数空间,从而在给定的数据集上优化其性能。这个问题复杂难解,而回报稀薄。之所以说它回报稀薄,是因为我们需要对网络进行足够的训练,还要对它进行评估;而在训练、评估完成后,我们得到回报的仅仅是一些得分。这些得分反映了整个系统的性能表现,而这种类型的回报并不是可导函数!说到这,是不是让你想起了什么呢?没错,这就是一个典型的“强化学习”情境!  维基百科对“强化学习”的定义:  “强化学习”(RL)是一种重要的机器学习方法,它的灵感来自于心理学的行为主义理论。具体来说,“强化学习”是关于有机体(agent)如何在环境(environment)的刺激下,将累计奖励最大化的方法。  “强化学习”与标准的监督式学习之间的区别在于它不需要出现正确的输入或输出对,也不需要精准校正其次优化行为。另外,“在线性能”也是“强化学习”关注的焦点,即在未知领域的探索与现有知识的开发之间找到平衡。  上图情境中的有机体(agent)是一个模型,环境(environment)就是我们用于训练和评估的数据集。解释器(interpreter)是对每一行为进行分析以及设置有机体状态(在我们这个情境中,解释器设置的是网络参数)的过程。  通常情况下,“强化学习”问题都被定义为一个Markov决策过程。其目的就是优化有机体的总回报。每一步,你需要对优化模型输出作出决策,或者是探索出一个新的行为。在环境的刺激下,有机体将根据得到的反馈,形成一个调整政策,不断改进其行为。  注意:这个话题超出了本文讨论的范围,R.Sutton和A. Barto的《强化学习介绍》可能是关于这个主题的最佳入门指导书。  进化算法  解决“强化学习”问题的另一种方法是“进化算法”。在生物进化的启发下,进化算法通过创建一个解决方案的集合,寻找解决方案的空间;然后,它会对每一解决方案进行评估,并根据评估得分不断调整这个方案集合。生物进化论中所讲的“进化”涉及到一个种群中最佳成员的选择和变异。因此,我们的解决方案集合也会不断进化发展,以提高其整体适应性,并为问题找到提供可行的解决方案。  上图的左边介绍了进化的过程,设计一个“进化算法”涉及到两个部分——“选择”,以及需要遵循的“跨界”或“变异”策略。  “选择”:对于“选择”,我们通常的做法是挑选最佳的个体和一些任意的个体,以达到多样性。更先进的选择方法是在种群下设立不同的“次群”,即“物种”;然后在物种中选择最佳的个体,以保护其多样性。另一种比较受欢迎的做法是“竞赛选择”,即任意选择一些个体参与竞赛,挑选出胜者(基因优胜的个体)。  “跨界”:“跨界”也称“交叉跨界”,指的是两组或两组以上亲本交叉混合,产生后代。“交叉跨界”高度依赖于问题结构的方式。常见的方法是用一个项目列表(一般是数值)对亲本进行描述,然后从亲本中挑选任意部分来生成新的基因组合。  “变异”:“变异”或“突变”指的是任意改变基因组的过程。这是主要的开发因素,有助于保持种群的多样性。  实施启用  “进化算法”的实施启用使用了PyTorch来建立代理,这个代理将会探索用于完成简单分类任务的DNNs。这个实验使用的是MNIST,因为它小且快,即使在CPU上也能完成训练。我们将建立一组DNN模型,并将其发展进化为N个步骤。  我们所讲的“进化”主题实际上就是“物竞天择”的实施,完整的高水平“进化算法”如下所示:  new_population = []  while size(new_population) & population_size:  choose k(tournament) individuals from the population at random  choose the best from pool/tournament with probability p1  choose the second best individual with probability p2  choose the third best individual with probability p3  mutate and append selected to the new_population  附注:当涉及到架构合并时,跨界问题就变得相当复杂了。究竟该如何将两个亲本的架构合并呢?缺陷图样及环境整合训练将对此产生什么影响呢?近期的一篇来自Miikkulainen等人的论文提出了一种被称为CoDeepNEAT的解决方案。基于Evolino进化理论,一个架构由部分单元模块组成,其中的每一单元模块都是服从于进化理论的。这个架构是一个合并了所有组成成分的理想蓝图。在这样的情境下,将亲本的组成成分混合是十分合理的,因为其成分是一个完整的微型网络。为了使文章更简洁易懂,我在这个算法实施过程中避开了跨界交叉的问题,而是简单介绍了类似NEAT(或CoDeepNEAT)这样的解决方案。(我打算在下一篇文章中详细介绍这些解决方案。)  基本的构件  我们需要定义的第一件事情就是每一模型的解决方案空间,每一个个体都代表着一个架构。简洁起见,我们堆叠了n层,每一层都包含三个参数:a)隐藏单元的数量;b)激活类型;c)丢失率。对于通用参数,我们在不同的优化器、学习率、权重衰减和层数量中进行选择。  # definition of a space  # lower bound - upper bound, type param, mutation rate  LAYER_SPACE = dict()  LAYER_SPACE['nb_units'] = (128, 1024, 'int', 0.15)  LAYER_SPACE['dropout_rate'] = (0.0, 0.7, 'float', 0.2)  LAYER_SPACE['activation'] =\  (0, &['linear', 'tanh', 'relu', 'sigmoid', 'elu'], 'list', 0.2)  NET_SPACE = dict()  NET_SPACE['nb_layers'] = (1, 3, 'int', 0.15)  NET_SPACE['lr'] = (0., 'float', 0.15)  NET_SPACE['weight_decay'] = (0.04, 'float', 0.2)  NET_SPACE['optimizer'] =\  (0, ['sgd', 'adam', 'adadelta', 'rmsprop'], 'list', 0.2)  完成以上操作以后,我们已经定义了模型的空间。接着我们还需要建立三个基本功能:  随机选择一个网络  def random_value(space):  &&&Sample &random value from the given space.&&&  val = None  if space[2] == 'int':  val = random.randint(space[0], space[1])  if space[2] == 'list':  val = random.sample(space[1], 1)[0]  if space[2] == 'float':  val = ((space[1] - space[0]) * random.random()) + space[0]  return {'val': val, 'id': random.randint(0, 2**10)}  def randomize_network(bounded=True):  &&&Create a random network.&&&  global NET_SPACE, LAYER_SPACE  net = dict()  for k in NET_SPACE.keys():  net[k] = random_value(NET_SPACE[k])  if bounded:  net['nb_layers']['val'] = min(net['nb_layers']['val'], 1)  layers = []  for i in range(net['nb_layers']['val']):  layer = dict()  for k in LAYER_SPACE.keys():  layer[k] = random_value(LAYER_SPACE[k])  layers.append(layer)  net['layers'] = layers  return net  首先,我们任意地对层数量和每一层的参数进行采样,样本值会在预先定义好的范围边缘内出现下降。在初始化一个参数的同时,我们还会产生一个任意的参数id。现在它还不能使用,但我们可以追踪所有的层。当一个新的模型发生突变时,旧的层会进行微调,同时仅对发生突变的层进行初始化。这样的做法应该能够显著地加快速度,并稳定解决方案。  注意:根据问题性质的不同,我们可能需要不同的限制条件,比如参数的总量或层的总数量。  使网络发生变异  def mutate_net(net):  &&&Mutate a network.&&&  global NET_SPACE, LAYER_SPACE  # mutate optimizer  for k in ['lr', 'weight_decay', 'optimizer']:  if random.random() & NET_SPACE[k][-1]:  net[k] = random_value(NET_SPACE[k])  # mutate layers  for layer in net['layers']:  for k in LAYER_SPACE.keys():  if random.random() & LAYER_SPACE[k][-1]:  layer[k] = random_value(LAYER_SPACE[k])  # mutate number of layers -- RANDOMLY ADD  if random.random() & NET_SPACE['nb_layers'][-1]:  if net['nb_layers']['val'] & NET_SPACE['nb_layers'][1]:  if random.random()& 0.5:  layer = dict()  for k in LAYER_SPACE.keys():  layer[k] = random_value(LAYER_SPACE[k])  net['layers'].append(layer)  # value & id update  net['nb_layers']['val'] = len(net['layers'])  net['nb_layers']['id'] +=1  else:  if net['nb_layers']['val'] & 1:  net['layers'].pop()  net['nb_layers']['val'] = len(net['layers'])  net['nb_layers']['id'] -=1  return net  每一个网络元素都存在变异的可能性,每一次变异都将重新采样参数空间,进而使参数发生变化。  建立网络  class CustomModel():  def __init__(self, build_info, CUDA=True):  previous_units = 28 * 28  self.model = nn.Sequential()  self.model.add_module('flatten', Flatten())  for i, layer_info in enumerate(build_info['layers']):  i = str(i)  self.model.add_module(  'fc_' + i,  nn.Linear(previous_units, layer_info['nb_units']['val'])  )  self.model.add_module(  'dropout_' + i,  nn.Dropout(p=layer_info['dropout_rate']['val'])  )  if layer_info['activation']['val'] == 'tanh':  self.model.add_module(  'tanh_'+i,  nn.Tanh()  )  if layer_info['activation']['val'] == 'relu':  self.model.add_module(  'relu_'+i,  nn.ReLU()  )  if layer_info['activation']['val'] == 'sigmoid':  self.model.add_module(  'sigm_'+i,  nn.Sigmoid()  )  if layer_info['activation']['val'] == 'elu':  self.model.add_module(  'elu_'+i,  nn.ELU()  )  previous_units = layer_info['nb_units']['val']  self.model.add_module(  'classification_layer',  nn.Linear(previous_units, 10)  )  self.model.add_module('sofmax', nn.LogSoftmax())  self.model.cpu()  if build_info['optimizer']['val'] == 'adam':  optimizer = optim.Adam(self.model.parameters(),  lr=build_info['weight_decay']['val'],  weight_decay=build_info['weight_decay']['val'])  elif build_info['optimizer']['val'] == 'adadelta':  optimizer = optim.Adadelta(self.model.parameters(),  lr=build_info['weight_decay']['val'],  weight_decay=build_info['weight_decay']['val'])  elif build_info['optimizer']['val'] == 'rmsprop':  optimizer = optim.RMSprop(self.model.parameters(),  lr=build_info['weight_decay']['val'],  weight_decay=build_info['weight_decay']['val'])  else:  optimizer = optim.SGD(self.model.parameters(),  lr=build_info['weight_decay']['val'],  weight_decay=build_info['weight_decay']['val'],  momentum=0.9)  self.optimizer = optimizer  self.cuda = False  if CUDA:  self.model.cuda()  self.cuda = True  上面的类别将会实例化模型的“基因组”。  现在,我们已经具备了建立一个任意网络、变更其架构并对其进行训练的基本构件,那么接下来的步骤就是建立“遗传算法”,“遗传算法”将会对最佳个体进行选择和变异。每个模型的训练都是独立进行的,不需要其他有机体的任何信息。这就使得优化过程可以随着可用的处理节点进行线性扩展。  GP优化器的编码  &&&Genetic programming algorithms.&&&  from __future__ import absolute_import  import random  import numpy as np  from operator import itemgetter  import torch.multiprocessing as mp  from net_builder import randomize_network  import copy  from worker import CustomWorker, Scheduler  class TournamentOptimizer:  &&&Define a tournament play selection process.&&&  def __init__(self, population_sz, init_fn, mutate_fn, nb_workers=2, use_cuda=True):  &&&  Initialize optimizer.  params::  init_fn: initialize a model  mutate_fn: mutate function - mutates a model  nb_workers: number of workers  &&&  self.init_fn = init_fn  self.mutate_fn = mutate_fn  self.nb_workers = nb_workers  self.use_cuda = use_cuda  # population  self.population_sz = population_sz  self.population = [init_fn() for i in range(population_sz)]  self.evaluations = np.zeros(population_sz)  # book keeping  self.elite = []  self.stats = []  self.history = []  def step(self):  &&&Tournament evolution step.&&&  print('\nPopulation sample:')  for i in range(0,self.population_sz,2):  print(self.population[i]['nb_layers'],  self.population[i]['layers'][0]['nb_units'])  self.evaluate()  children = []  print('\nPopulation mean:{} max:{}'.format(  np.mean(self.evaluations), np.max(self.evaluations)))  n_elite = 2  sorted_pop = np.argsort(self.evaluations)[::-1]  elite = sorted_pop[:n_elite]  # print top@n_elite scores  # elites always included in the next population  self.elite = []  print('\nTop performers:')  for i,e in enumerate(elite):  self.elite.append((self.evaluations[e], self.population[e]))  print(&{}-score:{}&.format( str(i), self.evaluations[e]))  children.append(self.population[e])  # tournament probabilities:  # first p  # second p*(1-p)  # third p*((1-p)^2)  # etc...  p = 0.85 # winner probability  tournament_size = 3  probs = [p*((1-p)**i) for i in range(tournament_size-1)]  # a little trick to certify that probs is adding up to 1.0  probs.append(1-np.sum(probs))  while len(children) & self.population_sz:  pop = range(len(self.population))  sel_k = random.sample(pop, k=tournament_size)  fitness_k = list(np.array(self.evaluations)[sel_k])  selected = zip(sel_k, fitness_k)  rank = sorted(selected, key=itemgetter(1), reverse=True)  pick = np.random.choice(tournament_size, size=1, p=probs)[0]  best = rank[pick][0]  model = self.mutate_fn(self.population[best])  children.append(model)  self.population = children  # if we want to do a completely completely random search per epoch  # self.population = [randomize_network(bounded=False) for i in range(self.population_sz) ]  def evaluate(self):  &&&evaluate the models.&&&  workerids = range(self.nb_workers)  workerpool = Scheduler(workerids, self.use_cuda )  self.population, returns = workerpool.start(self.population)  self.evaluations = returns  self.stats.append(copy.deepcopy(returns))  self.history.append(copy.deepcopy(self.population))  “进化算法”看起来非常简单,对吗?没错!这个算法可以非常成功,尤其是当你为个体定义了好的变异或跨界功能时。  存储库中还包含了一些额外的使用类别,比如工作器类和调度器类,使GP优化器能够独立平行地完成模型训练和评估。  运行代码  按照上述步骤操作运行。  &&&Tournament play experiment.&&&  from __future__ import absolute_import  import net_builder  import gp  import cPickle  # Use cuda ?  CUDA_ = True  if __name__=='__main__':  # setup a tournament!  nb_evolution_steps = 10  tournament = \  gp.TournamentOptimizer(  population_sz=50,  init_fn=net_builder.randomize_network,  mutate_fn=net_builder.mutate_net,  nb_workers=3,  use_cuda=True)  for i in range(nb_evolution_steps):  print('\nEvolution step:{}'.format(i))  print('================')  tournament.step()  # keep track of the experiment results & corresponding architectures  name = &tourney_{}&.format(i)  cPickle.dump(tournament.stats, open(name + '.stats','wb'))  cPickle.dump(tournament.history, open(name +'.pop','wb'))  接下来,让我们一起来看看运行的结果!  这是50个解决方案的得分结果,比赛规模为3。这些模型仅接受了10000个样本的训练,然后就被评估了。乍一看,进化算法似乎并没有起到太大的作用,因为解决方案在第一次进化中就已经接近最佳状态了;而在第七阶段,解决方案达到了它的最佳表现。在下图中,我们用了一个盒式图来依次描述这些解决方案的四分之一。我们发现,大多数方案都表现的很好,但在方案进化的同时,这个盒式图也随之紧缩了。  图中的这个盒子展示了方案的四分之一,而其盒须则延伸展示了剩余四分之三的方案分布。其中的黑点代表着方案的平均值,从图中我们会发现平均值的上升趋势。  为了进一步理解这一方法的性能和表现,我们最好将其与一个完全随机的种群搜做相比较。每个阶段之间都不需要进化,每个解决方案都要被重新设置为一个随机的状态。  在一个相对较小的(93.66% vs 93.22%)里进化算法的性能较好。而随机种群搜索似乎生成了一些好的解决方案,但模型的方差却大大增加了。这就意味着在搜索次优架构的时候出现了资源浪费。将这个与进化图相比较,我们会发现进化确实生成了更多有用的解决方案,它成功地使那些结构进化了,进而使之达到了更好的性能表现。  MNIST是一个相当简单的数据集,即使是单层网络也能达到很高的准确度。  像ADAM这样的优化器对学习率的敏感度比较低,只有在它们的网络具备足够的参数时,它们才能找到比较好的解决方案。  在训练过程中,模型只会查看10000个(训练总数据的1/5)样本示例。如果我们训练得时间再长一些,好的架构可能会达到更高的准确度。  限制样本数量对于我们学习的层的数量同样非常重要,越深层的模型需要越多样本。为了解决这个问题,我们还增加了一个移除突变层,使种群调节层的数量。  这个实验的规模还不足以突出这种方法的优势,这些文章中使用的实验规模更大,数据集也更复杂。  我们刚刚完成了一个简单的进化算法,这个算法很好地诠释了“物竞天择”的主题。我们的算法只会选择最终胜利的解决方案,然后将其变异来产生更多的后代。接下来,我们需要做的就是使用更先进的方法,生成和发展方案群。以下是一些改进的建议:  为通用层重新使用亲本的权重  将来自两个潜在亲本的层合并  架构不一定要连续的,你可以探索层与层之间更多不一样的联系(分散或合并等)  在顶部增加额外的层,然后进行微调整。  以上内容都是人工智能研究领域的一个课题。其中一个比较受欢迎的方法就是NEAT及其扩展。EAT变量使用进化算法在开发网络的同时,还对网络的权重进行了设置。在一个典型的强化学习场景下,代理权重的进化是非常有可能实现的。但是,当(x,y)输入对可用时,梯度下降的方法则表现得更好。
相关文章关键词:IT 自动机器学习 神经网络进化
热门技术文章
最新技术文章

我要回帖

 

随机推荐