我是神经网络的新手。我一直在尝试实现一个两层网络,以使用反向传播算法来学习XOR函数。隐藏层有2个单位,输出层有1个单位。所有单元均使用S型激活功能。

我正在初始化-1至+1之间的权重,并具有+1偏差。

问题是,当网络使用权重的其他随机值从头开始重新初始化时,网络学习该功能的次数非常少。它以很少的迭代次数来学习其他布尔函数(AND,OR),几乎每次都针对几乎所有随机分配的权重进行学习。问题出在XOR函数上-对于某些随机权重值,它不能收敛到最优值。

我正在使用随机梯度下降,反向传播进行学习。

我的代码:http://ideone.com/IYPW2N

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

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];
}


输出单元的计算输出功能:

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));
}


输出单元的computeError函数:

public void computeError(double t){
    this.t = t;
    error = (output)*(1-output)*(t-output);
}


输出单元的fixError函数(更新权重):

public void fixError() {
    for(int i=0;i<w.length;++i) w[i] += n*error*input[i];
}


该代码将在任何迭代中立即停止训练,所有示例均已正确分类。否则,当迭代次数超过90k时,它将停止。

学习率设置为0.05。如果输出单位的值大于0.5,则计为+1,否则为0。

培训实例:

static Example[] examples = {
        new Example(new double[]{0, 0}, 0),
        new Example(new double[]{0,  1}, 1),
        new Example(new double[]{1, 0}, 1),
        new Example(new double[]{1,  1}, 0)
};


代码输出:

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。

请纠正我在哪里出错或实现中存在错误的地方。

我签出了其他线程,但是没有得到令人满意的解决方案。

最佳答案

您还应该学习偏见,而您的代码假定偏见是恒定的(您应该权衡偏见)。没有偏见,您将无法学习XOR。

关于machine-learning - MLP无法正确训练XOR,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34384342/

10-12 23:31