Ch.4 벡터와 행렬 — 의미를 수학으로
행렬 연산 — AI의 핵심 도구
ChatGPT는 초당 수십억 번의 행렬 곱셈을 한다
Transformer 모델의 모든 연산 — Attention, Feed-Forward, Embedding — 은 결국 행렬 곱셈입니다. GPU가 AI에 핵심인 이유도 바로 이것이죠.
왜 행렬 곱셈이 AI의 '기본 연산'이 되었을까?
행렬 연산 — 수백만 개의 숫자를 한 번에 처리하는 AI의 핵심 엔진입니다.
핵심 개념
행렬
숫자를 2차원 격자로 배열한 것, AI 가중치의 기본 단위
텐서
다차원 배열을 GPU에서 효율적으로 연산할 수 있게 만든 자료구조
핵심 내용
행렬은 숫자를 행과 열로 배열한 직사각형 표입니다
벡터가 1차원이라면, 행렬은 2차원 숫자 표입니다
3×4 행렬 = 3행 4열 = 12개 숫자
행렬(Matrix), 전치(Transpose), 브로드캐스팅(Broadcasting)
AI에서 행렬의 역할: 가중치(Weight) = 학습된 행렬 (모델의 지식) 입력(Input) = 데이터 행렬 (토큰 임베딩 등) 출력(Output) = 가중치 × 입력 (행렬 곱)
행렬 곱셈에는 차원 규칙이 있습니다
행렬 A의 i행과 행렬 B의 j열을 원소끼리 곱한 후 합산하면 결과 행렬 C의 (i,j) 원소가 됩니다.
핵심 규칙: A의 열 수(n)와 B의 행 수(n)가 같아야 곱셈이 가능합니다. 결과 행렬의 크기는 A의 행 수(m) × B의 열 수(p)입니다.
차원 규칙 쉽게 기억하기: (m×n) · (n×p) → (m×p) 안쪽 숫자(n)는 같아야 하고, 바깥 숫자(m, p)가 결과 크기! GPT-4: (배치×토큰×768) · (768×768) → (배치×토큰×768)
NumPy로 행렬 곱셈, 전치, 브로드캐스팅을 실습합니다
import numpy as np
# 2×3 행렬
A = np.array([[1, 2, 3],
[4, 5, 6]])
# 3×2 행렬
B = np.array([[7, 8],
[9, 10],
[11, 12]])
# 행렬 곱셈: (2×3) · (3×2) = (2×2)
C = A @ B # 또는 np.dot(A, B)
print("A (2×3):")
print(A)
print("
B (3×2):")
print(B)
print("
A @ B (2×2):")
print(C)
# 전치 (Transpose): 행↔열 교환
print("
A의 전치 (3×2):")
print(A.T)
# 브로드캐스팅: 행렬 + 스칼라
print("
A + 10:")
print(A + 10)왜 NumPy를 써야 할까? 속도 차이를 비교해봅시다
NumPy가 빠른 이유: 1. C언어로 구현된 내부 연산 (Python 루프 없음) 2. SIMD 벡터 명령어 (CPU가 여러 숫자를 동시에 처리) 3. 메모리 연속 배치 (캐시 효율 극대화) GPU의 CUDA도 같은 원리로 행렬 곱셈을 가속합니다.
Transformer의 핵심 연산들은 모두 행렬 곱셈입니다
Transformer 내부의 행렬 연산: 1. [[임베딩]]: 토큰 ID → 벡터 (룩업 = 행렬의 행 선택) 2. Attention: Q·Kᵀ → 유사도 행렬 → V에 가중합 3. Feed-Forward: 행렬 곱 + 활성화 함수 4. 출력: 히든 벡터 → 어휘 확률 (행렬 곱 + Softmax) GPT-4는 파라미터 수조 개 = 수조 개의 행렬 원소!
중첩 리스트로 행렬 곱셈을 직접 구현하고 차원 규칙을 체감합니다
# 순수 Python으로 행렬 곱셈 구현
def mat_mul(A, B):
rows_A, cols_A = len(A), len(A[0])
rows_B, cols_B = len(B), len(B[0])
assert cols_A == rows_B, "차원 불일치!"
# 결과 행렬 초기화
C = [[0] * cols_B for _ in range(rows_A)]
for i in range(rows_A):
for j in range(cols_B):
for k in range(cols_A):
C[i][j] += A[i][k] * B[k][j]
return C
def print_matrix(name, M):
print(f"{name} ({len(M)}x{len(M[0])}):")
for row in M:
print(f" {row}")
# 2x3 행렬 @ 3x2 행렬 = 2x2 행렬
A = [[1, 2, 3],
[4, 5, 6]]
B = [[7, 8],
[9, 10],
[11, 12]]
print_matrix("A", A)
print_matrix("B", B)
C = mat_mul(A, B)
print_matrix("\nA @ B", C)
print(f"\n검증: C[0][0] = 1*7 + 2*9 + 3*11 = {1*7+2*9+3*11}")(3×4) 행렬과 (4×2) 행렬을 곱하면 결과 행렬의 크기는?
행렬 곱셈 A×B와 B×A는 항상 같은 결과를 낸다.
(2×5) 행렬과 (3×4) 행렬을 곱할 수 있나요?
(2×5) 행렬과 (3×4) 행렬은 곱셈이 가능하다.
다음 NumPy 코드의 빈칸을 채우세요. A = np.array(1,2],[3,4) B = np.array(5,6],[7,8) C = A ___ B # 행렬 곱셈
A ___ B (행렬 곱셈 연산자)
벡터와 행렬
핵심 용어
행렬
숫자를 2차원 격자로 배열한 것, AI 가중치의 기본 단위
텐서
다차원 배열을 GPU에서 효율적으로 연산할 수 있게 만든 자료구조
정리 노트
행렬 · 전치 · 브로드캐스팅 핵심 정리
행렬 곱셈 규칙
- 차원 규칙
- (m×n) · (n×p) = (m×p) — 안쪽 n이 같아야 곱셈 가능
- 교환 불가
- A×B ≠ B×A — 행렬 곱셈은 교환 법칙 미성립
- NumPy 연산
- A @ B 또는 np.dot(A, B)로 행렬 곱셈 수행
AI에서의 행렬
- 가중치(Weight)
- 학습된 행렬 — 모델의 지식이 저장된 곳
- 전치(Transpose)
- 행↔열 교환 — Attention의 Q·Kᵀ 연산에 필수
- 브로드캐스팅
- 크기가 다른 배열 간 연산을 자동 확장하여 수행
Transformer의 모든 핵심 연산(Embedding, Attention, Feed-Forward)은 결국 행렬 곱셈입니다!
시각 자료
핵심 정리
- 1벡터 = 숫자 나열, 임베딩 = 단어→벡터 변환
- 2코사인 유사도로 벡터 간 의미 유사성 측정
- 3행렬 곱셈 = AI의 기본 연산, (m×n)·(n×p)=(m×p)
- 4NumPy는 순수 Python보다 수천 배 빠른 행렬 연산 제공
퀴즈와 인터랙션으로 더 깊이 학습하세요
play_circle인터랙티브 레슨 시작