gpt4 book ai didi

machine-learning - MLP 未正确训练 XOR

转载 作者:行者123 更新时间:2023-11-30 08:38:01 24 4
gpt4 key购买 nike

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

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

问题在于,当使用其他一些随机权重值从头开始重新初始化时,网络会学习该函数的次数非常少。它以非常少的迭代次数学习其他 bool 函数(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。

如果我的理解有误或者实现中存在错误,请纠正我。

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

最佳答案

您也应该学习偏差,而您的代码假设偏差是恒定的(您应该将权重与偏差相关联)。没有偏见,你将无法学习异或。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com