# 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() 완전 가이드]]