Ch.4 벡터와 행렬 — 의미를 수학으로

행렬 연산 — AI의 핵심 도구

행렬 곱셈의 원리와 차원 규칙을 이해한다전치(Transpose)와 브로드캐스팅의 역할을 설명한다NumPy로 행렬 연산을 수행하고 순수 Python과 비교한다

ChatGPT는 초당 수십억 번의 행렬 곱셈을 한다

Transformer 모델의 모든 연산 — Attention, Feed-Forward, Embedding — 은 결국 행렬 곱셈입니다. GPU가 AI에 핵심인 이유도 바로 이것이죠.

왜 행렬 곱셈이 AI의 '기본 연산'이 되었을까?

행렬 연산 — 수백만 개의 숫자를 한 번에 처리하는 AI의 핵심 엔진입니다.

lightbulb

핵심 개념

행렬

숫자를 2차원 격자로 배열한 것, AI 가중치의 기본 단위

텐서

다차원 배열을 GPU에서 효율적으로 연산할 수 있게 만든 자료구조


article

핵심 내용

행렬은 숫자를 행과 열로 배열한 직사각형 표입니다

벡터가 1차원이라면, 행렬은 2차원 숫자 표입니다

3×4 행렬 = 3행 4열 = 12개 숫자

행렬(Matrix), 전치(Transpose), 브로드캐스팅(Broadcasting)

AI에서 행렬의 역할: 가중치(Weight) = 학습된 행렬 (모델의 지식) 입력(Input) = 데이터 행렬 (토큰 임베딩 등) 출력(Output) = 가중치 × 입력 (행렬 곱)

행렬 곱셈에는 차원 규칙이 있습니다

C_ij = sum_k=1^n A_ik imes B_kj

행렬 A의 i행과 행렬 B의 j열을 원소끼리 곱한 후 합산하면 결과 행렬 C의 (i,j) 원소가 됩니다.

(m imes n) cdot (n imes p) = (m imes p)

핵심 규칙: 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 (행렬 곱셈 연산자)

벡터행렬

key

핵심 용어

🔢

행렬

숫자를 2차원 격자로 배열한 것, AI 가중치의 기본 단위

🧮

텐서

다차원 배열을 GPU에서 효율적으로 연산할 수 있게 만든 자료구조

edit_note

정리 노트

행렬 · 전치 · 브로드캐스팅 핵심 정리

행렬 곱셈 규칙

차원 규칙
(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)은 결국 행렬 곱셈입니다!

image

시각 자료

다이어그램: py-scene-matmul
check_circle

핵심 정리

  • 1벡터 = 숫자 나열, 임베딩 = 단어→벡터 변환
  • 2코사인 유사도로 벡터 간 의미 유사성 측정
  • 3행렬 곱셈 = AI의 기본 연산, (m×n)·(n×p)=(m×p)
  • 4NumPy는 순수 Python보다 수천 배 빠른 행렬 연산 제공

퀴즈와 인터랙션으로 더 깊이 학습하세요

play_circle인터랙티브 레슨 시작