You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何独立使用NEAT前馈网络并自定义训练与变异逻辑

独立使用NEAT前馈网络并自定义全训练流程方案

FeedForwardNetwork类本身没有强绑定NEAT内置的Config、Genome体系,你不需要依赖自带的create()静态方法生成实例,直接调用构造函数即可自主创建网络,自定义选择、变异全流程逻辑。

1. 脱离Config/Genome创建网络实例

FeedForwardNetwork的构造函数仅需要三个无外部依赖的参数:

  • inputs:输入节点ID列表,可自行定义ID规则,通常遵循NEAT惯例用负ID标记输入节点
  • outputs:输出节点ID列表,通常用非负ID标记
  • node_evals:节点计算规则列表,每个元素为6元组格式(节点ID, 激活函数, 聚合函数, 偏置值, 响应系数, 上游连接列表),其中上游连接列表每个元素为(上游节点ID, 连接权重)

你可以直接复用NEAT自带的feed_forward_layers工具做拓扑分层,这个函数是纯逻辑工具,仅需要传入输入节点ID、输出节点ID、启用的连接列表即可返回分层结果,不依赖任何配置或基因组对象。
最小可运行示例:

import random
import numpy as np
from neat.graphs import feed_forward_layers
from neat.nn.feed_forward import FeedForwardNetwork
import neat.activations as activations
import neat.aggregations as aggregations

# 自定义网络基础参数:2输入、1输出、1个隐藏节点
input_nodes = [-1, -2]
output_nodes = [0]

# 自定义连接与权重,格式为 (入节点ID, 出节点ID): 权重值
enabled_connections = {
    (-1, 1): 0.5,
    (-2, 1): -0.3,
    (1, 0): 0.8
}

# 拓扑分层
conn_keys = list(enabled_connections.keys())
layers = feed_forward_layers(input_nodes, output_nodes, conn_keys)

# 构造节点计算规则
node_evals = []
for layer in layers:
    for node in layer:
        # 收集当前节点的所有入站连接
        node_input_links = []
        for (in_node, out_node), weight in enabled_connections.items():
            if out_node == node:
                node_input_links.append((in_node, weight))
        # 自定义节点参数,不需要从配置读取
        node_evals.append((
            node,
            activations.sigmoid, # 可替换为任意自定义激活函数
            aggregations.sum,    # 可替换为任意自定义聚合函数
            0.0,                 # 自定义偏置
            1.0,                 # 自定义响应系数
            node_input_links
        ))

# 直接实例化网络,无需传入genome或config
net = FeedForwardNetwork(input_nodes, output_nodes, node_evals)
# 测试前向传播
print(net.activate([0.5, 0.2]))

2. 自定义变异操作实现

你可以自行维护网络的连接、节点参数存储结构,不需要依赖NEAT内置的Genome类,常规NEAT变异逻辑可按如下方式实现:

  • 权重变异:按指定概率对连接权重做高斯扰动,小概率直接随机重置权重
  • 新增节点变异:随机选中一条现有连接,拆分该连接为两段,中间插入新的隐藏节点
  • 新增连接变异:随机选择两个不存在连接、不形成环路的节点,添加新连接并随机初始化权重
  • 节点参数变异:按小概率扰动节点偏置、响应系数,或替换激活函数

基础权重变异示例:

def mutate_connection_weights(connections, mutate_prob=0.8, reset_prob=0.05, mutate_strength=0.5):
    for conn_key in list(connections.keys()):
        if random.random() < mutate_prob:
            if random.random() < reset_prob:
                # 直接重置为[-2,2]区间随机值
                connections[conn_key] = random.uniform(-2, 2)
            else:
                # 叠加高斯噪声扰动
                connections[conn_key] += np.random.normal(0, mutate_strength)
    return connections

完成变异后,重新按照第一步的拓扑分层、构造node_evals的流程生成新的网络实例即可,整个适者选择、交叉、评估、迭代的训练流程完全可以自主控制,不需要绑定NEAT内置的训练循环。

内容的提问来源于stack exchange,提问作者coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:24:20