Кратко въведение в GANs

С обяснения на математиката и кода

GANs или Generative Adversarial Networks са вид невронна мрежова архитектура, която позволява на невронните мрежи да генерират данни. През последните няколко години те се превърнаха в едно от най-горещите подполета в задълбоченото обучение, преминавайки от генериране на размити изображения на цифри до фотореалистични изображения на лица.

Преди: размити цифри, След: фотореалистични лица

Вариантите на GAN са направили безумни неща, като преобразуване на изображения на зебри в коне и обратно.

Намерих GAN за завладяващи и в стремежа си да ги разбера по-добре, реших, че ще напиша тази статия и в процеса на обяснение на математиката и кода зад тях ги разбирам по-добре.

Ето линк към github repo, който направих за ресурси на GAN:

И така, как работят GANs?

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

Ето страхотна статия, която обяснява разпределението на вероятностите и други понятия за тези, които не са запознати с тях:

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

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

Обучението на генеративни състезателни мрежи включва две цели:

  1. Дискриминаторът увеличава максимално вероятността да присвои правилния етикет както на тренировъчни примери, така и на изображения, генерирани от генератора. Т.е. полицаят става по-добър в разграничаването между фалшиви и истински картини.
  2. Генераторът минимизира вероятността дискриминаторът да може да предвиди, че това, което генерира, е фалшиво. Т.е. генераторът става по-добър при създаването на фалшификати

Нека опитаме да кодираме тези две идеи в програма.

Ще следваме този код в този урок

Данните

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

Генераторът също се нуждае от произволни входни вектори, за да генерира изображения и за това ще използваме numpy

Функцията GAN

GAN играе minimax игра, при която цялата мрежа се опитва да оптимизира функцията V (D, G). Това е уравнението, което определя какво прави GAN:

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

Генераторът се определя от G (z), който преобразува някакъв шум z, който въвеждаме в някои данни, като изображения.

Дискриминаторът се определя от D (x), което извежда вероятността входът x да е от реалния набор данни или не.

Дискриминаторът действа като полицията

Искаме прогнозите на набора от данни от дискриминатора да са възможно най-близки до 1, а на генератора - колкото е възможно по-близо до 0. За да постигнем това, използваме вероятността за лога на D (x) и 1-D (z) в обективната функция.

Дневникът просто гарантира, че колкото по-близо е до неправилна стойност, толкова повече е санкциониран.

Ето обяснение за загубата на регистрация, ако не сте сигурни какво прави:

Кодиране на генератора

Генераторът е просто модел на ванилна невронна мрежа, който приема произволен входен вектор и извежда 784-димен вектор, който при преобразуване се превръща в 28 * 28 пикселно изображение.

Кодиране на дискриминатора

Дискриминаторът е друга невронна мрежа, която приема изхода на предишната мрежа, 784-измерен вектор и извежда вероятност между 0 и 1, че е дошла от тренировъчния набор от данни.

Съставянето му в GAN

Вече компилираме двата модела в една единствена състезателна мрежа, задавайки входа като 100-измерен вектор, а изхода като изход на дискриминатора.

Обучение на GAN

  1. Първо зареждаме данните и разделяме данните на няколко партиди, за да се захранваме в нашия модел
  2. Тук просто инициализираме нашата GAN мрежа въз основа на методите, дефинирани по-горе
  3. Това е нашата тренировъчна верига, в която работим за посочения брой епохи.
  4. Генерираме някакъв случаен шум и изваждаме някои изображения от нашата база данни
  5. Ние създаваме някои изображения с помощта на генератора и създаваме вектор X, който има някои фалшиви изображения и някои реални изображения
  6. Създаваме вектор Y, който има "правилните отговори", които съответстват на X, с фалшивите изображения с етикет 0 и реалните изображения с етикет 0,9. Те са обозначени 0,9 вместо 1, защото това помага на GAN да тренира по-добре, метод, наречен едностранно изглаждане на етикета.
  7. Трябва да редуваме обучението между дискриминатора и генератора, така че тук актуализираме дискриминатора
  8. Накрая актуализираме дискриминатора.

Първият ни GAN

След като стартираме кода по-горе, ние ефективно създадохме първия си GAN, който генерира цифри от нулата!

Изображения, генерирани от GAN, който обучихме!

Да се ​​надяваме, че тази статия предостави въведение в Генеративните състезателни мрежи и как да се направи такава. В близко бъдеще ще пиша много повече за машинното обучение, непрекъснато се актуализирайте!

Благодаря за четенето,

Sarvasv

Искате да разговаряте? Намерете ме в Twitter и Linkedin

Ето някои други публикации, които написах