โจทย์ทั้งหมด
ยาก 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ฝึกโครงข่ายประสาทเทียมให้แก้ปัญหา XOR

รวมทุกอย่างเข้าด้วยกัน: ฝึกโครงข่าย sigmoid แบบ 2-2-1 ด้วยการแพร่ย้อนกลับจนเรียนรู้ XOR ได้

สิ่งที่คุณจะได้เรียนรู้

  • ฝึกโครงข่ายเล็ก ๆ ตั้งแต่ต้นจนจบ
  • เข้าใจว่าทำไม XOR ต้องมีชั้นซ่อน
  • รวม forward pass และ backward pass เข้าด้วยกัน

โจทย์

XOR (exclusive 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

สำหรับแต่ละตัวอย่าง:

  1. ส่งผ่านไปข้างหน้า: 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)
  2. delta_out = 2 × (y - target) × y × (1 - y) และ delta_j = delta_out × output_weights[j] × a_j × (1 - a_j) โดยใช้น้ำหนัก ก่อน การปรับของตัวอย่างนี้
  3. ปรับทุกพารามิเตอร์ด้วยอัตราการเรียนรู้ 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)

เอาต์พุต

หลังการฝึก ให้คืนค่าการทำนาย y ของโครงข่ายสำหรับอินพุต [0, 0], [0, 1], [1, 0] และ [1, 1] ตามลำดับนี้

เงื่อนไข

0 ≤ epochs ≤ 5,000

0 < learning_rate ≤ 5

-2 ≤ น้ำหนักและไบแอสเริ่มต้นแต่ละค่า ≤ 2

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
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};

คำอธิบาย

เมื่อ epoch เป็น 0 จะไม่มีการฝึกเลย ผลลัพธ์จึงเป็นแค่การส่งผ่านไปข้างหน้าด้วยน้ำหนักเริ่มต้น: ประมาณ [0.482, 0.437, 0.494, 0.453] โครงข่ายที่ยังไม่ได้ฝึกตอบเกือบเหมือนกันทุกอินพุต

ตัวอย่างที่ 2
อินพุต:
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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก