为了账号安全,请及时绑定邮箱和手机立即绑定

NEAT-Python 无法捕获极端值

NEAT-Python 无法捕获极端值

PIPIONE 2021-12-09 18:22:18
我正在使用NEAT-Python来模拟基于曲线与 0 的绝对差异的常规正弦函数的过程。配置文件几乎完全采用了基本的 XOR 示例,但输入的数量设置为1. 偏移的方向是在实际预测步骤之后立即从原始数据中推断出来的,所以这实际上就是预测范围内的偏移[0, 1]。适应度函数和大部分剩余代码也已从帮助页面中采用,这就是为什么我相当有信心从技术角度来看代码是一致的。从下面包含的观察到的与预测的偏移的可视化中可以看出,该模型在大多数情况下产生了相当好的结果。但是,它无法捕获值范围的下限和上限。任何有关如何提高算法性能的帮助,特别是在下/上边缘,将不胜感激。或者到目前为止我还没有考虑到任何有条理的限制吗?config-feedforward 位于当前工作目录:#--- parameters for the XOR-2 experiment ---#[NEAT]fitness_criterion     = maxfitness_threshold     = 3.9pop_size              = 150reset_on_extinction   = False[DefaultGenome]# node activation optionsactivation_default      = sigmoidactivation_mutate_rate  = 0.0activation_options      = sigmoid# node aggregation optionsaggregation_default     = sumaggregation_mutate_rate = 0.0aggregation_options     = sum# node bias optionsbias_init_mean          = 0.0bias_init_stdev         = 1.0bias_max_value          = 30.0bias_min_value          = -30.0bias_mutate_power       = 0.5bias_mutate_rate        = 0.7bias_replace_rate       = 0.1# genome compatibility optionscompatibility_disjoint_coefficient = 1.0compatibility_weight_coefficient   = 0.5# connection add/remove ratesconn_add_prob           = 0.5conn_delete_prob        = 0.5# connection enable optionsenabled_default         = Trueenabled_mutate_rate     = 0.01feed_forward            = Trueinitial_connection      = full# node add/remove ratesnode_add_prob           = 0.2node_delete_prob        = 0.2# network parametersnum_hidden              = 0num_inputs              = 1num_outputs             = 1# node response optionsresponse_init_mean      = 1.0response_init_stdev     = 0.0response_max_value      = 30.0response_min_value      = -30.0response_mutate_power   = 0.0response_mutate_rate    = 0.0response_replace_rate   = 0.0# connection weight optionsweight_init_mean        = 0.0weight_init_stdev       = 1.0weight_max_value        = 30weight_min_value        = -30weight_mutate_power     = 0.5weight_mutate_rate      = 0.8weight_replace_rate     = 0.1[DefaultSpeciesSet]compatibility_threshold = 3.0
查看完整描述

1 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

NEAT 存在不同的实现,因此细节可能会有所不同。

通常 NEAT 通过包含一个始终处于活动状态(激活后 1)的特殊输入神经元来处理偏差。我怀疑bias_max_value 和bias_min_value 决定了这个偏置神经元和隐藏神经元之间的最大允许连接强度。在我使用的 NEAT 代码中,这两个参数不存在,并且将偏置到隐藏的连接视为正常连接(具有它们自己的允许范围,在我们的示例中为 -5 到 5)。

如果您正在使用 Sigmoid 函数,您的输出神经元将在 0 到 1 的范围内工作(考虑隐藏神经元的更快激活,也许是 RELU)。

如果您试图预测接近 0 或 1 的值,这是一个问题,因为您确实需要将神经元推到其范围的极限,而 Sigmoid 会渐近(缓慢地!)接近这些极端:

//img1.sycdn.imooc.com//61b1d8fd0001554609940662.jpg

幸运的是,有一种非常简单的方法可以查看这是否是问题所在:只需重新调整输出!就像是

out = raw_out * 1.2 - 0.1

这将使您的理论输出处于超出预期输出的范围内(在我的示例中为 -0.1 到 1.1),并且达到 0 和 1 会更容易(严格来说实际上是可能的)。


查看完整回答
反对 回复 2021-12-09
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信