Javascript 将感知器转化为乙状结肠/雷卢神经元

Javascript 将感知器转化为乙状结肠/雷卢神经元,javascript,python,neural-network,perceptron,Javascript,Python,Neural Network,Perceptron,我制作了一个具有二进制阈值激活函数(x

我制作了一个具有二进制阈值激活函数(x<0?0:1)的感知器,并通过以下公式对其进行教学(更新权重):

权重+(权重增量*学习率),其中权重增量为(此权重的输入*错误)

它工作得很好,如果我使用的是sigmoid函数而不是二进制阈值,同样的公式也可以工作。反向传播时我不使用导数,它仍然有效。为什么?当我尝试使用其他激活,如RELU时,它不起作用,或者TANH时,它只在某些时候起作用。。 作为概念证明,我做了一个单感知机/神经元学习的快速演示,并从随机数据中播放了一些Arkanoid:

learn(){
this.biasWeight=this.biasWeight+(this.bias*(this.desiredOutput-this.output)*0.1);
对于(var n=0;n
即使sigmoid是有效的,我想我在这里大错特错了,当使用非线性激活函数时,反向传播公式应该使用导数作为权重delta。例如,如何找到sigmoid和RELU的导数?我试着用公式计算权重delta,用sigmoid的OUTPUT*(1-OUTPUT),其中OUTPUT已经是sigmoid了,我只是想找到它的导数,但这只会让它变得更糟, 还尝试了不起作用的sigmoid(输入)*(1-sigmoid(输入))。使用RELU,我试图在输出小于0的情况下计算其权重增量导数?0:1,但无论如何,它都不起作用。以下是我的激活功能,其余代码都在CODEPEN上,我尝试对其进行注释,并尽可能简化:

 activate (x) {
    if (this.aFunc == "relu") {
        //relu
        return x < 0 ? 0 : x;
    } else if (this.aFunc == "sigmoid") {
        //sigmoid  
        return 1 / (1 + Math.exp(-x));
    } else if (this.aFunc == "tanh") {
        //TanH
        return Math.tanh(x)
    } else {
        //binary step threshold
        return x < 0 ? 0 : 1;
    }
}
激活(x){
如果(this.aFunc==“relu”){
//雷卢
返回x<0?0:x;
}else if(this.aFunc==“sigmoid”){
//乙状结肠
返回1/(1+Math.exp(-x));
}else if(this.aFunc==“tanh”){
//谭
return Math.tanh(x)
}否则{
//二进步阈值
返回x<0?0:1;
}
}

只需在Arkanoid中添加,我将球和划桨的像素位置以数字格式输入-在示例50中,150表示球位于像素位置50,划桨位于150,这表示划桨需要向左移动,感知输出应为0。。我尝试将数据从0标准化为1,而不是像素位置,但它不起作用。我现在意识到,导数是用于使用链式规则的多层感知,尽管我仍然不明白为什么relu和tanh激活效果如此糟糕?。。
 activate (x) {
    if (this.aFunc == "relu") {
        //relu
        return x < 0 ? 0 : x;
    } else if (this.aFunc == "sigmoid") {
        //sigmoid  
        return 1 / (1 + Math.exp(-x));
    } else if (this.aFunc == "tanh") {
        //TanH
        return Math.tanh(x)
    } else {
        //binary step threshold
        return x < 0 ? 0 : 1;
    }
}