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

word

Тук влизат автокодерите.

Автокодери

Спомняте ли си как работят невронните мрежи? Автокодерите са вид невронна мрежа, предназначена за намаляване на размерите; с други думи, представляваща една и съща информация с по-малко числа. Основната предпоставка е проста - ние вземаме невронна мрежа и я обучаваме да изплюва същата информация, която е дадена. По този начин ние гарантираме, че активирането на всеки слой трябва, по дефиниция да можете да представите изцяло входните данни (ако те ще бъдат успешно възстановени по-късно). Ако всеки слой е със същия размер като входния, това става тривиално и данните могат просто да бъдат копирани от слой на слой към изхода. Но ако започнем да променяме размера на слоевете, мрежата по същество научава нов начин за представяне на данните. Ако размерът на един от скритите слоеве е по-малък от входните данни, той няма друг избор, освен да намери някакъв начин да компресира данните.

И точно това прави автокодерът. Ако погледнете диаграмата, мрежата започва чрез „компресиране“ на данните в представяне с по-ниско измерение z и след това ги преобразува обратно в реконструкция на оригиналния вход. Ако мрежата се сближи правилно, z ще бъде по-компресирана версия на данните, която кодира същата информация. Например, ако входното изображение е лице, данните могат да бъдат намалени до определени определящи характеристики на лице - форма, цвят, поза и т.н. Представянето на всяка от тези характеристики може да бъде по-ефективно от съхраняването на всеки пиксел и в това наистина са страхотни автокодерите.

Често е полезно да мислите за мрежата като за „кодер“ и „декодер“. Първата половина на мрежата, кодерът, приема входа и го трансформира в представяне с по-ниско измерение. След това декодерът приема това представяне с по-ниски размери и го преобразува обратно в оригиналното изображение (или възможно най-близо до него). Кодерът и декодерът все още се обучават заедно, но след като имаме теглата, можем да използваме двете поотделно - може би използваме енкодера, за да генерираме по-смислено представяне на някои данни, които подаваме в друга невронна мрежа, или декодера, за да нека мрежата генерира нови данни, които не сме ги показвали преди.

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

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

Не сме обхванали директно повтарящи се невронни мрежи (RNN) (все още), но те със сигурност се появяват все повече и повече - и със сигурност са приложени към автокодери. Основната предпоставка зад RNN е, че вместо да работим и да произвеждаме вектор с фиксиран размер, вместо това започваме да работим и да произвеждаме последователности на вектори с фиксиран размер. Да вземем примера за машинен превод (ето едно изречение на английски, дайте ми същото изречение на руски). Поставянето на този проблем пред ванилна невронна мрежа е неразрешимо (бихме могли да преведем изречението дума по дума, но вече знаем, че граматиката не работи така). Въведете RNNs: даваме на мрежата входното изречение по една дума и мрежата магически изплюва едно и също изречение на испански, по една дума. Ще влезем повече в спецификата на това как точно RNN работи достатъчно скоро, но общата концепция засега е достатъчна.

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

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

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

Вграждане на думи

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

Да се ​​върнем към примера с лица за последен път. Започнахме с представянето на лица като поредица от пикселни стойности (да кажем 10 000 пиксела на лице) - за по-голяма простота ще приемем, че изображението е в сива скала и всеки пиксел е представен с една стойност на интензитета, но знайте, че същото принципите се пренасят за RGB данни (и, разбира се, данни без изображения). Сега, нека направим нещо малко интересно и може би неестествено в началото с тези пиксели. Нека използваме всяка пикселна стойност като координата в 10 000-измерно пространство. (Sidenote: ако имате проблеми с визуализирането на това, това е така, защото ние, смъртните хора, не можем да мислим в повече от 3 измерения - просто помислете за всичко от 2 или 3 измерения, но осъзнайте, че точно същите принципи се пренасят в като много измерения, колкото искате). Така че имаме 10 000-измерно пространство и и стойностите на 10 000 пиксела са координатите в това пространство. Всяко изображение в нашия набор от данни има отделно местоположение в това пространство. Ако трябваше да разгледате това невъзможно за визуализиране векторно пространство, ще забележите, че картини с много сходни пикселни стойности са много близо една до друга, докато много различни изображения са много далеч една от друга.

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

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

Процесът на създаване на смислено вграждане на векторно пространство обикновено е относително ясен за нещо като лица. Ако две лица имат подобен външен вид, те трябва да се появяват едно до друго във векторното пространство. Традиционните автокодери са доста добри в това. Но връзките не винаги са толкова очевидни - нека разгледаме примера на думите. Ако погледна буквите, от които се състои една дума, е почти невъзможно за мен да разбера кои думи трябва да са близо една до друга. Може да забележа, че „презентация“ и „присъствие“ имат сходни букви, така че те трябва да са една до друга; но от друга страна, „предисторията“ и „продължението“ също имат сходни букви, но те имат много различна връзка. По същия начин „яхта“ и „лодка“ са доста свързани, но нямат много общи букви. В резултат на това думите обикновено се кодират във векторна форма, използвайки one-of-k кодиране (известен също като едно горещо кодиране). Ако имаме общо N възможни думи, тогава всеки вектор ще има N числа и всички числа освен едно ще бъдат 0. Всяка дума ще има свой собствен индекс във вектора и стойността на тази позиция ще бъде 1. Въпреки че това ни позволява да правим разлика между думите, то не ни дава информация за това как думите са свързани или свързани.

Имаме нужда от по-добра система. Вместо да използваме едно-горещо кодиране, какво, ако можем да използваме нещо като автокодер, за да намалим думите си до по-нискоразмерен вектор, който ни дава повече информация за значението и характеристиките на самата дума? Звучи като план! Но, както вече установихме, автокодерите не могат да научат много значение от буквите, съставящи дума. Ще трябва да създадем нов модел, за да научим значенията и връзките между думите.

И точно това е вграждането на дума е. Накратко ще разгледаме популярен модел за вграждане на думи, но първо нека разгледаме някои от очарователните свойства, които може да има векторното пространство за вграждане на думи. Както се оказва и това не би трябвало да изненадва толкова много, думите имат много по-сложни взаимоотношения от картините на лица. Например, вземете „Вашингтон, окръг Колумбия“ и „Съединените щати“. Двамата очевидно са свързани, но връзката е много специфична. Това е също същата връзка, която имат "Отава" и "Канада". И двете тези връзки са много различни от връзката между „момче“ и „момиче“. В идеалния случай модел за вграждане на думи ще може да изрази всяка от тези връзки отчетливо.

Когато имате векторно пространство, можете да изразите връзки като вектор между две точки. Така че, ако вземете разстоянието от „момче“ до „момиче“, пътуването на едно и също разстояние (в една и съща посока) трябва да ви отведе от „мъж“ до „жена“, защото двамата имат една и съща връзка. Но посоката, която ще вземете, за да стигнете от „Отава“ до „Канада“, трябва да е съвсем различна. Ако можем да създадем пространство за вграждане на думи, което улавя всяка от тези взаимоотношения, това означава, че сега ще имаме невероятно полезен и смислен начин да представяме думите. След като успеем да вкараме думи в пространство като това, невронните мрежи (и разбира се други модели на ML) ще могат да се учат много по-ефективно - докато невронните мрежи обикновено трябва да научат опростена версия на тези взаимоотношения сами, способността да им дадеш тези знания директно означава, че е по-лесно да изпълняваш задачи за обработка на естествен език (като например машинен превод).

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

По принцип word2vec се обучава с помощта на нещо, наречено модел на пропускане на грам. Моделът с пропускане на грам, снимки по-горе, се опитва да използва векторното представяне, което се научава да предсказва думите, които се появяват около дадена дума в корпуса. По същество той използва контекста на думата, тъй като се използва в различни книги и друга литература, за да извлече смислен набор от числа. Ако „контекстът“ на две думи е подобен, те ще имат подобни векторни представления - това вече прави това ново вграждане по-полезно от едно-горещо кодиране. Но, както се оказва, връзките се задълбочават.

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

Нека разгледаме невронна мрежа, обучена за машинен превод, за да получим по-добра представа за това как ни помага вграждането на тази нова дума. Даването му на думи като еднократни вектори не е супер полезно - трябва да се научи самостоятелно, че векторът за „екран“ и „дисплей“ има едно и също значение, въпреки че няма никаква връзка между двата вектора. Но, използвайки нашето изискано ново вграждане на word2vec, “screen” и “display” трябва да имат почти идентични векторни изображения - така че тази корелация идва съвсем естествено. Всъщност, дори ако мрежата никога не е виждала пример за обучение с думата „дисплей“ в нея, тя вероятно ще може да обобщава само въз основа на примерите, които е виждала с „екран“, тъй като двамата имат подобно представяне.

Така че, да, автокодерите са доста спретнати.

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

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