深度学习参数怎么调优、遗传算法与深度学习的火花

1:优化器。机器学习训练的目的在于更新参数,优化目标函数,常见优化器有SGD,Adagrad,Adadelta,Adam,Adamax,Nadam。其中SGD和Adam优化器是最为常用的两种优化器,SGD根据每个batch的数据计算一次局部的估计,最小化代价函数。

学习速率决定了每次步进的大小,因此我们需要选择一个合适的学习速率进行调优。学习速率太大会导致不收敛,速率太小收敛速度慢。因此SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠。

Adam优化器结合了Adagrad善于处理稀疏梯度和RMSprop善于处理非平稳目标的优点,能够自动调整学习速率,收敛速度更快,在复杂网络中表现更优。

2:学习速率。学习速率的设置第一次可以设置大一点的学习率加快收敛,后续慢慢调整;也可以采用动态变化学习速率的方式(比如,每一轮乘以一个衰减系数或者根据损失的变化动态调整学习速率)。

3:dropout。数据第一次跑模型的时候可以不加dropout,后期调优的时候dropout用于防止过拟合有比较明显的效果,特别是数据量相对较小的时候。

4:变量初始化。常见的变量初始化有零值初始化、随机初始化、均匀分布初始值、正态分布初始值和正交分布初始值。一般采用正态分布或均匀分布的初始化值,有的论文说正交分布的初始值能带来更好的效果。实验的时候可以才正态分布和正交分布初始值做一个尝试。

5:训练轮数。模型收敛即可停止迭代,一般可采用验证集作为停止迭代的条件。如果连续几轮模型损失都没有相应减少,则停止迭代。

6:正则化。为了防止过拟合,可通过加入l1、l2正则化。从公式可以看出,加入l1正则化的目的是为了加强权值的稀疏性,让更多值接近于零。而l2正则化则是为了减小每次权重的调整幅度,避免模型训练过程中出现较大抖动。

7:预训练。对需要训练的语料进行预训练可以加快训练速度,并且对于模型最终的效果会有少量的提升,常用的预训练工具有word2vec和glove。

8:激活函数。常用的激活函数为sigmoid、tanh、relu、leaky relu、elu。采用sigmoid激活函数计算量较大,而且sigmoid饱和区变换缓慢,求导趋近于0,导致梯度消失。sigmoid函数的输出值恒大于0,这会导致模型训练的收敛速度变慢。

tanh它解决了zero-centered的输出问题,然而,gradient vanishing的问题和幂运算的问题仍然存在。

relu从公式上可以看出,解决了gradient vanishing问题并且计算简单更容易优化,但是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新(Dead ReLU Problem);leaky relu有relu的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明leaky relu总是好于relu。

elu也是为解决relu存在的问题而提出,elu有relu的基本所有优点,但计算量稍大,并且没有完全证明elu总是好于relu。

9:特征学习函数。常用的特征学习函数有cnn、rnn、lstm、gru。cnn注重词位置上的特征,而具有时序关系的词采用rnn、lstm、gru抽取特征会更有效。gru是简化版的lstm,具有更少的参数,训练速度更快。但是对于足够的训练数据,为了追求更好的性能可以采用lstm模型。

10:特征抽取。max-pooling、avg-pooling是深度学习中最常用的特征抽取方式。max-pooling是抽取最大的信息向量,然而当存在多个有用的信息向量时,这样的操作会丢失大量有用的信息。

avg-pooling是对所有信息向量求平均,当仅仅部分向量相关而大部分向量无关时,会导致有用信息向量被噪声淹没。针对这样的情况,在有多个有用向量的情形下尽量在最终的代表向量中保留这些有用的向量信息,又想在只有一个显著相关向量的情形下直接提取该向量做代表向量,避免其被噪声淹没。那么解决方案只有:加权平均,即Attention。

11:每轮训练数据乱序。每轮数据迭代保持不同的顺序,避免模型每轮都对相同的数据进行计算。

12:batch_size选择。对于小数据量的模型,可以全量训练,这样能更准确的朝着极值所在的方向更新。但是对于大数据,全量训练将会导致内存溢出,因此需要选择一个较小的batch_size。

如果这时选择batch_size为1,则此时为在线学习,每次修正方向为各自样本的梯度方向修正,难以达到收敛。batch_size增大,处理相同数据量的时间减少,但是达到相同精度的轮数增多。实际中可以逐步增大batch_size,随着batch_size增大,模型达到收敛,并且训练时间最为合适。

Meta Learnjng:遗传算法与深度学习的火花(附github代码)

陈扬

极市平台

原文地址:https://arxiv.org/pdf/1703.01513.pdf

这篇文章讲述了如何用传统的遗传算法,生成卷积神经网络,传统的遗传算法可以帮助我们调整参数调,这里我们把网络参数化,通过遗传算法调整我们的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它是生成不出来的,而且生成的网络中都是固定的格式,包括卷积核的大小也是固定的。所以其最大的问题就是能生成这样类似的网络结构,但是参数是固定的,这样子就会失去它的灵活性。如实验所示,我们可以仅使用这些基本构建块来实现竞争性识别性能。 正如近期发表的使用强化学习探索神经结构的工作所显示的那样 , 这种类型的方法通常需要大量的计算来遍历巨大的解决方案空间。他的计算量就是这么大,所以我们的方法就是想生成的网络先在MNIST上跑,然后跑到好了,我们再把它放到CIFAR10上去跑。

02 技术细节

遗传操作:它从初始化的一 代随机化个体开始。 然后,我们执行T轮或T代,每轮由三个操作组成,即选择,变异和交叉。

首先我们输入一个数据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

可以看得出进化的效果非常的不明显,我们想到了一个很好的解决方案,但是因为涉及到组里面现在的工作,暂不在这里写出

04 对比CIFAR10

我们可以到看到这个网络结构,首先它的层数是固定的,第二个是它的进化极其不明显,而且其最大的问题就是我们浪费了太多的时间在这个进化。相反,它的这个结构其实是很少的,并没有表现出良好的泛化能力。我们完全有理由相信,即便不进化,我们也依然可以生存出很好的效果,就是我们工作的一个努力方向,当然,具体的方法不方便透露。(其实隐藏在了MD里面)

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190101B01YKJ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券