Autoregressive
Autoregressive Model
이전 출력을 다음 입력으로 사용하는 순차적 생성 방식. GPT 계열의 핵심.
Autoregressive Model
이전 출력을 다음 입력으로 사용하는 순차적 생성 방식. GPT 계열의 핵심.
Autoregressive(자기회귀) 모델은 시퀀스의 다음 요소를 예측할 때 이전에 생성된 요소들을 입력으로 사용하는 순차적 생성 방식입니다. 수학적으로 P(x) = P(x1) * P(x2|x1) * P(x3|x1,x2) * ... 와 같이 조건부 확률의 곱으로 전체 확률을 분해합니다.
시계열 예측의 ARIMA 모델에서 유래한 개념으로, 딥러닝에서는 2016년 WaveNet(오디오 생성)과 2017년 Transformer 논문을 거쳐 GPT 시리즈의 핵심 원리가 되었습니다. 현재 ChatGPT, Claude 등 대부분의 생성형 AI가 이 방식을 사용합니다.
핵심 원리는 인과적 마스킹(causal masking)입니다. 현재 위치에서 미래 토큰을 볼 수 없도록 어텐션을 마스킹하여, 모델이 왼쪽에서 오른쪽으로 순차적으로 생성하도록 강제합니다. 이를 통해 학습 시에는 병렬 처리가 가능하면서도 추론 시에는 한 토큰씩 생성합니다.
실무에서 AR 모델의 가장 큰 장점은 생성의 일관성입니다. 이전 맥락을 모두 고려하므로 긴 텍스트에서도 논리적 일관성을 유지합니다. 단점은 추론 속도로, N개 토큰 생성에 N번의 forward pass가 필요해 병렬화가 어렵습니다. Speculative decoding 등으로 이를 개선하려는 연구가 활발합니다.
# 간단한 Autoregressive 텍스트 생성 예제
import torch
from transformers import GPT2LMHeadModel, GPT2Tokenizer
# 모델과 토크나이저 로드
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')
model = GPT2LMHeadModel.from_pretrained('gpt2')
def autoregressive_generate(prompt, max_new_tokens=50, temperature=0.8):
"""
Autoregressive 방식으로 텍스트 생성
- 한 토큰씩 순차적으로 생성
- 이전 출력이 다음 입력이 됨
"""
input_ids = tokenizer.encode(prompt, return_tensors='pt')
generated = input_ids
for _ in range(max_new_tokens):
# 현재까지의 시퀀스로 다음 토큰 확률 예측
with torch.no_grad():
outputs = model(generated)
next_token_logits = outputs.logits[:, -1, :]
# Temperature 적용 후 샘플링
probs = torch.softmax(next_token_logits / temperature, dim=-1)
next_token = torch.multinomial(probs, num_samples=1)
# 생성된 토큰을 시퀀스에 추가 (Autoregressive!)
generated = torch.cat([generated, next_token], dim=-1)
# EOS 토큰이면 종료
if next_token.item() == tokenizer.eos_token_id:
break
return tokenizer.decode(generated[0], skip_special_tokens=True)
# 실행 예제
prompt = "The future of artificial intelligence"
result = autoregressive_generate(prompt, max_new_tokens=30)
print(result)
"Autoregressive 특성상 긴 응답 생성에 레이턴시가 선형으로 증가해요. 500토큰 응답이면 500번의 forward pass가 필요하니까요. KV-cache를 활용하면 각 step의 연산량은 줄일 수 있지만, 근본적으로는 speculative decoding 도입을 검토해야 합니다."
"BERT는 양방향으로 전체 문맥을 보는 반면, GPT는 autoregressive라서 왼쪽 맥락만 봅니다. 그래서 BERT는 분류나 NLU에 강하고, GPT는 생성에 강한 거예요. 최근엔 인코더-디코더나 prefix LM으로 둘의 장점을 결합하려는 시도도 있습니다."
"Autoregressive 모델의 학습과 추론에서 Teacher Forcing의 역할을 설명드리면, 학습 시에는 정답 토큰을 입력으로 주어 병렬 학습이 가능하지만, 추론 시에는 자신이 생성한 토큰을 써야 해서 순차 생성이 됩니다. 이 gap을 exposure bias라고 하며, scheduled sampling으로 완화할 수 있습니다."
학습 시 정답 토큰을 보지만 추론 시 자신의 출력을 보는 불일치가 있습니다. 초기 생성 오류가 후속 토큰에 누적되어 품질이 급격히 저하될 수 있으므로, beam search나 nucleus sampling을 적절히 활용하세요.
토큰당 한 번의 forward pass가 필요해 실시간 서비스에서 병목이 됩니다. 배치 처리, KV-cache 최적화, 양자화 등을 조합하고, 긴 응답이 필요한 경우 스트리밍 출력을 고려하세요.
Temperature가 낮거나 greedy decoding을 사용하면 같은 패턴이 반복되는 현상이 자주 발생합니다. repetition penalty나 no_repeat_ngram_size 파라미터를 설정하세요.