Używam modeli SVM do krótkoterminowego prognozowania zanieczyszczeń powietrza. Aby wytrenować nowy model, muszę znaleźć odpowiednie metaparametry dla modelu SVM (mam na myśli C, gamma i tak dalej).
Dokumentacja Libsvm (i wiele innych książek, które przeczytałem) sugeruje użycie wyszukiwania siatki w celu znalezienia tych parametrów - w zasadzie trenuję model dla każdej kombinacji tych parametrów z określonego zestawu i wybieram najlepszy model.
Czy istnieje lepszy sposób na znalezienie optymalnych (lub prawie optymalnych) metaparametrów? Dla mnie jest to głównie kwestia czasu obliczeń - jedno przeszukiwanie siatki tego problemu zajmuje około dwóch godzin (po tym, jak przeprowadziłem kilka optymalizacji).
Zalety wyszukiwania siatki:
- Można go łatwo zrównoleglić - jeśli masz 20 procesorów, będzie on działał 20 razy szybciej, równolegle z innymi metodami jest trudniej
- Sprawdzasz duże części przestrzeni metaparametrów, więc jeśli istnieje dobre rozwiązanie, znajdziesz je.
Jeśli przyjmiesz założenie, że pod siatką parametrów leży stosunkowo gładka funkcja, możesz zrobić pewne rzeczy. Na przykład jedna prosta heurystyka polega na tym, aby zacząć od bardzo grubej siatki parametrów, a następnie użyć drobniejszej siatki wokół najlepszych ustawień parametrów z grubej siatki.
W praktyce działa to całkiem dobrze, oczywiście z zastrzeżeniami. Po pierwsze, przestrzeń niekoniecznie musi być gładka i mogą istnieć lokalne optymima . Gruboziarnista siatka może ich całkowicie ominąć i możesz uzyskać nieoptymalne rozwiązanie. Zauważ również, że jeśli masz stosunkowo mało próbek w zestawie podtrzymującym, możesz mieć wiele ustawień parametrów, które dają ten sam wynik (błąd lub dowolną używaną metrykę). Może to być szczególnie problematyczne, jeśli uczymy się w wielu klasach (np. Stosując metodę „ jeden na wszystkich” ), a zestaw zawiera tylko kilka przykładów z każdej klasy. Jednak bez uciekania się do nieprzyjemnych nieliniowych technik optymalizacji prawdopodobnie służy to jako dobry punkt wyjścia.
Jest ładny zestaw odniesień tutaj . W przeszłości przyjąłem podejście, że można rozsądnie oszacować dobry zakres hiperparametrów jądra poprzez kontrolę jądra (np. W przypadku jądra RBF, upewniając się, że histogram wartości jądra daje dobry rozkład wartości, zamiast przechylać się w kierunku 0 lub 1 - i możesz to zrobić automatycznie, bez zbytniej pracy), co oznacza, że możesz zawęzić zakres przed rozpoczęciem. Następnie możesz skoncentrować swoje wyszukiwanie na innych parametrach, takich jak parametr regularyzacji / wydajności. Jednak oczywiście działa to tylko w przypadku wstępnie obliczonych jąder, chociaż można to oszacować na przypadkowym podzbiorze punktów, jeśli nie chcesz używać wstępnie obliczonych jąder, i myślę, że takie podejście byłoby również w porządku.
źródło
Używam symulowanego wyżarzania do wyszukiwania parametrów.
Zachowanie jest regulowane przez kilka parametrów:
k
jest stałą Boltzmanna.T_max
jest twoją temperaturą początkową.T_min
jest twoim końcowym progiem.mu_T
(μ
) to o ile obniżasz temperaturę (T->T/μ
)i
to liczba iteracji w każdej temperaturzez
to rozmiar kroku - sam określasz, co to dokładnie znaczy. Losowo się poruszamold*(1±z)
.p = e^{-(E_{i+1} - E_i)/(kT)}
.T->T/μ
każdąi
iterację, aż uderzyszT_min
.Baw się trochę z parametrami i powinieneś być w stanie znaleźć zestaw, który działa dobrze i szybko.
A Biblioteka Naukowa GNU zawiera symulowane wyżarzanie.
źródło
Jeśli ktoś jest tutaj zainteresowany, zapoznaj się z moimi przemyśleniami na ten temat:
źródło
Jeśli jądro jest promieniowe, możesz użyć tej heurystyki, aby uzyskać właściweσ - Optymalizacja C jest wtedy znacznie łatwiejsza.
źródło