समस्या
XOR (एक्सक्लूसिव OR) वह क्लासिक समस्या है जिसे एक अकेला न्यूरॉन हल नहीं कर सकता, लेकिन एक हिडन लेयर वाला नेटवर्क कर सकता है। 2 इनपुट, 2 हिडन न्यूरॉन और 1 आउटपुट वाले नेटवर्क को ट्रेन करें, सभी sigmoid (σ(z) = 1 / (1 + e^(-z))), लॉस L = (y - target)² के साथ।
ट्रेनिंग डेटा, जो हर epoch में हमेशा इसी क्रम में इस्तेमाल होता है:
| इनपुट | target |
|---|---|
| [0, 0] | 0 |
| [0, 1] | 1 |
| [1, 0] | 1 |
| [1, 1] | 0 |
हर उदाहरण के लिए:
- फ़ॉरवर्ड: a_j = σ(x₁ × hidden_weights[j][0] + x₂ × hidden_weights[j][1] + hidden_biases[j]), y = σ(a₁ × output_weights[0] + a₂ × output_weights[1] + output_bias)
- delta_out = 2 × (y - target) × y × (1 - y), और delta_j = delta_out × output_weights[j] × a_j × (1 - a_j), इस उदाहरण के अपडेट से पहले वाले वेट का इस्तेमाल करते हुए
- लर्निंग रेट lr से हर पैरामीटर अपडेट करें: output_weights[j] -= lr × delta_out × a_j, output_bias -= lr × delta_out, hidden_weights[j][i] -= lr × delta_j × x_i, hidden_biases[j] -= lr × delta_j
train_xor(hidden_weights, hidden_biases, output_weights, output_bias, learning_rate, epochs) लागू करें।
आउटपुट
ट्रेनिंग के बाद, इनपुट [0, 0], [0, 1], [1, 0] और [1, 1] के लिए नेटवर्क की भविष्यवाणियाँ y इसी क्रम में लौटाएँ।
सीमाएँ
0 ≤ epochs ≤ 5,000
0 < learning_rate ≤ 5
-2 ≤ हर शुरुआती वेट और बायस ≤ 2
उदाहरण
इनपुट:
epochs = 0
output_bias = 0.0
hidden_biases = [0.0, 0.3]
learning_rate = 1.5
hidden_weights = [
[0.2, 0.8],
[0.9, -0.7]
]
output_weights = [-0.6, 0.4]
अपेक्षित आउटपुट:
expected = [0.482451, 0.436972, 0.494378, 0.452729]
इनपुट:
long long epochs = 0;
double output_bias = 0.0;
std::vector<double> hidden_biases = {0.0, 0.3};
double learning_rate = 1.5;
std::vector<std::vector<double>> hidden_weights = {
{0.2, 0.8},
{0.9, -0.7}
};
std::vector<double> output_weights = {-0.6, 0.4};
अपेक्षित आउटपुट:
std::vector<double> expected = {0.482451, 0.436972, 0.494378, 0.452729};
इनपुट:
long epochs = 0;
double output_bias = 0.0;
double[] hidden_biases = new double[] {0.0, 0.3};
double learning_rate = 1.5;
double[][] hidden_weights = new double[][] {
new double[] {0.2, 0.8},
new double[] {0.9, -0.7}
};
double[] output_weights = new double[] {-0.6, 0.4};
अपेक्षित आउटपुट:
double[] expected = new double[] {0.482451, 0.436972, 0.494378, 0.452729};
व्याख्या
0 epoch में कुछ भी ट्रेन नहीं होता, इसलिए परिणाम बस शुरुआती वेट के साथ फ़ॉरवर्ड पास है: लगभग [0.482, 0.437, 0.494, 0.453]। बिना ट्रेनिंग वाला नेटवर्क हर इनपुट का लगभग एक जैसा जवाब देता है।
इनपुट:
epochs = 2000
output_bias = 0.0
hidden_biases = [0.0, 0.3]
learning_rate = 1.5
hidden_weights = [
[0.2, 0.8],
[0.9, -0.7]
]
output_weights = [-0.6, 0.4]
अपेक्षित आउटपुट:
expected = [0.015727, 0.982119, 0.985515, 0.013682]
इनपुट:
long long epochs = 2000;
double output_bias = 0.0;
std::vector<double> hidden_biases = {0.0, 0.3};
double learning_rate = 1.5;
std::vector<std::vector<double>> hidden_weights = {
{0.2, 0.8},
{0.9, -0.7}
};
std::vector<double> output_weights = {-0.6, 0.4};
अपेक्षित आउटपुट:
std::vector<double> expected = {0.015727, 0.982119, 0.985515, 0.013682};
इनपुट:
long epochs = 2000;
double output_bias = 0.0;
double[] hidden_biases = new double[] {0.0, 0.3};
double learning_rate = 1.5;
double[][] hidden_weights = new double[][] {
new double[] {0.2, 0.8},
new double[] {0.9, -0.7}
};
double[] output_weights = new double[] {-0.6, 0.4};
अपेक्षित आउटपुट:
double[] expected = new double[] {0.015727, 0.982119, 0.985515, 0.013682};
व्याख्या
2,000 epoch के बाद भविष्यवाणियाँ लगभग [0.016, 0.982, 0.986, 0.014] हैं: [0, 0] और [1, 1] के लिए कम, [0, 1] और [1, 0] के लिए ज़्यादा। नेटवर्क ने XOR सीख लिया है।
संदर्भ
यह चुनौती CodeUtility के लिए अनुकूलित की गई है। ऊपर दिए गए स्टेटमेंट और सीमाओं का पालन करें।