这是一个神经网络

时间:2017-09-10 18:44:32

标签: javascript algorithm neural-network genetic-algorithm

我花了最近两天在神经网络上观看YouTube视频。

特别是,我一直在尝试实施一种随时间演变的遗传算法,然而,大多数视频似乎都集中在经过训练的神经网络上,然后用于分类。

由于困惑,我决定简单地尝试实现网络的基本结构,并且为了方便起见,在JS中对此进行了编码。

function sigmoid (x) { return  1 / (1 + Math.E ** -x); }
function Brain(inputs, hiddens, outputs) {
    this.weights = {
        hidden: [],
        output: []
    };

    for (var i = hiddens; i--;) {
        this.weights.hidden[i] = [];
        for (var w = inputs; w--;) this.weights.hidden[i].push(Math.random());
    }
    for (var i = outputs; i--;) {
        this.weights.output[i] = [];
        for (var w = hiddens; w--;) this.weights.output[i].push(Math.random());
    }
}

Brain.prototype.compute = function(inputs) {
    var hiddenInputs = [];
    for (var i = this.weights.hidden.length; i--;) {
        var dot = 0;
        for (var w = inputs.length; w--;) dot += inputs[w] * this.weights.hidden[i][w];
        hiddenInputs[i] = sigmoid(dot);
    }

    var outputs = [];
    for (var i = this.weights.output.length; i--;) {
        var dot = 0;
        for (var w = this.weights.hidden.length; w--;) dot += hiddenInputs[w] * this.weights.output[i][w];
        outputs[i] = sigmoid(dot);
    }
    return outputs;
}

var brain = new Brain(1,2,1);
brain.compute([1]);

我成功获得0到1之间的值。而且,当我使用特定权重时,每次都获得相同的值,以获得恒定输入。

  1. 我在代码中使用的术语是否合适?

  2. 我担心我可能只是在观察误报,实际上并没有向前推进。

  3. sigmoid功能是否合适?我应该将它用于遗传/进化算法吗?

  4. 我注意到我的结果只在0.5和1之间;

1 个答案:

答案 0 :(得分:1)

要将神经网络与遗传算法相结合,您的最佳拍摄可能是NEAT。这个算法在JS中有一个非常好的实现叫做“Neataptic”,你应该可以在github上伪造它。

将GA与ANN结合使用时,您通常不仅要调整权重,还要调整结构。

对于GA,Sigmoid激活是正常的,但在许多情况下,您还需要其他激活功能,您可以在维基百科上找到一小部分激活函数或创建自己的激活函数。