Telegram Web
HNSW [2016] - один из столпов современных рекомендательных систем

В больших системах существуют миллионы вариантов того, что можно порекомендовать пользователю. Это слишком много, чтобы применять ML для оценки релевантности документа, и, чтобы сузить выбор, существует этап кандидатогенерации. Генераторы бывают тупыми - например, какие-нибудь фильтры по ключевым словам, но бывают и умные, основанные на эмбеддингах.

Идея следующая: у нас есть эмбеддинг пользователя u и N эмбеддингов документов d, и мы хотим взять k ближайших к пользователю документов. Проблема в том, для точного ответа на такой запрос нам придётся считать все N расстояний между u и d, но такие вычисления мы не можем себе позволить. Но нам и не нужен точный ответ, подойдут и просто k близких к u векторов. Такая постановка называется "approximate nearest neighbor search". HNSW - это на сегодня топовый способ решения такой задачи.

Navigable Small World (NSW) - одна из двух ключевых компонент, работает так: построим граф из всех документов, соединив рёбрами между собой ограниченное количество ближайших соседей к каждому документу. Когда нам поступает запрос на поиск соседей к какому-то вектору q, мы жадно ходим по графу и идём всегда в вершину, которая ближе всего к q. Когда мы попадаем в "локальный минимум", то считаем его ответом. Такая процедура позволяет не считать все расстояния для каждого q.

HNSW добавляет Hierarchical к выше описанной схеме - мы создаём несколько уровней графа для поиска в разных масштабах. На нижнем уровне находятся все вершины, но с каждым повышением уровня остаётся случайный поднабор вершин, таким образом, делая соседей дальше друг от друга и позволяя прыгать дальше на каждом шаге поиска. Поиск начинается с самого верхнего уровня, и, попадая в тупик, мы спускаемся ниже и продолжаем. Это позволяет сократить количество операций. На картинке иллюстрация работа поиска.

Строится граф чуть сложнее, и для интересующихся оставлю ссылки на материалы: статья с объяснением, видео.

@knowledge_accumulator
👍15🔥3
Внутренние представления в рекомендациях интереснее, чем кажутся

В реальных рекомендательных системах из-за высокой нагрузки глубокое обучение можно применять не любым образом. Обычно мы ограничиваем себя следующей схемой:
- Пользователь в момент запроса представлен эмбеддингом u
- Документ-кандидат представлен эмбеддингом d
Далее мы их перемножаем и получаем "релевантность".

В самой базовой модели оба эти эмбеддинга - это обучаемые векторы, но в современных системах эмбеддинг пользователя - это выход из модели (например, трансформера), который запускают над последовательностью исторических событий. Однако, в теории "пропускная способность" тут не выше, чем у базовой! Мы получаем вектор той же размерности, как если бы его просто обучали, как параметр. Может быть, мы могли бы в теории просто выучить такие же "глубокие" векторы в базовой модели?

Не совсем, и на это есть ряд причин:
1) У трансформера меньше параметров (внезапно) и он их более равномерно утилизирует.
Допустим, 100 миллионов пользователей с векторами по 512 флотов - это 200 гигабайт весов. При этом веса редких пользователей обучаются мало шагов, частых - много. Наши трансформеры весят порядка 1гб, и на каждом сэмпле используются все веса модели.
2) Задавая пользователя его историей, а не конкретным вектором, мы готовы к изменению пользователя со временем и к новым пользователям.
3) Может звучать мутновато, но в ходе обучения базовой модели на каждом шаге происходит обмен информацией между 2 сущностями. Когда мы обучаем трансформер, то информацией обмениваются все сущности - документы из истории и основной документ. Это позволяет эмбеддингам документов быстрее "синхронизироваться" между собой.

Недавно стало понятно, что мой слабый разум был заперт в трансформерном пузыре, и на самом деле можно пойти ещё дальше в усилении этих позитивных эффектов. Мои дорогие коллеги из команды направили меня на путь развития, и в следующих постах я обязательно поделюсь этим с вами.

@knowledge_accumulator
👍14🔥7
Трансформеры над пользовательской историей - всего лишь жалкий частный случай

Речь сегодня пойдёт о такой вычислительной конструкции, как графовые сети. Итак, что для неё нужно?

Датасет для рекомендаций можно представить в виде графа:
- Вершинами являются всевозможные сущности - документы, пользователи, все виды объектов в системе.
- Рёбрами являются известные связи между ними - например, клик пользователя на документ, или связь между треком и артистом в музыкальном сервисе.
Очевидно, вершины и связи при этом могут быть разных типов.

Чем в такой схеме является обычный рекомендательный трансформер?
- Берём вершину пользователя и последние N связей его с другими документами
- Применяем Attention к этой последовательности, сохраняем результат агрегации.
- Так как трансформеры многослойные, проделываем это K раз.

И в этом случае мы смотрим в графе только на глубину 1 относительно вершины, но на самом деле можно смотреть на глубину K и использовать гораздо больше объектов! На картинке иллюстрация работы GraphSAGE, основная суть которой в следующем:

1) Берём желаемую вершину V и сэмплируем у неё N соседей. Потом у них сэмплируем ещё соседей, и так K раз.
2) На каждом шаге пересчитываем эмбеддинг каждой вершины, агрегируя информацию со всех её соседей. Раньше это делали каким-нибудь усреднением, но сегодня мы уже знаем про Attention.
3) Информация постепенно перетекает из окрестности глубины K в сторону выбранной вершины, и в конце концов вся выбранная окрестность будет задействована.

Понятно, что возникает проблема экспоненциального взрыва количества задействованных вершин, но это уже вопрос гиперпараметров и деталей процедуры. Но глобально, по сравнению с трансформером, в процессе подсчёта одного сэмпла может задействоваться очень много информации из всей системы, тем самым улучшая степень переиспользования данных. После обучения полученные эмбеддинги можно подавать в тот же трансформер и это даёт прирост по метрикам относительно простых обучаемых с нуля эмбеддингов.

@knowledge_accumulator
👍193🔥3
Почему рекомендательные системы - это ад для ML-инженера

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

- Огромное пространство объектов
Из-за невозможности посчитать релевантность каждого объекта для пользователя мы вынуждены городить костыли в виде многоступенчатой системы. Об одном из алгоритмов для первой ступени - кандидатогенерации - я рассказывал не так давно у себя в посте. И это не последний побочный эффект этой проблемы.

- Невозможность изолировать компоненты друг от друга
Когда вы работаете над большой штуковиной, вы хотите иметь возможность улучшать её составные части независимо друг от друга. Чтобы делать это, вам нужно уметь тестировать влияние изменений на систему. Для этого обычно используется AB-тестирование, но в рекомендациях не всё так просто. После внедрения вроде бы положительного изменения изменяется датасет для обучения, что в свою очередь может повлиять на другие компоненты (и пользователей) и в конце концов сделать так, что изменение перестанет быть положительным.

- Невозможность декомпозировать бизнес-метрику
Обычно, вы можете быть более-менее уверены, что чем лучше выбранная метрика качества вашей ML-компоненты, тем будет лучше для бизнеса. Но в рекомендациях нет очевидной связи между конечной бизнес-метрикой (например, GMV) и какой-либо краткосрочной метрикой. Главная проблема в том, что связь должна быть именно причинно-следственной, а обнаружить её крайне сложно. Оптимизировать конечную метрику можно было бы с помощью RL, но с его применением в рекомендациях всё очень печально. В результате, в реальных системах оптимизируется какая-нибудь костыльная прокси-метрика, и каждый раз мы просто надеемся на то, что её рост приведёт к росту бизнес-метрики.

Таким образом, с рекомендациями не соскучишься, и при этом есть возможность принести большую пользу бизнесу и людям. Поэтому я и продолжаю ими заниматься.

@knowledge_accumulator
👍29🔥82🤔1
Неожиданно хороший способ построить эмбеддинг документа в рекомендациях

Около года назад я присоединился к новой команде инженеров, обучающей трансформеры для рекомендательных систем. Здесь я познакомился с интересной техникой обучения эмбеддингов документа.

До этого я всегда использовал обучаемые векторы для каждого документа. Трансформер смотрел на историческую последовательность этих эмбеддингов истории взаимодействия и составлял своё представление пользователя. В одном из предыдущих постов я писал о том, что трансформер - это модель с гораздо меньшим количеством параметров, чем таблица с эмбеддингами, но не сказал, куда эта таблица с эмбеддингами, собственно говоря, девается.

Представим себе интернет-магазин. Как представить товар в виде эмбеддинга?
Очень просто: берём токены, из которых строится название товара, и складываем эмбеддинги этих токенов. То есть, если в вашем токенизаторе есть токены "iP", "hone " и "10", мы складываем их 3 эмбеддинга и получаем эмбеддинг товара "iPhone 10".

С первого взгляда может показаться, что это глупость. При применении метода мешка слов / токенов теряется вся информация об изначальных позициях этих токенов, нет возможности учесть взаимодействия токенов при получении внутреннего представления документов.

Но цель такого подхода - это не получить внутреннее представление товара по названию. Идея в том, чтобы информацию о товаре расположить в эмбеддингах токенов. Не наоборот.
То есть это не iPhone 10 - сумма "iP", "hone " и "10", а "iP" - это усреднение всех товаров, у которых есть iP в названии. Мы всё ещё как бы обучаем векторы для всех документов, но с помощью такого рода регуляризации мы заставляем каждый параметр использоваться в большом числе товаров.

С тем же намерением мы могли бы делать по 1 эмбеддингу на каждые 100 случайных товаров, и использовать его вместо любого из 100 товаров. Но мешок токенов всё-таки лучше, т.к. какая-то информация в токенах всё же есть. И, кстати, сколько бы я ни пытался перейти обратно на обучаемые векторы у каждого документа, я ни разу не получал улучшения на валидации.

@knowledge_accumulator
👍22🤯5
Как и зачем делать exploration в рекомендациях

В схеме Learning to Rank мы обучаем модель Score(user, item), выдающую оценку релевантности каждого из кандидатов. Рассмотрим пример сценария применения такой модели:

Этап кандидатогенерации, к примеру, HNSW, принёс нам 1000 кандидатов. К каждому мы применили нашу модель релевантности и получили 1000 чисел. В качестве результата выполнения запроса мы должны отдать пользователю 10 объектов. Простейшая опция - это отдать пользователю 10 объектов с наибольшей релевантностью. Но у этого есть проблема.

Дело в том, что для качественного обучения модели Score(user, item) у неё должен быть разнообразный набор данных. Если мы всем пользователям выдаём только самые релевантные треки, то может образоваться много треков, которые вообще не попадали в выдачу никому, и тогда модель на них может выдавать нереалистично маленький или большой результат - обе эти ситуации нежелательны и могут привести к плохой выдаче в будущем.

Возникает trade-off - с одной стороны, мы хотим формировать релевантную выдачу, с другой, мы хотим её немного разнообразить для улучшения качества датасета. Этот баланс на практике можно регулировать таким образом:
1) 1000 скоров кандидатов превращаются в вероятности попадания в выдачу: p = exp(score/T) / Z, где T - температура, а Z - нормировочная константа.
2) Применяется специальный алгоритм по генерации выборки из такого распределения.
Если T равна 0, мы получаем просто топ-10, и чем она больше, тем больше всё сглаживается в сторону равномерной выдачи.

Самая большая проблема этой схемы заключается в подборе значения T. Я уже объяснял, что когда один элемент влияет на все компоненты системы, для тестирования необходимо дублировать вообще всю систему - здесь именно такой случай, и почти всегда мы не можем этого себе позволить. Как же тогда быть?

Сначала предполагаем на глаз, какой уровень "гладкости" выдачи мы хотим. А затем уже подгоняем T, чтобы был нужный эффект, и по надобности иногда переподгоняем. Вот такая наука.

@knowledge_accumulator
👍10🔥2🤔1
Как злодеи используют язык, чтобы управлять миром

Язык - это очень эффективный способ передавать информацию между людьми. В угоду этому у него большие проблемы со строгостью, чёткостью, однозначностью и т.д. Ежедневная работа политиков - это подменять значения слова "справедливость", "свобода", "страна", чтобы выдать за хорошее то, что они делают.

Неудивительно, что этот потрясающий приём используют сторонники регуляций ИИ. Прикрываясь размышлениями об экзистенциальных рисках ИИ, в одну кучу "рисков" замешивается всё подряд, включая то, что модели делают предсказания, смотря на неполиткорректные признаки.

Давайте я проговорю: всё, что не касается уничтожения человечества чем-то типа Skynet, это совершенно стандартная история, повторяющаяся во всех сферах - крупный бизнес, который хочет контролировать рынок и затруднить появление новых игроков, придумывает и лоббирует удобные для себя правила.

От проблем это, конечно, не защитит - боюсь, телефонные мошенники не будут официально регистрировать свои генеративные модели и проходить сертификацию. Но это и не волнует законодателей, настоящей целью регуляций с самого начала является борьба с малым бизнесом в легальном поле. "Борьба со злодеями" - абсолютно стандартный политический обман.

Но текущая ситуация с ИИ уникальна. Помимо описанного выше, существует козырь - риск апокалипсиса. Благодаря этому каждый, кто говорит вслух "ИИ должен быть зарегулирован, потому что представляет угрозу всему человечеству", даже если имеет ввиду только один, самый главный риск, будет записан в сторонники обязательных watermark-ов на сгенерированных картинках. Манипуляторы будут на голубом глазу приравнивать эти вещи, но далеко не все увидят этот обман. Государство постоянно пользуется этим приёмом для расширения своей власти и прекрасно подыграет в данной ситуации.

Лавина уже сошла с гор.
Andrew Ng, Yann LeCun, François Chollet понимают, к чему всё идёт, но я не вижу, что общество достаточно сопротивляется надвигающейся катастрофе, чтобы она не случилась.

@knowledge_accumulator
👍15💯9🤔3👎2🔥2😢1💩1🤡1💅1
Почему я люблю лотереи больше, чем ML-лаборатории

- Лотереи честнее и понятнее финансируются

ML-лаборатории почти всегда финансируется людьми, которые плохо понимают контекст и пользу конкретных проектов. Этим легко могут воспользоваться исследователи, которые преувеличивают/выдумывают важность своих проектов. По сути, с точки зрения доноров это та же самая лотерея. Однако, в настоящих денежных розыгрышах все условия прозрачны и известны заранее, а участники имеют доступ ко всей необходимой информации для принятия решения.

- Лотереи помогают науке
Лотереи позволяют изучать человека. Почему люди в них участвуют? Как они субъективно воспринимают богатство? Что происходит с теми, кто случайно получает в руки большую сумму денег? В свою очередь, большинство статей по ML оказывает нулевое влияние на технологическое развитие, потому что из-за того, как устроена эта сфера, исследователи почти всегда близоруко анализируют происходящее и ищут пользу на поверхности, высасывают её из пальца, лишь бы опубликоваться.

- Лотереи приносят счастье людям
Когда я был ребёнком, какое-то время мы с родителями хорошо проводили субботнее утро, смотря телек и зачёркивая выпадающие числа. Эти лотерейные шоу существуют в конкуретной борьбе за внимание зрителей, поэтому вынуждены развлекать участников. Даже если мы проигрывали немного денег, нам было весело. Думаю, у большинства участвующих ситуация похожая.
В свою очередь, отправка статей на конференцию - это та же лотерея, после проигрыша в которой ты себя ненавидишь, потому что розыгрыш длится месяцами и после него отчислят из аспирантуры. Ну а те, кто эти статьи читают, тоже играют в лотерею на arxiv, где 99% билетов проигрышные.

- Лотереи - это хороший стимул для общества
С одной стороны, они позволяют зарабатывать деньги талантливым инженерам и организаторам. С другой стороны, в эру изобилия, когда естественный отбор больше не играет роли, мы нуждаемся в правильных экономических стимулах. На полностью добровольной основе лотерея штрафует на ресурсы своих участников. И если это ощутимо ложится на благосостояние человека, это, в свою очередь, награждает тех, кто лотереи избегает. Профессия ML-исследователя, в то же время, загубила немало людей, поддавшихся пропаганде и поступивших на PhD, и вынужденных теперь убеждать себя в правильности этой идеи, чтобы не совершать самоубийство.

А вы что думаете?

@knowledge_accumulator
😁26👍16💯8👎5🤔2🤡2
Как выигрывать в любой игре

Уже очень давно математики знают способ построения оптимальной стратегии в любой игре с дискретным пространством состояний и с полной информацией. Многие его знают как Minimax-алгоритм, логика работы следующая:

1) Построим направленный граф состояний игры.
- Каждое возможное состояние в игре обозначим как вершину графа
- Рёбра между вершинами будем проводить согласно правилам - если из одного состояния в другое игра может перейти в результате хода игрока, проведём это ребро
- Для корректной работы алгоритма требуется отсутствие циклов в графе. Обычно правила игры позволяют такое утверждение доказать

2) Разметим "листья" графа
Вершины без исходящих из них рёбер нужно разметить их соответствующим финальным результатом - ничьей или победой какого-то игрока

3) Рекурсивно разметить все вершины в графе
Эта функция работает для данной вершины v так:
- Вызываем её сначала для всех вершин, в которые из v есть ребро
- В зависимости от того, чей ход в данном состоянии игры, выбираем среди этих вершин результат, наиболее желаемый для него, и присваиваем его вершине v.
- Так как обычно в играх 2 игрока и они ходят по очереди, получается, что выбор результата чередуется: если в вершине v выбирается "максимальный" результат для игрока 1, то в его детях уже будет выбираться "минимальный" для него результат, т.к. ходит противник. Получается Minimax.

С одной стороны, очень простой алгоритм позволяет получить оптимальную стратегию в любой игре. С другой, его сложность по времени и памяти слишком велика для применения в реальных играх, и поэтому не применяется в таком виде, приходится костылить. Но об этом в другой раз.

@knowledge_accumulator
👍17🔥4💯1
Почему идеальный шахматный алгоритм был бы бесполезен

Несмотря на то, что современные шахматные алгоритмы, например, Stockfish, невероятно сильнее любого человека, люди играют в шахматы ради развлечения, в том числе и я. Именно Stockfish - алгоритм, не основанный на AlphaZero - сейчас является самым сильным алгоритмом. Грубо говоря, он работает так:

1) Строим дерево состояний игры из текущей вершины, как описано в предыдущем посте, заданной глубины d. Этот параметр - регулятор баланса скорости и качества работы.
2) Проставляем оценку каждому листу дерева. Если это конец игры, то проставляем +∞ / -∞ или ноль, если ничья. Иначе состояние игры оценивает ансамбль алгоритмов, в том числе и нейросети, которые считают "score" позиции - число, где 0.0 - равная позиция.
3) По логике Minimax-алгоритма пересчитываем score всех вершин в дереве, в том числе и корневой, получая таким образом оценку текущей позиции и оценку всех возможных ходов.

Stockfish активно используют игроки при анализе партий и комментаторы профессиональных матчей. Удобным его делает возможность навигации по разным возможным последовательностям ходов, когда игроки могут отследить, что один ход ведёт к состоянию "+5.5", а другой к "+1.3", и на основе этого можно анализировать происходящее.

Но что, если бы Stockfish мог работать с d=∞, как полный Minimax? Мы бы получили весьма бесполезную систему по простой причине - игроки не играют оптимально. Алгоритм будет вам говорить в дебюте - "Из 26 вариантов, вот эти 17 ведут к ничье, в остальных случаях противник поставит тебе мат за 53 хода". Или про немного выигрышную позицию - "Тут можно ходить, как хочешь, всё равно выиграешь, так будет мат в 43 хода, так мат в 47, а так мат в 48". А какая вам разница, если вы мат в 2 хода в половине случаев не видите, а противник не будет оптимально обороняться? Для анализа партий, играемых людьми, алгоритм становится бесполезен.

Эта проблема есть и сейчас, поскольку часто оценка позиции зависит от одной последовательности ходов, которую заметит не каждый гроссмейстер. Но, всё-таки, если есть способ выигрывать у противника фигуру и тем самым получить большое преимущество, Stockfish вам об этом явно скажет при анализе, что и делает его полезным.

@knowledge_accumulator
👍20🔥21
Про Emergent Complexity

Данное свойство реальности пронизывает её во многих аспектах, и как только ты его осознаешь, то начинаешь повсеместно замечать его присутствие.

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

Это позволяет миру функционировать именно так, как есть.

Несколько элементарных частиц порождают много атомов с очень разнообразным поведением, ну а количество разных молекул поражает.

Короткие программы на том же C++, состоящие из простых команд, способны задавать невероятно сложные алгоритмы.

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

Самый наглядный образец - это, пожалуй, Game of Life Конвея. Элементарные правила поведения каждой ячейки не мешают строить схемы невиданной сложности и, вообще говоря, даже симулировать компьютер.

А знаете, что печально? Мозг человека попросту не заточен под интуитивное понимание этой сложности. Каждый раз нам приходится применять наши жалкие методы, такие как "разбивать задачу на более мелкие". Но emergent complexity зачастую наблюдается в системах, в которых решение оптимизируется, а не проектируется, и поэтому оно не познаваемо нашим ограниченным мышлением. Для нас это неотличимо от магии.

Почему это важно осознать? Человеческий интеллект возник как результат оптимизации системы из кучи нейронов, и потому является примером emergent complexity. И у нас гораздо меньше шансов повторить этот успех, проектируя интеллект вручную. Люди уже поняли, что не нужно проектировать признаки объектов, но мы всё ещё проектируем архитектуры и обучающие алгоритмы. Рано или поздно мы перестанем делать и это, и тогда шансы на успех резко возрастут.

@knowledge_accumulator
👍23🤔9👎4🔥4🤣2
Слабо прочитать весь arXiv?

Лично мне - да. Но я знаю, кому нет. Хочу вам порекомендовать канал Кирилла - моего руководителя в Яндексе, который читает все статьи (или как минимум все заголовки) на тему рекомендаций, которые появляются на архиве. Теперь он пишет обзоры на иногда найденные интересные работы в своём канале, предлагаю вам его заценить.

Нет, меня не обещали уволить, если я не сделаю эту рекламу, честно-честно.

https://www.tgoop.com/inforetriever
😁22🤣8👍6🌚21🔥1
Как вам такой парадокс

Иногда мы натыкаемся на так называемые парадоксы. "Это предложение ложно", Парадокс Монти Холла про 3 двери или что-то ещё в этом роде. Обычно изучения пояснения хватает, чтобы понять, что парадокса никакого и нет, это простая задача с немного контринтуитивным решением.

Однако, как-то раз один неназванный профессор, занимающийся байесовскими методами, скинул в чатик видео про "Парадокс двух конвертов" и написал что-то вроде "Я не понимаю, какого хрена". В тот вечер в том чате было потрачено много человекочасов на обсуждение данной задачи, так что, думаю, и вам тоже будет интересно.

https://www.youtube.com/watch?v=EiVzbmBa9Kw
🔥6👍5🤔2
Alpha-beta pruning - ускорение минимакс-алгоритма

Сегодня мы с вами рассмотрим самый известный способ ускорить Minimax-алгоритм без потери качества. Основная идея состоит в следующем: иногда, находясь в вершине, мы можем заранее понять, что мы в ней точно не окажемся.

Как же так? Советую поглядывать на картинку, пока вы это читаете:

Находясь в вершине, вы считаете её значение для текущего игрока. Вы проходитесь по каждому ребёнку данной вершины и поддерживаете самый лучший встреченный вариант. Даже в середине процесса это позволяет сделать некоторый вывод. Ведь если текущее лучшее значение - это X, значит, итоговое финальное значение будет не хуже X.

А в какой ситуации из этого следует то, что вы никогда не окажетесь в этой вершине при оптимальной игре? Это происходит тогда, когда у вашего противника выше по дереву есть варианты, которые хуже X. Ведь если они есть, зачем пускать вас туда, где вам будет лучше?

Таким образом, обходя дерево по порядку, можно в значительной части случаев заканчивать исследовать вершину раньше времени. Количество сэкономленных обходов зависит от порядка обхода детей. В идеале вершины должны быть отсортированы по убыванию истинного значения соответствующего игрока. Тогда мы сможем останавливаться после первого же ребёнка, если это возможно.

Судя по википедии, количество вершин в лучшем случае становится вместо N^d равным sqrt(N^d). Судя по данному рандому со stackexchange, в шахматах 4.8x10^44 легальных позиций. То есть можно предположить, что в правильном порядке "обойти дерево шахмат" можно было бы за примерно 10^22 операций, что звучит гораздо реалистичнее, чем 10^44. Может быть, нейросеть способна упорядочить вершины так удачно?

Но даже в этом случае мы бы не получили идеальный шахматный алгоритм, поскольку по ходу игры он бы попадал в неизученное состояние и ему надо было бы достраивать дерево. Зато мы бы наконец узнали самое главное - может ли выиграть хоть кто-нибудь при оптимальной игре.

Раз и два - видео с примером

@knowledge_accumulator
👍9🔥31
Регистры в нашей голове

Сразу скажу - я не специалист в устройстве мозга, да и даже специалисты про мозг понимают мало. Моя цель - заинтересовать и нарисовать приблизительную картину. Прошу простить за неточности.

Поговорим сегодня про так называемую рабочую память (working memory) в нашей голове. Она хранит сущности, которыми мы оперируем в конкретный момент. Её объём измеряется всего лишь "единицами", например, вы точно не сможете запомнить набор из 10 случайных слов, написанных в ряд, за один взгляд.

Она, по всей видимости, сильно коррелирует со способностью обучаться и анализировать информацию, и поэтому многие мечтают о её тренировке. Но наука не подтверждает ни способность её реально натренировать, ни какое-то серьёзное влияние этих тренировок на какие-то другие тесты. Но людям может казаться, что натренировать её всё же возможно. Почему?

Рассмотрим задачу "n-назад", которую используют для тренировки. Вам называют, например, буквы по одной, и вы должны каждый раз говорить, повторяет ли буква ту, что была n букв назад - тривиальная задача для очереди длины n. После тренировок производительность людей растёт и создаётся иллюзия роста рабочей памяти, но это не так:

1) Это не переносится на другие задачи на рабочую память
2) На самом деле мозг человека упаковывает последовательности встречаемых сущностей в новые сущности и начинает хранить их в рабочей памяти "группами". Например, вам не нужна большая память, чтобы запомнить ABCDEFGHIJK. После длительных тренировок вы придумываете паттерны для упаковки всевозможных последовательностей.

Второе составляет важнейшую часть нашего обучения. Этот феномен упаковки сложной сущности в новые "простые" позволяет нам воспринимать на интуитивном уровне всё более и более сложные вещи и задачи. Эта идея лежит в основе Dreamcoder, которую я когда-то считал путём к общему интеллекту.

Но сейчас я в полной мере осознал, что наш мозг состоит из большого количества таких сложных систем, которые оптимизировались в связке друг с другом. Они не работают, как изолированные друг от друга куски, это всё один огромный механизм невообразимой для нас сложности. Поэтому нам придётся обучать интеллект, а не проектировать его.

@knowledge_accumulator
👍16🤯42🤔1
Generator and Critic: A Deep Reinforcement Learning Approachfor Slate Re-ranking in E-commerce - аналог RLHF в рекомендательных системах

Стандартная логика в рекомендациях на этапе ранжирования выглядит так - берём кандидатов, оцениваем каждого из них по отдельности и выдаём пользователю top-K. Работает это достаточно неплохо, но при генерации выдачи никак не учитывается взаимное наличие и порядок этих айтемов.

Один из способов это решить - авторегрессионная генерация последовательности, прямо как в языковых моделях. Для этого нам нужны 2 составляющие:

Critic, она же reward model.
Для её обучения мы собираем датасет пар (последовательность, таргет). Можно обучить модель любой сложности, поскольку она не будет применяться в проде. Это может быть трансформер, применяющийся поверх последовательности документов, и выдающий агрегированный результат по всей выдаче. Таргет нужно выбрать согласно логике бизнеса.

Generator
Пока человечество не придумало более удачного способа генерации последовательности, чем добавление их по одному в конец. Каждый кандидат на текущую позицию является действием агента, аналогично выбору следующего токена в тексте. Модель берёт на вход уже сгенерированный префикс и выдаёт распределение для следующего действия.

Логика обучения такая - "эпизодом" в терминах RL является генерация всей последовательности, награда выдаётся только в конце по результатам оценки от Critic. Обучаться можно любым RL-алгоритмом, например, в данной статье используют PPO.

На самом деле, в реальных рекомендательных системах такой подход почти не используется по простой причине - это не стоит затраченных усилий. В отличие от языка, где выдать top-K токенов в порядке крутости по убыванию было бы весьма неудачным решением, в рекомендациях это нормально. Влияние документов в выдаче друг на друга здесь гораздо меньше, при этом нельзя оценить заранее, что принесёт разработка и внедрение этой штуки.

@knowledge_accumulator
👍14🔥2👏1
LlamaRec: Two-Stage Recommendation using Large Language Models for Ranking [2023] - о том, как рекомендации превратили в ЕГЭ

Итак, какой пайплайн применения LLM для ранжирования придумали товарищи из NVIDIA:

1) Кандидатогенерация без LLM - сначала рекуррентная модель под названием LRURec кушает историю пользователя и в конце выдаёт распределение на следующий документ, из которого берётся топ-20. Обучается такая модель просто с помощью next item prediction.

2) На последней стадии работает уже языковая модель в формате теста.
В качестве промпта в модель подают список названий документов, с которыми взаимодействовал пользователь. Далее модель просят предсказать наилучший следующий документ.

Мы бы хотели получать от модели распределение на следующий документ, чтобы по нему можно было отсортировать выдачу, а также иметь возможность файнтюнить LLM, максимизируя вероятность верного айтема. Чтобы этого добиться, авторы кодируют каждый возможный айтем одной буквой. Таким образом, от модели требуется написать только 1 токен в качестве ответа, на вероятности которого мы и будем смотреть.

Имеет ли смысл применять такой подход в реальной рекомендательной системе? Давайте посмотрим, чем отличается данная нейросеть от того, что мы используем у нас. Если в нашем рекомендательном трансформере вместо мешка токенов будем брать их последовательность, и склеим все эти последовательности из истории в одну, мы получим такой же формат входа, как у LlamaRec. При этом сам трансформер от LLM на порядок больше, чем тот, что мы используем у нас.

Таким образом, подобная модель стала бы неподъёмной для использования на том же размере пользовательской истории, и её пришлось бы применять на очень короткой истории. Дало ли бы это значимый ортогональный сигнал засчёт претрейна на данных из интернета? Не знаю, на мой взгляд проект выглядит слишком дорого и есть много более низковисящих фруктов.

@knowledge_accumulator
👍132🔥1
Не люблю геройские подвиги

Очень часто можно наблюдать в каких-нибудь фильмах такую картину - герой собирает свои силы в кулак и совершает какой-то большой поступок, влияющий на его судьбу. Но, как и многое в кино, к реальности это имеет слабое отношение.

Настоящая жизнь гораздо скучнее. Её результат зависит не от подвигов - собрав волю в кулак и поработав ночь в режиме хакатона, едва ли возможно сделать что-то реально стоящее. Реальный результат в 99% случаев достигается за долгий промежуток времени, когда вы движетесь к нему регулярно, когда это движение является частью вашей повседневности.

К сожалению, наш мозг не эволюционировал в среде, способствующей долгосрочному планированию. Так как не имеет никакого значения, как вы проведёте именно сегодняшний день - что будете делать, что съедите, нам не свойственно уделять этому большое внимание, но жизнь как раз состоит из большого количества сегодняшних дней.

Однако, вместо выработки привычек многие люди пытаются совершить краткосрочный подвиг, который ни на что в итоге не влияет. Самой популярной в мире ошибкой такого рода являются диеты, во время которых люди придумывают себе безумные правила, следуя которым, быстро хотят привести себя в форму. Конечно, долгосрочно это ни на что не влияет.

Аккумулируя свой опыт, дам непрошенный совет:

1) Регулярно спрашивайте себя - есть ли у меня какая-то привычка, которая на длинной дистанции приводит к потерям? (Сколько часов я теряю за год, смотря тикток?)
2) Делайте постепенное изменение в положительную сторону - такое, которое не составит большого труда соблюдать (поставьте ограничение на время использования, равное 50-80% от текущего)
3) Используйте вашу силу воли, чтобы удержать это изменение. Когда вы решили изменить свою жизнь, вы были заряжены на успех, но когда импульс пройдёт, вы захотите вернуться к статусу кво.
4) Обязательно наградите себя в случае успеха. Пообещайте себе заранее что-нибудь за успешное удержание (в течение месяца, к примеру) - купите себе подарок / съешьте дорогой стейк. Порадуйтесь тому, что вы молодец. Только не подведите себя, откатив изменение потом.

Используя эту мета-привычку, за годы вы можете изменить свою жизнь до неузнаваемости - начнёте нормально питаться, заниматься спортом, откажетесь от всех вредных привычек, будете саморазвиваться, и, что важно, не почувствуете большого стресса!

Забудьте про подвиги, они никому не нужны.

@knowledge_accumulator
👍466🔥2
Towards General-Purpose In-Context Learning Agents [2023] - перспективное направление или тупик?

Не смог обойти стороной новую статью автора VSML, посвящённую In-Context трансформерам (ICT).
В его другой статье была проанализирована способность ICT обучаться обучаемости, а не запоминать все задачи. Иногда это происходит, и те же факторы были перенесены в контекст RL.

По сути данная работа - это модификация Algorithm Distillation. Его идея состоит в том, что мы обучаем ICT на траекториях, сгенерированных при обучении PPO. Таким образом мы хотим научить ICT подражать алгоритму, и по каким-то странным причинам он иногда учится быстрее изначального алгоритма.

В модифицированном же подходе было обнаружено, что если увеличить разнообразие тренировочных задач, т.е. случайно проецировать пространство состояний, то ICT начинает лучше работать на задачах, не похожих на тренировочные.

На мой взгляд, ICT - это плохой путь с точки зрения создания обучающих алгоритмов. Архитектура, в которой на каждом шаге мы смотрим на всю историю своей жизни и делаем одно действие, не масштабируется на длинную историю и не имеет ничего общего с тем, как информацию обрабатывает человек. В некоторых few-shot сценариях это имеет смысл, но кому это надо...

Чтобы ICT умел в совсем out-of-distribution задачи, ему нужно безумное распределение задач, и шагом в этом направлении является AdA, но пока нет свидетельств, что AdA обобщается за пределы XLand 2.0. А это всего лишь 265M-модель!

Иначе говоря, проблема ICT в том, что это перегруженный параметрами обучающий алгоритм. А чем больше параметров в обучающем алгоритме, тем больше он переобучается под тренировочные задачи. Мотивируясь этим, автор и пришёл к VSML изначально.

Возможно, всё дело в том, что это лаба Шмидхубера, и в ней запрещено развивать перспективные направления, чтобы потом можно было говорить, что придумал всё 20 лет назад. В принципе, и на этом спасибо, если что, смогу сам потом масштабированием заняться, как будет возможность 😁

@knowledge_accumulator
👍7🔥2
GAIA: a benchmark for General AI Assistants [2023] - достойное испытание или очередной тест на запоминание?

Авторы приводят следующую проблему появляющихся бенчмарков - их делают всё более и более трудными, добиваясь этого засчёт углубления необходимых знаний для ответа на вопрос, например, знание узкоспециализированного научного факта.

Но на самом деле рядовые задачи человека - это выполнения длинных цепочек простых операций, связанных с анализом содержимого файла, поиска в интернете, считывание чего-то с сайта и т.д. Именно такого рода испытание для моделей подготовили авторы данной работы. Они вручную составили 466 таких вопросов трёх уровней сложности (см. картинку).

Человек решает 90% вопросов, тогда как GPT-4 с настроенными вручную плагинами набирает только 30% на первом уровне сложности. На третьем уровне сложности та же модель показывает нулевой результат.

На мой взгляд, бенчмарк интересный. С одной стороны, он не проверяет интеллект, как обучаемость, то есть успешное прохождение не гарантирует нам тот самый AGI. Но это отличный тест на применимость AI в реальной жизни в качестве ассистента. Однако, и тут есть одно но.

Это всё будет иметь смысл только в случае, если GAIA будет black-box бенчмарком!

Если вопросы тестовой части бенчмарка выложат в интернет, это неизбежно приведёт к тому, что, во-первых, это попадёт в претрейн вместе с ответами, которые любезно оставят где-то в комментариях, а, во-вторых, разработчики неявно начнут зашивать в модель bias в сторону ответов на конкретные вопросы из GAIA.

Закрытость тестового входа стала ключом качества ARC, как теста на обучаемость, не позволившим исследователям неявно решить задачу "вместо модели" и таким образом обойдя сложность. Будем надеяться, авторы GAIA обеспечат честное и сложное соревнование.

@knowledge_accumulator
👍16🔥4
2025/07/12 19:22:02
Back to Top
HTML Embed Code: