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

2층 신경망의 역전파

sigmoid 은닉층 하나와 sigmoid 출력 하나를 가진 신경망의 모든 가중치와 편향 기울기를 계산합니다.

배우게 될 내용

  • 2층 신경망의 모든 기울기 계산하기
  • 오차 항을 층을 거슬러 전달하기
  • 수식과 코드를 단계별로 연결하기

문제

원문 보기 (영어)

역전파는 출력에서 입력 방향으로 레이어마다 연쇄 법칙을 적용합니다. 신경망은 n개의 입력, h개의 은닉 뉴런, 하나의 출력을 가지며 모두 sigmoid(σ(z) = 1 / (1 + e^(-z)))를 사용합니다.

  • 은닉층: a_j = σ(inputs · hidden_weights[j] + hidden_biases[j])
  • 출력: y = σ(a · output_weights + output_bias)
  • 손실: L = (y - target)²

기울기:

  1. delta_out = 2 × (y - target) × y × (1 - y)
  2. 출력층: dL/doutput_weights[j] = delta_out × a_j, dL/doutput_bias = delta_out
  3. delta_j = delta_out × output_weights[j] × a_j × (1 - a_j)
  4. 은닉층: dL/dhidden_weights[j][i] = delta_j × inputs[i], dL/dhidden_biases[j] = delta_j

backprop_gradients(inputs, hidden_weights, hidden_biases, output_weights, output_bias, target)를 구현하세요.

출력

h + 1개의 행을 가진 행렬을 반환하세요.

  • 행 j (각 은닉 뉴런 j에 대해 순서대로): hidden_weights[j]의 n개 기울기, 그다음 hidden_biases[j]의 기울기.
  • 마지막 행: output_weights의 h개 기울기, 그다음 output_bias의 기울기.

제약 조건

1 ≤ n, h ≤ 20

-5 ≤ 각 입력, 가중치, 편향 ≤ 5

0 ≤ target ≤ 1

예시

예시 1
입력:
inputs = [1.0]
target = 1.0
output_bias = 0.0
hidden_biases = [0.0]
hidden_weights = [
    [0.0]
]
output_weights = [0.0]

예상 출력:
expected = [
    [0.0, 0.0],
    [-0.125, -0.25]
]
입력:
std::vector<double> inputs = {1.0};
double target = 1.0;
double output_bias = 0.0;
std::vector<double> hidden_biases = {0.0};
std::vector<std::vector<double>> hidden_weights = {
    {0.0}
};
std::vector<double> output_weights = {0.0};

예상 출력:
std::vector<std::vector<double>> expected = {
    {0.0, 0.0},
    {-0.125, -0.25}
};
입력:
double[] inputs = new double[] {1.0};
double target = 1.0;
double output_bias = 0.0;
double[] hidden_biases = new double[] {0.0};
double[][] hidden_weights = new double[][] {
    new double[] {0.0}
};
double[] output_weights = new double[] {0.0};

예상 출력:
double[][] expected = new double[][] {
    new double[] {0.0, 0.0},
    new double[] {-0.125, -0.25}
};

설명

a = σ(0) = 0.5, y = σ(0) = 0.5. delta_out = 2 × (0.5 - 1) × 0.25 = -0.25. 출력 행: [-0.25 × 0.5, -0.25] = [-0.125, -0.25]. delta_1 = -0.25 × 0 × 0.25 = 0이므로 은닉 행은 [0, 0]입니다: 출력 가중치가 0이면 기울기가 전달되지 않습니다.

예시 2
입력:
inputs = [1.0, 0.0]
target = 0.0
output_bias = -1.0
hidden_biases = [0.0, 0.0]
hidden_weights = [
    [0.0, 1.0],
    [0.0, -1.0]
]
output_weights = [1.0, 1.0]

예상 출력:
expected = [
    [0.0625, 0.0, 0.0625],
    [0.0625, 0.0, 0.0625],
    [0.125, 0.125, 0.25]
]
입력:
std::vector<double> inputs = {1.0, 0.0};
double target = 0.0;
double output_bias = -1.0;
std::vector<double> hidden_biases = {0.0, 0.0};
std::vector<std::vector<double>> hidden_weights = {
    {0.0, 1.0},
    {0.0, -1.0}
};
std::vector<double> output_weights = {1.0, 1.0};

예상 출력:
std::vector<std::vector<double>> expected = {
    {0.0625, 0.0, 0.0625},
    {0.0625, 0.0, 0.0625},
    {0.125, 0.125, 0.25}
};
입력:
double[] inputs = new double[] {1.0, 0.0};
double target = 0.0;
double output_bias = -1.0;
double[] hidden_biases = new double[] {0.0, 0.0};
double[][] hidden_weights = new double[][] {
    new double[] {0.0, 1.0},
    new double[] {0.0, -1.0}
};
double[] output_weights = new double[] {1.0, 1.0};

예상 출력:
double[][] expected = new double[][] {
    new double[] {0.0625, 0.0, 0.0625},
    new double[] {0.0625, 0.0, 0.0625},
    new double[] {0.125, 0.125, 0.25}
};

설명

두 은닉 값이 모두 σ(0) = 0.5이므로 y = σ(0.5 + 0.5 - 1) = 0.5이고 delta_out = 2 × 0.5 × 0.25 = 0.25입니다. 출력 행: [0.125, 0.125, 0.25]. 각 delta_j = 0.25 × 1 × 0.25 = 0.0625이므로 은닉 행은 [0.0625, 0, 0.0625]입니다 (두 번째 입력이 0).

참고 자료

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

다른 사람의 풀이 보기

커뮤니티 솔루션

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