--> 有点像MINLP
但这里不仅不能穷举、甚至都没有定义出MI的那部分
所以也没法像正常的MI那样作连续松弛啥的
--> 感觉应该可以在CNN等操作的 复用 提效上做文章
————————————————
本文解读两篇基于遗传算法的典型方法:谷歌的《Large-Scale Evolution of Image Classifiers》和坦佩雷理工大学的《Finding Better Topologies for Deep Convolutional Neural Network by Evolution》。过去基于遗传算法的网络结构搜索大多依赖先验知识,以残差块(residual block)、稠密块(dense block)等已被验证有效的块为基础进行组合拼接,而且要求每个个体都从头开始训练,对计算资源要求很高。这里要介绍的两篇论文要解决上面的问题,它们的核心思想都是尽可能少的使用先验知识,从node-level进行网络结构搜索。
首先,作者进化出一个神经网络模型的种群,这个种群会包含很多不同的网络模型,其中每个模型即为一个个体。这个模型被训练后在验证集上的准确率为此个体的适应度评估。在每一个进化步中,worker(即计算机)从种群中随机选择两个个体,然后计算并比较其适应度。适应度较差的个体从种群中被移除,较好的个体留下来作为亲本进行下一步的繁殖。繁殖过程中,worker复制这个亲本,然后对其进行变异,即对其进行结构上的修改,修改后的模型称为后代。这个后代被训练然后得到在验证集上的准确率,最后被放回到种群里。
用这样的策略在巨大的搜索空间里寻找最优的分类模型需要巨大的计算量,为此作者提出了一个大规模并行的方法。很多worker在不同的计算机上异步地操作,他们彼此之间不直接通信。他们使用一个共享的文件系统,这里用字典存储了种群的信息,每个字典代表一个个体。相应的操作可以通过修改字典完成,例如,移除一个个体即为字典的重命名。有时会出现这种情况,对于同一个个体,一个worker尝试对其进行修改,但另一个worker可能正在对其进行操作,此时这个worker放弃修改并重新尝试。在这篇论文里,种群的大小是1000个个体,worker的个数总是为种群大小的四分之一。为了在有限的空间内实现长时间的运行,会经常对被移除的个体的字典进行垃圾收集。
1、编码和变异 改变学习率 2、初始情况 3、训练和验证 4、计算代价 4、权重继承 |
三、Finding Better Topologies for Deep Convolutional Neural Network by Evolution 作者用一个有向图G(N,E)G(N,E)G(N,E)表示CNN,NNN是节点(node)集合,EEE是边(edge)集合。源节点(source node)表示输入,汇节点(sink node)表示输出,内节点(internal node)表示对前驱节点的和、激活、池化、卷积等操作,也称为卷积节点,其输出是特征图。每个卷积节点包括如下模型参数:激活函数、通道数和池化类型,默认全部采用ReLU激活函数。池化类型可以是None或最大池化(步长为2)。 进化从简单的拓扑结构开始,包括一个源节点、汇节点和一个卷积节点。每次繁殖,个体产生变异,变异是从预先定义好的集合里随机选择,变异集合里包括: 卷积节点通道数目加倍
如果一个变异产生的网络是无效的,例如源节点和汇节点没有连接或者图是循环的,则随机选择另一个变异。这个过程不断重复,直到生成一个有效的图。 在进化阶段,我们根据每个个体的验证集准确率来评估其适应度。然后使用随机排序比例选择策略,选择哪些个体留下来。个体能留下来的概率和它在整个种群的排序是成比例的,我们假设其服从玻尔兹曼分布,概率质量函数为: kkk是个体的排序,NNN是种群的大小,λlambdaλ是平衡“探索”和“利用”的参数。当λlambdaλ比较大时,p(k)p(k)p(k)变的平滑,适应度低的个体变的更容易被选择,算法更倾向于“探索”。 这篇论文也采用了权重继承来加速训练。后代直接继承亲本的卷积核权重,由于变异导致的不与亲本共享的部分则随机初始化。 本论文中还使用贝叶斯方法从种群中学习超参数,如学习率、批大小、dropout、优化器等。作者这些超参数当做阶学习的知识,不把其当做需要进化的部分,而是从种群中不断学习最优参数并传给下一代。 |