Wpis z mikrobloga

Udało mi się wreszcie lepiej zrozumieć jak efektywnie uczyć sieci typu GAN do generowania obrazów, więc postanowiłem podzielić się spostrzeżeniami i może oszczędzić komuś sporo czasu. Jak wiadomo ta architektura jest prawdopodobnie najtrudniejsza do debugowania a proces uczenia długi - no ale właśnie niekoniecznie. Jak się okazuje jednoczasowa propagacja wsteczna dla generatora i obu lossów dyskryminatora jest bardzo nieskuteczna. Lepiej rozbić to uczenie na 3 niezależne części - no ale wtedy czas uczenia wydłuża się prawie 3 krotnie, wciąż finalnie progres i tak jest szybszy. Ale z tego do czego doszedłem wynika, że można mieć prawie taką samą szybkość przetwarzania epok i prawie tak samo szybki progres na epokę. Trzeba zastosować tylko mały trik.

Uczenie dyskryminatora oddzielnie na danych rzeczywistych i generowanych nie zwiększa czasu aż tak bardzo, najbardziej ma na to wpływ generowanie obrazów 2 razy. Aby temu zapobiec można zapisać obrazy wygenerowane podczas uczenia generatora. Wtedy jednak uczymy dyskryminator, że te dane ma rozpoznawać jako fałszywe, a generator już nauczył się które z tych danych są dobre - co znacznie spowalnia progres. W ten sposób pokazujemy dyskryminatorowi "najlepsze karty". Ale jest sposób aby trochę go oszukać - duży dropout. Musimy wykonać ponowną kalkulację wyników dla tych samych obrazów ale jest to szybsze niż ponowna ich generacja i dopiero ta sama kalkulacja. A duży dropout sprawia, że te trenowane wagi nie widziały jeszcze tych obrazów.

Dla porównania klasyczne uczenie wszystkiego naraz po 180 epokach (lewo) i oddzielne po 130 (czas ~180 epok klasycznych) (prawo).
#deeplearning #programowanie #python #datascience #machinelearning
Bejro - Udało mi się wreszcie lepiej zrozumieć jak efektywnie uczyć sieci typu GAN do...

źródło: comment_1655938289GU2WRP43WYMF7A3scu6EUP.jpg

Pobierz
  • 8
@Bejro: Ale czy pokazywanie „najlepszych kart” ma znaczenie jak korzystasz z wasserstein distance jako funkcji kosztu? Tam chodzi o to żeby krytyk (dyskryminator) był jak najbardziej optymalny zatem czy wtedy trik z dropoutem ma znaczenie?
@ejsap_kupno: Musiałem trochę poczytać xD. W tym podejściu i tak musisz trenować dyskryminator częściej niż generator więc nie ma to takiego znaczenia. Ale cel tego podejścia jest podobny - aby ustabilizować proces uczenia. I działa to na innej zasadzie. Ale nie rozumiem idei tego WGANa. O ile dobrze rozumiem taki sam (a nawet lepszy) efekt można osiągnąć stosując klasyfikację logitową i crossentropy loss - nie trzeba też wtedy koniecznie stosować przypinania
@Bejro: Nie byłem konkretny. Chodziło mi o WGAN-GP (tutaj nie clipujemy wag tylko mamy penalty na gradiencie, przez co zachowany jest warunek 1-Lipschitzowosci) który ma znacznie stabilniejszy proces uczenia od tego standardowego lossu który przytaczas. W praktyce tez nie stosuje sie częstszego treningu krytyka od generatora. Idea WGAN jest to, ze ta funkcja kosztu ma bardziej informacyjne gradienty przez co generator nawet jak się bardzo myli to może się poprawić (niemożliwe
@ejsap_kupno: Hinge loss jest bardzo podobny do crossentropy z logitów więc to takie cofnięcie się do czegoś co działało od funkcji W. Generalnie WGAN-GP wciąż robi to samo co WGAN ale w inny (lepszy) sposób. Jeśli używamy dyskryminatora z dużym dropoutem na tym samym wygenerowanym batchu to wirtualnie próbkujemy większy rozkład i zwiększamy generalizację - a to coś innego niż zapobieganie zanikaniu gradientów w WGANach.