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

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

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

Въведете AutoGrad и Embeddings

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

Но както Justin Basilico показа в своя информативен семинар talk на ICML, моделирането на проблема като мрежа с дълбоко предаване прави задачата за обучение много по-сложна. Поради наличието на повече параметри и хиперпараметри, той изисква повече изчисления, като същевременно осигурява само „съмнителни подобрения“ за действителната задача. Така че защо трябва да се притесняваме да мислим за проблема по този начин?

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

Други начини за изучаване на вграждания

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

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

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

За препоръка има много различни начини за създаване на тези последователности. Airbnb има „страхотен документ“ за това как те събират поредици от обяви въз основа на последователни кликвания на потребителя върху обяви по време на сесия за търсене/резервация, за да научат вграждането на артикули. Alibaba има друг „интересен начин“, при който те поддържат графика на взаимодействие артикул-артикул, където край от артикул A до B показва колко често даден потребител е щраквал върху артикул B след артикул A, и след това използват произволни разходки в графиката, за да генерират последователности.

И така, какво е толкова готино в тези вграждания?

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

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

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

Първоначално публикувано на https://abhadury.com.