Эмбеддинги, внимание, FNN и все что вы хотели знать, но боялись спросить

Вступление

Сим я пытаюсь начать цикл статей, посвященных LLM (большим языковым моделям), нейросетям и всему, что рядом с аббревиатурой AI. Цели написания этих статей, конечно же, шкурные, ибо сам относительно недавно начал погружаться в эти темы и столкнулся с тем, что вроде бы и масса информации, и статей, и документов, написанных мелким шрифтом с заумными диаграммами и формулами, читая которые, заканчивая абзац, забываешь, о чем был предыдущий. Поэтому здесь я буду пробовать описать суть предметной области на концептуальном уровне - а посему обещаю избегать по максимуму математических формул и мудреных графиков, видя которые, читатель неизбежно ловит себя на желании закрыть вкладку браузера и посетить ближайший винно-водочный магазин. Так что - нет формулам (кроме самых простых), нет заумности, нет претензий выглядеть умнее, чем я есть. Эти статьи должна понять ваша бабушка, и если это не получилось - значит, я с поставленной задачей не справился.

Итак, эмбеддинги

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

Возьмем слово “кот”. Возьмем абстрактную, но обученную LLM-модель. Где-то в глубинах своих матриц-словарей она содержит это слово. Выглядит это примерно так:

СловоВектор
Кот[0.2, -1.3, 3.4, 5.6…]

Так вот - что значит этот вектор? Эти цифры? А эти цифры - это координаты кота в смысловых измерениях.

Но как так - откуда у бездушной машины может быть понятие смыслового измерения? Правильно - не может. Но они есть. Откуда они взялись? А как результат обучения модели на информации, сгенерированной человечеством и до которой модель смогла дотянуться на этапе обучения. (Кому нужны подробности - Hugging Face Space). Но о подробностях обучения поговорим в следующих статьях.

Давайте предположим, что некое внеземное существо просит вас объяснить - что такое кот? Как вы это сделаете? Очевидно - попытаетесь пройтись по признакам:

  • Кот? Ну, небольшой такой (относительно чего? Вируса? Бактерии? Синего кита? Нам нужна шкала измерения - пусть от 0 до 10)
  • Это пушистый он (Насколько? Опять нужна шкала. А если сфинкс?)
  • Короче, еще мяукает (Частотные характеристики? Форма спектра?)
  • Он вполне разумен (Опять же - шкала разумности, как мы ее понимаем?)

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

Другими словами, модель не оперирует признаками (смысловыми характеристиками) в человеческом понимании, а лишь выявляет статистические закономерности в тексте. Так могут выделиться, например, измерения, связанные с размером, поведенческими характеристиками или степенью разумности, даже если последнее не является буквальным.

Если упростить многомерное пространство до двух измерений, можно представить, где окажутся координаты “кота” относительно других сущностей:

Semantic coordinates

Смысловые координаты слов в пространстве одушевленности и размера

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

  • Физические характеристики
    • Размер
    • Вес
    • Форма
    • Цвет
  • Поведенческие характеристики
    • Разумность
    • Активность
    • Опасность
    • Социальность
  • Функциональные и ролевые признаки
    • Полезность
    • Одомашненность
  • Эмоциональная окраска
  • Временная принадлежность

Чтобы упростить это представление, можно представить себе трехмерное пространство, где каждая галактика — это смысловое пространство. В этом пространстве каждая звезда представляет собой слово, а её координаты определяют его смысловое положение. Например, где-то в этом пространстве будет звезда, названная “кот”. Рядом с ней могут находиться звезды с именами “собака”, “хомяк” и “мышь”, так как эти слова семантически близки друг к другу. А вот “акула” будет подальше - вроде как тоже животное царство, но в классе хрящевых рыб.

Word embeddings space

Координаты в смысловом пространстве

А теперь вспомним про теорию Мультиверса (да, эверетовская интерпретация, теория струн) и представим, что пространственных измерений куда больше трех - и каждое измерение определяет собственное смысловое пространство.

Ну а теперь, когда мы разобрались с эмбеддингами, перейдем к механизму “внимания”.

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 (кот). Если модель знает про Кота-Баюна, то “говорил” получит высокий вес. А если модель незнакома с русскими народными сказками, то она может считать, что “говорил” совсем и не важно (модель не слышала о говорящих котах). Ну а далее - модель пытается генерировать продолжение, и так как обучена на Афанасьеве - то и возьмет что-то оттуда. Что чаще всего говорил кот-Баюн?

То есть модель продолжит наш исходный текст как-нибудь так:

Промпт: Напиши рассказ о том, как мой ученый кот говорил, что он…

Ответ модели - “многое повидал и многое знает”

Attention mechanism

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