Комментарии 17
По этому набор чисел мы сможем определить, что, например, этот объект «яблоко», а не «груша».
Сегодня день невычитанных текстов? Только начинаю читать статью - обязательно либо путаница с ударениями, либо пропущенные слова, как будто люди забыли собственный язык.
Наконец-то нормальное человеческое объяснение что такое эмбединг, без тонны формул и терминов
То есть, вас не смущают пасcажи, в которых неясно кто на ком стоял:
N‑граммы не понимают, что они на самом деле связаны по смыслу
Как N-граммы могут вообще что-то понимать?
Может быть, автор имел в виду что "N-граммы не содержат информации, которая помогла бы их связать по смыслу"? Но об этом знает только сам автор.
Позволю себе поделиться своими наработками в данном направлении - может кто покритикует меня здесь конструктивно. Получется, что числа несут два разных вида информации: количественную (сколько), и порядковую (после чего), что не соответствует информационному наполнению слов. Вопрос который на первый взгляд не имееет отношения к рассматриваемой автором теме: можно ли каким-то образом выделить из чисел эти две ипостаси и использовать их по-отдельности? Например, мы хотим обрабатывать только информацию о количестве игнорируя порядок. Или порядок без знания о количестве. Я спрашиваю потому что здесь задача кодирования сводится с задаче сжатия данных. А сжатие опирается на особенности последовательностей (т.е. на свойства порядка).
Представим себе некоторый канал связи или хранилище информации, скажем файл на диске. Байты, составляющие этот файл хранятся в определенном порядке, и когда мы запрашиваем данный файл, эти байты приходят к нам с сохранением порядка. Даже если отдельные части файла приходят к нам асинхронно по сети, мы все равно после приема упорядочиваем их в исходную последовательность.
Теперь мы уберем требование того, чтобы передаваемые данные (неважно синхронно или асинхронно) требовали порядка, но при этом после получения сохраняли свой смысл. Это можно сделать, передавая некоторые базисные количества, например степени двойки. Тогда после получения набора базисных чисел мы можем восстановить передаваемое исходное число (или файл) независимо от порядка получения компонентов. Например, я что-то там закодировал числом 14 и хочу оперировать этим кодом без знания того что это число больше 13 и меньше 15. Тогда я разложу его в сумму 14 = 8 + 4 + 2. Восемь, четыре и два - это базисные количества и я могу их передавать в любом порядке (параллельно, последовательно или еще как-то), но после получения данных компонент их сумма всегда даст исходное число 14. Кодировка one-hot близка к данному принципу, но в ней все еще заложен порядок нулевых байт. Кстати, биологические нейроны игнорируют порядок поступающих данных, суммируя входящие заряды со всех дендридов без разбора как бы намекая, что мы на правильном пути.
Теперь мы уберем информацию о количестве и попробуем описать только порядок. Перестановки возникают тут сами собой: из N объектов можно составить N! перестановок и присвоить каждой из них свой уникальный номер. Например, числа 9, 10 и 11 можно переставить 6 различными способами. Если у получателя сообщения уже есть эти числа, то передав 1 мы сообщим ему что правильный порядок для них 9, 10, 11. А для 6 правильный порядок обратный 11, 10, 9.
Удивительно здесь то, что выделив две составляющие из числовой информаци объем передаваемых данных увеличился. Т.е. числа в том виде, к которому мы привыкли, уже сильно сжимают информацию и попытки №1 было бы достаточно на данном этапе пока мы не уйдем от чисел к чему-то более адекватному.
Удаляя порядок, мы можем потерять информацию. Например,
man eats shark
shark eats man
имеют противоположные смыслы.
Но вообще задача о разделении содержания и порядка довольно интересная. Например, вот здесь рассказывается, как с помощью преобразования Фурье разделить позиционную и цветовую информацию на изображении.
С такими иллюстрациями все намного понятнее. А то иногда складывается ощущение, что авторов математических статей бьют током за вставку картинок. Обычно их там кот наплакал
Спасибо за статью. Идея для следующей - sparse vs dense vectors.
Мда, смешано все: токены, многомерные векторы (простите embeddings), положение этого вектора.
Вот просто если взять только понятие токен - это часть текста - целое число token id, которое обозначает либо целое слово, либо часть этого слова - т.д. проще говоря словарь где ключом будет слово или его часть, а значением целое число.
Первый шаг - разбиение текста на токены. И тут можно статью писать: 1) Что делать, если слово - это какое-то новое никогда не встречающееся слово - понятно - несколько токенов - но как выбирать? ну и про <|endoftext|> упомянуть 2) Если цикл статей направлен на LLM, то вот еще вопрос - одинаковые ли id токенов скажем в gpt-2, qwen и т.п. - поскольку без глубокого понимания этого нельзя делать даже finetuning модели.
Возможно стоит упомянуть https://github.com/openai/gpt-2/blob/master/src/encoder.py и осветить библиотеку tiktoken
Шаг второй - вектор эмбеддинга - тоже множество вопросов. От случайно заполненной, обучаемой матрицы эмбеддингов (которая не входит в повторяющиеся блоки трансформера) до скалярное произведения этих векторов и косинуса угла между ними (хотя и тут вопросы - где лучше это рассматривать - возможно при рассмотрении внимания).
В целом, статья больше "запутывает" - что-то реально полезное то на ютубе есть неплохое видео от Sebastian Raschka - вот там по полочкам все.
"порассуждать о назначении эмбеддингов" - это скорее про "скалярное произведения этих векторов и косинуса угла между ними", про гиперплоскости (хотя наверное нужно начинать с более простого - с функции задающей линию в 2D, функции задающей плоскость в 3D и т.д. поскольку понятие гиперплоскость не совсем "школьное") - смысл в том чтобы математически "чувствовать" как это происходит. Кстати, наверное дальше будет упоминание про softmax() функцию - которая "вдруг" для многих производит нормализацию, а вот почему используется степень числа е и основной смысл нормализации - это будет? Или Вы вот упомянули про "Позиционное кодирование", а почему простое суммирование (а не умножение или возведение в степень) "добавляем позиционный вектор к вектору эмбеддинга" тут работает? В чем различие в эмбеддинге, например предложений "собака перепрыгнула через кошку" и " кошка перепрыгнула через собаку"
Вот хорошее видео на эту тему:
LLM и GPT - как работают большие языковые модели? Визуальное введение в трансформеры

«Привет! Я [0.44, -0.91, 0.66...]» или как научить машину понимать смысл слов