神经网络训练方法

时间:2015-04-06 18:53:17

标签: artificial-intelligence neural-network genetic-algorithm numerical-methods evolutionary-algorithm

我最近一直在研究神经网络。我将解释我的目标:我正在尝试教怪物走路,站立,基本上执行“奖励”他们的行动(最大化健身功能)。 NN接收传感器输入,并输出肌肉活动。问题归结为训练神经元的权重和偏差。 我的问题是,我不确定我是否正确行事,而且通过神经网络,我可能会犯错,从不知道它。所以我会解释一下我在做什么,如果你发现了一个错误,请纠正我!

1)我创建了一个神经网络,其神经元使用双曲正切传递函数。

2)创建一群随机“染色体”,每个染色体包含一系列双打作为基因(NN中的权重和偏差),阵列的长度是NN中的权重和偏差的量。基因有一个下限和上限,通常为[-2,2],其中随机值是在初始化和突变中产生的。

每一代:

3)对于每条染色体,我更新NN重量并测试怪物大约5000帧。每10帧,网络输出通过传感器输入生成。输出是归一化为[0,1]的双重值,它们通过根据该值改变它们的中性长度来控制体内的“肌肉”(弹簧)。计算健身值。

4)执行遗传算法运算符 - 首先以~0.4概率创建交叉,然后根据染色体长度以~0.1概率进行变异。突变使基因随机化为某个下限和上限之间的值。精英主义 - 下一代保留两个最佳解决方案。

重复直到几代人> GTA maxGenerations或达到最大适合度。

我不确定我的代码中的一些内容:权重和偏差是否有限制?如果是的话,它会限制NN可能实现的潜在结果。如果不是,那么我如何初始化值,并进行变异?我担心增加一个随机值作为突变会陷入局部最优,如爬山。没有限制会减少初始化整个过程时需要考虑的参数量,这很好!

双曲正切是一个不错的选择吗?为什么或为什么不呢?

我是否必须标准化输入传感器数据?如果是,在什么值之间?

此外,我不确定我是否通过输出屈曲而不是二进制的双倍值来做错误 - 高于0.5是flex,较少是释放,可能是一个选项,当现在我只是使用值作为弹性量。

不要将我的代码中的错误视为不良结果的原因,因为我多次检查并实现了完美运行的XOR。

我非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:1)

我假设您指的是前馈神经网络,即前向连接的神经元层。

使用双曲正切或sigmoid函数是可以的。只需确保它们在其域中是连续的和可派生的。否则,学习算法(梯度下降)可能无法将错误正确地反馈回第一层。

您应该使用zscore将每个输入标准化为[-1,+ 1]或[-std,+ std]等范围。因此,您的输入值在决策函数中具有相似的权重。

如果输出的目标是离散或浮点,则不指定它们的目标。

我想知道,由于FFNN受到监督,您在训练算法的数据是什么?