12 10 10 8 8 출력 y 출력 y b=1을 고정하고 a 바꾸기 6 4 6 4 2 2 0 0 0 1 2 3 4 0 1 입력 x a=1, b=1 a=2, b=1 2 3 4 입력 x a=2, b=1 a=2, b=3 a는 x가 늘 때의 증가량, b는 x=0일 때의 출력입니다. 03
1] y = Wx + b 계산할 출력 각 입력에 비중을 곱하고 더하기 결과 첫 번째 숫자 2×2+1×1+1 6 두 번째 숫자 −1 × 2 + 3 × 1 + 0 1 숫자 하나의 규칙을, 여러 숫자의 계산으로 넓힙니다 LLM의 선형층에서는 W가 여러 가중치를 담고, b가 편향을 담습니다. 05
기초와 텍스트 01~09 문장을 어떻게 숫자로 바꿀까? 약 30분 토큰 사이의 관계 10~14 어떤 토큰의 정보를 섞을까? 약 30분 GPT 조립 15~23 작은 부품을 어떻게 연결할까? 약 25분 학습과 생성 24~29 예측을 어떻게 개선하고 사용할까? 약 30분 1시간이 되면 36장까지 마치고, 다음 시간에 이어갑니다 07
! 0 중복 제거 후 정렬하여 번호 부여 I 53 중복 제거 후 정렬하여 번호 부여 the 988 중복 제거 후 정렬하여 번호 부여 you 1126 중복 제거 후 정렬하여 번호 부여 vocab = {token: integer for integer, token in enumerate(all_words)} ID는 사전의 번호이며, 크기에 의미가 담겨 있지 않습니다 10
특징 2 특징 3 사전 크기 6 ID 0 0.34 -0.18 -0.17 고를 수 있는 행 6개 ID 1 0.92 1.58 1.30 특징 수 3 ID 2 1.28 -0.20 -0.16 ID 3 -0.40 0.97 -1.15 ID 4 -1.16 0.33 -0.63 -2.84 -0.78 -1.41 ID 5 한 토큰당 숫자 3개 입력 [2, 3, 5, 1] 출력 크기 [4, 3] 정수 ID 하나가 C개의 숫자로 된 벡터 하나를 선택합니다 19
벡터 위치 벡터 더한 결과 위치 0 [0.2, 0.4, 0.1] [0.1, 0.0, 0.3] [0.3, 0.4, 0.4] 위치 1 [0.2, 0.4, 0.1] [0.0, 0.5, 0.1] [0.2, 0.9, 0.2] [8, 4, 256] + [4, 256] = [8, 4, 256] 같은 토큰도 문장 속 위치가 다르면 입력 벡터가 달라집니다 20
특징 3 6개 토큰 Your 0.43 0.15 0.89 Your journey starts with one step journey 0.55 0.87 0.66 토큰당 숫자 3개 starts 0.57 0.85 0.64 with 0.22 0.58 0.33 one 0.77 0.25 0.10 0.05 0.80 0.55 step 입력 크기 [6, 3] 이번 기준 토큰 두 번째 행 journey 각 행은 토큰 하나, 각 열은 특징 하나입니다 23
주는 점수 1.50 1.5 1.0 1.48 1.09 0.95 0.84 0.71 0.5 0.0 Your journey starts with one step 점수(journey, starts) = 0.55×0.57 + 0.87×0.85 + 0.66×0.64 기준 벡터와 다른 벡터를 곱해 더한 값이 점수입니다 24
starts with one step 한 행의 합 = 1 Your 0.21 0.20 0.20 0.12 0.12 0.15 비중으로 해석 가능 journey 0.14 0.24 0.23 0.12 0.11 0.16 진할수록 큰 비중 starts 0.14 0.24 0.23 0.12 0.11 0.16 with 0.14 0.21 0.20 0.15 0.13 0.17 one 0.15 0.20 0.20 0.14 0.19 0.13 두 번째 행을 먼저 읽기 아직 미래도 보임 12번에서 마스크 추가 step 0.14 0.22 0.21 0.14 0.10 0.19 행은 정보를 받는 토큰, 열은 정보를 가져올 토큰입니다 25
비중 입력 벡터 Your 13.9% [0.43, 0.15, 0.89] journey 23.8% [0.55, 0.87, 0.66] starts 23.3% [0.57, 0.85, 0.64] with 12.4% [0.22, 0.58, 0.33] one 10.8% [0.77, 0.25, 0.10] step 15.8% [0.05, 0.80, 0.55] journey의 새 벡터 = [0.442, 0.651, 0.568] 새 벡터에는 주변 토큰의 정보가 비중에 따라 섞입니다 26
with one step 보라색: 참조 가능 Your 1 × × × × × 현재와 과거 journey 1 1 × × × × 회색: 참조 차단 starts 1 1 1 × × × with 1 1 1 1 × × one 1 1 1 1 1 × step 1 1 1 1 1 미래 토큰 대각선은 열려 있음 자기 정보도 사용 1 현재 토큰은 자기 자신과 앞쪽 토큰만 볼 수 있습니다 30
4 5 6 p = 0.5 행1 2 2 0 2 2 0 절반 정도를 무작위로 끔 행2 0 0 0 2 0 2 남은 값은 2배 행3 2 2 2 2 0 2 행4 0 2 2 0 0 2 행5 0 2 0 2 0 2 행6 평균 크기를 보정 평가·생성할 때 model.eval() 0 2 2 2 2 0 훈련 중에만 일부 값을 0으로 만들고, 남은 값을 조절합니다 32
법 Q, K, V 각각 [2, 4, 768] 문장, 토큰, 전체 특징 헤드 분리와 축 이동 [2, 12, 4, 64] 문장, 헤드, 토큰, 헤드 특징 Q × Kᵀ [2, 12, 4, 4] 각 헤드의 토큰 간 점수 가중 평균과 헤드 결합 [2, 4, 768] 토큰마다 768개 특징 헤드 계산을 마치면 다시 [B, T, 768]로 돌아옵니다 35
현재 역할 입력 ID [2, 4] 두 문장에 토큰 4개씩 임베딩 [2, 4, 768] 토큰과 위치를 숫자로 더미 블록과 더미 정규화 [2, 4, 768] 그대로 통과하는 자리 출력 로짓 [2, 4, 50,257] 각 위치의 후보 토큰 점수 블록의 자리를 먼저 만들고, 16~21번에서 실제 부품을 채웁니다 37
값 = (x − 평균) / √(분산 + ε) 최종 출력 = scale × 정규화한 값 + shift 설정 초기값 역할 ε 0.00001 분모를 안정적으로 scale / shift 1/0 학습하며 출력 크기와 중심 조절 평균·분산으로 맞춘 뒤, 학습 가능한 scale과 shift를 적용합니다 39
3 설명용 숫자로 보는 입력과 출력 입력 x = 10 15 10 5 더하는 변화량, 입력 x 더하는 변화량, 출력 x + F(x), 3 10 잔차 F(x) = +3 10 0 입력 x 원래 입력 출력 x + F(x) 출력 = 13 더하는 변화량 입력 10을 13으로 바꾸려면, 변화량 +3을 계산해 더합니다 43
없음 잔차 연결 있음 1번째 층 0.000202 0.221698 2번째 층 0.000120 0.206941 3번째 층 0.000715 0.328970 4번째 층 0.001399 0.266573 5번째 층 0.005050 1.325854 첫 층: 0.000202 / 0.221698 이 작은 실험에서는 첫 층의 평균 기울기가 약 1,099배 커집니다 45
파라미터 수 설명 현재 코드의 실제 합 163,009,536 입력 임베딩과 출력층이 별도 가중치 공유를 가정한 계산 124,412,160 출력층 수를 한 번 뺌 fp32 가중치만의 크기 621.8 MiB 훈련 전체 메모리와 다름 임베딩 표 하나의 크기: 50,257 × 768 현재 GPTModel은 토큰 임베딩과 출력 가중치를 별도로 보관합니다 49
전 펼친 뒤 예측 로짓 [2, 3, 50,257] [6, 50,257] 정답 ID [2, 3] [6] 손실 토큰마다 정답 확률 비교 6개 문제의 평균값 cross_entropy(logits.flatten(0, 1), targets.flatten()) CrossEntropyLoss는 확률 대신 로짓을 받아 계산합니다 54
수 훈련 데이터 18,431 가중치 조절에 사용 15,000 검증 데이터 10,000 별도로 오차를 확인 5,000 2,048 0 훈련용 문자 검증용 문자 문맥 길이 256 여기서는 1,024에서 줄임 코드는 원문 문자 수를 기준으로 앞 90%와 뒤 10%를 나눕니다 55
순서 하는 일 코드 1 이전 기울기 비우기 optimizer.zero_grad() 2 현재 예측의 손실 계산 loss = calc_loss_batch(...) 3 가중치별 조절 방향 계산 loss.backward() 4 가중치 갱신 optimizer.step() 손실을 계산하고, 그 손실을 줄이는 방향으로 가중치를 조절합니다 56
후보에 대한 실제 확률 70% 57.21% 60% 50% 35.76% 40% 30% 20% 10% 6.09% 0% closer 0.16% 0.01% every effort forward 0.34% 0.01% 0.01% inches moves pizza 0.40% toward you argmax는 가장 큰 후보, multinomial은 확률에 따른 추출입니다 58
것 이유 1 같은 GPT_CONFIG 가중치를 담을 모양을 맞춤 2 모델 state_dict 학습한 가중치를 복원 3 옵티마이저 state_dict 업데이트의 누적 상태 복원 4 model.train() 후 1에포크 훈련을 이어감 같은 구조를 만든 뒤 모델과 옵티마이저 상태를 복원합니다 62
불러오는 것 다음 연결 28번 gpt_download.py라는 코드 다운로드 도우미 준비 29번 GPT-2 설정과 가중치 내 GPTModel에 값을 배치 28: urlretrieve(...) 29: download_and_load_gpt2(...) 28번은 gpt_download.py를 받으며, 모델 가중치는 29번에서 요청합니다 63
블록 수 헤드 수 헤드당 특징 small 768 12 12 64 medium 1024 24 16 64 large 1280 36 20 64 xl 1600 48 25 64 29번에서 추가로 맞추는 값: context_length = 1024, qkv_bias = True 현재 선택은 GPT-2 XL이며, 위치 길이 1,024와 QKV bias를 맞춥니다 64
내 코드의 자리 필요한 처리 wte / wpe tok_emb / pos_emb 같은 크기로 복사 c_attn의 가중치와 bias W_query / W_key / W_value Q, K, V로 분리 선형층 가중치 attention / FFN의 Linear 필요한 행렬 전치 모든 값 assign(left, right) shape가 다르면 오류 행렬의 이름과 축 순서를 맞추고, 크기를 확인한 뒤 복사합니다 65
온도에 따른 확률 변화를 관찰 Brendan Bycroft의 LLM Visualization 모델을 확대하며 행렬과 반복 블록의 위치를 확인 black7375의 한국어 설명 토크나이저, 임베딩, 트랜스포머의 배경을 복습 PPT의 같은 계산을 웹에서 확대하고 바꿔 볼 수 있습니다 68
06_sliding_window.py 07_data_loader.py 08_token_embedding.py 09_position_encoding.py 10_self_attention.py 11_scaled_dot_product_attention.py 12_causal_attention.py 13_dropout.py 14_gpt_size.py 15_dummy_gpt_model.py 이 파일에서 보는 것 원문 읽기와 정규식 분할 어휘 사전과 토큰 ID 인코딩·디코딩 미등록 단어와 문서 경계 GPT-2 BPE 입력·타깃 한 칸 이동 윈도와 배치 토큰 임베딩 학습 가능한 위치 임베딩 단순 셀프 어텐션 Q/K/V와 스케일링 인과 마스크 드롭아웃 GPT 크기의 멀티헤드 더미 GPT 구조 파일 순서대로 개념이 쌓입니다 70
21_transformer_block_test.py 22_gpt_model_test.py 23_text_generate.py 24_text_eval.py 25_sampling.py 26_sampling2.py 27_model_load.py 28_download_gpt_download.py 29_load_pretrained_gpt.py 이 파일에서 보는 것 정규화의 직관 LayerNorm 클래스 GELU와 ReLU FFN 특징 변환 잔차 연결과 기울기 트랜스포머 블록 GPT 전체 모델과 크기 한 토큰씩 생성 손실·검증·훈련 온도와 Top-k 학습·샘플링·저장 체크포인트 복원 다운로드 도우미 받기 공개 GPT-2 가중치 로딩 파일 순서대로 개념이 쌓입니다 71
문자열을 나눈 모델의 처리 단위 텐서 (tensor) 숫자를 여러 축으로 정리한 배열 임베딩 (embedding) ID에 대응하는 숫자 벡터 어텐션 (attention) 다른 토큰의 정보를 비중에 따라 섞는 계산 로짓 (logit) 확률로 바꾸기 전의 후보 토큰 점수 손실 (loss) 정답 예측이 얼마나 틀렸는지 나타내는 값 기울기 (gradient) 가중치를 어느 방향으로 조절할지 알려 주는 값 체크포인트 (checkpoint) 저장한 모델 또는 학습 상태 영어 이름은 코드에서 같은 개념을 찾을 때 사용합니다 72
연결 01~21 uv sync 후 필요한 파일 선택 실행 22 / 24 / 26 대형 모델 생성·훈련은 강의 전에 확인 27 26번이 만든 model_and_optimizer.pth 필요 28 / 29 도우미 코드 준비 후 GPT-2 가중치 다운로드 uv run python 05_bpe.py 모든 명령은 the-verdict.txt가 있는 저장소 루트에서 실행합니다 73