现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。
分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
-
在节点之间添加新连接
-
将新节点添加到网络中
下图显示了NEAT算法的结构变异:
当将突变算子应用于NEAT基因组时,新添加的基因(连接基因或节点基因)将分配递增的创新编号。在进化过程中,种群中生物的基因组逐渐变大,并产生了大小不同的基因组。该过程导致不同的连接基因位于基因组内的相同位置,使得同源基因之间的匹配过程极为复杂。为了解决这一问题,NEAT在基因中引入了创新编号(innovation number)。当将突变算子应用于NEAT基因组时,新添加的基因(连接基因或节点基因)将分配递增的创新编号。
带有创新编号的交叉算子
在进化过程中,存在某些信息用于准确地告诉我们在拓扑多样化的种群中基因组之间匹配等位基因的匹配情况。在神经进化算法中,连接节点尽管可能具有不同的连接权重值,但具有相同历史起源的连接基因代表相同的结构。NEAT算法中基因的历史起源由递增分配的创新编号表示,这使我们能够追踪结构突变的时间顺序。
同时,在杂交过程中,后代从亲本基因组继承了带有创新编号的基因。因此,特定基因的创新编号永远不会改变,从而允许在交叉过程中匹配来自不同基因组的等位基因。能够匹配的基因具有相同的创新编号。如果创新编号不匹配,则该基因属于基因组的不相交(disjoint)或多余(excess)部分,具体取决于其创新编号是在另一亲本创新编号范围之内还是之外。不相交或多余的基因表示在另一个亲本的基因组中并不存在,并且在交换阶段需要特殊处理。因此,后代继承了具有相同创新编号的基因。这些是从父母之一中随机选择的。后代总是从适应度最高的父母那里继承不相交或多余的基因。此功能使NEAT算法可以使用线性基因组编码有效地执行基因重组,而无需进行复杂的拓扑分析。
下图显示了NEAT算法中的交叉(重组):
上图显示了使用NEAT算法的两个父级之间的交叉的示例。使用创新编号(连接基因细胞顶部的编号)对两个亲本的基因组进行比对。此后,当创新编号相同时,通过从任一亲本中随机选择连接基因来产生后代:创新编号为1到5的基因。最后,不相交和多余的基因是无条件地从亲本中添加的,并按创新编号排序。
物种形成(Speciation)
在进化过程中,生物可以世代相继创建各种拓扑,但是它们无法产生和维持自己的拓扑创新。较小的网络结构比较大的网络结构优化速度更快,添加新节点或新连接后,无意地减少了后代基因组的生存机会。因此,由于种群内生物体的适应度值暂时下降,新近增加的拓扑结构经历了负的进化压力。同时,从长远来看,新颖的拓扑可以引入创新,从而导致成功的解。为了解决适应度的暂时下降,在NEAT算法中引入了物种形成的概念。物种形成通过引入狭窄的生态位来限制可以交叉的生物的范围,在生态位中只有属于相同生态位的生物才相互竞争,而不是与种群中的所有生物竞争。通过划分种群来实现物种形成,从而使具有相似拓扑结构的生物属于同一物种。
物种形成算法:
NEAT方法允许创建能够解决各种控制优化问题以及其他无监督学习问题的复杂ANN。由于引入了通过逐步复杂化和物种形成来增强ANN拓扑的细节,因此这些解决方案倾向于优化训练和推理的性能。最终的ANN拓扑会不断增长,以匹配需要解决的问题,而不会引入任何过多的隐藏单元层。
XOR问题介绍
经典的多层感知器(MLP)或人工神经网络(ANN)的拓扑中没有任何隐藏的单元,仅能正确解决线性可分离的问题。此类ANN配置无法用于模式识别以及异或问题任务。但是,对于更复杂的MLP架构,其中包括具有非线性激活函数(例如sigmoid)的隐藏单元,可以近似任何函数。因此,非线性可分离问题可用于研究神经进化过程是否可以在求解器表型的ANN中增长任意数量的隐藏单元。
XOR问题是经典计算机实验,如果不对求解器算法引入非线性操作,则无法解决。利用此问题可以证明:NEAT算法可以演化ANN的拓扑结构,从非常简单的拓扑开始,逐步增加复杂性,直到找到所有连接都合适的网络结构。XOR实验通过证明NEAT算法始终具有增加适当拓扑的能力,表明NEAT可以避免适应度值的局部最大值。
下表定义了XOR特征:
| Input 1 | Input 2 | Input 3 |
| — | — | — |
| 1 | 1 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 0 | 0 | 0 |
XOR是一个二进制逻辑运算符,仅当两个输入中只有一个为true时才返回true。两个输入信号必须由非线性隐藏单元组合以产生正确的输出信号。对于XOR输入的组合,没有线性函数能够将它们正确地分类。
NEAT算法从初始种群开始,该种群编码一个非常简单的表型,并逐渐发展出该表型的拓扑结构,直到创建了合适的ANN。表型ANN的初始结构不包括任何隐藏的单元,而是由两个输入单元,一个输出单元和一个偏置单元组成。两个输入节点和偏置节点连接到输出节点,即初始基因型具有三个连接基因和四个节点基因。偏置单元是一种特殊类型的输入,始终将其初始化为大于0的特定值。如果我们想设置神经元单元的激活函数,那么偏置单元是必要的,它是由应用于输入和的相关激活函数计算的,如果两个输入的值都为0,则偏置为特定的非零值。
下图显示了初始和最小可能的XOR表型:
在找到最终解之前,表型的ANN变得越来越复杂。最小的解算器仅包含一个隐藏节点。
XOR问题的目标函数
在XOR实验中,种群中生物体的适应度定义为正确解与为所有四个XOR输入模式生成的输出总和之间的平方距离。计算如下:
-
针对所有四个XOR输入模式激活表型ANN。
-
从每个模式的正确答案中减去输出值,然后将结果的绝对值相加。
-
从最大适应度值(4)中减去在上一步中找到的误差值,以计算个体适应度。更高适应度值意味着更好的求解器性能。
-
然后对计算出的适应度求平方,以按比例为个体提供更高适应度,从而生成求解器ANN,为标准解提供更接近的正确解。这种方法可以增大进化的压力。
因此,目标函数可以定义如下:
f = ( 4 − ∑ i = 1 4 ∣ y i − A N N ( x 1 i , x 2 i ) ∣ ) 2 f=(4-\sum4_{i=1}|y_i-ANN(x1_i,x2_i)|)2 f=(4−i=1∑4∣yi−ANN(x1i,x2i)∣)2
基于NEAT-Python库的相应Python源代码如下:
xor inputs and expected output values
xor_inputs = [(0.0,0.0),(0.0,1.0),(1.0,0.0),(1.0,1.0)]
xor_outputs = [(0.0,),(1.0,),(1.0,),(0.0,)]
def eval_fitness(net):
error_sum = 0.0
for xi,xo in zip(xor_inputs,xor_outputs):
output = net.activate(xi)
error_sum += abs(output[0]-xo[0])
Calculate amplified fitness
fitness = (4 - error_sum) ** 2
return fitness
NOTE:可以尝试不同的适应度得分计算方法。例如

最低0.47元/天 解锁文章
1506

被折叠的 条评论
为什么被折叠?



