Эмбеддинги, внимание, FNN и все что вы хотели знать, но боялись спросить
Вступление
Сим я пытаюсь начать цикл статей, посвященных LLM (большим языковым моделям), нейросетям и всему, что рядом с аббревиатурой AI. Цели написания этих статей, конечно же, шкурные, ибо сам относительно недавно начал погружаться в эти темы и столкнулся с тем, что вроде бы и масса информации, и статей, и документов, написанных мелким шрифтом с заумными диаграммами и формулами, читая которые, заканчивая абзац, забываешь, о чем был предыдущий. Поэтому здесь я буду пробовать описать суть предметной области на концептуальном уровне - а посему обещаю избегать по максимуму математических формул и мудреных графиков, видя которые, читатель неизбежно ловит себя на желании закрыть вкладку браузера и посетить ближайший винно-водочный магазин. Так что - нет формулам (кроме самых простых), нет заумности, нет претензий выглядеть умнее, чем я есть. Эти статьи должна понять ваша бабушка, и если это не получилось - значит, я с поставленной задачей не справился.
Итак, эмбеддинги
Это очень хорошее слово - дабы выглядеть солидно, не забывайте вставить это слово в любом контексте, когда разговор заходит в область обсуждения AI. Шансы, что кто-то попросит вас уточнить, что это такое, и начнет задавать уточняющие вопросы, - мизерные, однако авторитет в глазах окружающих как минимум не упадет, да и кто захочет вопросами выдать свою дремучесть? Тем не менее, учитывая, что скорее всего вам скоро придется ходить по собеседованиям опять, - попробуем все же разобраться в сути явления на высоком абстрактном уровне.
Возьмем слово “кот”. Возьмем абстрактную, но обученную LLM-модель. Где-то в глубинах своих матриц-словарей она содержит это слово. Выглядит это примерно так:
Слово | Вектор |
---|---|
Кот | [0.2, -1.3, 3.4, 5.6…] |
Так вот - что значит этот вектор? Эти цифры? А эти цифры - это координаты кота в смысловых измерениях.
Но как так - откуда у бездушной машины может быть понятие смыслового измерения? Правильно - не может. Но они есть. Откуда они взялись? А как результат обучения модели на информации, сгенерированной человечеством и до которой модель смогла дотянуться на этапе обучения. (Кому нужны подробности - Hugging Face Space). Но о подробностях обучения поговорим в следующих статьях.
Давайте предположим, что некое внеземное существо просит вас объяснить - что такое кот? Как вы это сделаете? Очевидно - попытаетесь пройтись по признакам:
- Кот? Ну, небольшой такой (относительно чего? Вируса? Бактерии? Синего кита? Нам нужна шкала измерения - пусть от 0 до 10)
- Это пушистый он (Насколько? Опять нужна шкала. А если сфинкс?)
- Короче, еще мяукает (Частотные характеристики? Форма спектра?)
- Он вполне разумен (Опять же - шкала разумности, как мы ее понимаем?)
На этапе обучения модель анализировала слова, которые часто встречались рядом со словом “кот”, и на основе этих данных вычисляла его характеристики. Например, рядом со словом “кот” часто встречались описания вроде “пушистый”, “небольшой”, “ловит мышей” и другие. Именно таким образом формируются координаты слова в многомерном пространстве признаков.
Другими словами, модель не оперирует признаками (смысловыми характеристиками) в человеческом понимании, а лишь выявляет статистические закономерности в тексте. Так могут выделиться, например, измерения, связанные с размером, поведенческими характеристиками или степенью разумности, даже если последнее не является буквальным.
Если упростить многомерное пространство до двух измерений, можно представить, где окажутся координаты “кота” относительно других сущностей:

Смысловые координаты слов в пространстве одушевленности и размера
Итак - кот вполне разумен и размера небольшого. Для сравнения указаны другие представители нашей фауны и даже трактор - как некая противоположность смыслового значения кота: большой и неразумный. Конечно, это безумное упрощение, ибо в современных моделях таких смысловых измерений - до 2024 и больше. То есть это могут быть еще такие измерения, как:
- Физические характеристики
- Размер
- Вес
- Форма
- Цвет
- Поведенческие характеристики
- Разумность
- Активность
- Опасность
- Социальность
- Функциональные и ролевые признаки
- Полезность
- Одомашненность
- Эмоциональная окраска
- Временная принадлежность
- …
Чтобы упростить это представление, можно представить себе трехмерное пространство, где каждая галактика — это смысловое пространство. В этом пространстве каждая звезда представляет собой слово, а её координаты определяют его смысловое положение. Например, где-то в этом пространстве будет звезда, названная “кот”. Рядом с ней могут находиться звезды с именами “собака”, “хомяк” и “мышь”, так как эти слова семантически близки друг к другу. А вот “акула” будет подальше - вроде как тоже животное царство, но в классе хрящевых рыб.

Координаты в смысловом пространстве
А теперь вспомним про теорию Мультиверса (да, эверетовская интерпретация, теория струн) и представим, что пространственных измерений куда больше трех - и каждое измерение определяет собственное смысловое пространство.
Ну а теперь, когда мы разобрались с эмбеддингами, перейдем к механизму “внимания”.
Attention, Attention!
Итак - мы разобрались, что имеем некое многомерное смысловое пространство, но на уровне отдельных слов. А если речь идет об омонимах? Например - “У меня новая коса”. Коса косить траву? Или я вышел из барбера? Понять, о какой косе идет речь, мы можем из контекста. Например - из предыдущей фразы. Если я сказал перед тем - “я на даче”, - то становится ясно с большой степенью вероятности, о какой косе идет речь. Хотя вероятность и не 100%.
А как модели понять предложение и его смысл? Особенно если мы говорим о генеративной модели - что-нибудь в смысле:
Промпт: “Напиши рассказ о том, как мой ученый кот говорил, что он…"
Как модель понимает, чего я от нее хочу? Как понимает контекст всего текста? Итак - опишем суть механизма “внимания” с постановки задачи. Как мы увидели на примере выше - нам нужно понять взаимосвязь слов в исходном тексте (упростим пока до одного предложения). Например - что “ученый” - это характеристика кота, или “он” - опять же относится к коту. Конечно, мы не можем определить все такие связи со 100% уверенностью, но как минимум с высокой.
Представим, что я следователь, расследующий отравление богатого человека. Естественно, я определяю круг подозреваемых - кто был рядом в момент преступления, кто имел доступ к потерпевшему и так далее. Далее - я пытаюсь понять мотивы - кто-то жаждал наследства (алчность), кто-то испытывал личную неприязнь, кто-то боялся огласки каких-то секретов. Анализируя потенциальный мотив каждого подозреваемого, я как бы назначаю “вес” совокупности мотивов. У кого-то он больше, у кого-то меньше, а кому-то усопший был вообще безразличен. Таким образом я сужаю круг подозреваемых, а кого-то вообще из него исключаю. Примерно то же самое делает механизм внимания - назначает “вес” каждому слову относительно всех других слов в тексте.
К примеру - модель берет слово “кот”. Задача - спросить весь входной текст: какие слова важны для уточнения контекста слова “кот”? Нам-то понятно, что это “ученый”, например, а “говорил” связано опять же с котом, как и “он”, но модели-то как понять?
Представим, что у нас есть некая справочная (назовем ее “Query”, дабы соответствовать терминологии модели), и первый наш шаг - мы даем запрос на слово “кот” (то есть эмбеддинг, вектор в данном случае). Справочная содержит много информации, в том числе и про котов, и отдаст нам ряд признаков, которые могут с высокой степенью вероятности относиться к коту. Например, “домашнее животное, мяукает, любит кушать”. На языке модели это будет обновленный вектор - то есть смысловая координата, обогащенная признаками кота.
На втором шаге мы генерируем подобный запрос для всех остальных слов в тексте - таких как “мой”, “ученый”, “говорил” и так далее. Только делаем это с помощью другой справочной (“Key”). Например, что слово “ученый” подразумевает какие-то интеллектуальные характеристики, а “мой” - это характеристика принадлежности, а “говорил” связано с речью. Дальше нужно сопоставить, что у нас пересекается с первым запросом на “кота”. Ну например, “говорил” - разве коты говорят? А тут уж зависит от обученности модели - если ей скармливали “Русские народные сказки” Афанасьева - то вполне. Тот же кот-баюн. А раз так, то слово “говорил” вполне пересекается по характеристикам со словом “кот”. То есть в терминах модели - обновленные смысловые координаты характеристик “кота”, которые мы получили выше на этапе запроса, они не так далеко от таких же обогащенных координат всех остальных слов в предложении, которые мы получили на шаге 2.
Так а о каких “справочных” идет речь? О предобученных матрицах с характеристиками каждого слова из вокабуляра модели. В итоге справочная №1 (“Query”) - это как поисковый запрос. Мы при помощи этой справочной обогащаем смысловое понятие “кота” некоторыми признаками, дабы уточнить запрос.
А справочная №2 (“Key”) - это будто картотека с подробным описанием всех слов из вокабуляра модели. И вот мы запрос, полученный на шаге 1, сравниваем с результатами шага 2. Таким образом определяем значимость (вес) каждого слова в исходном тексте для данного.
Но есть еще справочная №3 - (“Value”). А в ней - сами данные, которые мы будем использовать для обновления представления слова “кот” с учетом контекста.
А еще добавлю - что таких наборов “справочных” у нас несколько (“Attention heads” или “головы внимания”), например 12 - и каждая фокусируется на каких то определенных смысловых контектсах.
И еще раз: Шаг первый: мы задали вопрос “Что мы знаем про кота?” (спросили справочную “Query” - передав вектор слова “кот”, и получили новый вектор с признаками кота). То есть мы уточнили запрос.
Шаг второй: Мы сделали запросы с каждым другим словом из текста в справочную №2 (“Key”). Мы сверились с результатами шага 1 и результатами этих запросов: “Какие слова в тексте могут помочь уточнить, что за кот?” И мы выяснили, что это “ученый” и “говорил”.
Шаг третий: То есть, когда мы вычислили, что “кот” связан со словами “ученый” и “говорил”, мы смотрим, какую информацию эти слова хранят в справочной №3 (“Value”).
Например: “Ученый” в Value несет признаки: “интеллект, знания”. “Говорил” в Value несет признаки: “речь, коммуникация”. “Мой” в Value несет признаки: “принадлежность, указание на владельца”.
Теперь мы взвешиваем эти признаки, принимая во внимание, насколько они соответствуют запросу Query (кот). Если модель знает про Кота-Баюна, то “говорил” получит высокий вес. А если модель незнакома с русскими народными сказками, то она может считать, что “говорил” совсем и не важно (модель не слышала о говорящих котах). Ну а далее - модель пытается генерировать продолжение, и так как обучена на Афанасьеве - то и возьмет что-то оттуда. Что чаще всего говорил кот-Баюн?
То есть модель продолжит наш исходный текст как-нибудь так:
Промпт: Напиши рассказ о том, как мой ученый кот говорил, что он…
Ответ модели - “многое повидал и многое знает”

Механизм внимания в действии