# GPT 언어모델 입력-타겟 쌍 생성 원리 ## 핵심 개념 언어 모델은 **입력 텍스트를 보고 다음 글자를 예측**하는 자기회귀적(autoregressive) 방식으로 학습합니다. ## 1. 데이터 준비 과정 ### 1.1 초기 데이터 설정 ```python x = train_dataset[:block_size] # 인덱스 [0:8] - 처음 8개 요소 y = train_dataset[1:block_size+1] # 인덱스 [1:9] - 1부터 9까지 (한 칸 밀림) ``` ### 1.2 왜 y를 한 칸 밀어서 생성하는가? - x의 각 위치에서 **바로 다음 글자**가 정답이 되도록 설정 - x[i]의 다음 글자 → y[i]가 되는 구조 - 이렇게 하면 모델이 현재까지의 문맥으로 다음 글자를 예측하도록 학습 ## 2. 학습 데이터 생성 과정 ### 2.1 for 루프 동작 원리 ```python for time in range(block_size): context = x[:time+1] # 처음부터 time+1개까지의 문맥 target = y[time] # 예측해야 할 다음 글자 ``` ### 2.2 각 시점별 입력-타겟 쌍 | time | context (입력) | target (정답) | 설명 | |------|---------------|--------------|------| | 0 | x[:1] | y[0] | 첫 글자로 두 번째 글자 예측 | | 1 | x[:2] | y[1] | 첫 두 글자로 세 번째 글자 예측 | | 2 | x[:3] | y[2] | 첫 세 글자로 네 번째 글자 예측 | | ... | ... | ... | ... | ## 3. 실제 예시로 이해하기 ### 3.1 텍스트 예시: "안녕하세요" ```python # 텍스트를 숫자로 변환 (가정) "안녕하세요" → [1909, 1169, 2546, 1770, 2008] # block_size = 4일 때 x = [1909, 1169, 2546, 1770] # "안녕하세" y = [1169, 2546, 1770, 2008] # "녕하세요" ``` ### 3.2 학습 과정 상세 ``` time=0: 입력="안"(1909) → 예측="녕"(1169) time=1: 입력="안녕"(1909,1169) → 예측="하"(2546) time=2: 입력="안녕하"(1909,1169,2546) → 예측="세"(1770) time=3: 입력="안녕하세"(1909,1169,2546,1770) → 예측="요"(2008) ``` ## 4. Python 슬라이싱 복습 ### 4.1 슬라이싱 규칙 - `list[start:end]`에서 **end 인덱스는 포함되지 않음** - `x[:2]` → 인덱스 0, 1만 포함 - `x[1:4]` → 인덱스 1, 2, 3만 포함 ### 4.2 예시 ```python x = [10, 20, 30, 40, 50] x[:2] # [10, 20] → 인덱스 0, 1 x[:3] # [10, 20, 30] → 인덱스 0, 1, 2 x[1:4] # [20, 30, 40] → 인덱스 1, 2, 3 ``` ## 5. 왜 이렇게 학습하는가? ### 5.1 자기회귀 모델의 특성 - GPT는 **이전 토큰들을 보고 다음 토큰을 예측**하는 모델 - 실제 사용 시에도 동일한 방식으로 텍스트 생성 ### 5.2 학습 효율성 - 하나의 시퀀스에서 여러 개의 학습 샘플 생성 - block_size=8이면 8개의 서로 다른 길이의 입력-타겟 쌍 생성 - 다양한 길이의 문맥을 학습하여 범용성 확보 ## 관련 참고 자료 - [[02일차_2장 to 2.4_GPT 기초]] - [[Python 기초 문법 - 컴프리헨션과 메서드]] - [[PyTorch 텐서와 torch.tensor() 완전 가이드]]