作家
登录

如何用自动机器学习实现神经网络进化

作者: 来源: 2017-07-27 16:19:39 阅读 我要评论

“变异”:“变异”或“突变”指的是随便率性改变基因组的过程。这是重要的开辟身分,有助于保持种群的多样性。

实施启用

“进化算法”的实施启用应用了PyTorch来建立代劳,这个代劳将会摸索用于完成简单分类义务的DNNs。这个实验应用的是MNIST,因为它小且快,即使在CPU上也能完成练习。我们将建立一组DNN模型,并将其成长进化为N个步调。

我们所讲的“进化”主题实际上就是“物竞天择”的实施,完全的高程度“进化算法”如下所示:

  1. new_population = [] 
  2.   while size(new_population) < population_size: 
  3.   choose k(tournament) individuals from the population at random 
  4.   choose the best from pool/tournament with probability p1 
  5.   choose the second best individual with probability p2 
  6.   choose the third best individual with probability p3 
  7.   mutate and append selected to the new_population 

附注:当涉及到架构归并时,跨界问题就变得相当复杂了。毕竟该若何将两个亲本的架构归并呢?缺点图样及情况整合练习将对此产生什么竽暌拱响呢?近期的一篇来自Miikkulainen等人的论文提出了一种被称为CoDeepNEAT的解决筹划。基于Evolino进化理论,一个架构由部分单位模块构成,个中的每一单位模块都是服大年夜于进化理论的。这个架构是一个归并了所有构成成分的幻鲜攀蓝图。在如许的情境下,将亲本的构成成分混淆是十分合理的,因为其成分是一个完全的微型收集。为了使文┞仿更简洁易懂,我在这个算法实施过程中避开了跨界交叉的问题,而是简单介绍了类似NEAT(或CoDeepNEAT)如许的解决筹划。(我计算鄙人一篇文┞仿中具体介绍这些解决筹划。)

根本的构件

我们须要定义的第一件工作就是每一模型的解决筹划空间,每一个个别都代表着一个架构。简洁起见,我们堆叠了n层,每一层都包含三个参数:a)隐蔽单位的数量;b)激活类型;c)损掉率。对于通用参数,我们在不合的优化器、进修率、权重衰减和层数量中进行选择。

  1. # definition of a space 
  2. # lower bound - upper bound, type param, mutation rate 
  3. LAYER_SPACE = dict() 
  4. LAYER_SPACE['nb_units'] = (128, 1024, 'int', 0.15) 
  5. LAYER_SPACE['dropout_rate'] = (0.0, 0.7, 'float', 0.2) 
  6. LAYER_SPACE['activation'] =\ 
  7.    (0,  ['linear', 'tanh', 'relu', 'sigmoid', 'elu'], 'list', 0.2) 
  8.  
  9. NET_SPACE = dict() 
  10. NET_SPACE['nb_layers'] = (1, 3, 'int', 0.15) 
  11. NET_SPACE['lr'] = (0.0001, 0.1, 'float', 0.15) 
  12. NET_SPACE['weight_decay'] = (0.00001, 0.0004, 'float', 0.2) 
  13. NET_SPACE['optimizer'] =\ 
  14.    (0, ['sgd', 'adam', 'adadelta', 'rmsprop'], 'list', 0.2) 

接下来,让我们一路来看看运行的结不雅!

完成以上操作今后,我们已经定义了模型的空间。接着我们还须要建立三个根本功能:

随机选择一个收集

起首,我们随便率性地对层数量和每一层的参数进行采样,样本值会在预先定义好典范围边沿内出现降低。在初始化一个参数的同时,我们还会产生一个随便率性的参数id。如今它还不克不及应用,但我们可以追踪所有的层。当一个新的模型产生突变时,旧的层会进行微调,同时仅对产生突变的层进行初始化。如许的做法应当可以或许明显地加快速度,并稳定解决筹划。

留意:根据问题性质的不合,我们可能须要不合的限制前提,比如参数的总量或层的总数量。

使收集产生变异

  1. def mutate_net(net): 
  2.    """Mutate a network.""" 
  3.    global NET_SPACE, LAYER_SPACE 
  4.  
  5.    # mutate optimizer 
  6.    for k in ['lr', 'weight_decay', 'optimizer']: 
  7.         
  8.        if random.random() < NET_SPACE[k][-1]: 
  9.            net[k] = random_value(NET_SPACE[k]) 
  10.             
  11.    # mutate layers 
  12.    for layer in net['layers']: 
  13.        for k in LAYER_SPACE.keys(): 
  14.            if random.random() < LAYER_SPACE[k][-1]: 
  15.                layer[k] = random_value(LAYER_SPACE[k]) 

      推荐阅读

      百度前首席科学家吴恩达:AI短期内不会超越人类

    吴恩达认为,根本收入筹划的目标不该该是让人们持续给打车公司开车,他欲望根本收入筹划可以或许资世人们进修更多的器械,赞助他们找到有意义的工作。 腾讯科技讯 据外媒报道,固然比来有很>>>详细阅读


    本文标题:如何用自动机器学习实现神经网络进化

    地址:http://www.17bianji.com/lsqh/36435.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)