이 모듈의 도달 목표

뉴런과 여러 층으로 계산하기

가중합과 활성화 함수로 뉴런을 만들고, 행렬 계산으로 여러 뉴런과 두 층의 순전파를 구현합니다.

결과물 · 2층 신경망 순전파 검사기
약 5~7시간
  • 한 뉴런의 가중합·편향·활성화 계산을 설명한다
  • ReLU가 비선형 변환을 만드는 이유를 이해한다
  • 입력·가중치·출력 행렬의 shape를 연결한다
  • 두 층의 순전파와 은닉 표현을 직접 구현하고 검사한다
01

뉴런은 입력의 중요도를 모아 값 하나를 만든다

뉴런 하나는 각 입력에 가중치를 곱해 모두 더하고 편향을 더합니다. 가중치는 입력별 중요도와 방향을, 편향은 입력이 모두 0이어도 조정할 수 있는 기준점을 나타냅니다.

일상에서 보면여러 심사위원의 점수에 서로 다른 반영 비율을 곱해 최종 점수를 만드는 것과 같습니다.
import numpy as np
inputs = np.array([2.0, 3.0])
weights = np.array([0.5, 1.0])
bias = -1.0
weighted_sum = np.dot(inputs, weights) + bias
print(weighted_sum)
실행 결과
3.0
한 줄씩 보기
  1. 두 입력값을 벡터로 준비합니다.
  2. 입력별 중요도를 가중치로 준비합니다.
  3. 내적에 편향을 더해 가중합 하나를 만듭니다.
직접 값 바꾸기첫 번째 가중치를 0으로 바꾸고 해당 입력이 결과에 주는 영향이 사라지는지 확인하세요.
흔한 실수입력과 가중치의 길이가 다르면 어떤 값끼리 곱할지 정할 수 없습니다.

짧은 확인편향은 입력과 곱해질까요, 가중합에 마지막으로 더해질까요?

02

ReLU는 음수를 막고 양수를 통과시킨다

활성화 함수는 뉴런의 가중합을 다음 층에 전달할 값으로 바꿉니다. ReLU는 max(0, x)로 음수를 0으로 만들고 양수는 그대로 두며, 여러 층이 단순한 한 번의 선형 계산으로 합쳐지지 않게 합니다.

일상에서 보면기준을 넘은 신호만 다음 방으로 보내는 출입문과 같습니다.
import numpy as np
values = np.array([-2.0, 0.0, 1.5])
print(np.maximum(0, values).tolist())
실행 결과
[0.0, 0.0, 1.5]
한 줄씩 보기
  1. 음수·0·양수가 섞인 가중합을 준비합니다.
  2. 0과 각 값을 비교해 더 큰 값을 선택합니다.
  3. 양수 신호만 다음 층으로 전달됩니다.
직접 값 바꾸기모든 값이 음수인 배열에 ReLU를 적용해 출력이 모두 0인지 확인하세요.
흔한 실수ReLU는 음수를 절댓값으로 바꾸지 않고 0으로 만듭니다.

짧은 확인가중합이 -3일 때 ReLU 출력은 무엇일까요?

03

한 층의 여러 뉴런은 행렬곱 하나로 계산한다

샘플마다 뉴런을 하나씩 반복 호출하는 대신 입력 행렬 X와 가중치 행렬 W를 곱합니다. X가 (samples, inputs), W가 (inputs, units)이면 출력은 (samples, units)이 되고 (units,) 편향이 각 행에 더해집니다.

일상에서 보면여러 주문서와 여러 조리법을 표로 놓고 모든 주문의 결과를 한 번에 계산하는 것과 같습니다.
import numpy as np
X = np.array([[1.0, 2.0], [3.0, 4.0]])
W = np.array([[1.0, 0.0], [0.0, 1.0]])
b = np.array([0.5, -1.0])
print((X @ W + b).tolist())
실행 결과
[[1.5, 1.0], [3.5, 3.0]]
한 줄씩 보기
  1. 두 샘플과 두 입력 특성을 준비합니다.
  2. 각 열이 뉴런 하나인 가중치 행렬을 준비합니다.
  3. 행렬곱 뒤 뉴런별 편향을 모든 샘플에 더합니다.
직접 값 바꾸기가중치 열을 하나 더 추가해 units가 3일 때 출력 shape가 어떻게 변하는지 확인하세요.
흔한 실수가중치를 (units, inputs)로 뒤집으면 행렬곱의 안쪽 크기가 맞지 않습니다.

짧은 확인(5, 3) 입력과 (3, 4) 가중치를 곱한 출력 shape는 무엇일까요?

04

은닉층은 입력을 새로운 특징으로 다시 표현한다

첫 층의 출력은 최종 답이 아니라 다음 층이 사용할 은닉 표현입니다. 각 은닉 뉴런은 원래 특성을 서로 다른 가중치로 섞어 패턴 하나에 반응하며, ReLU 뒤의 값은 그 패턴이 얼마나 활성화됐는지 나타냅니다.

일상에서 보면밀가루·달걀·우유를 바로 완성품으로 보지 않고 반죽이라는 중간 재료로 바꾸는 과정과 같습니다.
import numpy as np
X = np.array([[1.0, 2.0]])
W1 = np.array([[1.0, -1.0], [0.5, 1.0]])
hidden = np.maximum(0, X @ W1)
print(hidden.tolist(), hidden.shape)
실행 결과
[[2.0, 1.0]] (1, 2)
한 줄씩 보기
  1. 원래 특성 두 개를 입력합니다.
  2. 은닉 뉴런마다 다른 조합 규칙을 사용합니다.
  3. ReLU 결과 두 개가 새 은닉 특성이 됩니다.
직접 값 바꾸기첫 번째 입력을 -3으로 바꾸고 어느 은닉 뉴런이 꺼지는지 확인하세요.
흔한 실수은닉층의 각 열은 샘플이 아니라 서로 다른 은닉 뉴런의 출력입니다.

짧은 확인은닉층에 뉴런이 4개라면 샘플 하나의 은닉 표현 길이는 얼마일까요?

05

순전파는 층의 출력을 다음 층 입력으로 전달한다

순전파는 입력에서 출력을 향해 계산을 한 번 진행하는 과정입니다. 2층 신경망에서는 hidden = ReLU(X @ W1 + b1), outputs = hidden @ W2 + b2 순서로 계산하며, 연결되는 두 배열의 shape가 반드시 맞아야 합니다.

일상에서 보면첫 공정의 완성품이 두 번째 공정의 재료가 되는 생산 라인과 같습니다.
import numpy as np
X = np.array([[1.0, 2.0]])
W1 = np.eye(2)
b1 = np.zeros(2)
W2 = np.array([[1.0], [2.0]])
b2 = np.array([0.5])
hidden = np.maximum(0, X @ W1 + b1)
outputs = hidden @ W2 + b2
print(hidden.tolist(), outputs.tolist())
실행 결과
[[1.0, 2.0]] [[5.5]]
한 줄씩 보기
  1. 첫 층의 선형 계산을 수행합니다.
  2. ReLU로 은닉 표현을 만듭니다.
  3. 은닉 표현을 두 번째 층 입력으로 사용합니다.
  4. 마지막 층이 최종 출력값을 만듭니다.
직접 값 바꾸기W2의 shape를 (1, 2)로 바꿨을 때 왜 연결되지 않는지 shape로 설명하세요.
흔한 실수두 번째 층에 원래 X를 다시 넣으면 첫 층에서 만든 은닉 표현을 사용하지 못합니다.

짧은 확인첫 층의 units와 두 번째 층 가중치의 첫 번째 크기가 같아야 하는 이유는 무엇일까요?

ReLU 뉴런 하나 만들기

  1. 입력·가중치·편향의 역할을 구분합니다.
  2. 한 뉴런의 선형 계산을 완성합니다.
  3. ReLU로 전달할 신호를 결정합니다.
  4. 가중합과 활성화 결과를 각각 출력해 비교합니다.
import numpy as np

inputs = np.array(input().split(), dtype=np.float64)
weights = np.array(input().split(), dtype=np.float64)
bias = float(input())
weighted_sum = np.dot(inputs, weights) + bias
output = max(0, weighted_sum)
print(f'가중합: {weighted_sum:.2f}')
print(f'출력: {output:.2f}')

핵심을 확인해 볼까요?

5문항 중 4문항 이상 정답이면 완료됩니다. 오답 후에도 다시 제출할 수 있습니다.

1뉴런의 가중합을 올바르게 나타낸 것은?
2ReLU에 -2를 넣은 출력은?
3(8, 3) 입력과 (3, 5) 가중치의 출력 shape는?
4은닉 표현은 무엇인가?
52층 순전파의 올바른 순서는?