我正在尝试使用c ++实施监督式机器学习。我正在使用XOR来测试网络是否正常工作。但是,它不起作用。该错误确实会收敛,但是当我使用相同的输入来预测输出时,这些结果与预期的不一致。
输入:[[0,0],[0,1],[1,0],[1,1]]
预期输出:[[0],[1],[1],[0]]
层:2-> 2-> 1;学习率:0.1;激活函数:乙状结肠
我发现前向传播中没有错别字/算术问题,而且我认为向后传播中可能存在一些问题。
这是我的反向传播函数:
void BackPropagate(){
if (label_set.empty()) {
printf("You Need To Set Up Your Labels First! (Call : \"SetLabel(...)\")\n");
return;
}
unsigned int last_layer = layer_size - 1;
// back prop of last layer
for (unsigned int neu = 0; neu < neurons[last_layer].size(); ++neu){
vector<double> y_sub = subtract(neurons[last_layer][neu].activated_output, transpose(label_set)[neu]); //(ŷ - y)
vector<double> dacti_a; dacti_a.reserve(training_set_size); // dsigmoid( sum_product_output )
for (double value : neurons[last_layer][neu].output)
dacti_a.push_back(deri_active(value, neurons[last_layer][neu].act_fcn));
neurons[last_layer][neu].delta = multiply(y_sub, dacti_a); // update delta
// update weight and bias
neurons[last_layer][neu].bias -= learning_rate * sum(neurons[last_layer][neu].delta);
for (unsigned pren = 0; pren < connections[last_layer][neu].size(); ++pren) {
connections[last_layer][neu][pren].weight -= learning_rate *sum(
multiply(neurons[last_layer][neu].delta,neurons[last_layer - 1][pren].output));
}
}
// back prop of hidden layers
for (unsigned int layer = last_layer - 1; layer > 0; --layer){
for (unsigned int neu = 0; neu < neurons[layer].size(); ++neu){
vector<double> weight_delta = multiply(neurons[layer + 1][0].delta,
vector<double>(), connections[layer+1][0][neu].weight); // sum(weight*delta)
for (unsigned int posn = 1; posn < neurons[layer+1].size(); ++posn)
weight_delta = addition(weight_delta,
multiply(neurons[layer+1][posn].delta, vector<double>(), connections[layer+1][posn][neu].weight));
vector<double> dsig_a; dsig_a.reserve(training_set_size); // dsigmoid( sum_product_output )
for (double value : neurons[layer][neu].output)
dsig_a.push_back(deri_active(value, neurons[layer][neu].act_fcn));
neurons[layer][neu].delta = multiply(weight_delta, dsig_a); // update delta
// update weight and bias
neurons[layer][neu].bias -= learning_rate * sum(neurons[layer][neu].delta);
for (unsigned pren = 0; pren < connections[layer][neu].size(); ++pren)
connections[layer][neu][pren].weight -= learning_rate *
sum(multiply(neurons[layer][neu].delta, neurons[layer-1][pren].output));
}
}
}
仅供参考,这是我的完整代码:https://github.com/samuel8876170/NeuralNetwork
有人可以给我一些调试建议吗?
更新(2019年12月26日):我找到了一种解决方案,可以获取XOR门和其他门(OR / AND门)的正确结果,这将网络层增加到2-> 2-> 2-> 1然后解决了。但是,我的网络需要3层才能获得预期的结果,但在Internet上大多数只需要2层,这可能是什么原因?