Destylacja wiedzy

Destylacja dodaje drugi składnik funkcji straty, który zbliża pośrednie mapy cech ucznia do map zamrożonego nauczyciela. LibreYOLO przechwytuje cechy za pomocą forward hooks, dlatego głowica i funkcja straty nauczyciela nigdy nie uczestniczą w procesie.

Destylacja z większego checkpointu

Ustawienie distill_model włącza destylację. Wartością jest checkpoint nauczyciela wczytywany przez tę samą fabrykę co każdy inny model.

Python
from libreyolo import LibreYOLO # Większy checkpoint tej samej rodziny nadzoruje mniejszy model.model = LibreYOLO("LibreYOLO9s.pt")model.train(    data="my-dataset.yaml",    epochs=100,    distill_model="LibreYOLO9c.pt",    distill_loss_type="mgd",)
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 distill_model=LibreYOLO9c.pt distill_loss_type=mgd

Nauczyciel wykonuje przebieg w ramach no_grad oraz autocast, gdy AMP jest włączone, dzięki czemu zamrożony model nie ponosi kosztu obliczeń z pełną precyzją w każdym kroku. Forward hooks przechwytują jego mapy cech w nazwanych punktach, funkcja straty porównuje je z mapami ucznia, a wynik jest dodawany do funkcji straty trenowania i raportowany jako składnik o nazwie distill.

Destylacja z zamrożonego modelu bazowego backbone

Samonadzorowany ViT może zamiast tego nadzorować pojedynczy etap backbone ucznia. Cechy nauczyciela pochodzą z jego własnego ekstraktora cech, a nie z hooks, zaś funkcja straty obsługuje różnicę między siatką patchy a krokiem splotowym.

Python
from libreyolo import LibreYOLO # Zamrożony samonadzorowany ViT nadzoruje jeden etap backbone.model = LibreYOLO("LibreYOLO9s.pt")model.train(    data="my-dataset.yaml",    epochs=100,    distill_model="dinov2",)
CLI
libreyolo train model=LibreYOLO9s.pt data=my-dataset.yaml \  epochs=100 distill_model=dinov2

distill_model rozpoznaje dinov2, oznaczające DINOv2-base, a także dinov2_vits14, dinov2_vitb14, dinov2_vitl14, dinov2-small, dinov2-base, dinov2-large i każdy surowy identyfikator w hubie zaczynający się od facebook/dinov2. Każda inna wartość jest traktowana jako ścieżka checkpointu nauczyciela.

Ta ścieżka używa feat_mse niezależnie od distill_loss_type i wymaga zainstalowanego transformers. Jeśli nauczyciel zostanie wczytany z brakującymi kluczami wag, proces zostanie przerwany zamiast prowadzić destylację względem częściowo losowego backbone.

Obsługiwane rodziny

Obsługa destylacji jest metodą modelu ucznia i istnieją dwie takie metody.

get_distill_config() udostępnia wieloskalowe punkty przechwytywania nadzorowane przez nauczyciela detektora. Implementują ją YOLOv9, YOLOX i RF-DETR.

get_backbone_distill_config() udostępnia pojedynczy etap backbone nadzorowany przez nauczyciela bazowego. Implementuje ją YOLOv9 i jest jedyną rodziną, która to robi.

Każda inna rodzina zgłasza błąd zamiast trenować bez tej funkcji straty:

LibreDFINE does not implement get_distill_config(). Distillation is not yet
supported for the 'dfine' family.
Foundation-model distillation into the 'yolox' family is not supported yet
(no get_backbone_distill_config()).

Punkty przechwytywania

Punkty przechwytywania są stałe dla każdej rodziny i roli. Nauczyciel i uczeń nie muszą więc mieć tej samej architektury, ale muszą mieć zgodne kroki cech.

RodzinaRolaPunkty przechwytywaniaKroki
YOLOv9nauczyciel lub uczeńneck.elan_up2, neck.elan_down1, neck.elan_down28, 16, 32
YOLOv9uczeń modelu bazowegobackbone.elan316
YOLOXnauczyciel lub uczeńbackbone.C3_p3, backbone.C3_n3, backbone.C3_n48, 16, 32
RF-DETRnauczyciel lub uczeńmodel.backbone.0.projector.stages.0sprawdzane podczas konfiguracji

Niezgodne kroki powodują błąd przed rozpoczęciem trenowania:

Teacher and student must have matching strides. Teacher: [8, 16, 32],
Student: [16]

To sprawdzenie jest pomijane dla nauczycieli bazowych, których istotą jest różnica między siatkami.

Trzy funkcje straty

distill_loss_type wybiera funkcję straty cech dla nauczyciela detektora. Nauczyciel bazowy zawsze używa feat_mse.

mgd, czyli masked generative distillation, maskuje część pozycji przestrzennych ucznia i trenuje mały generator z dwoma splotami, aby z pozostałych pozycji odtworzył pełną mapę cech nauczyciela. distill_mask_ratio określa maskowaną część, domyślnie 0.65.

cwd, czyli channel-wise distillation, przekształca aktywacje przestrzenne każdego kanału w rozkład prawdopodobieństwa i minimalizuje dywergencję KL kanał po kanale. distill_tau jest temperaturą softmax, domyślnie 1.0.

feat_mse wyrównuje kanały ucznia z kanałami nauczyciela za pomocą splotu 1x1, zmienia biliniowo rozmiar siatki nauczyciela do siatki ucznia i oblicza średni błąd kwadratowy. distill_normalize=True najpierw normalizuje L2 obie mapy cech wzdłuż wymiaru kanałów, dzięki czemu dopasowanie zależy wyłącznie od kąta i jest niezmienne względem skali. Wartość domyślna to False.

dis jest globalną wagą stosowaną dodatkowo. Jeśli nie zostanie ustawione, każda funkcja straty używa własnej opublikowanej wartości domyślnej: 2e-5 dla MGD, 1.0 dla CWD i 1.0 dla feature MSE. Wartości te różnią się o pięć rzędów wielkości, dlatego waga dostrojona dla jednego rodzaju funkcji straty jest bezużyteczna dla innego.

Dostrajanie funkcji straty
from libreyolo import LibreYOLO model = LibreYOLO("LibreYOLO9s.pt")model.train(    data="my-dataset.yaml",    distill_model="LibreYOLO9c.pt",    distill_loss_type="cwd",    dis=1.0,           # globalna waga destylacji    distill_tau=1.0,   # temperatura softmax CWD)

distill_mask_ratio, distill_tau i distill_normalize nie mają flag CLI. Są argumentami Pythona lub kluczami YAML w cfg=. W przypadku RF-DETR cała destylacja jest również dostępna tylko w Pythonie, ponieważ mapowanie argumentów CLI tej rodziny nie zawiera kluczy destylacji.

Adaptery, checkpointy i wiele GPU

Każda funkcja straty buduje małe moduły możliwe do trenowania, które znajdują się poza uczniem: adaptery kanałów 1x1 oraz generator MGD. Otrzymują własną grupę parametrów optymalizatora z efektywnym współczynnikiem uczenia przebiegu.

Moduły są zapisywane w checkpoincie pod kluczem distiller i przywracane po wznowieniu, dlatego wznowiony przebieg nie zaczyna z zimnymi projektorami.

W DDP adaptery znajdują się poza opakowanym uczniem, co oznacza, że reduktor DDP nigdy nie widzi ich gradientów. Trener jawnie wykonuje dla nich all-reduce w każdym kroku, dzięki czemu każdy proces trenuje te same adaptery.

Przechwytywanie grafu CUDA nie jest dostępne w przebiegu destylacji. Przekazanie cuda_graph=True zapisuje jeden wiersz w logu i prowadzi trenowanie w trybie eager. Zobacz wydajność trenowania.

Powiązane strony

Zweryfikowano z LibreYOLO v1.5.0.