„По-голямата част от обучението при хора и животни е обучение без надзор. Ако интелигентността беше торта, неконтролираното обучение щеше да бъде тортата [основата], контролираното обучение щеше да е черешката на тортата, а обучението с подсилване щеше да бъде черешката на тортата. Знаем как да направим глазурата и черешата, но не знаем как да направим тортата.“

Директорът на AI Research във Facebook, професор Yann LeCunn многократно споменава тази аналогия в своите разговори. Под неконтролирано учене той се позовава на „способността на машината да моделира околната среда, да предсказва възможно бъдеще и да разбира как работи светът, като го наблюдава и действа в него.“

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

Вариационните автоенкодери (VAE) ни позволяват да формализираме този проблем в рамката на вероятностни графични модели, където максимизираме долната граница на логаритмичната вероятност на данните. В тази публикация ще разгледаме наскоро разработена архитектура, Adversarial Autoencoders, които са вдъхновени от VAE, но ни дават повече гъвкавост в начина, по който картографираме нашите данни в латентно измерение (ако това не е ясно към момента, не се притеснявайте , ще преразгледаме тази идея в публикацията). Една от най-интересните идеи за Adversarial Autoencoders е как да се наложи предварително разпределение на изхода на невронна мрежа чрез използване на adversarial learning.

Ако искате да се докоснете до кода на Pytorch, не се колебайте да посетите GitHub repo. Заедно с публикацията ще разгледаме малко предистория на премахването на шума на автоенкодери и вариационни автоенкодери, за да преминем към Адверсарни автоенкодери, имплементиране на Pytorch, последваната процедура на обучение и някои експерименти по отношение на разплитането и полуконтролираното обучение използвайки набора от данни MNIST.

Заден план

Демонизиращи автоенкодери (dAE)

Най-простата версия на автокодер е тази, в която обучаваме мрежа да реконструира своя вход. С други думи, бихме искали мрежата по някакъв начин да научи функцията за идентичност $f(x) = x$. За да не бъде този проблем тривиален, ние налагаме условието на мрежата да премине през междинен слой (латентно пространство), чиято размерност е много по-ниска от размерността на входа. При това състояние на тясно място мрежата трябва да компресира входната информация. Следователно мрежата е разделена на две части, кодерът получава входа и създава латентно или скрито представяне на него, а декодер приема това междинно представяне и се опитва да реконструира входа. Загубата на автокодера се нарича загуба при реконструкция и може да се дефинира просто като квадратна грешка между входа и генерираните проби:

Друга широко използвана загуба на реконструкция за случая, когато входът е нормализиран да бъде в диапазона [0,1]^N, е загубата на кръстосана ентропия.

Вариационни автоенкодери (VAE)

Вариационните автоенкодери налагат второ ограничение за това как да се конструира скритото представяне. Сега латентният код има предварително разпределение, дефинирано от дизайн p(x). С други думи, енкодерът не може да използва свободно цялото латентно пространство, но трябва да ограничи произведените скрити кодове, за да бъдат вероятно при това предварително разпределение p(x). Например, ако предишното разпределение на латентния код е гаусово разпределение със средно 0 и стандартно отклонение 1, тогава генерирането на латентен код със стойност 1000 би трябвало да е наистина малко вероятно.

Това може да се разглежда като втори тип регулиране на количеството информация, което може да се съхранява в латентния код. Ползата от това се основава на факта, че сега можем да използваме системата като генеративен модел. За да създадем нова извадка, която идва от разпределението на данни p(x), просто трябва да извадим от p(z) и да пуснем тази извадка през декодера, за да възстановим a нова картинка. Ако това условие не е наложено, тогава латентният код може да се разпределя свободно сред латентното пространство и следователно не е възможно да се вземе проба от валиден латентен код, за да се произведе резултат по директен начин.

За да се наложи това свойство, към функцията на загубата се добавя втори член под формата на отклонение на Kullback-Liebler (KL) между разпределението, създадено от енкодера, и предишното разпределение. Тъй като VAE се основава на вероятностна интерпретация, използваната загуба на реконструкция е загубата на кръстосана ентропия, спомената по-рано. Събирайки това заедно, имаме,

or

Където $q(z|x)$ е енкодерът на нашата мрежа и $p(z)$ е предварителното разпределение, наложено върху латентния код. Сега тази архитектура може да бъде съвместно обучена с помощта на обратно разпространение.

Състезателни автоенкодери (AAE)

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

Един от основните недостатъци на вариационните автоенкодери е, че интегралът на термина за дивергенция на KL няма аналитично решение в затворена форма, с изключение на шепа разпределения. Освен това, не е лесно да се използват дискретни разпределения за латентния код z. Това е така, защото обратното разпространение чрез дискретни променливи обикновено не е възможно, което прави модела труден за ефективно обучение. Един подход за това в настройката на VAE беше въведен „тук“.

Съперническите автоенкодери избягват изцяло използването на KL дивергенцията, като използват състезателно обучение. В тази архитектура нова мрежа е обучена да предсказва дискриминационно дали пробата идва от скрития код на автокодера или от предварителното разпределение p(z), определено от потребителя. Загубата на енкодера сега се състои от загубата при реконструкция плюс загубата, дадена от дискриминаторната мрежа.

Изображението показва схематично как работят AAE, когато използваме Gaussian prior за латентния код (въпреки че подходът е общ и може да използва всяко разпределение). Горният ред е еквивалентен на VAE. Първо се изготвя извадка z според генераторната мрежа q(z|x), след което тази проба се изпраща до декодера, който генерира x’ от z. Загубата при реконструкция се изчислява между x и x’ и градиентът се разпространява обратно през p и q съответно и неговите тегла се актуализират.

Фигура 1. Основна архитектура на AAE. Горният ред е автоматичен енкодер, докато долният ред е противопоставяща се мрежа, която принуждава изхода към енкодера да следва разпределението p(z).

В частта за състезателна регуляризация дискриминаторът получава z, разпределено като q(z|x) и z’, взети от истинския предишен p(z) и присвоява вероятност на всяко от идващите от p(z). Възникналата загуба се разпространява обратно през дискриминатора, за да актуализира своите тегла. След това процесът се повтаря и генераторът актуализира своите параметри.

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

Загубата на дискриминатора е

(Сюжет)

където m е размерът на минипартида, z се генерира от енкодера, а z’ е извадка от истинския предход.

За съперническия генератор, който имаме

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

Определение на мрежата

Преди да влезем в процедурата за обучение, използвана за този модел, ние разглеждаме как да внедрим това, което имаме до момента в Pytorch. За мрежите за енкодер, декодер и дискриминатор ще използваме прости невронни мрежи с подаване напред с три 1000 слоя скрити състояния с ReLU нелинейни функции и отпадане с вероятност 0,2.

Някои неща, които трябва да се отбележат от тези определения. Първо, тъй като изходът на енкодера трябва да следва гаусово разпределение, ние не използваме никакви нелинейности на последния му слой. Изходът на декодера има сигмоидна нелинейност, това е така, защото ние използваме входовете, нормализирани по начин, по който техните стойности са в рамките на 0 и 1. Изходът на дискриминаторната мрежа е само едно число между 0 и 1, представляващо вероятността от входът идва от истинското предишно разпределение.

След като мрежовите класове са дефинирани, създаваме екземпляр на всеки един и дефинираме оптимизаторите, които да се използват. За да имаме независимост в процедурата за оптимизация на енкодера (който е и генератор на противниковата мрежа), ние дефинираме два оптимизатора за тази част от мрежата, както следва:

Процедура на обучение

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

1) Направете път през частта на енкодера/декодера, изчислете загубата при реконструкция и актуализирайте параметрите на мрежите на енкодера Q и декодера P.

2) Създайте латентно представяне z = Q(x) и вземете проба z' от предишния p(z), прекарайте всеки един през дискриминатора и изчислете резултата, присвоен на всеки (D(z) ) и D(z')).

3) Изчислете загубата в дискриминатора като и я разпространете обратно през мрежата на дискриминатора, за да актуализирате нейните тегла. В кода,

4) Изчислете загубата на генераторната мрежа и съответно актуализирайте Q мрежата.

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

Сега се опитваме да визуализираме как AAE кодира изображения в 2-D гаусово латентно представяне със стандартно отклонение 5. За това първо обучаваме модела с 2-D скрито състояние. След това генерираме еднакви точки в това латентно пространство от (-10,-10) (горния ляв ъгъл) до (10,10) (долния десен ъгъл) и ги прекарваме през мрежата на декодера.

AAE, за да научите разплетени представяния

Идеалното междинно представяне на данните би било такова, което улавя основните причинно-следствени фактори на вариация, които генерират наблюдаваните данни. Йошуа Бенгио и колегите му отбелязват в „този документ“, че „бихме искали нашите представяния да разплитат факторите на вариацията. Различните обяснителни фактори на данните са склонни да се променят независимо един от друг във входното разпределение“. Те също така споменават, „че най-стабилният подход към изучаването на функции е да се разплитат възможно най-много фактори, като се отхвърля възможно най-малко информация за данните“.

В случай на данни MNIST (които са голям набор от данни от ръкописни цифри), можем да дефинираме два основни причинно-следствени фактора, от една страна имаме генерираното число, а от друга стилът или начинът на писане то.

Подход под наблюдение

В тази част отиваме една стъпка по-далеч от предишната архитектура и се опитваме да наложим определена структура в латентния код z. По-специално искаме архитектурата да може да отделя информацията за класа от стила на проследяване в напълно контролиран сценарий. За да направим това, разширяваме предишната архитектура до тази на фигурата по-долу. Разделяме латентното измерение на две части: първата z е аналогична на тази, която имахме в предишния пример; втората част от скрития код сега е „един горещ вектор“ y, указващ идентичността на номера, подаван към автокодера.

В тази настройка декодерът използва еднократния вектор y и скрития код z, за да реконструира оригиналното изображение. На енкодера остава задачата да кодира информацията за стила в z. На изображението по-долу можем да видим резултата от обучението на тази архитектура с 10 000 етикетирани MNIST проби. Фигурата показва реконструираните изображения, в които за всеки ред скритият код z е фиксиран към определена стойност, а етикетът на класа y варира от 0 до 9. Ефективно стилът се поддържа в колоните.

Полу-контролиран подход

Като наш последен експеримент ние търсим алтернатива за получаване на подобни резултати от разплитане за случая, в който имаме само няколко проби от етикетирана информация. Можем да модифицираме предишната архитектура, така че AAE да произвежда латентен код, съставен от конкатенацията на вектор y, указващ класа или етикета (с помощта на Softmax) и непрекъсната латентна променлива z (с помощта на линеен слой). Тъй като искаме векторът y да се държи като един горещ вектор, ние го налагаме да следва категорично разпределение, като използваме втора състезателна мрежа с дискриминатор Dcat. Енкодерът сега е q(z,y|x). Декодерът използва както етикета на класа, така и непрекъснатия скрит код, за да реконструира изображението.

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

Струва си да се отбележи, че сега не само можем да генерираме изображения с по-малко етикетирана информация, но също така можем да класифицираме изображенията, за които нямаме етикети, като разгледаме латентния код y и изберем този с най-висока стойност. При текущата настройка загубата на класификация е около 3%, като се използват 100 етикетирани проби и 47 000 немаркирани.

На GPU обучение

И накрая, правим кратко сравнение във времето за обучение за този последен алгоритъм в два различни GPU и CPU в платформата Paperspace. Въпреки че тази архитектура не е много сложна и е съставена от няколко линейни слоя, подобрението във времето за обучение е огромно при използване на GPU ускорение. Времето за обучение при 500 епохи намалява от почти 4 часа в CPU до около 9 минути при използване на Nvidia Quadro M4000 и още повече до 6 минути при Nvidia Quadro P5000.

Повече материал

За да изпробвате днес облачен GPU, регистрирайте се тук.

Първоначално публикувано в blog.paperspace.com на 20 март 2017 г.