Софтмакс Гумбеля: как устроен и для каких нейронных сетей полезен |
||
|
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-08-08 11:45 Всем привет! Меня зовут Николай Лысенко, я занимаюсь рекомендательными системами в Яндекс Маркете. Сегодня хочу затронуть интересную тему: что делать, если в графе вычислений (aka нейронная сеть) возникает дискретное место, через которое не проходит градиент. Как многие знают, для решения этой проблемы есть такие методы, как REINFORCE и софтмакс Гумбеля (Gumbel-Softmax trick). О последнем и пойдёт речь. Хотя про софтмакс Гумбеля уже много написано, ценность этой статьи в том, что вам не придётся ничего искать в интернете и не потребуется делать выкладки на бумаге. Я постарался собрать всю нужную информацию и расписать все промежуточные вычисления. Начнём с примера Представим ленту с рекомендациями на абстрактном маркетплейсе. Чтобы, листая ленту, пользователь не сталкивался с долгой дозагрузкой контента, нужно сразу отгружать десятки товаров и, пока пользователь на них смотрит, готовить следующую партию. Конечная цель — сделать так, чтобы как можно больше товаров соответствовали ожиданиям пользователя, и он положил их в корзину. ![]() То, как на самом деле работают рекомендательные системы, не относится к нашей теме. Но на эту задачу я предлагаю посмотреть под новым углом: как если бы это было обучение с подкреплением. Будем считать выбор товара для каждой позиции действием. Сначала выбирается товар для первой позиции, потом для второй и так далее. Как только вся партия для отображения ленты сформировалась, эпизод завершается. По итогам этого эпизода будет выдана награда, если пользователь что-то закажет. Также возможно, что начнётся следующий эпизод, если пользователь долистает до конца, а не уйдёт раньше. Но допустим, что в истории действий пользователя есть информация, что он недавно искал на маркетплейсе холодильник, но пока его не купил. Для первой партии рекомендаций нужно выбрать 30 товаров. Показать ли 30 холодильников? Всё таки нет, так как не исключено, что пользователь уже купил холодильник в другом месте. А что лучше: показать пять холодильников подряд, а потом 25 других товаров, или показывать то холодильник, то пять разных товаров? Маркетинговые исследования говорят, что окружающий контекст влияет на восприятие текущей рекомендации. К тому же после Рассмотрим агента в виде нейронной сети. Опираясь на информацию о пользователе (например, по его векторному представлению) и о его предыдущих действиях (например, агрегированному через трансформер списку выбранных товаров), она возвращает вероятности товаров, с которыми они могут быть выбраны для текущего действия. Проблема здесь вот в чём. На Всё так сложно потому, что, во-первых, награда выдаётся за совокупность действий. Во-вторых, каждое действие зависит от предыдущих. Если отказаться хотя бы от одного из этих условий, никакой софтмакс Гумбеля будет не нужен. Например, в GPT горизонт планирования — ровно одно слово. Благодаря этому (по крайней мере, на претрейне) нет никакого обучения с подкреплением, а есть просто классификация, где нужно угадывать следующее слово. И каким-то чудом так получается, что, двигаясь каждый раз на одно слово вперёд, модель всё равно выдаёт связный текст, а не набор слов. Однако в рекомендациях нельзя показать пользователю товар, посмотреть, как он на него отреагирует, а только потом показать следующий товар. А вот влиянием соседних рекомендаций на текущую можно пренебречь, решив вышеописанную проблему 30 холодильников как-нибудь по-другому: например, через DPP. Так или иначе, проблема вычисления градиентов при наличии сэмплирования из категориального распределения достаточно общая. Она может возникать не только в обучении с подкреплением, но и в генеративных моделях (наподобие GAN). Чтобы её решить, используют приём с распределением Гумбеля. Его и разберём, но сначала остановимся на пререквизитах. Вероятностные распределения Стандартным распределением Гумбеля Или, что эквивалентно, — распределение с функцией плотности: ![]() Сэмплировать величины
Какой-то смысл в распределении Гумбеля пока искать не нужно. Просто мы ввели некое распределение, из которого умеем сэмплировать, а позже увидим, что это умение пригодится. Также далее будет фигурировать экспоненциальное распределение. У экспоненциального распределения с интенсивностью В то же время функция плотности равна 0 при отрицательных ![]() Связь между этими распределениями такова. Если Альтернативный способ сэмплирования из категориального распределения Пусть есть вектор Чтобы сэмплировать из
Убедимся, что такой способ сэмплирования Продолжим представлять сэмплирование из Повторим это ещё раз в виде альтернативной процедуры сэмплирования
При полученной процедуре сэмплирование из категориального распределения, зависящее как от вектора Решение проблемы вычисления градиентов Несмотря на преимущества сэмплирования через распределение Гумбеля, одного его не хватит для вычисления градиентов. В нём фигурирует операция Введём следующие обозначения:
Модифицируем граф вычислений, в котором фигурирует сэмплирование из категориального распределения с предсказанными вероятностями
Касательно прямого прохода это означает, что операция сэмплирования реализована через распределение Гумбеля, а функция потерь рассчитывается по Искусственным образом объявляется, что у one-hot-кодирования такой же градиент, как у тождественной операции, то есть при обратном проходе её можно просто-напросто пропустить. Это допущение называется «дуболомным» обратным распространением (straight-through backpropagation). Хотя идея может звучать сомнительно, она описывалась классиками глубокого обучения: например, в статье Estimating or Propagating Gradients Through Stochastic Neurons for Conditional Computation. Итого получаем, что при обратном распространении:
Вот и всё. Мы разобрались с приёмом, при помощи которого можно сэмплировать из категориального распределения так, чтобы это не мешало вычислению градиентов. Источники
Источник: habr.com Комментарии: |
|