2장. Transformer 입력 표현
글자가 숫자 행렬이 되기까지
택배를 보낼 때를 떠올려 봅니다. 물건을 그대로 트럭에 싣지 않습니다. 먼저 상자에 나눠 담고(토큰화), 상자마다 송장 번호를 붙이고(토큰 ID), 송장 번호로 무게와 크기가 적힌 정보표를 찾고(임베딩), 몇 번째로 실을지 차례 번호를 붙입니다(위치 정보). 트럭(Transformer)은 이 정보표 묶음만 보고 일합니다.

그림 왼쪽은 문장 "I am a student." 가 토큰으로 나뉘는 모습이고, 오른쪽은 토큰마다 숫자 한 줄(벡터)로 바뀐 모습입니다. 그림에서는 "student" 가 "stude" 와 "nt" 로 나뉘었는데, 토크나이저마다 자르는 법이 달라 생기는 차이입니다. 아래 짧은 예시에서 Qwen 토크나이저는 " student" 를 한 토큰으로 둡니다. 숫자 줄 다섯 개를 위아래로 쌓으면 (토큰 수, d_model) 모양의 행렬, 즉 행이 토큰이고 열이 특징인 표가 됩니다.
1장에서 본 Transformer 구조도에서 이 장이 다루는 곳은 강조된 "입력 준비" 칸입니다. Encoder 와 Decoder 는 모두 이 칸에서 만든 행렬을 받아 일을 시작합니다.
입력 준비의 네 걸음
| 걸음 | 하는 일 | 결과의 모양 | 택배로 치면 |
|---|---|---|---|
| 토큰화 | 문장을 토큰으로 자른다 | ["I", " am", " a", " student", "."] | 상자에 나눠 담기 |
| 정수 ID 변환 | 사전에서 번호를 찾는다 | [40, 1079, 264, 5458, 13] | 송장 번호 붙이기 |
| 임베딩 | 번호마다 d_model 길이의 벡터를 꺼낸다 | (5, d_model) 행렬 | 송장으로 정보표 찾기 |
| 위치 정보 더하기 | 위치마다 다른 벡터를 더한다 | (5, d_model) 행렬(모양은 그대로) | 싣는 차례 번호 붙이기 |
짧은 예시
# AutoTokenizer = 모델 이름만 주면 그 모델에 맞는 토크나이저를 골라 주는 도구
from transformers import AutoTokenizer
# from_pretrained = 이미 학습된(pretrained) 설정에서 불러오기. 처음 한 번만 내려받고 다음부터는 캐시를 쓴다
tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
# 1걸음과 2걸음: 문장을 잘라 번호로 바꾼다. add_special_tokens=False 는 표시용 토큰을 붙이지 말라는 뜻
ids = tok("I am a student.", add_special_tokens=False)["input_ids"]
print(ids) # 결과: [40, 1079, 264, 5458, 13]
# decode = 번호를 다시 글자로. 번호 하나씩 되돌려 토큰 조각을 본다
print([tok.decode([i]) for i in ids]) # 결과: ['I', ' am', ' a', ' student', '.']이 코드가 뜻하는 것
택배 상자 다섯 개에 송장 번호 다섯 개가 붙은 모습을 찍어 본 코드입니다. 여기서 택배 회사가 tok, 송장 번호 목록이 ids 입니다. 토큰 앞의 빈칸(" am")은 "앞에 띄어쓰기가 있던 조각"이라는 표시입니다. 그래서 디코딩하면 띄어쓰기까지 원래대로 돌아옵니다.
| 줄 | 하는 일 | 쉽게 말하면 |
|---|---|---|
AutoTokenizer.from_pretrained(...) | Qwen 의 토크나이저를 불러온다 | 택배 회사 고르기 |
tok(..., add_special_tokens=False) | 문장을 토큰 ID 로 바꾼다 | 상자에 송장 붙이기 |
["input_ids"] | 결과 사전에서 번호 리스트만 꺼낸다 | 송장 번호 목록 |
tok.decode([i]) | 번호 하나를 글자로 되돌린다 | 송장으로 상자 내용 확인 |
주의할 점
- 이 예시는 토크나이저만 불러오고 모델은 불러오지 않습니다. 토크나이저 파일은 수 MB 라 CPU 에서 몇 초면 끝납니다.
- 처음 실행할 때는 Hugging Face 에서 파일을 내려받으므로 인터넷이 필요합니다. Windows 에서는 이때 "symlinks" 경고가 한 번 보일 수 있는데, 캐시가 조금 더 자리를 차지한다는 안내일 뿐 결과에는 영향이 없습니다.