CHAPTER 5 · PRETRAINING · 실제 노트북 기반

코드를 읽기 전에,
무엇이 바뀌는지부터 보세요.

중요한 흐름 → 직접 눌러 보는 학습 → 전체 코드 한 줄씩 해설

Chapter_5_Excercise_Pretraining.ipynb · 외부 연결 없이 열리는 학습 자료

먼저 구분할 한 가지: 언제 가중치가 바뀔까?

단계 카드를 눌러보세요. 생성에는 역전파가 없고, 평가에서는 LOSS를 구해도 가중치를 바꾸지 않습니다.

LOSS를 직접 움직여 보세요

입력이 나는 밥을이고 정답 다음 토큰이 먹었다라고 가정해요. 아래는 실제 GPT 출력이 아닌 이해용 예시입니다.


토큰 하나의 Cross Entropy: −ln(정답 확률). 실습에서는 여러 배치·위치의 손실을 평균 내요. 코드는 확률이 아닌 logits를 cross_entropy에 넣으며 함수 내부에서 안정적으로 계산합니다.

왜 ‘맞았다 / 틀렸다’만 세지 않나요?

같은 토큰을 선택했더라도 정답에 준 확률이 다를 수 있어요. LOSS는 이 차이를 숫자로 표현해서 가중치를 조정할 학습 신호를 줍니다.

가중치 하나로 학습 한 번 따라가기

GPT 대신 예측 = 입력 × 가중치인 작은 모델을 씁니다. 입력=2, 정답=10, 처음 가중치=3, 학습률=0.1. 여기서는 설명용 제곱 오차와 기본 경사하강법을 사용해요. 실제 실습은 Cross Entropy와 AdamW입니다.

미분식: LOSS=(2w−10)² → 기울기=2×(2w−10)×2. 업데이트 후 손실이 어떻게 달라졌는지 확인하세요.

입력과 정답은 어떻게 연결될까?

아래 숫자는 이해를 위한 토큰 ID예요. 정답은 원문에서 한 칸 뒤의 토큰입니다.

입력 101112

정답 111213

각 위치의 예측을 각각 채점합니다. 학습 시 미래 토큰을 미리 보지 못하도록 모델의 인과적 어텐션 마스크가 막아줍니다.

logits [B,T,V]
문장 2개 × 위치 3개 × 후보 50,257개
→ flatten(0,1) →
[6,50257]
예측 6개, 각각 후보 점수 50,257개
target [2,3]
111213212223
→ flatten() →
[6]

11 · 12 · 13 · 21 · 22 · 23

실제 어휘 수 V는 50,257이며, 정답 ID는 0부터 V−1 범위입니다. flatten은 값을 바꾸지 않고 차원만 합칩니다.

전체 코드를 한 줄씩 읽기

왼쪽은 함수, 가운데는 실제 코드, 오른쪽은 선택한 줄의 설명입니다. 코드 줄을 클릭하거나 ‘다음 줄’로 이동하세요. 먼저 최우선 세 함수를 보세요.

노트북은 수정하지 않았습니다. 기본 화면은 빈칸을 채운 해설용 코드입니다. 원본 보기로 실제 ????와 오타를 확인할 수 있어요. 원본에 있는 Temperature·Top-k 주석은 실제 구현과 다릅니다. 마지막 생성 전에는 model.eval()이 필요하다는 보충 설명을 붙였습니다.
def · for 키워드model() 호출"text" 문자열256 숫자# 설명 주석

이 네 질문에 답할 수 있으면 핵심은 잡았어요

① model.train()을 부르면 학습된 건가요?

아니요. Dropout 등의 동작을 학습 모드로 바꿉니다. 실제 파라미터 수정은 optimizer.step()에서 일어납니다.

② LOSS만 구했으면 가중치가 바뀌나요?

아니요. 예측을 채점했을 뿐입니다. 평가에서도 LOSS를 구합니다.

③ backward()와 step()은 어떻게 다른가요?

backward()는 기울기를 계산하고, step()은 그 정보를 이용해 가중치를 수정합니다.

④ 생성에서도 순전파를 하나요?

네. 현재 모델로 점수를 계산하고 다음 토큰을 고릅니다. 이 실습의 생성에는 정답을 이용한 손실 계산·역전파·업데이트가 없습니다.