Hugging Face LLM 강좌
트랜스포머 세 갈래 · pipeline 내부 · Trainer 미세조정 · LoRA를 코드와 숫자로 배우는 수업
먼저 알아야 할 것
다루는 내용
Hugging Face LLM 강좌의 핵심을 이 페이지 안에서 배우는 수업입니다. 인코더 · 디코더 · 인코더-디코더 세 갈래, pipeline 뒤의 토크나이저 → 모델 → 소프트맥스를 강좌 출력값으로 검산합니다. 사전학습과 미세조정, Trainer로 MRPC를 미세조정하는 코드, LoRA 파라미터 절감 계산, 생성 설정과 강좌 지도까지 정리합니다.
해설
Hugging Face LLM 강좌
Hugging Face의 무료 LLM 강좌 가운데 실무에 바로 쓰는 뼈대만 골라 이 페이지 안에서 배웁니다. 트랜스포머 모델 세 갈래,
pipeline()한 줄 뒤에서 일어나는 세 단계(토크나이저 → 모델 → 후처리), 사전학습과 미세조정,Trainer로 하는 미세조정 학습 루프, LoRA, 생성 설정까지 숫자와 코드로 따라갑니다.
| 항목 | 내용 |
|---|---|
| 원제 | Hugging Face LLM Course (강좌 인용 표기: The Hugging Face Course) |
| 만든 곳 | Hugging Face (Abubakar Abid, Ben Burtenshaw, Lewis Tunstall, Leandro von Werra 외) |
| 형태 | 무료 온라인 강좌 · 코드 실습 · 장별 퀴즈 · huggingface.co/learn/llm-course |
| 트랙 · 수준 | LLM 활용·에이전트 · 기초 |
| 이 수업이 다루는 범위 | 강좌 1장(트랜스포머 모델) · 2장(Transformers 사용) · 3장(미세조정) · 11장(LoRA)의 핵심 개념. 데이터셋 · 데모 · GRPO 장은 지도만 |
들어가기 전에
- 어텐션만 있으면 된다 (트랜스포머) — 인코더 · 디코더 구조를 알면 1장의 세 갈래 구분이 바로 이해됩니다.
- 토큰과 토크나이저 — 2장의 첫 단계가 토크나이저입니다.
- 언어 모델의 기본: 다음 토큰 예측 · 퍼플렉서티 · 샘플링 — 인과 언어 모델링과 생성 설정(온도 · top-p)의 바탕.
- 파이썬을 읽을 줄 알면 코드를 따라올 수 있습니다. 강좌는 PyTorch · TensorFlow 경험을 필수로 요구하지 않습니다.
한눈에 보기
- 인코더 전용(BERT류) · 디코더 전용(GPT류) · 인코더-디코더(T5류)가 각각 어떤 일에 맞는지 고를 수 있습니다.
pipeline("sentiment-analysis")의 내부를 토크나이저 → 모델 → 소프트맥스 세 단계로 풀어 숫자로 확인합니다.- 사전학습과 미세조정이 무엇이 다르고, 왜 미세조정이 적은 데이터로도 잘 되는지 압니다.
Trainer로 문장 쌍 분류 모델을 미세조정하는 코드의 각 줄이 하는 일을 압니다.- LoRA가 학습 파라미터를 얼마나 줄이는지 직접 계산합니다.
1. 트랜스포머 모델의 세 갈래
직관(해설용 비유). 인코더는 "글을 끝까지 읽고 이해하는 사람", 디코더는 "앞 글만 보고 다음 말을 이어 쓰는 사람", 인코더-디코더는 "원문을 다 읽은 뒤 새 글을 쓰는 번역가"입니다.
강좌 1장의 구분을 표로 정리하면 다음과 같습니다.
| 갈래 | 대표 | 학습 목표 | 잘하는 일 |
|---|---|---|---|
| 인코더 전용(auto-encoding) | BERT | 가린 단어 맞히기(마스크 언어 모델링) | 문장 분류, 개체명 인식 등 '이해' 과제 |
| 디코더 전용(auto-regressive) | GPT | 다음 단어 예측(인과 언어 모델링) | 글 생성 |
| 인코더-디코더(sequence-to-sequence) | T5 | 입력을 받아 출력 문장 생성 | 번역 · 요약 |
왜 갈래가 나뉘나. 인코더는 문장의 앞뒤를 모두 보므로 이해에 유리하지만, 글을 한 토큰씩 만들어 내는 데는 맞지 않습니다. 디코더는 앞만 보도록 가려져 있어(→ 어텐션 직관의 인과 마스킹) 생성에 바로 쓸 수 있습니다. 오늘날 채팅 LLM 대부분은 디코더 전용입니다.
강좌는 트랜스포머의 흐름을 연표로도 보여 줍니다. 2017년 6월 트랜스포머 → 2018년 6월 GPT(강좌 표현으로 "첫 사전학습 트랜스포머 모델") → 2018년 10월 BERT → 2019년 2월 GPT-2 → 2019년 10월 T5 → 2020년 5월 GPT-3 → 2022년 1월 InstructGPT 순입니다.
2. pipeline 뒤의 세 단계
단계(강좌 2장).
- 전처리 — 토크나이저: 글을 토큰으로 자르고 정수 id로 바꾸며, 모델에 필요한 부가 입력(
attention_mask)을 만듭니다. - 모델: id를 받아 클래스마다 점수(로짓)를 냅니다.
- 후처리: 소프트맥스로 로짓을 확률로 바꾸고, 번호를 라벨 이름으로 바꿉니다.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
import torch
ckpt = "distilbert-base-uncased-finetuned-sst-2-english"
tok = AutoTokenizer.from_pretrained(ckpt) # 1) 같은 체크포인트의 토크나이저
model = AutoModelForSequenceClassification.from_pretrained(ckpt) # 2) 분류 헤드가 붙은 모델
inputs = tok(["I've been waiting for a HuggingFace course my whole life.",
"I hate this so much!"],
padding=True, truncation=True, return_tensors="pt")
logits = model(**inputs).logits # 모양: [2, 2]
probs = torch.softmax(logits, dim=-1) # 3) 확률로
print(model.config.id2label) # {0: 'NEGATIVE', 1: 'POSITIVE'}| 기호 | 뜻 |
|---|---|
| 라벨 의 로짓 | |
| 라벨 의 확률 |
숫자로 해 보기(강좌의 출력값으로 검산). 강좌에 실린 첫 문장의 로짓은 입니다. 두 값의 차이는 이므로 긍정 확률은 , 부정은 입니다 — 강좌에 실린 확률과 같습니다. 둘째 문장 는 같은 방법으로 부정 입니다. 로짓이 모양인 것은 "문장 2개 × 라벨 2개"이기 때문입니다.
왜 이렇게 나누나. 세 단계를 분리해 두면 같은 모델에 토크나이저 설정(패딩 · 자르기)만 바꾸거나, 후처리만 바꿔(예: 임곗값 조정) 쓸 수 있습니다. 또 Auto* 클래스가 체크포인트 이름만으로 맞는 토크나이저와 모델 구조를 골라 주므로 둘이 어긋날 일이 줄어듭니다.
3. 사전학습과 미세조정
직관(해설용 비유). 사전학습은 "책을 엄청나게 많이 읽어 언어 감각을 기르는 일", 미세조정은 "그 사람에게 우리 회사 업무 매뉴얼을 며칠 가르치는 일"입니다.
강좌 1장의 설명을 정리하면:
- 사전학습(pretraining): 무작위 가중치에서 시작해 아주 큰 데이터로 학습합니다. 보통 몇 주가 걸리고 비용이 큽니다. 목표는 다음 토큰 예측이나 가린 토큰 맞히기처럼 정답 라벨이 필요 없는 과제입니다.
- 미세조정(fine-tuning): 사전학습된 모델에서 출발해, 과제용 데이터(보통 사람이 라벨을 붙인 데이터)로 이어서 학습합니다. 데이터 · 시간 · 계산이 훨씬 적게 들고, 처음부터 학습한 것보다 성능이 좋은 경우가 많습니다.
왜 잘 되나: 전이 학습(transfer learning). 사전학습 때 배운 문법 · 단어 뜻 · 상식이 새 과제에도 그대로 쓸모가 있기 때문입니다. 강좌는 영어로 사전학습한 모델을 arXiv 말뭉치로 미세조정해 연구 글에 특화된 모델을 만드는 예를 듭니다. 강좌는 또 학습된 가중치를 공유하면 공동체 전체의 계산 비용과 탄소 배출이 줄어든다고 강조합니다.
4. Trainer로 미세조정하기
강좌 3장은 두 문장이 같은 뜻인지 가리는 GLUE MRPC 데이터로 BERT를 미세조정합니다. 흐름은 다음과 같습니다.
flowchart LR
A[load_dataset<br/>glue · mrpc] --> B[토크나이저로<br/>문장 쌍 인코딩]
B --> C[DataCollatorWithPadding<br/>배치마다 길이 맞추기]
C --> D[사전학습 모델 +<br/>새 분류 헤드 num_labels=2]
D --> E[Trainer.train<br/>순전파 · 손실 · 역전파 · 갱신]
E --> F[에폭마다 검증<br/>compute_metrics]
F --> G[정확도 · F1]from datasets import load_dataset
from transformers import (AutoTokenizer, AutoModelForSequenceClassification,
DataCollatorWithPadding, TrainingArguments, Trainer)
import numpy as np, evaluate
ckpt = "bert-base-uncased"
raw = load_dataset("glue", "mrpc")
tok = AutoTokenizer.from_pretrained(ckpt)
def encode(b): return tok(b["sentence1"], b["sentence2"], truncation=True)
ds = raw.map(encode, batched=True)
model = AutoModelForSequenceClassification.from_pretrained(ckpt, num_labels=2)
metric = evaluate.load("glue", "mrpc")
def compute_metrics(p):
logits, labels = p
return metric.compute(predictions=np.argmax(logits, axis=-1), references=labels)
args = TrainingArguments("test-trainer", eval_strategy="epoch")
trainer = Trainer(model, args, train_dataset=ds["train"], eval_dataset=ds["validation"],
data_collator=DataCollatorWithPadding(tok), processing_class=tok,
compute_metrics=compute_metrics)
trainer.train()각 줄이 하는 일.
num_labels=2: 사전학습 때 없던 분류 헤드 를 새로 붙입니다. 이 부분만 무작위로 시작하므로 경고가 뜨는 것이 정상입니다.DataCollatorWithPadding: 데이터 전체를 가장 긴 문장에 맞추지 않고, 배치마다 그 배치의 최대 길이로만 채워 계산을 아낍니다.compute_metrics: 로짓에서 가장 큰 쪽(argmax)을 예측으로 삼아 정확도 · F1을 계산합니다.
강좌가 보고한 결과. 검증 세트 408개에서 정확도 약 85.78%, F1 약 89.97이 나왔다고 강좌는 적고, 분류 헤드의 무작위 초기화 때문에 실행마다 조금씩 달라질 수 있다고 덧붙입니다.
5. LoRA 맛보기: 일부만 학습하기
직관. 큰 모델 전체를 고치는 대신, 원래 가중치는 얼려 두고 작은 보정 행렬 두 개 만 학습해 더합니다.
| 기호 | 뜻 |
|---|---|
| 얼린 사전학습 가중치() | |
| 새로 학습하는 작은 행렬 | |
| 랭크(rank) — 보정의 '자유도' |
숫자로 해 보기(해설용 크기). 인 어텐션 가중치 하나를 통째로 학습하면 개입니다. LoRA는 개로, 원래의 약 0.39% 입니다.
강좌 11장은 LoRA가 일반적으로 학습 파라미터를 약 90% 줄이며, GPT-3 175B에서는 전체 미세조정 대비 학습 파라미터를 10,000분의 1로, GPU 메모리를 3분의 1로 줄였다고 소개합니다. 설정값으로는 랭크 r 을 보통 4~32(작게 4~8부터 시작), lora_alpha 를 보통 랭크의 2배, lora_dropout 을 0.05~0.1로 안내합니다. 학습이 끝나면 merge_and_unload() 로 보정을 원래 가중치에 합쳐, 추론 속도 손해 없이 쓸 수 있습니다. 자세한 원리는 LoRA 논문 해설 에서 이어집니다.
6. 생성 설정과 강좌 지도
디코더 모델로 글을 만들 때는 max_new_tokens(최대 생성 길이), temperature(온도), top_k, top_p 같은 값을 정합니다. 각 값이 확률 분포를 어떻게 바꾸는지는 언어 모델의 기본 에서 손으로 계산했습니다.
강좌의 나머지 장은 필요할 때 찾아가면 됩니다.
| 장 | 내용 | 이런 분께 |
|---|---|---|
| 4장 | Hub에 모델 공유, 모델 카드 | 만든 모델을 동료에게 줄 때 |
| 5장 | Datasets, FAISS로 의미 검색 | 사내 문서 검색(RAG)을 만들 때 |
| 6장 | Tokenizers, BPE · WordPiece · Unigram 구현 | 토크나이저를 직접 학습할 때 |
| 7장 | 토큰 분류 · 번역 · 요약 · 질의응답 | 고전 NLP 과제 |
| 9장 | Gradio 데모 | 화면으로 보여 줄 때 |
| 10~11장 | 데이터 큐레이션, 채팅 템플릿 · SFT · LoRA | 우리 데이터로 LLM을 맞출 때 |
| 12장 | GRPO로 추론 모델 | 강화학습으로 추론을 키울 때 |
연습 문제
- 고객 리뷰를 긍정 · 부정으로 나누는 일과, 회의록을 요약하는 일에 각각 어떤 갈래가 맞나요?
- 풀이: 분류는 인코더 전용(BERT류)이 효율적이고, 요약은 인코더-디코더(T5류)나 디코더 전용 LLM이 맞습니다.
- 로짓이 인 문장의 긍정 확률은?
- 풀이: 입니다.
- , 인 LoRA의 학습 파라미터 수와 비율은?
- 풀이: 개, 전체 개의 약 3.1% 입니다.
- 문장 8개를 3개 라벨로 분류하면 로짓의 모양은?
- 풀이: 입니다.
스스로 점검
- 체크포인트와 다른 토크나이저를 쓰면 왜 안 되나요?
- 답: 토큰 id의 뜻(어휘 표)과 특수 토큰 규칙이 달라져, 모델이 학습 때와 전혀 다른 입력을 받게 되기 때문입니다.
- 미세조정 때 "일부 가중치가 새로 초기화됐다"는 경고는 왜 뜨나요?
- 답: 과제용 분류 헤드는 사전학습 체크포인트에 없어서 무작위로 새로 만들기 때문입니다.
- LoRA를 합친(merge) 뒤 추론 속도가 느려지지 않는 이유는?
- 답: 를 미리 계산해 에 더해 두면 행렬이 원래 크기 하나로 돌아가 추가 계산이 없기 때문입니다.
용어 정리
| 용어 | 쉬운 뜻 |
|---|---|
| 체크포인트(checkpoint) | 학습된 가중치와 설정을 저장한 묶음, 이름으로 불러옴 |
| pipeline | 토크나이저 · 모델 · 후처리를 한 번에 묶은 함수 |
| 로짓(logit) | 소프트맥스 전 점수 |
| 분류 헤드(head) | 모델 끝에 붙여 과제 라벨 점수를 내는 작은 층 |
| 사전학습(pretraining) | 큰 데이터로 처음부터 하는 학습 |
| 미세조정(fine-tuning) | 사전학습 모델을 과제 데이터로 이어서 학습 |
| 전이 학습(transfer learning) | 배운 지식을 다른 과제에 옮겨 쓰는 것 |
| Trainer | 학습 루프 · 평가 · 저장을 대신해 주는 클래스 |
| LoRA | 원래 가중치는 얼리고 작은 저랭크 행렬만 학습하는 방법 |
| 랭크(rank) | LoRA 보정 행렬의 폭, 작을수록 가벼움 |
더 깊이 보려면
- BERT: 양방향 트랜스포머 사전학습 — 인코더 전용 · 마스크 언어 모델링
- LoRA: 저차원 적응으로 대형 모델 미세조정 — 저랭크 보정의 원리와 실험
- 사람 피드백으로 지시를 따르게 학습하기 (InstructGPT) — SFT 다음 단계인 RLHF
- 강좌 원문 1~3장, 11장
다음에 볼 것
- 프롬프트 설계와 인컨텍스트 학습: 제로샷 · 퓨샷 · 생각의 사슬 — 모델을 '잘 쓰는' 첫걸음: 지시 · 예시 · 생각의 사슬을 숫자로 비교
- 생각의 사슬 프롬프팅 (Chain-of-Thought) — 미세조정 없이 프롬프트만으로 추론을 끌어내는 법
- LoRA: 저차원 적응으로 대형 모델 미세조정 — 5절의 LoRA를 원 논문으로
- 검색의 기초: TF-IDF · BM25 · 벡터 검색 · 검색 평가 지표 — 모델 밖의 지식을 가져오는 RAG의 첫걸음
라이선스
강좌 소개 페이지는 강좌가 Apache 2 라이선스로 공개됐다고 밝히며, 공식 저장소(github.com/huggingface/course)의 LICENSE도 Apache License 2.0입니다. 재사용할 때는 출처 표기 · 라이선스 링크 · 변경 사실 표시가 필요합니다. 이 페이지의 설명은 KAITABASE가 강좌 내용을 바탕으로 새로 쓴 해설이며, 코드는 강좌 예제를 줄여 고친 것입니다. 저장소의 한국어(ko) 폴더에는 일부 장만 번역되어 있습니다.
출처
- 원문: huggingface.co/learn/llm-course/chapter1/1 (Hugging Face)
- 1장 How do Transformers work?: huggingface.co/learn/llm-course/chapter1/4
- 2장 Behind the pipeline: huggingface.co/learn/llm-course/chapter2/2
- 3장 Fine-tuning a model with the Trainer API: huggingface.co/learn/llm-course/chapter3/3
- 11장 LoRA: huggingface.co/learn/llm-course/chapter11…
- 공식 목차 · 라이선스: github.com/huggingface/course
AI 원리부터 이해하기 · LLM 활용·에이전트 모듈
LLM 활용·에이전트 모듈 학습
이 글은 LLM 활용·에이전트 모듈의 학습 자료입니다. 전체 19개 자료 중 1번째입니다.
출처·원문
원문 보기번역가능