모든 챌린지
어려움 0명 해결 정답률 0%

XOR을 푸는 신경망 학습시키기

모든 것을 합쳐서: 2-2-1 sigmoid 신경망을 역전파로 XOR을 학습할 때까지 훈련합니다.

배우게 될 내용

  • 작은 신경망을 처음부터 끝까지 학습시키기
  • XOR에 은닉층이 필요한 이유 알기
  • 순전파와 역전파 합치기

문제

원문 보기 (영어)

XOR(배타적 논리합)은 뉴런 하나로는 풀 수 없지만 은닉층이 하나 있는 신경망으로는 풀 수 있는 고전적인 문제입니다. 입력 2개, 은닉 뉴런 2개, 출력 1개를 가지고 모두 sigmoid(σ(z) = 1 / (1 + e^(-z)))를 쓰는 신경망을 손실 L = (y - target)²로 학습시키세요.

학습 데이터는 모든 에포크에서 항상 이 순서대로 사용합니다.

입력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)를 구현하세요.

출력

학습 후 입력 [0, 0], [0, 1], [1, 0], [1, 1]에 대한 신경망의 예측 y를 이 순서대로 반환하세요.

제약 조건

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

설명

에포크가 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 에포크 후 예측은 약 [0.016, 0.982, 0.986, 0.014]입니다: [0, 0]과 [1, 1]에서는 낮고 [0, 1]과 [1, 0]에서는 높습니다. 신경망이 XOR을 학습했습니다.

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.