2个版本
0.1.1 | 2023年10月27日 |
---|---|
0.1.0 | 2023年10月27日 |
#367 in 机器学习
73KB
1.5K SLoC
NEAT在Rust中的实现
通过增强拓扑(NEAT)动态演化神经网络,以最大化特定任务的性能(适应度)。原始论文可以在这里找到。这是一个受原始论文以及evo-NEAT和neat-python项目启发的Rust实现。
这是一个实验性项目,供对ML和Rust语言感兴趣的人使用。因此,请随时指出模型中的错误并做出贡献。
开始使用
检查模型有效性的最简单模型是异或运算,因为它是一个非线性问题。\
运行示例
cargorun --examplexor
由于网络不一定总是进化出必要的节点以使其非学习,因此可能需要多次尝试才能找到解决方案。
概念
NEAT网络的独特且迷人的特性是,它不像预定义的网络拓扑,网络本身可以进化出新的结构并改变网络内的参数。
这种进化发生在变异过程中,由于变异缓慢且方向不确定,网络必须同时运行大量基因组,以便我们有更高的概率找到解决方案。
变异发生在称为“交叉”的过程中,我们随机从两个“父代”基因组中获取基因和连接,以生成一个新的基因组,然后对其进行变异。
由于大多数变异最初都是有害的,这个网络采用了一种物种的概念来保护新基因组免遭立即抹去,这鼓励了探索。
大部分概念来自原始论文,只有一些小调整。
- 基因和连接基因可以被删除。
- 每个基因都附有响应性和偏差。
基因
基因组的基本单位,每个基因都有一个唯一的键,以便它始终代表某些特征。
连接
连接表示两个基因之间的连接,它还包含两个基因之间的权重。
创新数字
每个连接都将获得一个递增的创新编号,以便我们可以在杂交过程和物种形成中区分不同的连接。
基因组
基因组是基因和连接的集合。
物种
物种是彼此足够相似的基因组的集合。
种群
种群是物种的集合。
依赖性
~5.5–8MB
~143K SLoC