Machine learning MLP未正确训练XOR

Machine learning MLP未正确训练XOR,machine-learning,neural-network,backpropagation,perceptron,Machine Learning,Neural Network,Backpropagation,Perceptron,我不熟悉神经网络。我一直在尝试使用反向传播算法实现一个两层网络来学习XOR函数。隐藏层有2个单元,输出层有1个单元。所有装置均使用sigmoid激活功能 我正在初始化介于-1到+1之间的权重,并且有+1偏差 问题在于,当使用其他一些随机权重值从头开始重新初始化时,网络学习函数的次数非常少。它在极少量的迭代中学习其他布尔函数(AND,OR),几乎每次都学习几乎所有随机分配的权重。问题在于XOR函数——对于某些随机权重值,它不会收敛到最优值 我用随机梯度下降,反向传播来学习 我的代码: 隐藏层的计算

我不熟悉神经网络。我一直在尝试使用反向传播算法实现一个两层网络来学习XOR函数。隐藏层有2个单元,输出层有1个单元。所有装置均使用sigmoid激活功能

我正在初始化介于-1到+1之间的权重,并且有+1偏差

问题在于,当使用其他一些随机权重值从头开始重新初始化时,网络学习函数的次数非常少。它在极少量的迭代中学习其他布尔函数(AND,OR),几乎每次都学习几乎所有随机分配的权重。问题在于XOR函数——对于某些随机权重值,它不会收敛到最优值

我用随机梯度下降,反向传播来学习

我的代码:

隐藏层的计算输出功能代码:

public double computeOutput(double[] input){
    this.input = input;
    output = bias+w[0]*input[0] + w[1]*input[1];
    output = 1/(1+Math.pow(Math.E, -output));    
    return output;
}
public double computeError(double w, double outputUnitError){
    error = (output)*(1-output)*(outputUnitError*w);  
    return error;        
}
计算错误函数代码:

public double computeOutput(double[] input){
    this.input = input;
    output = bias+w[0]*input[0] + w[1]*input[1];
    output = 1/(1+Math.pow(Math.E, -output));    
    return output;
}
public double computeError(double w, double outputUnitError){
    error = (output)*(1-output)*(outputUnitError*w);  
    return error;        
}
修复隐藏单元的错误:

public void fixError(){  
    for(int i=0;i<input.length;++i) w[i] += n*error*input[i]; 
}
输出单元的computeError函数:

public void computeOutput(double[] input) { 
    this.input = input;  
    output = bias+input[0]*w[0]+input[1]*w[1];
    output = 1/(1+Math.pow(Math.E, -output));   
} 
public void computeError(double t){ 
    this.t = t; 
    error = (output)*(1-output)*(t-output); 
}
输出装置的fixError功能(更新权重):

代码的输出:

Iterations > 90000, stop...
Displaying outputs for all examples... 
0.018861254512881773
0.7270271284494716
0.5007550527204925
0.5024353957353963

Training complete. No of iterations = 45076
Displaying outputs for all examples... 
0.3944511789979849
0.5033004761575361
0.5008283246200929
0.2865272493546562

Training complete. No of iterations = 39707
Displaying outputs for all examples... 
0.39455754434259843
0.5008762488126696
0.5029579167912538
0.28715696580224176

Iterations > 90000, stop...
Displaying outputs for all examples... 
0.43116164638530535
0.32096730276984053
0.9758219334403757
0.32228953888593287
我尝试了几个学习速率值,增加了隐藏层单元的数量,但仍然没有学习XOR

请纠正我哪里弄错了,或者实现中是否存在错误


我检查了其他线程,但没有得到任何令人满意的问题解决方案。

您也应该学习bias,而您的代码假设bias是常量(您应该将权重连接到bias)。如果没有偏见,您将无法学习XOR。

我更正了代码。现在,如果我使用2个隐藏单位(+1个偏移单位),代码几乎在80%的随机权重分配中收敛3个隐藏单位(+1个偏移单位),几乎90%4个隐藏单位,几乎99%看起来不错,或者它应该在第一种情况下100%运行?输出层中的偏差在哪里?隐藏层和输出层都得到了偏差输入。从新代码来看似乎不是这样。你们有一个新的列,它相当于有偏差的隐藏层,但输出并没有偏差。输出得到有偏差的输入。outputsHLayer(按隐藏层单位输出)数组的第0个索引在第107行处设置为1,用于偏移。然后,第112行使用“outputsHLayer”的内容计算outputUnit的输出,应用包括偏置权重在内的适当权重。第117行:更新输出单元输入连接的权重。接下来,将更新隐藏层单元的“输入连接”权重。只要需要,我就使用索引0作为偏差。