2个版本

0.1.1 2023年10月27日
0.1.0 2023年10月27日

#367 in 机器学习

MIT许可证

73KB
1.5K SLoC

NEAT在Rust中的实现

通过增强拓扑(NEAT)动态演化神经网络,以最大化特定任务的性能(适应度)。原始论文可以在这里找到。这是一个受原始论文以及evo-NEATneat-python项目启发的Rust实现。

这是一个实验性项目,供对ML和Rust语言感兴趣的人使用。因此,请随时指出模型中的错误并做出贡献。

开始使用

检查模型有效性的最简单模型是异或运算,因为它是一个非线性问题。\

运行示例
cargorun --examplexor

由于网络不一定总是进化出必要的节点以使其非学习,因此可能需要多次尝试才能找到解决方案。

概念

NEAT网络的独特且迷人的特性是,它不像预定义的网络拓扑,网络本身可以进化出新的结构并改变网络内的参数。

这种进化发生在变异过程中,由于变异缓慢且方向不确定,网络必须同时运行大量基因组,以便我们有更高的概率找到解决方案。

变异发生在称为“交叉”的过程中,我们随机从两个“父代”基因组中获取基因和连接,以生成一个新的基因组,然后对其进行变异。

由于大多数变异最初都是有害的,这个网络采用了一种物种的概念来保护新基因组免遭立即抹去,这鼓励了探索。

大部分概念来自原始论文,只有一些小调整。

  1. 基因和连接基因可以被删除。
  2. 每个基因都附有响应性和偏差。

基因

基因组的基本单位,每个基因都有一个唯一的键,以便它始终代表某些特征。

连接

连接表示两个基因之间的连接,它还包含两个基因之间的权重。

创新数字

每个连接都将获得一个递增的创新编号,以便我们可以在杂交过程和物种形成中区分不同的连接。

基因组

基因组是基因和连接的集合。

物种

物种是彼此足够相似的基因组的集合。

种群

种群是物种的集合。

依赖性

~5.5–8MB
~143K SLoC