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)
한 줄씩 보기- 두 입력값을 벡터로 준비합니다.
- 입력별 중요도를 가중치로 준비합니다.
- 내적에 편향을 더해 가중합 하나를 만듭니다.
직접 값 바꾸기첫 번째 가중치를 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과 각 값을 비교해 더 큰 값을 선택합니다.
- 양수 신호만 다음 층으로 전달됩니다.
직접 값 바꾸기모든 값이 음수인 배열에 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]]
한 줄씩 보기- 두 샘플과 두 입력 특성을 준비합니다.
- 각 열이 뉴런 하나인 가중치 행렬을 준비합니다.
- 행렬곱 뒤 뉴런별 편향을 모든 샘플에 더합니다.
직접 값 바꾸기가중치 열을 하나 더 추가해 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)
한 줄씩 보기- 원래 특성 두 개를 입력합니다.
- 은닉 뉴런마다 다른 조합 규칙을 사용합니다.
- 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]]
한 줄씩 보기- 첫 층의 선형 계산을 수행합니다.
- ReLU로 은닉 표현을 만듭니다.
- 은닉 표현을 두 번째 층 입력으로 사용합니다.
- 마지막 층이 최종 출력값을 만듭니다.
직접 값 바꾸기W2의 shape를 (1, 2)로 바꿨을 때 왜 연결되지 않는지 shape로 설명하세요.
흔한 실수두 번째 층에 원래 X를 다시 넣으면 첫 층에서 만든 은닉 표현을 사용하지 못합니다.
짧은 확인첫 층의 units와 두 번째 층 가중치의 첫 번째 크기가 같아야 하는 이유는 무엇일까요?