CMU 15-445 数据库课程第四课文字版 - 存储2(中)
假设元组的 c 属性是一个 VARCHAR 类型并且保存的值很大,那么元组内在 c 的位置会保存一个指针,它会指向存储在溢出页中的 varchar 数据。溢出页可能一页存不下,不止一页大小,所以会是一个页链表。这在不同的系统中有不同的叫法:postgres 称它为 toast,如果大于2KB,溢出页就会出现MySQL:大于页大小的一半就会出现溢出页SQL Server:大于页大小才会出现溢出页除了溢出页还有另一种方式即存储为外部文件某些 DBMS 允许你将这种大值存储到外部的文件中,以 BLOB 的方式处理这个数据,例如:Oracle: BFILE 数据类型Microsoft:FILESTREAM 数据类型我们一般不不适合存储进数据库的大数据放入外部文件存储,例如视频、图片等等。我们只是存储了一个指向数据的指针,实际指向的数据位于文件系统的其他地方,我们可以在需要的时候引用它。但是这样就丧失了 DBMS 对其的管理特性,例如不能保证外部是否有修改或者删除这个外部文件,不能保证事务性修改等等。对于非不适合放入数据库存储的那种大数据,比如大 JSON 等等,Jim Gray 曾经有一篇论文研究,评估数据大小对于是直接在溢出页面内存储blob好,还是在外部存储blob更好的影响,这是一篇 15 年前的论文,这篇论文得出的结论是,他们得出的结论是256KB的大小在外部存储更有利,现在这个数字可能变得更大了。但是我们要记住,如果它存储在DBMS中,我们每次都要把这些巨大的对象通过很多页写入和从磁盘中读取,这是我们要考虑的权衡。3. 系统目录(System Catalog)我们接下来要讲的是系统级别的目录,DBMS 需要在内部保存所有关于数据库的元数据以便于他能需要知道如何编码和解码存储在代表元组的字节中的数据。一般存储关于表,列,索引,视图的结构信息,诸如此类的结构信息。DBMS 通常还存储有关用户和权限的信息,就像访问权限,即用户应该能够查看或修改哪些数据。最后,DBMS 还存储了大量的内部统计数据,比如不同值的数量,或者连接基数,或者数据范围之类的,这些是构建查询计划,查询执行中非常重要的。大部分的 DBMS 都将数据库存储为目录类型的结构,前面我们说过,在这个系统目录中也会存储关于表,列,索引,视图的结构信息,这些结构信息也像普通的表一样存储。那么现在就有了鸡生蛋蛋生鸡的问题,我们需要这些结构信息解析读取表数据,但是这些信息也以表的形式存储。所以一般的设计是它们有这些特殊的元数据对象包装器,系统可以用来直接编码和解码存储在系统目录中的值。用户可以查询 DBMS 的这个内部目录,它通常存储在这个 INFORMATION_SCHEMA 中,以获取关于数据库的信息以及各种统计信息等等。这被 ANSI 标准定义为只读视图的集合,在它标准化之前,这曾经很混乱,每个系统都有自己的方式来暴露这些元数据。现在有了这个标准,大家都可以通过访问 INFORMATION_SCHEMA 来访问这些信息。不过不同的系统还是暴露了其他的一些等价的快捷方式命令访问这些信息,比如:这是列出某个数据库中所有表的命令:SQL-92 标准中是:select * from information_schema.tablesPostgres 中是:\dMySQL 中是:show tablessqlite 中是:.tables这是查看某个表的详细信息的命令:SQL-92 标准中是:select * from information_schema.tables where table_name = 'student'Postgres 中是:\d studentMySQL 中是:DESCRIBE studentsqlite 中是:.schema student4. 数据库工作负载类型(Database Workload)我们主要有三种不同类型的数据库工作负载:第一个是在线事务处理,简称 OLTP(Online Transaction Processing):这意味着你有很多快速短小的运行操作,即每次只读取或更新一小部分数据。例如你的银行账户场景,比如你想要得到你银行账户的余额,你只是读取一个值,或者如果你想做一笔交易,比如存款,这是一笔相当短的交易。还有就是像亚马逊这样的网上商店,你浏览不同的产品把它们加到你的购物车结账付运费,你访问的数据量相对于亚马逊提供的所有产品来说是相对较小的,但是如果你思考下世界上有很多同时购物的人,这就积少成多了,即各个事务访问或修改的数据量积少成多了。第二个是在线分析处理,简称 OLAP(Online Analytical Processing):这些有点像分析查询,读取大量的数据,扫描表的大部分,会产生聚合,有很多表之间的连接,通常用于决策支持或商业智能。同样是亚马逊的例子,比如亚马逊想知道在过去的一个月里,CMU 学生购买最多的五个商品是什么。这种查询需要扫描一个大的样本,而不仅仅是更新单个或读取单个记录。最后一个是最近越来越流行的混合事务和分析处理,简称 HTAP(Hybrid Transaction and Analytical Processing):目标是能够把 OLTP 和 OLAP 放在同一个数据库实例上,事务处理和分析同时运行,这样能够得到关于交易数据更快或更实时的见解。这个坐标图可能更直观些,X 轴是从写多读少到读多写少,Y 轴是请求复杂度,从简答到复杂。OLTP 的工作负载更多的是写多一些并且比较简单的请求,OLAP 的工作负载更多的是读多一些并且比较复杂的请求,HTAP 介于两者之间。在实际使用中,一般公司会建立 OLAP 与 OLTP 独立的环境:因此,在一端你通常会有多个 OLTP 数据筒仓,这里做所有的在线业务请求;另一端非常大的 OLAP 数据仓库,你要在数据仓库转储所有的数据筒仓的数据以供分析。我们需要从数据筒仓到数据仓库的数据传输,主要通过这个 ETL(Extract Transform Load,提取、转换、加载)过程:我们从这些不同的数据筒仓中提取所有的数据,这些数据格式可能与我们最终需要的数据格式有差异,所以我们需要转换这些数据,并且对数据做一些处理,比如合并,删除重复等等,最后加载到数据仓库中。还有一些数据分析的结果需要从数据仓库传回数据筒仓中,例如一些产品推荐信息,在你访问商品网页时为你推荐的产品。HTAP 的思想就是让这些事务工作与查询工作一起并发执行,并省略很多中间的同步操作。为什么区分不同类型的工作负载很重要?回顾一下关系模型,它为我们对数据进行不同操作提供了一定的规则和要求,但它并没有告诉我们在物理上我们需要如何存储数据。我们需要根据我们的业务即工作负载的类型,来决定我们的数据如何存储。我们前面主要讲的主要是基于行的存储,即某一个元组的所有属性的数据都紧密的保存在一起。但是这种设计并不适用所有的场景,我们来看一个维基百科的例子:
云起学习小记
这次举办的活动非常的好,一共有五期,分别是从零到一上手玩转云服务器、Linux操作系统实战入门、MySQL数据库进阶实战、零基础容器技术实战、轻松入门学习大数据。让我们以练带学的方式去学习这些基础知识。感谢云起实验室举办的那么好的活动。第一期学习非常的有意思,实验难度适中。0基础的同学也可以快速入门。第一期我们学习了上云基础,动手实操ECS云服务器,动手快速搭建LAMP环境、使用ECS服务器部署MySQL数据库、通过workbench远程登录ECS,快速搭建Docker环境》及 《从零搭建Spring Boot的Hello World》、使用PolarDB和ECS搭建门户网站,整体来说这一周的学习还是很丰富的。从零到上手玩转云服务器。了解了ECS服务器的基本操作、了解了基本应用例如LAMP、Docker的安装。 第二期是Linux基础。让我们一起好好学习吧。
飞天加速计划初体验
我是一名来自大二的学生,学习的是软件技术专业。通过老师推荐了解到“飞天加速计划·高校学生在家实践”活动,它给我提供了一个可以学习的大平台。我认为这个飞天加速计划对于我这样的大学生帮助真是太大了,我觉得这是个良好的平台能够更好的让我进行实践,通过云服务器远端部署自己的项目就是一件非常重要的事情。 之前因为也学过Linux,使用的是CentOS7的操作系统,但是由于在本机上通过VMWare开启虚拟机,过程相当的缓慢繁琐,且在本机上部署虚拟机其实也没有什么真正使用服务器的实感,因此在通过一些与服务器有关的视频及博客教程中,了解到了阿里云服务器,然后发现了阿里云对于高校学生的优惠服务---飞天加速计划,这令我相当惊喜。 在完成了相关的前置任务后,我成功领取到了ECS的限期免费使用权,通过阿里云附带的详细的有关ECS的实例c创建部署的帮助文档引导后,成功创建了ECS实例,并通过windows下的XShell工具,远程地连接上了我创建的ECS的实例,在XShell中一切命令都会如实地操控我的远端服务器,至此,我才真正感觉到了,哦,原来云服务器是这种感觉! 阿里云非常好,为祖国的科技人才成创造出了一个免费的平台,供广大网友和各路人才进行使用。在领取之前还会有一个教程和简单的测试,以便更好的使用。领取服务器之后,立马连接上使用一番。我还是很推荐远程操作工具的Xshell7的,这个软件不仅支持中文,而且完全免费,并且功能非常强大。连接之后第一件事是什么,当然是装宝塔了!装宝塔面板的速度很快,打开面板的速度简直是秒开,速度很快,宝塔一键部署的软件5分钟不到就装好了,真的很棒。 对于程序员或者对编程感兴趣的人来说,拥有自己的云服务器,通过远端部署自己的项目,无论是博客也好,还是其他什么也好,都是一件相当酷的事情,阿里云的飞天加速计划让我初步体验了云服务器的使用,也希望更多的同学能够接触到“云”,有自己的云上之家。
飞天加速计划初体验
我是一名来自大二的学生,学习的是软件技术专业。通过老师推荐了解到“飞天加速计划·高校学生在家实践”活动,它给我提供了一个可以学习的大平台。我认为这个飞天加速计划对于我这样的大学生帮助真是太大了,我觉得这是个良好的平台能够更好的让我进行实践,通过云服务器远端部署自己的项目就是一件非常重要的事情。 之前因为也学过Linux,使用的是CentOS7的操作系统,但是由于在本机上通过VMWare开启虚拟机,过程相当的缓慢繁琐,且在本机上部署虚拟机其实也没有什么真正使用服务器的实感,因此在通过一些与服务器有关的视频及博客教程中,了解到了阿里云服务器,然后发现了阿里云对于高校学生的优惠服务---飞天加速计划,这令我相当惊喜。 在完成了相关的前置任务后,我成功领取到了ECS的限期免费使用权,通过阿里云附带的详细的有关ECS的实例c创建部署的帮助文档引导后,成功创建了ECS实例,并通过windows下的XShell工具,远程地连接上了我创建的ECS的实例,在XShell中一切命令都会如实地操控我的远端服务器,至此,我才真正感觉到了,哦,原来云服务器是这种感觉! 阿里云非常好,为祖国的科技人才成创造出了一个免费的平台,供广大网友和各路人才进行使用。在领取之前还会有一个教程和简单的测试,以便更好的使用。领取服务器之后,立马连接上使用一番。我还是很推荐远程操作工具的Xshell7的,这个软件不仅支持中文,而且完全免费,并且功能非常强大。连接之后第一件事是什么,当然是装宝塔了!装宝塔面板的速度很快,打开面板的速度简直是秒开,速度很快,宝塔一键部署的软件5分钟不到就装好了,真的很棒。 对于程序员或者对编程感兴趣的人来说,拥有自己的云服务器,通过远端部署自己的项目,无论是博客也好,还是其他什么也好,都是一件相当酷的事情,阿里云的飞天加速计划让我初步体验了云服务器的使用,也希望更多的同学能够接触到“云”,有自己的云上之家。
阿里云ECS使用体验
自我介绍我是一名大三在读的大数据专业的学生,近期刚好有与Linux的相关课程,课程中老师有提到使用阿里的云服务器,或者使用VM本地虚拟机。同时近期也在自学spring,vue等等技术后,完成了一个后台系统的部分内容,想尝试结合课程所学的知识,尝试完成一次远程部署。使用体验入手的第一个问题便是关于服务器的安全组规则的配置问题,尤其在使用Nginx时产生了矛盾,这是和使用本地虚拟机极大的一个不同点,阿里云的防火墙和服务器的防火墙是独立的,以一种类似串联的方式运行,如果想要开放某一端口,需要同时保证在安全组规则,以及服务器防火墙中同时开放该端口。但其实在真正使用的过程中我遇到的问题远不止于此,在解决问题过程中,我不断的查阅资料,寻求解决方法,这使我收获颇丰;其次,是使用Xshell建立本地通信;最后便是各种环境的搭建,无论是从流畅度,还是操作体验来说,相较于本地虚拟机都要好很多。本次体验涉及到的工具:Xshell配置的软件环境:JDK1.8,MySQL5.7,Nginx1.20.1,Redis收获总结在疫情反弹的当下,我们只能在家学习,在此非常感谢阿里云可以提供如此好的一个平台,对于我们学生而言,并没有太多的经济来源,但阿里云给了我们一个免费,实用,友好的环境,让我们自己完成一个服务器配置,学习了解云服务的知识,将自己的项目部署到云服务器上,这对我们的学习来说是有极大实践意义的。通过这一次的体验,我相信无论是作为学习者还是开发者,阿里云都一定会是个不错的选择。
飞天加速计划初体验
我是一名来自大二的学生,学习的是软件技术专业。通过老师推荐了解到“飞天加速计划·高校学生在家实践”活动,它给我提供了一个可以学习的大平台。我认为这个飞天加速计划对于我这样的大学生帮助真是太大了,我觉得这是个良好的平台能够更好的让我进行实践,通过云服务器远端部署自己的项目就是一件非常重要的事情。 之前因为也学过Linux,使用的是CentOS7的操作系统,但是由于在本机上通过VMWare开启虚拟机,过程相当的缓慢繁琐,且在本机上部署虚拟机其实也没有什么真正使用服务器的实感,因此在通过一些与服务器有关的视频及博客教程中,了解到了阿里云服务器,然后发现了阿里云对于高校学生的优惠服务---飞天加速计划,这令我相当惊喜。 在完成了相关的前置任务后,我成功领取到了ECS的限期免费使用权,通过阿里云附带的详细的有关ECS的实例c创建部署的帮助文档引导后,成功创建了ECS实例,并通过windows下的XShell工具,远程地连接上了我创建的ECS的实例,在XShell中一切命令都会如实地操控我的远端服务器,至此,我才真正感觉到了,哦,原来云服务器是这种感觉! 阿里云非常好,为祖国的科技人才成创造出了一个免费的平台,供广大网友和各路人才进行使用。在领取之前还会有一个教程和简单的测试,以便更好的使用。领取服务器之后,立马连接上使用一番。我还是很推荐远程操作工具的Xshell7的,这个软件不仅支持中文,而且完全免费,并且功能非常强大。连接之后第一件事是什么,当然是装宝塔了!装宝塔面板的速度很快,打开面板的速度简直是秒开,速度很快,宝塔一键部署的软件5分钟不到就装好了,真的很棒。 对于程序员或者对编程感兴趣的人来说,拥有自己的云服务器,通过远端部署自己的项目,无论是博客也好,还是其他什么也好,都是一件相当酷的事情,阿里云的飞天加速计划让我初步体验了云服务器的使用,也希望更多的同学能够接触到“云”,有自己的云上之家。
一文看懂AutoML(三)
其他从整体流程上来看,NAS方法还可以分为一阶段和两阶段。两阶段是一般做法,第一个阶段就是搜索评估阶段,选出最好的架构,第二个阶段就是retrain这个最优架构,在验证集上评估。而一阶段就是只需要训练一次超网络,联合优化架构参数和模型权重,之后不需要再retrain了。比如比较有名的Once-for-all,采用了progressive shrinking算法来使得子网络之间的性能相互不受到影响。NAS还可以分为one-shot和non-one-shot,one-shot意思就是搜索空间重合的,可以重复利用之前的参数,比如ENAS、网络态射、ProxylessNAS等都是的。大多数NAS都只是把最终的效果当作目标,其实在移动端部署上还要考虑延时、模型大小、计算量等目标,一般都是解帕累托最优,比如MnasNet考虑到了延时。开放性问题搜索空间的灵活性现在的搜索空间基本都还是人为定义的,参考了很多人类设计神经网络的经验,比如原子操作定义成conv、pooling之类的,结构上cell堆叠等等,但是真正的auto应该是模型自动设计网络架构和原子操作,比如AutoML-Zero就用最基本的原子操作(sin、cos、mean、std等)设计出了两层的神经网络。这一块应该是今后的一大方向,例如目前工作主要在CV上,而对于NLP的Transformer模型,搜索空间如何定义的很好?目前工作还寥寥无几,看了几篇也都是堆叠conv,分支结构之类的。探索更多的领域如上所说,目前大多数工作都是在CV上,搜的是conv结构,而像NLP、语音等领域探索甚少,像多目标领域也只有很少的工作(韩松老师组工作很多),即使是在CV,任务也大多数局限在CIFAR-10和ImageNet上。可解释性搜出来的网络为什么好?现在人类设计的网络大多数都能强行解释一下好处,即使它仍然是个黑盒。但是NAS搜出来的基本看不出设计的逻辑。可复现之前也说了,例如演化算法和强化学习这一类方法训练很不稳定,很难复现出结果。很多论文也都只是公开了最好的模型,都不放出源码的(当然我并没有质疑他们),超参数之类的也有些没有公布,这导致我们平民玩家没法复现,没法用啊。而且大家评测的环境都不相同,众说纷纭,没法公平比较,因此也有一些工作提出了NAS统一的数据集来评测。鲁棒性如果目标领域数据添加了噪声,可能会对搜出来的模型产生很大影响。所以如何搜出更加鲁棒、能适应不同领域或者有噪声数据的结构可能是未来的一个研究方向。联合超参优化和架构优化目前大多数NAS方法都是先搜出最优架构,再调整超参在目标领域上retrain,如何同时学好这两块也是一个方向。完全的AutoML的pipeline做到从数据收集开始一直到最后的模型生成训练全部流程化,不需要人为参与,那样才是真正的智能。目前的话有一些比较好的开源工具了,AutoKeras、NNI等等。终身学习当新的数据源源不断进来时,当只有少量有标签数据或者有大量无标签数据时,如何做NAS,有几个不错的工作,比如UnNAS是做无监督NAS的,MetaNAS是结合meta-learning的。经典论文简析(NAS)[ICLR 17] Neural Architecture Search with Reinforcement Learning动机用强化学习来采样网络,生成出最优网络结构,避免人工设计。方法用RNN来预测CNN或者RNN的结构,采样结构,下游任务效果作为强化学习得分,策略梯度更新参数。CNN预定义好层数,LSTM每5层预测CNN一层的5个参数。RNN预定义好cell的计算拓扑图,LSTM预测每个node的计算逻辑。实验接近人类设计网络的最好水平。速度超慢,800 K40,28天,只适用于小数据集例如CIFAR-10。评价强化学习应用到NAS的第一篇论文。(NASNet)[CVPR 18] Learning Transferable Architectures for Scalable Image Recognition动机RL直接搜太慢了,只能用在小数据集,ImageNet之类的大数据集没法用。方法提出了NASNet,用堆叠相同cell的方式减小搜索空间。在CIFAR-10上面学习cell结构,通过增加堆叠层数的方式迁移到ImageNet上去。用PPO替代策略梯度。选择之前的两个node,分别预测对应op,然后预测合并op。实验效果和参数量都好于前作,达到了SOTA水平。速度加快很多,500 P100,4天,相比于前作加速7倍。评价NASNet,通过cell堆叠加快了结构搜索的速度,同时效果达到了SOTA,并且容易迁移到其他任务上去。(ENAS)[ICML 18] Efficient Neural Architecture Search via Parameter Sharing动机之前的方法采样出一个结构,在dev上得到acc,然后就会抛弃权重,重新采样训练,非常耗时。方法定义一个超图,每次搜出的子图共享权重。对于RNN cell,LSTM的每两个step预测之前某个node作为输入,再预测op,最后出度0的node拼接作为输出。对于CNN,一种策略是直接生成整个网络,每个node先预测之前哪些作为输入,然后预测op。另一种策略和NASNet类似,堆叠cell,搜索空间缩小到一个cell。实验优于NAS和NASNet,1 1080Ti,16小时,相比NAS加速1000倍。评价训练速度很快,AutoKeras背后就采用了ENAS。(DARTS)[ICLR 19] DARTS: Differentiable Architecture Search动机离散结构搜索太慢了,采样+验证+反馈的循环很耗时。方法连续域结构搜索代替离散域结构搜索,用微分来优化结构。两套参数:模型参数(训练集优化)、结构参数(验证集优化)。交替优化两套参数,softmax+relax学习最终结构。实验效果达到或接近了SOTA,速度上比ENAS慢,比其他的方法快。评价第一个用可微分方法做NAS的,第一个连续空间搜索代替离散空间搜索。[ICLR 19] Rethinking the Value of Network Pruning动机现有的剪枝方法存在问题,很多操作不合理,没有必要。方法传统剪枝方法基于两个假设:过参数化很重要,训练大模型再剪枝优于直接训练剪枝后的模型。继承大模型参数,再finetune很重要,优于随机初始化剪枝后模型再重新训练。本文认为都不一定对:对于预定义好的模型,直接训练可以达到和训练-剪枝-finetune相同甚至更好的效果。大模型剪枝后,随机初始化重新训练,效果和继承参数finetune差不多。所以本文认为剪枝后的结构重要,而参数不是那么重要。实验一系列实验结果验证了猜想,此外本文还否定了彩票假设,认为剪枝后随机初始化即可,没必要和原始初始化相同。评价仍然有一些局限性,比如数据分布均衡、模型比较大,估计在其他设置下不一定work。而且不如finetune速度快。参考链接不错的综述或讨论https://lilianweng.github.io/lil-log/2020/08/06/neural-architecture-search.htmlhttps://jinzhuojun.blog.csdn.net/article/details/84698471http://www.tensorinfinity.com/paper_136.htmlhttps://zhuanlan.zhihu.com/p/73785074https://www.zhihu.com/question/359162202https://github.com/pzhren/Awesome-NASNeural Architecture Search: A SurveyA Comprehensive Survey of Neural Architecture Search: Challenges and SolutionsAutoML: A Survey of the State-of-the-ArtA Comprehensive Survey of Neural Architecture Search: Challenges and Solutions一些经典论文Neural Architecture Search with Reinforcement LearningDesigning Neural Network Architectures using Reinforcement LearningEfficient Neural Architecture Search via Parameter SharingLearning Transferable Architectures for Scalable Image RecognitionDARTS: Differentiable Architecture SearchNeural Architecture OptimizationFP-NAS: Fast Probabilistic Neural Architecture SearchSNAS: Stochastic Neural Architecture SearchEfficientNet: Rethinking Model Scaling for Convolutional Neural NetworksOnce for All: Train One Network and Specialize it for Efficient DeploymentRethinking the Value of Network PruningTextNAS: A Neural Architecture Search Space Tailored for Text RepresentationThe Evolved TransformerHAT: Hardware-Aware Transformers for Efficient Natural Language ProcessingSearching Better Architectures for Neural Machine Translation一些经典源码或工具https://github.com/quark0/dartshttps://github.com/melodyguan/enashttps://github.com/mit-han-lab/once-for-allhttps://github.com/mit-han-lab/hardware-aware-transformershttps://github.com/microsoft/nnihttps://github.com/IntelLabs/distillerhttps://autokeras.com/参考资料[1]AutoML: A survey of the state-of-the-art: https://arxiv.org/abs/1908.00709作者简介:godweiyang,知乎同名,华东师范大学计算机本硕,字节跳动算法工程师,研究方向句法分析、机器翻译、模型压缩。
一文看懂AutoML(二)
网络态射这类方法主要思想就是在已经训练好的成熟网络基础上增加宽度、深度等等,继承父网络的参数,加速子网络的训练。首先是Net2Net,扩展分为两个方向,一种是宽度上的,一种是深度上的,不能同时进行。因此后来就有了网络态射,可以处理任意线性层和非线性层,并且深度和宽度上可以同时扩展。架构优化定义好搜索空间后,就要采用架构优化算法来搜索出最优的架构了。演化算法演化算法就是模仿的生物进化过程。首先要对网络架构进行编码,方便之后的操作。可以将图结构编码为二进制串,但是这样固定长度不灵活。于是就有了Cartesian genetic programming、Neuro evolution of augmenting topologies、Cellular encoding等各种编码方法,详细就不介绍了。一般演化算法分为四步:选择、交叉、变异、替换。选择。就是从候选的网络架构中挑选出适应度最高的,一种可以直接挑绝对值最高的,另一种可以挑相对值最高的,第三种比较有名的是锦标赛选择算法,也就是放回抽样,每次等概率随机选k个,挑出最好的那一个,进入下一代,其余放回,重复上述操作。交叉。交叉方式和编码方式有很大关系,变异。上面两步做完后,有很多方式可以对个体进行变异,比如随机翻转某一位,随机增加或者删除两层之间的连接等等。替换。新的个体加入种群后,旧的个体要被删除掉。可以删除最久之前的,也可以删除效果最差的,也有工作一个都不删除,只要你内存和时间顶得住。强化学习强化学习主要思想就是用一个控制器(一般是RNN)来生成网络架构,然后评估得到得分作为反馈更新控制器参数。有用策略梯度的,也有用Q-learning的,还有用PPO算法的等等。第一篇NAS论文就是用的RL,但是这一类方法普遍很费卡,一般人玩不起。梯度下降前两种都是在离散空间搜结构,梯度下降方法是将离散空间变为了连续空间。第一个提出的是DARTS,在两个结点之间定义了若干种操作,然后做softmax,最后在评估的时候取argmax。这种方法也有不好,比如成倍增加了显存,本来一条边现在需要成倍的计算量,此外用了代理任务,在小数据集上训的层数比较少,迁移到大数据集上层数又很多。也有解决方法,比如P-DARTS,随着训练进行逐渐加层数,为了减小计算量,还逐渐减少了每条边上的操作数。而GDAS每次只选概率最大的那个操作边做前向,反向传播用gumbel softmax。两套参数联合优化也是很困难的,DARTS用的是交替优化,一次优化结构参数,一次优化模型权重。最后还有个问题,就是搜索后期会倾向于搜索残差连接之类的操作,这不好。于是DARTS+发现一个cell里出现两个或以上残差连接后就直接停止。P-DARTS则是给残差加了正则化,减小出现的次数。代理模型这一类方法(SMBO)使用一个代理模型来指导最优模型的生成。传统的方法有贝叶斯优化(高斯过程、随机森林、TPE等等),就不详细介绍传统方法了。也有用神经网络当作代理模型的,比如PNAS、EPNAS、NAO都用一个LSTM或者MLP将离散的结构编码成连续的表示,然后预测性能,接着找出性能最高的最优表示,用解码器还原出离散的结构。网格和随机搜索这就是最原始最普通的优化方法,比如直接在搜索空间随机搜索结构,然后评估,最后取最优的就行了。虽说随机搜索听起来不大行,但实际出来的效果,能和大多数NAS方法达到相似效果,还很简单。混合优化方法上面这么多方法混合在一起,可能效果会更好。演化算法是全局优化的,鲁棒性很强,但是随机性有点大,不稳定,计算消耗也大。强化学习也是的,训练很不稳定。梯度下降方法训练快,但是需要提前定义好超网络结构,限制了结构的多样性。演化算法可以结合强化学习、梯度下降、SMBO,梯度下降也可以结合SMBO等等,这里就不详细介绍了,典型的例子有Evo-NAS、NAO等等。超参优化这一步其实是脱离了NAS的,就和一般的超参优化一样,网络搜索、随机搜索、贝叶斯优化、梯度优化等等方法,这里不做过多介绍了。模型评估在模型生成之后,需要对模型进行评估,然后指导架构优化模块生成更好的架构。最一般的方法就是从头开始训练到收敛,但是这样太慢了,一般都要生成个几百万以上的架构的,训练时间太久了。低保真度可以在评估时降低数据集的分辨率,降低cell堆叠的层数,使用小数据集等等,这样可以快速得到架构的大致效果,但是最后得到的架构可能在目标数据集上不是全局最优的。权重共享比如ENAS,可以在多次评估模型性能时,继承之前相同node的参数,可以加快收敛速度。网络态射也是用到了权重共享。代理模型直接学习一个预测器,输入是网络架构,输出是它的性能,当然这需要提前先训练一些模型,得到(架构,性能)的若干数据,然后才能学习出这个预测器,PNAS就是这么干的。当然预测器的学习数据肯定不会多,所以SemiNAS就用半监督的方法,利用大量无标注的结构去预测出性能,加入到训练集中继续优化预测器。early stop可以只训练几轮,然后根据前期的学习曲线预测出最终的性能。一些讨论效果对比可以看出,演化算法和强化学习搜索时间都非常长,除了个别几个用了权重共享之类技巧的。梯度下降方法全部都挺快的,但是整体效果都不如其他几类方法。
一文看懂AutoML(一)
介绍首先这篇综述是讲AutoML的,不单单是NAS,但是因为NAS是AutoML中最最重要的一部分,所以主要篇章还是用来讲NAS了。据作者所说,应该是第一篇完整讲述AutoML整个流程的综述。首先,本文将AutoML划分成了如下几个流程:先是数据准备,然后是特征工程,接着是模型生成,最后就是模型评估了。其中模型生成又可以分为搜索空间和优化方法,搜索空间有传统的ML模型或者DL模型,优化方法又分为超参数优化和结构优化。NAS的话主要就涉及到DL模型的搜索空间定义、结构优化和模型评估策略这三块。因为我主要关注NAS这块,所以其他部分就只简单介绍一下,不做过多解读。数据准备看上面这个图应该很清楚了,数据准备主要分为数据收集、数据清洗和数据增强三个部分。数据收集有开源的就去下开源的,没开源的就去互联网上爬,要是什么都没有呢,那就通过GAN之类的技术来生成伪数据,有总比没有好嘛。数据清洗就是清洗数据中的噪声、脏数据,这一过程可能需要一些知识去判断什么是噪声。还有一个研究主题就是如何清洗每天更新的源源不断的新数据。数据增强数据增强某种程度上也可以被视为数据收集的一种工具,因为效果都是一样的,增加了新数据。但是它的目的有所不同,主要是为了防止模型过拟合。上图针对不同数据有很多增强方法,这里就不介绍了。特征工程有句话叫:数据和特征决定了机器学习的上界,而模型和算法只是为了去近似这个上界。主要可以分成三块,特征选择、特征构建和特征提取。这里也不多介绍了,因为在DL里特征工程用得很少,DL模型可以自己从数据中学出特征,很少需要自己手动构造特征了。模型生成从这块开始进入到了NAS的领域。之前说了,搜索空间分为ML和DL两块,本文只关注DL,而优化方法又分为超参优化和网络架构优化,本文也主要只关注网络架构优化,因为超参优化是挑选出最优网络架构之后的事情了,不过也有工作将NAS用在超参优化上的,这个就不在讨论范围内了。上面两张图是NAS的一般流程:首先针对不同的任务定义一个搜索空间,这个搜索空间就决定了你搜出来的网络架构可能长什么样子,也决定了你搜出来的架构可能性有多少,当然是越大越好,但是带来的后果就是搜索速度太慢。然后在这个搜索空间里进行搜索,采样出一个比较好的模型架构,这里方法就非常多了,最简单的就是随机搜索,随机采样一个网络架构。最后就是在训练集上评估你采样出的架构效果,反馈给架构优化,让它优化,然后继续采样,循环下去。评估方法也有很多,最简单的就是像正常训练模型那样完整训练一遍,得到效果,但是这样太慢了,因此需要其他方法来加速训练或者估计效果。搜索空间神经网络可以看作是一个DAG,而如何定义这个DAG,其实你可以用生成图的方式做加法生成它,也可以做减法,从大图中抽取出子图等等,有很多方法。定义搜索空间需要人类知识,这一步目前还不够Auto,定义的好,生成出来的架构才可能好。而有些工作发现只要你搜索空间定义的足够好,随机搜索都能达到和各种架构优化方法相似的效果,那么NAS将变得毫无意义,所以这一块还是挺玄学的。整体结构搜索就是按照DAG的拓扑序,依次生成出模型架构出来。一般来说,用一个RNN来生成,每生成一个node,都要预测出它的输入是哪些node(残差)、作用在它上面的op有哪些。但是这种方法太慢了,搜索的复杂度是指数级别的,因此在最初的几篇RL论文里,都用了几百个GPU训练了几十天才搜出来,穷苦人家可搜不起。cell搜索这种方式也是借鉴了人类设计神经网络的经验,像ResNet系列都是将一个个cell层层堆叠得到的,因此如果只搜一个cell,然后将相同的cell堆叠起来岂不是大大减小了搜索空间。后面的很多工作都是基于cell来搜索的,比如NASNet。在NASNet中,cell被分成了两种,一种是normal cell,它的输入输出维度保持相同,另一种是reduction cell,它的结构和normal cell相似,但是输出的宽度和高度减半,通道数加倍。最后搜索出最优cell之后,根据需要堆叠不同层数的cell就行了,这个层数也是人为定义的。但是这里就会存在一个训练和评估不一致的问题,一般来说,在搜索的时候,为了减小显存占用,会堆叠比较少的层数去评估。但是在得到最优cell之后,用来retrain时会堆叠比较多的层数,这里就不一定是最优解了。也有工作做这方面的优化,比如P-DARTS,在搜索阶段逐渐增加堆叠的层数。分层搜索当然搜索cell也是存在问题的,忽视了整体结构的优化,而且每一层的cell相同也不一定最好啊。因此后来的工作又提出了分层搜索的方法。比如Auto-deeplab在搜索cell的同时,还搜索了不同层的分辨率,下一层的分辨率可以是一半、不变或两倍,这一步限制一是为了减小搜索空间,二是为了增加稳定性,防止分辨率变化太大。再如HierNAS,按照层次结构来搜索网络架构,第一层是一些原子操作,第二层用这些原子操作生成一些比较小的网络,第三层用第二层的小网络再搭建出一个更大的网络,依次下去。再如progressive NAS,为了减小一个cell里面的搜索空间大小,从一个cell里面只有一个block开始搜索,每次挑出top-k个cell,在基础上衍生出两个block,依次下去。评估性能用的是代理模型直接预测,不需要真的训练一遍。再如MnasNet,它将整个网络分为了若干个cell,每个cell串行了若干个block,每个cell的block数量可能不同,而单个cell里面的block结构是相同的,这样就考虑到了整体的网络搜索空间。和堆叠cell不同的是,每个block的结构比较简单,不然的话整体上搜索复杂度还是太大了。当然这篇主要还是为了做移动端部署,因此做了多目标NAS,将延时也考虑到了目标函数中去。之前的方法还存在一个问题,就是基本都是在小数据集上做的搜索评估,最后将最优结构运用到大数据集上,这就存在不一致性。因此例如ProxylessNAS就直接在大数据集上搜索评估,为了减小显存消耗,采用BinaryConnect,每次只激活两个结点之间的一条边。
高校学生参加飞天加速计划
我是一名来自四川的大四学生,用阿里云服务器已经一年多了,平时能够在阿里云服务器上部署一些自己的小项目,不仅能够学习,还能满足自己的一些成就感。阿里云的很多活动对学生非常友好,最开始看到阿里云的学生服务器仅需9元一月,就直接下手了一年,服务器配置能够满足我的基本需求,平时学习Linux和部署一些项目在上面拿去参赛等。 阿里云非常的人性,在开通服务器时会介绍很多知识,能够让小白快速上手。开通服务器后,就安装了宝塔面板,这是一个非常好的服务器运维面板,提供了很多便捷的工具。阿里云服务器ECS可以搭建个人网站、小程序等,安全性也很高,不需要担心安全问题。 飞天加速计划是个非常好的活动,它为我在家中学习的大学生提供了一个稳定性强、容易使用、安全度高的云服务器,可以通过学习,做出属于自己的网页,可以和同学一起开发小程序、微信公众号等等。还搭建了小程序服务端,在比赛中还获了奖。阿里云将其在、大数据、AI、低代码、数据智能等方面,提供给开发者便利。宣布升级到2.0的"飞天加速计划",助力开发者应用创新。其中包括:面向高校师生,提供30亿小时免费资源,提供教育基金,用于学生教育与实践;面向开发者,提供专属特价产品及免费学习资源、认证服务和比赛基金,给我们很多优惠以及很多方便。 最后,对计算机感兴趣的,特别是喜欢开发的,一定要拥有一台自己的云服务器,刚好阿里云的活动就能够满足大部分的学生用户,刚开始还有免费的ECS领取,也希望更多的大学生加入到这一队列来,为自己增加一个新的技能!我希望阿里云能够不断创新,给广大应用人员提供更多的方便。