0

신경 네트워크의 아이디어를 파악하려고합니다. (완전히) 그래서 자신의 simple perceptron 알고리즘을 만들어 내기 시작했습니다. (내가 사용하고 알고리즘에 의해 배울 수)단순/단일 레이어 퍼셉트론 알고리즘이 작동하지 않습니다.

var lr = 0.1;//learning rate 

//Initiate the weights randomly 
function initWeights(weights, trainingSets){ 
    for(var i=0; i<trainingSets[0].in.length; i++){ 
     weights[i] = Math.random()*2 - 1; 
    } 
    weights.push(Math.random()*2 - 1); //b 
} 


//Return the raw activation value for a giving trainingSet 
function getSum(weights, trainingSet){ 
    var sum = 0; 
    for(var i=0; i < trainingSet.in.length; i++){ 
     sum += weights[i]*trainingSet.in[i]; 
    } 
    sum += 1 * weights[weights.length-1]; 
    return sum; 
} 

//Activation function 
function activate(value){ 
    return (value >= 0)? 1 : 0; 
} 

function train(weights, trainingSets){ 
    var error = 0; 
    for(var i=0; i<trainingSets.length; i++){ 
     var currentSet = trainingSets[i]; 
     var activationValue = getSum(weights, currentSet); 
     var error = currentSet.out - activate(activationValue); 
     error += error; 
     for(var j=0; j<weights.length-1; j++){ 
      var deltaW = error * lr * currentSet.in[j]; 
      weights[j] += deltaW; 
     } 
     weights[weights.length-1] += error * lr * 1; 
    } 
    return error/(weights.length); 
} 

var inp = [ 
    {in:[1,1], out:1}, 
    {in:[0,0], out:0}, 
    {in:[0,1], out:0}, 
]; 
var w = []; 
initWeights(w, inp); 
//for(var j = 0; j < inp.length; j++){ 
    var error = 1; 
    while(error >= 0.01){ 
     error = train(w, inp); 
    } 
//} 
console.log("===") 
var tester = {in:[1,0], out: NaN}; 
console.log(getSum(w, tester)) //should be negative 
console.log("y=("+w[1]+"*x+"+w[2]+")/"+w[1]) 

결과가 일치하지 않는 :

은 여기 내 (자바 스크립트) 코드입니다.
플롯은 다음과 같은 모양입니다 :
http://puu.sh/44eIY/401f63cde7.png
그러나 일반적으로 다음과 같습니다
http://puu.sh/44eAJ/75488a05eb.png

내가 여기에 뭔가 작은 사전에
감사를 누락 확신 해요.

답변

1

이 코드 적어도 세 가지 문제된다, 그것은 먼저 당신이 행된로 다시 선언하는 오류 요약 될 운명이되었다 당신은 오류 변수를 재 선언하는

  • 가 출력 뉴런 오류는 전체 프로세스를 정보를 잃는 결과를 가져옵니다.
  • 중지 기준이 좋지 않습니다. 평균은 이어야합니다. 오류의 합계는입니다. 단순한 네트워크는 고려해야합니다. 훈련 예 훈련 중지, 그래서 그것은 사실이 아니다
  • 을 통해 F 라벨 01로, 그것은 인에서 멀리하더라도, 코드에서 부정적인 오류가 발생합니다 후 교육

    var inp = [ 
        {in:[1,1], out:1}, 
        {in:[0,0], out:0}, 
        {in:[0,1], out:0}, 
    ]; 
    

    그 당신은 f([1,0]) == 0을 얻을 것입니다, 이것은 어떻게 퍼셉트론이 작동하지 않습니다. 그것은 단지 한쪽면에 [1,1]이 있고 다른 쪽면이 [0,0][0,1] 인 2 차원 평면에서 그러한 선을 찾습니다. [1,0][0,0][0,1]과 같은쪽에 있으며 이는 이고, 예상되는의 동작임을 보장하지 않습니다. 제공된 데이터를 사용하면 퍼셉트론이 x=0.5이라는 수직선을 사용하지 않아도 데이터를 완벽하게 분리 할 수는 없습니다. f([1,0]) == 1. 귀하의 훈련 데이터는 작업을 "정의"하지 않으며 무한 수의 분류 자의 지시를 따르는 단순한 규칙 집합입니다. 이 점에 대한 값으로 네트워크를 훈련하는 경우 주석에 명시된 바와 같이

    function train(weights, trainingSets){ 
    var error = 0; 
    for(var i=0; i<trainingSets.length; i++){ 
        var currentSet = trainingSets[i]; 
        var activationValue = getSum(weights, currentSet); 
        var error_current = currentSet.out - activate(activationValue); 
        error += Math.abs(error_current); 
        for(var j=0; j<weights.length-1; j++){ 
         var deltaW = error_current * lr * currentSet.in[j]; 
         weights[j] += deltaW; 
        } 
        weights[weights.length-1] += error_current * lr * 1; 
    } 
    return error/(weights.length); 
    } 
    

(1,0), (0,1)와 (1,1)는 가치 (0을 추론 할 것이다, 0) 자체

var inp = [ 
    {in:[1,1], out:1}, 
    {in:[0,1], out:0}, 
    {in:[1,0], out:0}, 
]; 

var w = []; 
initWeights(w, inp); 
//for(var j = 0; j < inp.length; j++){ 
    var error = 1; 
    while(error >= 0.01){ 
     error = train(w, inp); 
    } 
//} 
console.log("===") 

var test = [ 
    {in:[1,1], out:1}, 
    {in:[0,0], out:0}, 
    {in:[0,1], out:0}, 
    {in:[1,0], out:0}, 
]; 

for(var i=0; i<test.length; ++i){ 
console.log(test[i].in + " out: " +test[i].out + " nn: " + activate(getSum(w, test[i]))); 
} 

1,1 out: 1 nn: 1 
0,0 out: 0 nn: 0 
0,1 out: 0 nn: 0 
1,0 out: 0 nn: 0 
+0

훗, 나는 같은 결과를 내 대답을 쓸 막이었다 생산하고 있습니다. – tsiki

+0

예, 오류가 다시 선언되었습니다. 불량합니다 (그럴 의도는 아닙니다). 또한, 마지막 요점은 나를 혼란스럽게 만들고, 네트워크의 기본 규칙을 (전부는 아님) 제공하고 (희망) 네트워크가 그에 따라 행동 할 것인가? – funerr

+0

그러나 그에 따라 동작합니다. 규칙의 집합만으로도 그러한 큰 일반화를 기대하기는 어렵습니다. 가능한 모델이 너무 많아 ** 기대하는 규칙 집합에 완벽하게 맞습니다 ** 관심있는 유일한 것을 마술로 선택합니다. – lejlot

관련 문제