Usunąłem 74% neuronów z sieci neuronowej. To obniżyło dokładność tylko o 0,50%. Oto szczegóły (z kodem):
Wytrenowana sieć neuronowa zawsze ma neurony, które nie mają znaczącego wpływu na wydajność. Jednak nadal zużywają pamięć. Można je usunąć bez znaczącego kompromisu w dokładności. 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.
41K