1장. 준비 수학과 Transformer 개요
벡터와 행렬: 숫자를 담는 두 가지 모양
학교 성적표를 떠올려 봅니다. 민지의 국어, 수학, 영어 점수는 한 줄에 놓인 숫자 세 개입니다. 이 한 줄이 벡터입니다. 반 학생 전체의 성적표는 이런 줄을 여러 개 쌓은 표이고, 이것이 행렬입니다. 모델도 같은 방식으로 낱말을 다룹니다. "student" 라는 낱말 하나를 숫자 여러 개로 된 한 줄로 적고, 문장 하나는 낱말마다 한 줄씩 쌓은 표로 적습니다.
왼쪽 상자는 숫자 6개를 한 줄로 놓은 벡터입니다. shape 는 (6,) 입니다. 가운데 상자는 낱말 3개를 각각 숫자 4개로 적은 행렬이고, shape 는 (3, 4) 입니다. 오른쪽 상자의 shape 는 pandas 의 df.shape 와 같은 꼴입니다. 앞 숫자가 행 수, 뒤 숫자가 열 수입니다.
벡터와 행렬 견주기
| 이름 | 생김새 | shape 예 | 성적표로 치면 | 모델 안에서 |
|---|---|---|---|---|
| 벡터 | 숫자 한 줄 | (6,) | 학생 한 명의 점수 줄 | 낱말 하나의 숫자 묶음 |
| 행렬 | 숫자 표 | (3, 4) | 반 전체 성적표 | 문장 하나(낱말 3개 × 차원 4) |
| 차원 | 한 줄의 숫자 개수 | d_model = 4 | 과목 수 | 낱말 하나를 적는 숫자 개수 |
짧은 예시
import numpy as np
import pandas as pd
# 두 학생의 세 과목 점수표(설명을 위해 정한 값)
report = pd.DataFrame(
{"국어": [90, 60], "수학": [80, 75], "영어": [70, 95]},
index=["민지", "준호"],
)
# to_numpy(): DataFrame 에서 숫자만 꺼내 NumPy 배열(행렬)로 바꾼다
table = report.to_numpy()
print("성적표 행렬 shape:", table.shape) # 결과: 성적표 행렬 shape: (2, 3) → 학생 2명, 과목 3개
# table[0]: 첫 행만 꺼낸다. 행 하나는 벡터다
print("민지 벡터:", table[0]) # 결과: 민지 벡터: [90 80 70]
print("민지 벡터 shape:", table[0].shape) # 결과: 민지 벡터 shape: (3,)이 코드가 뜻하는 것
성적표 한 장을 행렬로, 학생 한 명의 줄을 벡터로 꺼내 본 코드입니다. 여기서 성적표가 table, 민지의 점수 줄이 table[0] 입니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
report.to_numpy() | 표에서 숫자만 꺼내 2차원 배열로 만든다 | 이름표를 떼고 숫자만 남기기 |
table.shape | 행 수와 열 수를 본다 | 학생 2명, 과목 3개 |
table[0] | 첫 행을 꺼낸다 | 민지의 점수 줄 하나 |
(2, 3) 과 (3,) 의 차이를 눈여겨봅니다. 행렬은 숫자 두 개로, 벡터는 숫자 하나와 쉼표로 shape 가 나옵니다. 뒤에서 문장 하나가 (낱말 수, d_model) 행렬로 나올 때 이 읽는 법을 그대로 씁니다.
주의할 점
(3,)과(1, 3)은 다릅니다. 앞은 1차원 벡터이고, 뒤는 행이 하나인 2차원 행렬입니다. 숫자는 같아도 곱셈 규칙이 달라지므로 shape 를 자주 찍어 봅니다.- 실제 모델의 벡터는 훨씬 깁니다. 이 장의 예는 숫자 4~6개지만, 원 논문의 Transformer 는 낱말 하나를 숫자 512개로 적습니다.