지식 증류 (Knowledge Distillation)#
퀵스타트#
distill_model 인수를 추가하여 더 큰 교사 모델의 지도를 받아 더 작은 학생 모델을 학습시킵니다:
from ultralytics import YOLO
model = YOLO("yolo26n.pt")
model.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt")지식 증류(Knowledge Distillation)란 무엇입니까?#
지식 증류는 크고 정확한 교사 모델에서 더 작은 학생 모델로 지식을 전달합니다. 학생은 교사의 내부 특징 표현을 모방하는 법을 배우며, 처음부터 학습하는 것보다 종종 더 나은 정확도를 달성합니다.

증류를 사용해야 하는 경우:
- 배포를 위해 더 작고 빠른 모델이 필요한 경우
- 동일한 데이터로 학습된 정확도가 높은 교사 모델이 있는 경우
- 표준 학습보다 더 높은 정확도를 원하는 경우
지식 증류는 detect, segment, pose, obb 작업에 구현되어 있습니다. 현재는 detect 작업에 대해서만 정확도 향상이 실험적으로 검증되었습니다.
성능#
지식 증류는 추가적인 추론 비용 없이 COCO의 전체 YOLO26 패밀리에 걸쳐 학생의 mAP를 향상시킵니다. 아래 표는 표준 YOLO26 모델(기준선)과 권장 교사로부터 증류하여 학습된 동일한 모델을 비교합니다.
| 모델 | 크기 (픽셀) | mAPval 50-95 baseline | mAPval 50-95 distilled | mAPval 50-95 (e2e) baseline | mAPval 50-95 (e2e) distilled |
|---|---|---|---|---|---|
| YOLO26n-distill | 640 | 40.9 | 41.5 | 40.1 | 40.9 |
| YOLO26s-distill | 640 | 48.6 | 49.2 | 47.8 | 48.6 |
| YOLO26m-distill | 640 | 53.1 | 53.9 | 52.5 | 53.3 |
| YOLO26l-distill | 640 | 55.0 | 56.0 | 54.4 | 55.5 |
| YOLO26x-distill | 640 | 57.5 | 57.9 | 56.9 | 57.4 |
- mAPval 값은 COCO val2017 데이터셋에서의 단일 모델 단일 스케일 기준입니다.
yolo val detect data=coco.yaml device=0을(를) 통해 재현하세요. - e2e 값은 기본 NMS 없는 추론 경로를 사용하며, 비 e2e 값은 전통적인 NMS 후처리(
end2end=False)를 사용합니다. 자세한 내용은 엔드투엔드 탐지를 참조하세요.
사전 요구 사항#
시작하기 전에 다음 요구 사항을 충족하는지 확인하십시오:
- 학습된 교사 모델: 학생 모델과 동일한 YOLO 제품군(예: YOLO26)에서 사전 학습된 고정밀 교사 모델.
- 일치하는 데이터셋 및 작업: 교사 모델과 학생 모델 모두 정확히 동일한 데이터셋 및 작업 구성을 사용해야 합니다.
- GPU 리소스: 학습 중에 두 모델을 동시에 로드하고 실행하기에 충분한 GPU 메모리(VRAM) (일반적인 VRAM 오버헤드는 FAQ 참조).
권장 모델 조합#
| 학생 모델 | 권장 교사 모델 |
|---|---|
yolo26n.pt | yolo26s.pt |
yolo26s.pt | yolo26m.pt |
yolo26m.pt | yolo26x.pt |
yolo26l.pt | yolo26x.pt |
교차 제품군 증류(예: YOLO11 교사와 YOLO26 학생)는 지원되지 않습니다.
주요 매개변수#
| 파라미터 | 유형 | 기본값 | 설명 |
|---|---|---|---|
distill_model | str | None | 교사 모델 파일의 경로 (예: yolo26x.pt). 이를 설정하면 지식 증류가 활성화됩니다. |
dis | float | 6.0 | 증류 손실 가중치. 전체 학습 손실에 증류 손실이 기여하는 정도를 제어합니다. |
작동 원리#
- 교사 모델은
eval모드에서 고정된 상태를 유지하며 각 배치에 대해 추론을 수행합니다. - 학생 모델은 표준 작업 손실과 증류 지도를 함께 사용하여 학습합니다.
- 특징은 Detect 제품군 헤드로 전달되는 세 개의 넥 레이어에서 두 모델 모두로부터 추출됩니다.
- 프로젝터 네트워크(경량 MLP)는 학생의 특징 차원을 교사와 일치하도록 조정합니다.
- **점수 가중 L2 손실(score-weighted L2 loss)**은 교사의 분류 신뢰도로 가중치가 적용된, 투영된 학생 특징과 교사 특징을 비교합니다.
- 증류 손실은
dis가중치를 사용하여 표준 손실과 결합됩니다.
flowchart TD
A[Input Image Batch]:::start --> T[Teacher Model<br/>frozen, eval mode]:::extern
A --> S[Student Model<br/>trainable]:::proc
T --> |Detect head inputs| TF[Teacher Features]:::extern
S --> |Detect head inputs| SF[Student Features]:::proc
SF --> P[1×1 Conv Projector<br/>with ReLU]:::decide
P --> AF[Aligned Student Features]:::proc
TF --> SW[Score-weighted L2 Loss]:::proc
AF --> SW
S --> D[Detection Head]:::proc
D --> DL[box_loss + cls_loss + dfl_loss]:::proc
SW --> |× dis| DIS[distillation loss]:::proc
DL --> TOTAL[Total Loss]:::out
DIS --> TOTAL
TOTAL --> BP[Backpropagate<br/>Student + Projector only]:::out
classDef start fill:#4CAF50,color:#fff
classDef proc fill:#2196F3,color:#fff
classDef decide fill:#FF9800,color:#fff
classDef out fill:#9C27B0,color:#fff
classDef extern fill:#607D8B,color:#fff작업 지원#
증류 구현은 모델의 Detect 계열 헤드에 입력되는 세 개의 넥 레이어에서 특징을 추출합니다. segment, pose, 그리고 obb 헤드는 동일한 Detect 아키텍처를 상속받으므로, 증류는 기술적으로 해당 작업과도 호환됩니다.
현재 detect 작업에 대해서만 실험적 벤치마킹 및 검증이 완료되었습니다. segment, pose, obb에 대해서도 증류를 실행할 수 있으나, 해당 작업에 대한 정확도 향상은 아직 검증되지 않았습니다.
from ultralytics import YOLO
# Segment
model = YOLO("yolo26n-seg.pt")
model.train(data="coco8-seg.yaml", epochs=100, distill_model="yolo26s-seg.pt")
# Pose
model = YOLO("yolo26n-pose.pt")
model.train(data="coco8-pose.yaml", epochs=100, distill_model="yolo26s-pose.pt")
# OBB
model = YOLO("yolo26n-obb.pt")
model.train(data="dota8.yaml", epochs=100, distill_model="yolo26s-obb.pt")학습#
기본 학습#
증류를 사용한 학습은 표준 학습과 동일합니다. 활성화하려면 distill_model 경로를 제공하세요:
from ultralytics import YOLO
# Load a student model
student = YOLO("yolo26m.pt")
# Train with knowledge distillation from a larger teacher model
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26x.pt")증류 손실 가중치 조정#
dis 매개변수(기본값: 6.0)는 증류 손실 기여도를 제어합니다:
from ultralytics import YOLO
student = YOLO("yolo26n.pt")
results = student.train(data="coco8.yaml", epochs=100, distill_model="yolo26s.pt", dis=10.0)증류 학습 재개#
증류 학습은 체크포인트에서 재개하는 것을 지원합니다. 교사 모델은 distill_model 경로에서 자동으로 다시 빌드됩니다:
from ultralytics import YOLO
student = YOLO("runs/detect/train/weights/last.pt")
results = student.train(resume=True)학습 출력#
증류가 활성화되면 학습 로그에 추가적인 dis_loss 열이 나타납니다:
Epoch GPU_mem box_loss cls_loss dfl_loss dis_loss Instances Size
1/80 46.2G 1.566 5.404 0.003249 6.658 231 640내보내진 모델은 학생 모델 가중치만 포함합니다. 파일 크기와 추론 속도는 일반적인 방식으로 학습된 학생 모델과 동일합니다.
FAQ#
- 교사와 학생이 동일한 YOLO 세대인지 확인하십시오.
distill_model경로가 올바르고 파일이 로드되는지 확인하세요.- 손실 값이 매우 작다면
dis을(를) 늘려보세요. - 교사 모델이 동일한 데이터셋으로 학습되었는지 확인하십시오.
distill_model매개변수를 추가하세요. 나머지는 모두 동일하게 작동합니다. 학습 중에 추가적인 증류 손실이 계산되지만, 저장된 모델은 오버헤드가 없는 표준 YOLO 모델입니다.네. 교사 모델이 각 배치에서 추론을 실행하기 때문에 1.2~1.5배 느린 학습과 ~1.1배 더 많은 GPU 메모리를 예상할 수 있습니다. 교사는 기울기 없이
eval모드로 실행되어 오버헤드를 관리 가능한 수준으로 유지합니다. 영향을 줄이려면amp=True을(를) 사용하세요.지식 증류는 Detect 제품군 헤드로 전달되는 세 개의 넥 레이어에서 특징을 증류하므로 detect, segment, pose, obb 작업에서 작동합니다. Classify 및 semantic 작업은 지원되지 않습니다.
detect 작업에 대해서만 정확도 향상이 실험적으로 검증되었습니다. Segment, pose, obb는 기술적으로 호환되지만 아직 벤치마킹되지 않았습니다.
교사와 학생은 반드시 동일한 YOLO 제품군(예: YOLOv8, YOLO11, 또는 YOLO26)에 속해야 합니다. 교차 제품군 증류(예: YOLO11 교사와 YOLO26 학생)는 지원되지 않습니다.