Tại sao AI của tôi hoạt động không đúng?

Tôi có đoạn code trí tuệ nhân tạo sau:

var inputdone = [[0,1,0], [1,0,0], [1,0,1], [0,1,1], [1,1,1], [0,0,0]];
var outputdone =[[1,0,1], [0,1,1], [0,1,0], [1,0,0], [0,0,0], [1,1,1]];

var WeightIt = [[[0,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,0],[0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0]]];

var SpeedN=1;

function randomweight(){
return Math.random() * 2 + -1;
}

for(var i=0;i<WeightIt.length;i++){
for(var i2=0;i2<WeightIt[i].length;i2++){
for(var i3=0;i3<WeightIt[i][i2].length;i3++){
WeightIt[i][i2][i3] = randomweight();
}
}
}

function Neurol(x,w){
var SumOfthis=0;
for (var i = 0; i < x.length; i++){
    SumOfthis += w[i]*x[i];
}
return 1/(1+Math.exp(-SumOfthis));
}


function ActionNetworkNeurol(input){
var input2=[];
for(var i=0;i<WeightIt.length;i++){
input2.splice(0,input2.length);
for(var i2=0;i2<WeightIt[i].length;i2++){
input2[i2]=Neurol(input,WeightIt[i][i2]);
}
input.splice(0,input.length);
input=CopyA(input2);
//console.log(input);
}
return input;
}

function ChangeWeight(weight,trasoutput,trasinput,output){
var Errro=output*(1-output)*(trasoutput-output);
return weight+SpeedN*trasinput*Errro;
}

function ErrorWeight(trasoutput,output){
	var ErrorHaveChanged=[];
for(var i=0;i<output.length;i++){
ErrorHaveChanged[i]=output[i]*(1-output[i])*(trasoutput[i]-output[i]);
}
return ErrorHaveChanged;
}

function ChangeWeightHide(weight,error,outa,ina,wa){
var ASum=0;
for(var i=0;i<wa.length;i++){
	ASum+=wa[i]*error[i];
}
return weight+SpeedN*ina*outa*(1-outa)*ASum;
}

function ErrorWeightHide(wa,error,outa){
	var ErrorHaveChanged=[];
	var ASum=0;
for(var i=0;i<wa.length;i++){
	ASum+=wa[i]*error[i];
}
return outa*(1-outa)*ASum;
}

function ActionSimpleClassNeurol(input, NumberBack){
var input2 = new Array();
var inputCS=CopyA(input);
for(var i=0;i<WeightIt.length;i++){
input2.splice(0,input2.length);
for(var i2=0;i2<WeightIt[i].length;i2++){
input2[i2]=Neurol(inputCS,WeightIt[i][i2]);
}
inputCS.splice(0,inputCS.length);
inputCS=CopyA(input2);
if(i>=(WeightIt.length-NumberBack-1)){
break;
}
}
return inputCS;
}

function CopyA(ARRay){
	var DDDsa = new Array();
	DDDsa = [...ARRay];
	return DDDsa;
}

function LearningDeep(input2c,output2c){
	var inputdone2=CopyA(input2c);
	var outputdone2=CopyA(output2c);
	var ErrorD=[];
	for(var i=WeightIt.length-1;i>=0;i--){
		var FHH=WeightIt.length-i-1;
		var ACtu1=ActionSimpleClassNeurol(inputdone2,FHH);
		var ACtu2=ActionSimpleClassNeurol(inputdone2,FHH+1);
		var OldErrorD=CopyA(ErrorD);
		ErrorD.splice(0,ErrorD.length);
		if(i==WeightIt.length-1){
		ErrorD=ErrorWeight(outputdone2,ACtu1);
		for(var i2=0;i2<WeightIt[i].length;i2++){
				for(var i3=0;i3<WeightIt[i][i2].length;i3++){
					WeightIt[i][i2][i3]=ChangeWeight(WeightIt[i][i2][i3],outputdone2[i2],ACtu2[i3],ACtu1[i2]);
				}
		}
		} else {
			for(var i2=0;i2<WeightIt[i].length;i2++){
				var DkJ=new Array();
					for(var i4=0;i4<WeightIt[i+1].length;i4++){
						DkJ.push(WeightIt[i+1][i4][i2]);
					}
					var DCSJ =ErrorWeightHide(DkJ,OldErrorD,ACtu1[i2]);
				for(var i3=0;i3<WeightIt[i][i2].length;i3++){
					WeightIt[i][i2][i3]=ChangeWeightHide(WeightIt[i][i2][i3],OldErrorD,ACtu1[i2],ACtu2[i3],DkJ);
				}
				ErrorD[i2]=DCSJ;
			}
			}
	}
}

for(var i2=0;i2<100000;i2++){
for(var i=0;i<inputdone.length;i++){
LearningDeep(inputdone[i],outputdone[i]);
}
}

Khi cho mạng neurol chạy thì nó chỉ trả về giá trị nó đã học :frowning:, còn giá trị mới thì nó không tính ra được :frowning:

Vì sao bị NaN?
Thì tính toán sai giữa các số nên mới bị NaN. Ma trận WeightIt được tính toán ở đâu thì lần theo đó

function ChangeWeight(weight, trasoutput, trasinput, output = []) {
    var WeightHaveChanged = [];
    for (var i = 0; i < output.length; i++) {
        WeightHaveChanged[i] = weight[i] + SpeedN * trasinput[i] * output[i] * (1 - output[i]) * (trasoutput[i] - output[i]);
    }
    return WeightHaveChanged;
}

Như trên thì parameter transInput có element cuối cùng của bị NaN -> NaN bị lây lan từ đây. Rồi vì sao transInput lại có NaN thì trace tiếp tới hàm ActionSimpleClassNeurol
Cứ thế là sẽ ra được bug nhé. Code bạn, bạn viết, bạn hiểu nhất. Nên phần còn lại bạn tự tìm.

4 Likes

Thanks bro, mình tìm ra rồi

Tại sao nó chỉ biết những giá trị đã học còn giá trị mới thì không lại sai?

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?