Всем привет. В этой статье мы рассмотрим идею, которая даст возможность нейросетям строить не только эмбеддинги токенов, но и «смысловые» эмбеддинги. Итак, план:
Рассмотрим основную проблему нынешних LLM-моделей.
Рассмотрим идею «смыслового» эмбеддинга и то, как эта идея теоретически может помочь в обучении нейросетей.
Рассмотрим плюсы и минусы такого подхода.
Подведем итоги.
Ну что, приступим!
Проблема современных LLM-моделей
Современные LLM-модели являются чрезвычайно сложной вероятностной машиной, которая предсказывает следующий токен на основе контекста.
Проблема заключается в том, что LLM-модели не имеют структурного мышления, что является большой проблемой (подробнее читайте в этой статье).
Хотелось бы решить эту проблему не полностью, а частично. Например, мы знаем, что каждое слово в эмбеддинге содержит информацию о себе, а именно то, чем оно является в предложении. Но ассоциации и общее представление о нём как о целом не ищут небанальные связи, а лишь основные связи из последовательности. (Градиент идёт только из последовательности, где участвует это слово. В смысловом эмбеддинге же один вектор на несколько слов — расскажу позже. И получается, один вектор получает градиент сразу из нескольких последовательностей, нескольких слов, создавая единое представление об этих словах как о целом для минимизации ошибки.)
Можно сделать вывод, что просто информации о последовательности и одного эмбеддинга (например, эмбеддинг + Attention или RNN/LSTM) недостаточно, так как, как мы говорили выше, модель не строит небанальные связи, которых нет в обучающей выборке. Это теоретически бы повысило устойчивость модели к последовательностям, которых она не видела в обучающей выборке, за счёт того, что она выявляет небанальные связи между группой (я объяснял ранее).
А подробнее — рассмотрим далее.
Идея и ее разбор
У нас есть слова. Очень много слов. Какую бы пару мы ни взяли — мы найдём общую связь, пусть даже и косвенную, между каждым словом в этой паре. Давайте разберём на примере. Нам даны слова:
Картошка
Дверь
Человек
Батарея
Кажется, просто слова, которые ничем не связаны. Но нет! Смотрите, сколько у них общего:
Каждый предмет из вышеперечисленных — физический объект, существующий в реальном мире, имеет изнашивание (гниение, старение и т. п.), является твёрдым телом.
Каждое слово — русское, имя существительное, склоняемое по падежам, и является часто используемым словом.
Все эти объекты легкоподвижные — картошку можно толкнуть, и она покатится, человека можно толкнуть, и он сдвинется, батарею можно так же, как и картошку, толкнуть, и она покатится, дверь можно легко открыть.
Если искать общие связи — их выйдет очень много. Что я этим хотел показать? А я хотел показать то, что даже в такой группе слов, где кажется, что связей нет, — они есть, хоть и не банальные и косвенные.
Так вот, мы разделим все N слов из словаря модели на K групп, по X случайных слов в каждой так, чтобы на каждую группу (X токенов) приходился 1 вектор размерностью d_model, и суммарное количество слов во всех группах было равно количеству слов в словаре (N). Обязательно сделаем эти группы обучаемыми и убедимся, что слово, которое находится в одной группе, не находится в любой другой группе (ибо потом будем мучиться с вопросом, какую группу брать, если это слово окажется в R группах, что создаст дополнительную сложность).
Ещё хочу добавить одну не менее важную вещь: так как метод смыслового эмбеддинга будет работать не с одним словом, а с группой слов, то смысл слова (научно — способность модели дифференцировать только текущий токен для снижения лосса) теряется, то есть модель полагается только на группу токенов, что может привести к неправильному пониманию контекста. Это можно решить добавлением основного эмбеддинга токенов, который внесёт информацию о токене (научно — позволит модели дифференцировать текущий токен для снижения лосса тоже) и умного обучаемого вентиля.
Обучаемый вентиль — это некий распределитель внимания, который распределяет внимание между двумя эмбеддингами — смысловым и основным. Желательно, чтобы он не отдавал всё внимание одному, минуя второй. Так что формула будет:
И далее — прогоняем этот G в основной механизм сети.
Зачем же нам Sigmoid?
Представим ситуацию: один вес равен −1e9, а второй — 1e9. Если подать эти веса в Softmax без Sigmoid, мы получим следующую картину: один забирает всё, второй — ничего. Это противоречит поставленной выше задаче: «Желательно, чтобы он не отдавал всё внимание одному, минуя второй».
Если же прогнать каждый вес через Sigmoid, картина меняется. Первый вес (-1e9) после Sigmoid стремится к нулю и, вероятно, будет округлён до машинного нуля; второй (1e9) после Sigmoid стремится к единице и с большой вероятностью также будет округлён. Тогда на вход в Softmax приходят не −1e9 и 1e9 (что убило бы нашу задачу, ведь выход Softmax был бы равен 0 и 1 с учётом округления), — а 0 и 1. Такой вход даёт на выходе Softmax значения 0.269 и 0.731, что как раз удовлетворяет нашему правилу.
Плюсы и минусы смыслового эмбеддинга
У всех подходов есть свои плюсы и минусы, и это абсолютно нормально. Наш подход — не исключение. Ниже я составил таблицу плюсов и минусов для удобства чтения.
Плюс |
Минус |
Модель вынуждена найти общую связь между токенами в одной группе. |
Этот подход может дестабилизировать обучение модели за счёт того, что ей придётся работать с группой токенов как с одним объектом, что усложняет задачу. |
Смягчается проблема OOD — если, например, нам попался токен, который есть в параметрах, но модель его не видела при обучении, то группа, в которой состоит этот токен, с большей вероятностью обучена на других токенах и внесёт свою информацию, тем самым, повторюсь, смягчая проблему OOD. |
Но это никак не решает проблему непонимания моделью этого токена. Если этот токен не попадался в датасете, значит, и наш смысловой эмбеддинг не обучится на нём и не будет содержать информацию о нём, хотя в группе он есть. |
Модель обретает возможность строить очень небанальные связи, которых нет в обучающей выборке. И плюсом — если обучить две разные модели на одном и том же датасете, связи будут разные за счёт случайного распределения по группам. |
Этот способ склонен к тому, что модель иногда сможет неправильно выполнить свою задачу, которая отражает обучающую выборку. Также модель может неправильно классифицировать некоторые последовательности — как раз за счёт смыслового эмбеддинга и небанальных связей. |
На самом деле, если продолжать искать плюсы и минусы — их будет очень много. Так что я перечислил только 3 самых основных плюса и минуса, что достаточно для представления этой идеи.
Итог
Понятно, что без сравнения двух моделей: со смысловым эмбеддингом и без — точного результата мы не получим. Но примерно мы можем сказать, что модель будет вынуждена выучить некие связи и представить эту группу как единое целое.
pureooplover
Хорошая идея, но вот что я бы сказал по статье:
Зачем везде курсив и жирное вставлять!?!?!? Это некрасиво выглядит...
Слишком короткая - хотя бы плюсы и минусы бы добавили или более подробный (хотя бы теоретический) разбор вашей идеи.
Бенчмарки должны быть - не обязательно сравнения, хотя бы покажите что модель с вашими смысловыми эмбеддингами вообще работает, а не скатывается в loss 4 или наоборот, оверфиттинг, и всё такое.
Так же вам надо довести формулы до ума, там ваш модуль может только мешать, попробуйте без него.
И ещё - правильно было бы писать не как:
, как у вас, а вот так:
radmirryan Автор
Большое спасибо за обратную связь! Сейчас я обучаю модель с использованием этой идеи, так что бенчмарки будут. В ближайшее время отредактирую пост и исправлю все недочёты, которые вы отметили.
Насчёт сигмоиды я знаю, что она выражается в формулах так. Но в основном я делал ставку на то, что кто-то может не знать формулу сигмоиды.
pureooplover
Вы лучше уже новый пишите, потому что старый уже мало кто заметит.