본문으로 이동
메뉴 여닫기
환경 설정 메뉴 여닫기
개인 메뉴 여닫기
로그인하지 않음
지금 편집한다면 당신의 IP 주소가 공개될 수 있습니다.
Instruction Tuning; 인스트럭션 튜닝
여러 과제를 자연어 지시문 형태로 바꾼 데이터로 언어 모델을 미세조정해, 처음 보는 지시도 따르게 만드는 학습 방법

인스트럭션 튜닝(instruction tuning, 지시 튜닝)은 사전 학습된 언어 모델을 "지시문과 그에 맞는 출력" 쌍으로 미세조정해 지시를 따르는 능력을 기르는 방법이다. 2021년 구글의 FLAN 논문이 이 이름을 붙였고, 핵심 주장은 여러 과제를 지시문으로 묶어 학습하면 학습에 없던 과제의 제로샷 성능이 오른다는 것이었다.[1] 지금의 대화형 대형 언어 모델에서 사전 학습 다음에 오는 첫 사후 학습 단계가 이것이다.

학습 방식 자체는 지도 미세조정(SFT)이다. 지도 미세조정 문서가 손실 계산, 데이터 형식, RLHF와의 관계 같은 일반 원리를 다룬다면, 이 문서는 인스트럭션 튜닝이라는 연구 흐름에서 나온 데이터셋과 발견, 지시 데이터를 만드는 방법, 그리고 대화 데이터를 모델 입력으로 바꾸는 채팅 템플릿을 다룬다.

연도 연구 내용
2021.4 Natural Instructions[2] 기존 데이터셋 제작에 쓰인 크라우드소싱 지시문을 모아 과제 61개, 사례 19만 3천 개로 정리. 지시문을 쓴 모델이 처음 보는 과제에서 19% 더 나았다
2021.9 FLAN[1] 1,370억 매개변수 LaMDA-PT를 60여 개 과제로 인스트럭션 튜닝. 평가한 25개 과제 중 20개에서 제로샷 GPT-3 1,750억을 앞섬
2021.10 T0[3] 빅사이언스(BigScience)가 데이터셋마다 여러 문구의 프롬프트를 붙여 인코더-디코더 모델을 다중 과제 학습. 최대 16배 큰 모델보다 나은 제로샷 성능을 자주 보임
2022.3 InstructGPT[4] 실제 API 사용자 프롬프트와 평가자가 쓴 모범 답안으로 SFT 뒤 RLHF. 학술 과제 모음이 아닌 실사용 지시로 방향을 바꿈
2022.4 Super-NaturalInstructions[5] 전문가가 지시문을 쓴 과제 1,616개(76개 유형). 이것으로 학습한 Tk-Instruct가 한 자릿수 작은 크기로 InstructGPT를 9% 넘게 앞섬
2022.10 Flan-T5, Flan-PaLM[6] 과제 수를 1,800여 개로 늘리고 연쇄적 사고 데이터를 섞음. Flan-PaLM 540B가 PaLM 540B보다 평균 9.4% 높고 MMLU 5샷 75.2%. Flan-T5 체크포인트 공개
2022.12 Self-Instruct[7] 모델이 스스로 지시 데이터를 만들게 하는 방법(아래 설명)
2023.3 스탠퍼드 알파카[8] Self-Instruct 방식으로 OpenAI text-davinci-003이 만든 시연 5만 2천 개로 LLaMA 7B를 미세조정. 데이터 생성 비용 500달러 미만, 학습은 A100 80GB 8장으로 3시간
2023.5 LIMA[9] 엄선한 1,000개 예제만으로 LLaMA 65B를 SFT. 통제된 사람 평가에서 GPT-4와 같거나 더 낫다는 응답이 43%

무엇이 일반화를 만드는가

편집 원본 편집

FLAN은 공개 데이터셋 62개를 12개 과제 군집으로 나누고, 데이터셋마다 자연어 지시문 템플릿 10개를 손으로 써서 학습 데이터를 만들었다. 평가할 군집은 학습에서 통째로 빼서, 같은 유형의 과제를 본 적 없는 상태에서 성능을 쟀다.[1] 절제 실험에서 성능을 좌우한 것은 학습 과제(데이터셋) 수, 모델 크기, 자연어 지시문 세 가지였다. 학습 군집을 늘릴수록 처음 보는 군집의 성능이 올랐다.

같은 FLAN 실험에서 1,000억 매개변수 안팎의 두 모델은 인스트럭션 튜닝으로 처음 보는 과제 성능이 크게 올랐지만, 80억 이하 모델에서는 오히려 떨어졌다. 논문은 작은 모델은 학습 과제를 익히는 데 용량을 다 써 버리기 때문일 수 있다고 해석했다.[1] 이후 Flan-T5는 과제 수를 크게 늘리고 다양한 형식(제로샷, 퓨샷, 연쇄적 사고)을 섞어 작은 모델에서도 효과를 냈다.[6]

얕은 정렬 가설

편집 원본 편집

LIMA 논문은 학습 데이터 약 75만 토큰, 1,000개 예제(스택 익스체인지와 위키하우에서 고른 750개와 직접 쓴 250개)로 강한 성능을 보이고, "모델의 지식과 능력은 거의 모두 사전 학습에서 생기고, 정렬은 사용자와 상호작용할 때 어떤 형식과 문체를 써야 하는지를 가르칠 뿐"이라는 얕은 정렬 가설(Superficial Alignment Hypothesis)을 제시했다.[9] 이 관점에서 인스트럭션 튜닝 데이터는 양보다 질과 다양성이 중요하다. 지식을 넣는 방법으로 SFT를 쓰는 것의 한계는 지도 미세조정 문서에도 정리되어 있다.

지시 데이터를 만드는 방법

편집 원본 편집
방법 예 장점 단점
기존 데이터셋에 템플릿 씌우기 FLAN, T0, Super-NaturalInstructions 대량, 정답 품질 보장 학술 과제 위주라 실제 사용자 요청과 거리가 있음
사람이 직접 작성 InstructGPT 시연 데이터, LIMA 실제 요청에 가까움, 품질 높음 비쌈
모델이 생성(자기 지시) Self-Instruct, 알파카 싸고 빠름 생성 모델의 오류와 편향이 전이, 생성 모델 이용 약관 문제
강한 모델의 응답 증류 강한 모델의 답변·사고 과정 수집 성능이 빠르게 오름 학생 모델이 스승 모델의 문체만 흉내 낼 수 있음

Self-Instruct 파이프라인

편집 원본 편집

Self-Instruct는 사람이 쓴 175개 씨앗 과제(과제마다 지시문 1개와 사례 1개)에서 출발해 다음 네 단계를 반복한다.[7]

  1. 지시문 생성: 과제 풀에서 지시문 8개(사람이 쓴 것 6개, 모델이 만든 것 2개)를 뽑아 예시로 주고 새 지시문을 생성한다.
  2. 분류 과제 판별: 출력 레이블이 적은 분류 과제인지 모델에게 판별시킨다.
  3. 사례 생성: 일반 과제는 입력을 먼저 만들고 출력을 만드는 입력 우선 방식, 분류 과제는 레이블을 먼저 정하고 그에 맞는 입력을 만드는 출력 우선 방식으로 만든다. 입력 우선 방식으로 분류 과제를 만들면 한 레이블에 쏠리기 쉬워서다.
  4. 걸러내기: 기존 지시문과의 ROUGE-L 유사도가 0.7 이상이면 버리고, 모델이 처리할 수 없는 키워드(이미지, 그림 등)가 있거나 중복·이상한 사례도 버린다.

GPT-3로 지시문 약 5만 2천 개와 사례 약 8만 2천 개를 만들었고, 이것으로 GPT-3를 미세조정하자 Super-NaturalInstructions에서 원래 모델보다 절대값 33% 높아져 사람 데이터로 학습한 InstructGPT-001과 비슷해졌다.[7]

대화 모델은 여러 차례의 메시지를 하나의 토큰 열로 바꿔 학습하고 추론한다. 이 직렬화 규칙이 채팅 템플릿(chat template)이다. 역할(system, user, assistant) 사이에 특수 토큰을 넣는 방식이 모델마다 다르므로, 학습 때와 추론 때 같은 템플릿을 쓰지 않으면 성능이 떨어진다. 허깅 페이스 Transformers는 템플릿을 Jinja 문법으로 토크나이저 설정에 저장하고 apply_chat_template로 적용한다.[10]

# transformers 5.x
from transformers import AutoTokenizer

tok = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-0.5B-Instruct")
messages = [
    {"role": "user", "content": "Hi there!"},
    {"role": "assistant", "content": "Nice to meet you!"},
    {"role": "user", "content": "Can I ask a question?"},
]
text = tok.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
print(text)

모델이 <|im_start|> 계열 템플릿을 쓰면 결과는 다음과 같은 모양이다(모델에 따라 기본 시스템 메시지가 앞에 붙기도 한다).[10]

<|im_start|>user
Hi there!<|im_end|>
<|im_start|>assistant
Nice to meet you!<|im_end|>
<|im_start|>user
Can I ask a question?<|im_end|>
<|im_start|>assistant
  • add_generation_prompt=True는 끝에 어시스턴트 차례의 시작 토큰을 붙여, 모델이 사용자 메시지를 이어 쓰지 않고 답을 시작하게 한다. 추론할 때 쓰고 학습할 때는 쓰지 않는다.
  • continue_final_message=True는 마지막 메시지의 끝 토큰을 빼서 그 메시지를 이어 쓰게 한다(답 앞부분 미리 채우기). 두 옵션은 함께 쓸 수 없다.
  • 템플릿에 이미 BOS, EOS 같은 특수 토큰이 들어 있으므로, tokenize=False로 만든 문자열을 다시 토큰화할 때는 add_special_tokens=False로 중복을 막는다.[10]

템플릿 자체는 메시지 목록을 도는 Jinja 코드다. 단순화하면 다음과 같다.

{%- for message in messages %}
{{- '<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>' + '\n' }}
{%- endfor %}
{%- if add_generation_prompt %}
{{- '<|im_start|>assistant\n' }}
{%- endif %}

어시스턴트 응답에만 손실 주기

편집 원본 편집

대화 데이터로 학습할 때는 보통 사용자와 시스템 메시지 토큰을 손실에서 빼고 어시스턴트 응답에만 손실을 준다. TRL v1.16.0의 SFTTrainer는 SFTConfig(assistant_only_loss=True)로 이를 지원하는데, 채팅 템플릿에 어시스턴트 구간을 표시하는 {% generation %}, {% endgeneration %} 키워드가 있어야 한다. Qwen3 같은 알려진 모델 계열은 TRL이 템플릿을 자동으로 고쳐 준다.[11]

# pip install "trl==1.16.0"
from datasets import load_dataset
from trl import SFTConfig, SFTTrainer

dataset = load_dataset("trl-lib/Capybara", split="train")   # {"messages": [...]} 대화 형식
trainer = SFTTrainer(
    model="Qwen/Qwen3-0.6B",
    args=SFTConfig(output_dir="qwen3-0.6b-sft", assistant_only_loss=True),
    train_dataset=dataset,
)
trainer.train()
  • 형식은 배우지만 지식은 잘 늘지 않는다: 얕은 정렬 가설이 시사하듯, 인스트럭션 튜닝은 주로 답하는 방식을 바꾼다. 2024년의 통제 실험에서는 사전 학습에 없던 사실을 담은 미세조정 예제가 다른 예제보다 훨씬 느리게 학습되었고, 그런 예제를 학습할수록 환각 경향이 선형으로 늘었다.[12]
  • 합성 데이터의 한계: 모델이 만든 지시 데이터는 생성 모델의 오류와 편향을 물려받는다. 알파카는 학술 연구용으로만 공개하고 상업적 사용을 금지했는데, 기반 모델 LLaMA의 비상업 라이선스와 데이터를 만든 OpenAI 모델의 이용 약관을 이유로 들었다.[8]
  • 작은 모델: FLAN에서는 80억 이하 모델의 일반화가 오히려 나빠졌다.[1] 과제 다양성과 데이터 형식 혼합이 중요하다.
  • 평가 오염: 학술 데이터셋을 지시문으로 바꿔 학습하면 같은 데이터셋의 평가 세트와 겹치기 쉽다. FLAN은 평가 군집을 통째로 빼는 방식으로 이를 막았다. 벤치마크 오염 참고.
  1. ↑ 1.0 1.1 1.2 1.3 1.4 Jason Wei 외, 〈Finetuned Language Models Are Zero-Shot Learners〉, ICLR 2022. arXiv:2109.01652
  2. ↑ Swaroop Mishra 외, 〈Cross-Task Generalization via Natural Language Crowdsourcing Instructions〉, ACL 2022. arXiv:2104.08773
  3. ↑ Victor Sanh 외, 〈Multitask Prompted Training Enables Zero-Shot Task Generalization〉, ICLR 2022. arXiv:2110.08207
  4. ↑ Long Ouyang 외, 〈Training language models to follow instructions with human feedback〉, NeurIPS 2022. arXiv:2203.02155
  5. ↑ Yizhong Wang 외, 〈Super-NaturalInstructions: Generalization via Declarative Instructions on 1600+ NLP Tasks〉, EMNLP 2022. arXiv:2204.07705
  6. ↑ 6.0 6.1 Hyung Won Chung 외, 〈Scaling Instruction-Finetuned Language Models〉, 2022. arXiv:2210.11416
  7. ↑ 7.0 7.1 7.2 Yizhong Wang 외, 〈Self-Instruct: Aligning Language Models with Self-Generated Instructions〉, ACL 2023. arXiv:2212.10560
  8. ↑ 8.0 8.1 Alpaca: A Strong, Replicable Instruction-Following Model, 스탠퍼드 CRFM, 2023-03-13.
  9. ↑ 9.0 9.1 Chunting Zhou 외, 〈LIMA: Less Is More for Alignment〉, 2023. arXiv:2305.11206
  10. ↑ 10.0 10.1 10.2 Chat templates, 허깅 페이스 Transformers 문서(v5.20.0 원문 chat_templating.md).
  11. ↑ SFT Trainer, 허깅 페이스 TRL 문서(v1.16.0 원문 sft_trainer.md).
  12. ↑ Zorik Gekhman 외, 〈Does Fine-Tuning LLMs on New Knowledge Encourage Hallucinations?〉, 2024. arXiv:2405.05904