近期爆火的Meta Learnjng,遗传算法与深度学习的火花,再不了解你就out了(附github代码)!
作者:陈扬
编辑:田旭
简 介
url:[https://arxiv.org/pdf/1703.01513](https://arxiv.org/pdf/1703.01513)
这篇文章讲述了如何用传统的遗传算法,生成卷积神经网络,传统的遗传算法可以帮助我们调整参数调,这里我们把网络参数化,通过遗传算法调整我们的DNA序列,然后生成不同的网络结构。好探索我们的网络结构是否可以达到像我们人工设计的网络一样具有高效的泛化能力和识别能力。这样我们。可以通过自动生成网络来设计网络的方法帮助人设计神经网络,也是元学习的一个基础。我写这篇论文的目的也是为我第二篇论文笔记通过强化学习设计网络结构探索网络结构的一个基础性的工作。
再扯点别的知识
什么是遗传算法:
在遗传算法中,一个个体一般只包含一条染色体。染色体上包含这一组基因组。
遗传算法
基因型(genotype):性状染色体的内部表现
表现型(phenotype):染色体决定的性状的外部表现,或者说,根据基因型形成的个体的外部表现;
进化(evolution):种群逐渐适应生存环境,品质不断得到改良。生物的进化是以种群的形式进行的。
适应度(fitness):度量某个物种对于生存环境的适应程度。
选择(selection):以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。
复制(reproduction):细胞分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因。
交叉(crossover):两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;
变异(mutation):复制时可能(很小的概率)产生某些复制差错,变异产生新的染色体,表现出新的性状。
编码(coding):DNA中遗传信息在一个长链上按一定的模式排列。遗传编码可看作从表现型到基因型的映射。
解码(decoding):基因型到表现型的映射。
个体(individual):指染色体带有特征的实体;
种群(population):个体的集合,该集合内个体数称为种群
遗传算法中每一条染色体,对应着遗传算法的一个解决方案,一般我们用适应性函数(fitness function)来衡量这个解决方案的优劣。所以从一个基因组到其解的适应度形成一个映射。可以把遗传算法的过程看作是一个在多元函数里面求最优解的过程。可以这样想象,这个多维曲面里面有数不清的“山峰”,而这些山峰所对应的就是局部最优解。而其中也会有一个“山峰”的海拔最高的,那么这个就是全局最优解。而遗传算法的任务就是尽量爬到最高峰,而不是陷落在一些小山峰。(另外,值得注意的是遗传算法不一定要找“最高的山峰”,如果问题的适应度评价越小越好的话,那么全局最优解就是函数的最小值,对应的,遗传算法所要找的就是“最深的谷底”)
好吧这些都是题外话,要是你真的想了解GE,我给你我的gtihub的代码:(
https://github.com/harvitronix/neural-network-genetic-algorithm)
01
正题
我们现在可以吧一个神经网络变成一段01字符串序列,然后通过对这段DNA序列进行我们生物学的:过度繁殖,自然选择(俄罗斯转轮不均匀选择),适者生存。
这个问题的关键是我们如何把这个网络参数化?
文章的方法是:设计竞争网络结构的遗传算法。 首先,我们描述一种用固定长度的二进制串表示网络 结构的方法。约束情况下为网络结构提供二进制字符串表示
我大概解释一下,他这个连接的方式。第一个1是指A2联A1,然后00是指A3没有连接A1和A2然后111是指A4链接了A1,A2,A3。
stage2中的B2因为既没有入点有没有出点,相当于DNA序列中的无效基因片段。
·In each stage, we use 1+2+...+(Ks 1) = 1 Ks (Ks 1) bits to encode the inter-node connections.
相当于O(n^2)的复杂度
这样我们就可以生成许多有趣的结构
嗯,这个网络是什么,我就不解释了吧,但是呢我们发现的,是他有一些结构,比如那MAXOUT的它是生成不出来的,而且他生成了网络中,他的conv也好知道pooling要好AP化层也好,他都是固定的格式,包括卷积核的大小它也是固定了的,等于说他只是能够生成不同的网络结构,但是在这个具体的参数上他都是已经定死了的一个东西,所以说他最大的问题就是我能生成这样类似的网络结构,但是我的参数是定时的,这样子他就会失去它的灵活性。如实验所示,我们可以仅使用这些 基本构建块来实现竞争性识别性能。 正如最 发表的 使用强化学习探索神经结构的工作所显示的那样 , 这种类型的方法通常需要大量的计算来遍历巨大的解决方案空间。他的计算量就是这么大,所以我们的方法就是想生成的网络现在MNIST上跑,然后跑到好了,我们再把它放到西法时(CIFAR10)上去跑。
02
技术细节
遗传操作:它从初始化的一 代随机化个体开始。 然后,我们执行T轮或T代,每轮 由三个操作组成,即选择,变异和交叉。(呵呵前面介绍了这么多GE algorithm他都没有用上)。
首先我们输入一个数据dataset,遗传的代数T还有我们要的这个网络的大小N,嗯,然后我们进行一个迭代的过程,首先是我们对初始网络进行一个随机参数初始化,然后我们再进行一个选择,选择简单的说就是在那个训练局现在完之后跑一下他的正确率然后一个优胜劣汰保存他的DNA,之后我们再对这个网络进行一个交叉,是根据概率PC和QC(因为技术细节我们组里不让讲太清楚。)然后。然后就是突变,也是基于一个概率pm和qm。在这一代自然选择完了之后我们队这一整袋的基因进行一个整体性的评估evaluation 如果MT,N先前被评估过,我们就简单再次评估并计算其所有事件的平均精确度。这种策略至少在一定程度上减轻了训练过程中随机性引起的不稳定性。
最后,我们把这些新编的码放到了下一代的自然选择中。
上面这幅图演示了一个进化的过程。具体那些网络是什么?你应该看得懂
03
实验介绍
遵循基本的LeNet进行MNIST识别。 原始网络缩写 为:
C5 @ 20 MP2S2-C5 @ 50 MP2S2-FC500-D0.5-FC10。 这里,C5 @ 20是一个具有内核大小的卷积层 5,缺省空间步幅1和内核20的数量;MP2S2是一个内核大小为2和空间跨度为2的最大池层, FC500是一个具有500个输出的完全连接层,D0.5是具 有下降比率的丢弃层0.5。 我们应用20个训练时期,学习率为10-3,其次为4个时期, 学习率为10-4,另一个时间为10,学习率为10-5(这是一种常见的优化策略用于平均训练时间和精度)。
我们创建一个N = 20个个体的初始代,并 行T = 50 个循环的遗传过程。 其他参数设置为pM= 0.8,qM= 0.1, pC= 0.2和qC= 0.3。 我们设置相对较高的突变和交叉概率 来促进新结构的产生。 探索个体的最大数量是20(50 + 1)= 1,020 <8,192。 每个人的训练阶段在现代Titan-X GPU上平均需要2.5分钟(呵呵,就我这台小破鱼,你觉得有可能跑的动吗?)
经过50代后,最佳个体的识别错 误率从0.41%下降到0.34%
等等我找一张图:
我们可以看得出来他进化的效果非常的不明显啊,而且从他的颜色分布你就可以看到出来。我们想到了一个很好的解决方案,但是因为涉及到组里面现在的工作,我就不在这里写出来啦。
04
再对比一下CIFAR10
我们可以到看得到他最大的问题,就是他这个网络结构,首先它的层数是固定的,第二个是他的进化及其的不明显。极其的不明显,而且他的就是最大的问题就是我们浪费了太多多的时间在这个进化。相反,它的这个结构其实是很少的,并没有表现出良好的泛化能力。我们完全有理由相信,我们即便是不进化,我们也依然可以生存出很好的效果。对,就是我们工作的一个努力方向。当然,具体的方法我还是不会说出来。(确实是我隐藏在了MD里面)
05
总结
哦,我讲一下我的总结的经验吧,这是我自己第一次在把论文上“开荒”,应该是没有人写过的论文笔记,这个是我自己写的,网络上第一个。还是可以的吧,开荒的过程中,其实遇到了蛮多的问题去学习,包括我之前不知道的一些基本的操作也好啊,包括以前很多参数上的具体的调整的细节也是要靠自己去阅读。更多的是我也学到了很多常见的数据集比如MNIST还有CIFAR10,还有常见的网络结构VGG,Resnet,densenet,Lenet,googleNet等等
我觉得开荒的过程中也是学习的一个过程,这篇文章我差不多开了三天的荒。
END
往期回顾之NLP
【3】【干货教程】自然语言处理入门:手把手教你解决90%的NLP问题
机器学习算法工程师
一个用心的公众号
进群,学习,得帮助
你的关注,我们的热度,
我们一定给你学习最大的帮助