ProGAN: Как NVIDIA генерира изображения с безпрецедентно качество

Прогресивно нарастващите GAN им позволяват да станат по-големи и по-стабилни

Хората в изображенията с висока разделителна способност по-горе може да изглеждат реални, но всъщност не са — те са синтезирани от ProGAN, обучен на милиони изображения на знаменитости. „ProGAN“ е разговорният термин за тип генеративна състезателна мрежа, която е въведена за първи път в NVIDIA. Публикуван е от Karras et al. миналата година в „Прогресивно разрастване на GAN за подобрено качество, стабилност и вариация“. В тази публикация ще разгледаме този документ, за да разберем как работи този тип мрежа, как може да създава изображения като тези по-горе и защо това е пробив.

Тази публикация предполага, че сте запознати с дълбокото обучение за визуални задачи като цяло, но не и че имате обширни познания за GAN.

Кратка история на GAN

Нов вид генеративен модел

Generative Adversarial Networks (GANs) съществуват от няколко години. Те бяха представени в „сега известна статия от 2014 г.“ от Иън Гудфелоу и колеги от университета в Монреал и оттогава са популярна област на изследване.

Накратко, GANs са вид генеративен модел, който се опитва да синтезира нови данни, които са неразличими от данните за обучение. Това е форма на обучение без надзор. Той има две невронни мрежи, заключени в конкуренция: генератор, който се захранва с вектор от произволни числа и извежда синтезирани данни, и дискриминатор, който се захранва с част от данни и извежда вероятност те да са от набора за обучение (за разлика от синтезирания). С други думи, генераторът създава „фалшификати“, а дискриминаторът се опитва да различи тези „фалшиви“ проби от „истинските“.

И двете мрежи започват да се представят доста слабо при задачите си, но когато обучението върви добре, те се подобряват в тандем, докато генераторът не произвежда убедителни фалшификати. Двете мрежи са заключени в игра с нулева сума, където успехът на едната съответства на провал на другата. Поради това стойността на функцията на загубите във всеки даден момент не ни казва колко добре е обучена системата като цяло, а само колко добре се справят генераторът или дискриминаторът относително към другия.

Случайният код, който подаваме в генератора, е особено важен. Това е източник на шум, който позволява на синтезираните проби да бъдат нови и уникални. Освен това има тенденция да контролира изхода по интересни начини. Тъй като линейно интерполираме около векторното пространство на произволния код, съответният генериран изход също се интерполира плавно, понякога дори по начини, които са интуитивни за нас, хората.

Предизвикателства и ограничения

Въпреки че всичко това беше много вълнуващо за изследователите, интересуващи се от нови начини за научаване на представяне на немаркирани данни, използването на GAN на практика често беше доста трудно. От самото начало практикуващите забелязаха, че са трудни за обучение. Това до голяма степен се дължи на проблем, наречен колапс на режим. Колапсът на режима може да възникне, когато дискриминаторът по същество „спечели“ играта и тренировъчните градиенти за генератора стават все по-малко полезни. Това може да се случи относително бързо по време на обучение и когато се случи, генераторът започва да извежда почти една и съща проба всеки път. Спира да се подобрява.

Дори Иън Гудфелоу признава, че е извадил късмет, когато хиперпараметрите, които е избрал за първия си GAN, са работили, когато го е изпробвал с предчувствие – те лесно са можели да се провалят. През годините след това изследователската общност измисли много начини да направи обучението по-надеждно. Някои фамилии архитектури изглежда работят по-добре от други и са проучени няколко вариации на функциите за състезателна загуба. Някои от тях изглеждат по-стабилни от други. Бих препоръчал „Равни ли са създадените GAN? A Large Scale Study» от Lucic et al., отличен скорошен преглед на ландшафта на GAN, ако искате да прочетете повече.

Въпреки това нито един от тези подходи не е елиминирал проблема изцяло и теоретичните причини за колапса на режима остават област на активно изследване.

Генериране на изображения

Голямо подобрение в генерирането на изображения се случи през 2016 г., когато Radford et al публикуваха „Unsupervised Representation Learning With Deep Convolutional Generative Adversarial Networks“. Те бяха открили семейство от GAN архитектури, които работеха добре за създаване на изображения, наречени накратко „DCGANs“. DCGAN се отърваха от обединяващите слоеве, използвани в някои CNN, и разчитаха на навивки и транспонирани навивки, за да променят размера на представянето. Повечето слоеве бяха последвани от партидна нормализация и активиране на ReLU с теч.

И все пак дори DCGAN могат да създават изображения само с определен размер. Колкото по-висока е разделителната способност на изображението, толкова по-лесно става за дискриминатора да различи „истинските“ изображения от „фалшификатите“. Това прави колапса на режима по-вероятен. Докато синтезирането на изображения с размери 32x32 или дори 128x128 се превърна в рутинен учебен материал, генерирането на изображения с разделителна способност над 512x512 остава предизвикателство на практика.

Трябва да отбележа, че някои техники за превод от изображение към изображение могат да се справят с високи разделителни способности, но това е различна задача, тъй като те се научават да променят само характеристиките на повърхностно ниво на входно изображение и са не генериране на изцяло ново изображение от нулата.

Както можете да си представите, трудността при генериране на големи изображения от нулата силно ограничава полезността на GAN за много видове практически приложения.

Към по-високи разделителни способности на изображенията

В този контекст екипът на NVIDIA представи изумително детайлните 1024x1024 изображения в горната част на тази статия, генерирани от техния нов ProGAN. Още по-добре, те не знаеха причина тяхната техника да не може да се използва за синтезиране на изображения с дори по-висока разделителна способност. Той беше дори по-ефективен (по отношение на времето за обучение) от предишните GAN.

Растящи GAN

Вместо да се опитва да обучи всички слоеве на генератора и дискриминатора наведнъж — както обикновено се прави — екипът постепенно разрасна своя GAN, един слой наведнъж, за да обработва прогресивно версии с по-висока резолюция на изображенията.

За да направят това, те първо изкуствено свиват своите изображения за обучение до много малка начална резолюция (само 4x4 пиксела). Те създадоха генератор само с няколко слоя за синтезиране на изображения при тази ниска резолюция и съответен дискриминатор на огледална архитектура. Тъй като тези мрежи бяха толкова малки, те се обучиха относително бързо и научиха само широкомащабните структури, видими в силно замъглените изображения.

Когато първите слоеве завършат обучението, те добавят още един слой към G и D, удвоявайки изходната разделителна способност до 8x8. Тренираните тежести в по-ранните слоеве бяха запазени, но не и заключени, а новият слой беше избледнял постепенно, за да помогне за стабилизиране на прехода (повече за това по-късно). Обучението е подновено, докато GAN отново не синтезира убедителни изображения, този път с новата резолюция 8x8.

По този начин те продължиха да добавят слоеве, да удвоят разделителната способност и да тренират, докато се достигне желаният изходен размер.

Ефективността на отглеждането на GAN

Като увеличаваме постепенно разделителната способност, ние непрекъснато искаме от мрежите да научат много по-проста част от общия проблем. Постепенният процес на обучение значително стабилизира обучението. Това, в комбинация с някои подробности за обучението, които ще обсъдим по-долу, намалява шанса за колапс на режима.

Тенденцията от ниска към висока разделителна способност също принуждава прогресивно разрастващите се мрежи първо да се съсредоточат върху структурата на високо ниво (модели, забележими в най-замъглените версии на изображението) и да попълнят подробностите по-късно. Това подобрява качеството на крайното изображение, като намалява вероятността мрежата да получи драстично грешна структура на високо ниво.

Постепенното увеличаване на размера на мрежата също е по-ефективно от изчислителна гледна точка от по-традиционния подход за инициализиране на всички слоеве наведнъж. По-малкото слоеве са по-бързи за обучение, тъй като в тях просто има по-малко параметри. Тъй като всички с изключение на крайния набор от обучителни итерации се извършват с подмножество от евентуалните слоеве, това води до някои впечатляващи печалби в ефективността. Karras и др. установиха, че техният ProGAN обикновено се обучава около 2–6 пъти по-бързо от съответния традиционен GAN, в зависимост от изходната разделителна способност.

Архитектурата

В допълнение към постепенното разширяване на мрежите, авторите на статията на NVIDIA направиха няколко други архитектурни промени, за да улеснят стабилното и ефективно обучение.

Архитектурата на генератора за дадена разделителна способност k следва познат модел от високо ниво: всеки набор от слоеве удвоява размера на представянето и намалява наполовина броя на каналите, докато изходният слой създаде изображение само с три съответстващи канала към RGB. Дискриминаторът прави почти точно обратното, като намалява наполовина размера на представянето и удвоява броя на каналите с всеки набор от слоеве. И в двете мрежи моделът на удвояване на канала се прекъсва чрез ограничаване на броя на филтрите на разумна стойност, като 512, за да се предотврати прекомерното увеличаване на общия брой параметри.

В този смисъл ProGAN прилича на по-ранните GAN, създаващи изображения. Подобна структура е използвана от DCGAN.

DCGAN обаче използва транспонирани навивки, за да промени размера на представянето. За разлика от това, ProGAN използва най-близки съседи за увеличаване на мащаба и обединяване на средни стойности за намаляване на мащаба. Това са прости операции без заучени параметри. След това те са последвани от два навити слоя.

„Избледняване“ на нови слоеве

Мрежите постепенно нарастват чрез добавяне на нов набор от слоеве за удвояване на разделителната способност всеки път, когато обучението завърши при съществуващата разделителна способност. Когато се добавят нови слоеве, параметрите в предишните слоеве остават обучаеми.

За да се предотвратят сътресения в съществуващите по-ниски слоеве от внезапното добавяне на нов горен слой, горният слой е линейно „избледнял“. Това затихване се контролира от параметър α, който е линейно интерполиран от 0 до 1 в хода на много повторения на обучение. Както можете да видите на диаграмата по-горе, крайното генерирано изображение е претеглената сума от последния и предпоследния слой в генератора.

Нормализиране на пикселите

Вместо да използват групова нормализация, както обикновено се прави, авторите са използвали пикселна нормализация. Този слой „pixelnorm“ няма обучаеми тежести. Той нормализира вектора на характеристиките във всеки пиксел до единица дължина и се прилага след конволюционните слоеве в генератора. Това се прави, за да се предотврати излизането извън контрол на величините на сигнала по време на тренировка.

Дискриминаторът

Генераторът и дискриминаторът са грубо огледални изображения един на друг и винаги растат в синхрон. Дискриминаторът взема входно изображение x, което е или изход от генератора, или изображение за обучение, намалено до текущата разделителна способност за обучение. Както е типично за дискриминаторите на GAN, той се опитва да разграничи „истинските“ изображения на комплекта за обучение от „фалшивите“ генерирани изображения. Той извежда D(x), стойност, която улавя увереността на дискриминатора, че входното изображение идва от набора за обучение.

Минипартида Стандартно отклонение

Като цяло GAN са склонни да произвеждат проби с по-малко вариация от тази, открита в набора за обучение. Един подход за борба с това е да накарате дискриминатора да изчисли статистически данни за цялата партида и да използва тази информация, за да разграничи „истинските“ партиди с данни за обучение от „фалшивите“ генерирани партиди. Това насърчава генератора да произвежда по-голямо разнообразие, така че статистическите данни, изчислени в генерирана партида, да приличат повече на тези от партида с данни за обучение.

В ProGAN това се прави чрез вмъкване на слой „минипартидно стандартно отклонение“ близо до края на дискриминатора. Този слой няма параметри, които могат да се обучават. Той изчислява стандартните отклонения на пикселите на картата на характеристиките в партидата и ги добавя като допълнителен канал.

Изравнена скорост на учене

Авторите установиха, че за да се осигури здравословна конкуренция между генератора и дискриминатора, е от съществено значение слоевете да се учат с подобна скорост. За да постигнат тази изравнена скорост на обучение, те мащабират теглата на даден слой според това колко тегла има този слой. Те правят това, използвайки същата формула, която се използва при Инициализацията Той, с изключение на това, че го правят при всяко преминаване напред по време на обучение, а не само при инициализация.

Благодарение на тази намеса не са нужни фантастични трикове за инициализация на тегло - простото инициализиране на тегла със стандартно нормално разпределение работи добре.

Функция на загубата

Авторите казват, че изборът на функция на загуба е ортогонален на техния принос - което означава, че нито едно от горните подобрения не разчита на конкретна функция на загуба. Би било разумно да се използва някоя от популярните функции за загуба на GAN, които се появиха през последните няколко години.

Въпреки това, ако искате да следвате точно статията, те са използвали подобрената функция за загуба на Wasserstein, известна също като WGAN-GP. Това е една от по-популярните често срещани функции за загуба и е доказано, че стабилизира обучението и подобрява шансовете за конвергенция.

Важно е да се отбележи, че функцията за загуба на WGAN-GP очаква D(x) и D(x’) да бъдат неограничени числа с реална стойност. С други думи, изходът на дискриминатора не се очаква да бъде стойност между 0 и 1. Това е малко по-различно от традиционната формулировка на GAN, която разглежда изхода на дискриминатора като вероятност.

Резултати

Ако сте стигнали дотук, поздравления! Вече разбирате доста добре един от най-съвременните алгоритми за генериране на изображения. Ако искате да видите повече подробности за обучението, има отлична официална реализация, която беше пусната от екипа на NVIDIA. Те също имат беседа по темата.

Благодаря за четенето! Надявам се, че това беше полезен преглед. Моля, оставете коментар, ако имате въпроси, корекции или предложения за подобряване на тази публикация.