Jesteś na rozmowie kwalifikacyjnej na stanowisko inżyniera ML w Tesli. Interviewer: Musimy wdrożyć sieć neuronową na sprzęcie brzegowym pojazdu, ale nie mieści się w pamięci. Jak byś to rozwiązał? Ty: Użyję destylacji wiedzy, aby wytrenować mniejszy model. Rozmowa zakończona. Oto, co przegapiłeś:
Destylacja wiedzy wymaga tygodni obliczeń, ponieważ w zasadzie trenujesz nowy model. Ale rozwiązanie jest już w twojej wytrenowanej sieci. Większość neuronów to martwy ciężar - zużywają pamięć, ale ledwo przyczyniają się do prognoz. Zobaczmy, jak je zidentyfikować!
Oto kroki: Krok 1) Wytrenuj sieć neuronową jak zwykle. Krok 2) Przepuść zbiór walidacyjny przez wytrenowaną sieć, a dla każdego neuronu w warstwach ukrytych oblicz: - Średnią aktywację - Wariancję aktywacji (jeśli aktywacje mogą być ujemne) Sprawdź to👇
Krok 3) Przytnij neurony, które mają niemal zerową średnią aktywację i wariancję, ponieważ mają niewielki wpływ na wynik modelu. Idealnie, wykreśl wydajność w różnych progach przycinania, aby wybrać model, który najlepiej pasuje do twojego kompromisu między rozmiarem a dokładnością. Sprawdź to 👇
Przyjrzyjmy się kodowi. Zaczynamy od zdefiniowania prostej sieci neuronowej i jej wytrenowania. Ponieważ później będziemy obliczać aktywacje na poziomie neuronów do przycinania, zwracamy wszystkie pośrednie aktywacje w przebiegu do przodu. Sprawdź to👇
Następnie definiujemy dwie listy z trzema elementami: - Jedna będzie przechowywać średnią aktywacji - Druga będzie przechowywać odchylenie standardowe aktywacji Przepuszczamy zbiór walidacyjny przez nasz model, aby obliczyć te statystyki dla każdej warstwy ukrytej. Sprawdź to 👇
Na tym etapie stwórzmy wykres rozkładu statystyk na poziomie neuronów, które wygenerowaliśmy powyżej. Jak pokazano poniżej, średnie aktywacje większości neuronów i ich odchylenie standardowe są mocno rozłożone wokół wartości bliskich zeru. Spróbujmy je teraz przyciąć.
Aby przeprowadzić przycinanie, iterujemy po liście progów i: - Tworzymy nową sieć i przenosimy wagi, które przekraczają próg. - Oceniamy nową sieć i obliczamy łączną liczbę parametrów. - Dodajemy wyniki do listy. Sprawdź to 👇
Ta tabela porównuje dokładność i redukcję rozmiaru modelu przyciętego w różnych progach w stosunku do oryginalnego modelu. Przy mean=0.1 i std-dev=0.4: - Dokładność modelu spada o 0.08%. - Rozmiar modelu zmniejsza się o 62%. To ogromna redukcja. Sprawdź to 👇
Oto kolejny interesujący wynik. Przy mean=0.5 i std-dev=1: - Dokładność modelu spada o 0,5%. - Rozmiar modelu zmniejsza się o 74%. W zasadzie uzyskujemy prawie podobną wydajność przy 1/4 liczby parametrów. Sprawdź to 👇
Oczywiście, istnieje kompromis między dokładnością a rozmiarem. Gdy zmniejszamy rozmiar, jego dokładność spada (sprawdź wideo). Jednak w większości przypadków dokładność nie jest jedynym wskaźnikiem, który optymalizujemy. Zamiast tego, kilka wskaźników operacyjnych, takich jak wydajność, pamięć itp., jest kluczowymi czynnikami.
340