제1원리 질문. 행렬곱은 왜 칸끼리 곱하지 않고 ‘행 × 열’이라는 이상한 규칙을 쓰는가. 데이터 여러 건과 가중치 여러 세트의 내적을 한 번에 모두 계산하려면, 데이터의 행과 가중치의 열을 짝지어 내적하는 규칙이 가장 자연스럽기 때문이다.

핵심 — 모양 규칙부터
로드맵 22주차는 “엑셀 표가 곧 행렬, 데이터 100건 = 행렬 하나”로 행렬을 정의하고, 24주차에 곱셈 원리, 25주차에 “신경망 한 층 = 행렬곱 한 번”을 둔다. 행렬곱에서 가장 먼저 확인할 것은 모양(shape)이다.
| 행렬 | 모양 | 의미 |
|---|---|---|
| X (입력) | 2 × 3 | 데이터 2건, 특성 3개 |
| W (가중치) | 3 × 2 | 특성 3개 → 뉴런 2개 |
| X @ W | 2 × 2 | 데이터 2건 × 뉴런 2개의 출력 |
| 규칙 | (m × n)(n × k) = (m × k) | 안쪽 n이 같아야 곱할 수 있음 |
1편의 y = wx + b가 입력 여러 개, 출력 여러 개로 확장된 모양이다. 활성화 함수는 로드맵 후반에 다루므로 여기서는 생략했다.
코드로 번역하기
파이썬에서 행렬곱 연산자는 @다. 마지막 줄은 결과의 첫 칸(3.2)이 ‘X의 1행과 W의 1열의 내적 + 편향’과 같은지 손계산으로 확인한다.
import numpy as np
# 입력 X: 데이터 2건 x 특성 3개 (2 x 3)
X = np.array([[1.0, 2.0, 3.0],
[4.0, 5.0, 6.0]])
# 가중치 W: 특성 3개 -> 뉴런 2개 (3 x 2)
W = np.array([[0.1, 0.2],
[0.3, 0.4],
[0.5, 0.6]])
b = np.array([1.0, -1.0]) # 뉴런별 편향
Z = X @ W + b # 신경망 한 층 = 행렬곱 한 번 + 편향
print(Z.shape) # (2, 2)
print(Z)
# 첫 데이터, 첫 뉴런 값을 손으로 확인: 행 x 열의 내적
print(1*0.1 + 2*0.3 + 3*0.5 + 1.0) # 3.2
실행 결과
(2, 2)
[[3.2 1.8]
[5.9 5.4]]
3.2
사례 적용 — 결과 한 칸 = 내적 하나
결과 Z의 (1행, 2열) 값 1.8도 같은 방식으로 확인된다. X의 1행 (1, 2, 3)과 W의 2열 (0.2, 0.4, 0.6)의 내적은 0.2 + 0.8 + 1.8 = 2.8이고, 편향 −1을 더하면 1.8이다. 즉 2 × 2 결과의 네 칸은 내적 네 번이다. 데이터가 100건이면 X가 100 × 3이 될 뿐 코드는 바뀌지 않는다.
이것이 ‘신경망 한 층 = 행렬곱 한 번’의 의미다. 뉴런 하나는 입력과 자기 가중치의 내적에 편향을 더한 값이고, 한 층의 뉴런들을 옆으로 나란히 세운 것이 W의 열들이다. 층을 여러 개 쌓으면 행렬곱을 여러 번 반복하는 구조가 된다.
1분 개념 체크
로드맵 교재 템플릿의 ‘1분 개념 체크’ 형식을 빌려 스스로 확인할 문제 두 개를 만들었다.
| 질문 | 답 | 근거 |
|---|---|---|
| (4 × 3) 행렬과 (3 × 5) 행렬을 곱한 결과의 모양은? | 4 × 5 | 안쪽 3이 같고 바깥 4와 5가 남음 |
| (2 × 3) @ (2 × 3)은 계산되는가? | 안 됨 | 앞의 열 3과 뒤의 행 2가 다름 |
내 해석 — Rhymbro가 읽은 것
모양 규칙 (m × n)(n × k)는 기계 요소의 결합 조건과 같다고 느꼈다. 축 지름과 베어링 내경이 맞아야 조립되듯, 앞 행렬의 열 수와 뒤 행렬의 행 수가 맞아야 곱해진다. 코드 오류 중 상당수가 이 ‘치수 불일치’에서 나온다는 점도 설계 검토와 비슷했다.
그래서 행렬 코드를 짤 때는 계산 전에 각 배열의 .shape를 먼저 출력해 보는 습관을 들이기로 했다. 도면 검토에서 조립 치수부터 확인하는 순서와 같다.
한계로, 실제 신경망은 행렬곱 뒤에 비선형 활성화 함수를 거쳐야 층을 쌓는 의미가 생기므로, 행렬곱만으로 신경망 전체를 설명할 수는 없다.
요약
| 항목 | 정리 |
|---|---|
| 모양 규칙 | (m × n)(n × k) = (m × k) |
| 결과 한 칸 | 행 × 열의 내적 |
| 신경망 한 층 | Z = X @ W + b |
| 확인 습관 | 계산 전 .shape 출력 |
그래서 나는 무엇을 하기로 했나
이번 주는 입력 3개 → 뉴런 4개 → 뉴런 2개로 이어지는 두 층을 NumPy로 만들고, 각 단계의 shape를 표로 적어 모양 규칙을 손으로 먼저 예측해 보기로 했다.
주제와 순서는 개인 학습용으로 정리한 104주 AI 수학 로드맵 목차를 따랐고, 설명과 예제는 그 목차를 바탕으로 내 언어로 다시 썼다. 코드는 Python 3 + NumPy 2.x에서 실행해 출력을 확인했으며, 예시 수치는 설명용 가정 값이다.
AI 수학 로드맵 노트 · 전체 10편
- AI 수학 로드맵 노트 1 — y = wx + b, 가중치와 편향의 정체
- AI 수학 로드맵 노트 2 — 지수와 로그, 폭발과 압축의 언어
- AI 수학 로드맵 노트 3 — Σ(시그마)는 그냥 for문이다
- AI 수학 로드맵 노트 4 — 벡터의 크기와 거리, 노름
- AI 수학 로드맵 노트 5 — 내적과 코사인 유사도, 방향이 비슷하면 취향도 비슷하다
- AI 수학 로드맵 노트 6 — 행렬곱, 신경망 한 층의 정체
- AI 수학 로드맵 노트 7 — 미분과 체인룰, 변화가 전달되는 법
- AI 수학 로드맵 노트 8 — 경사하강법과 학습률, 산을 내려가는 보폭
- AI 수학 로드맵 노트 9 — 손실함수 MSE, 얼마나 틀렸나를 숫자 하나로
- AI 수학 로드맵 노트 10 — 베이즈 정리, 검사 결과를 뒤집어 읽기
같은 카테고리에서 함께 읽기
강의자료 121편독일어 문법 노트 10 — 관계절, Die Maschine, die wir kauften
관계대명사의 성·수는 선행사를 따르고, 격은 관계절 안에서의 역할로 정해진다. 전치사 + 관계대명사, wo와 was·wer까지 설비·부품 예문으로 정리했다.
독일어 문법 노트 9 — 종속절과 동사 후치, weil·dass·wenn·als
weil·dass·wenn·obwohl·ob가 이끄는 절에서는 활용된 동사가 맨 끝으로 간다. 종속절이 앞에 오면 쉼표를 사이에 두고 동사가 마주 보는 구조, als…
독일어 문법 노트 8 — 형용사 어미변화, 다섯 칸의 -e와 나머지 -en
정관사가 성·격을 표시하면 형용사는 -e나 -en만 붙는다. -e가 오는 자리는 다섯 칸뿐이고 나머지는 전부 -en. 서술 용법에는 어미가 없다는 점까지 정리했다.


