Читать книгу Вектор смысла: новый квадрант. Навигация в пространстве векторного поиска (Сергей Кирницкий) онлайн бесплатно на Bookz (2-ая страница книги)
Вектор смысла: новый квадрант. Навигация в пространстве векторного поиска
Вектор смысла: новый квадрант. Навигация в пространстве векторного поиска
Оценить:

5

Полная версия:

Вектор смысла: новый квадрант. Навигация в пространстве векторного поиска

Существуют так называемые locality-sensitive hash – хэши, чувствительные к локальности, к близости объектов. Они устроены хитрее: похожие объекты с некоторой вероятностью получают одинаковые хэши. Это полезно для грубой предварительной фильтрации – быстро отсеять заведомо непохожее. Но это не решение задачи, а вспомогательный инструмент. Степень похожести они не измеряют.

Итак, три наивных подхода – и три тупика.

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

Все три метода совершают одну и ту же ошибку: они работают с формой, а не с содержанием. С тем, как данные записаны, а не с тем, что они означают. С синтаксисом, а не с семантикой.

Это фундаментальная проблема. Компьютер видит представление – байты, пиксели, символы. Человек видит сквозь представление – объекты, идеи, значения. Наивные методы пытаются сравнивать представления и удивляются, что результаты не совпадают с человеческим восприятием. Они измеряют расстояние между записями, а не между тем, что записано.

Парадокс: чем точнее мы сравниваем данные, тем дальше уходим от сравнения смыслов. Идеальное попиксельное совпадение – это копия, а не похожий объект. Идеальное совпадение слов – это плагиат, а не связанный документ. Точность в неправильном измерении бесполезна.

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

Это возможно. Люди научились это делать. Но для этого пришлось переосмыслить само понятие «похоже».

1.3. Что значит «похоже»

Наивные методы провалились не потому, что они плохо реализованы. Они провалились потому, что отвечают на неправильный вопрос. Они спрашивают: «насколько похожи данные?» А нужно спрашивать: «насколько похожи значения?»

Это разные вопросы.

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

Но значение – одно. Это один и тот же предмет. Та же модель. Если покупатель ищет именно её, обе фотографии одинаково релевантны. Для задачи поиска – это «похожие» изображения. Не потому что похожи пиксели, а потому что изображено одно и то же.

Теперь возьмём другую пару. На одной фотографии – красные кроссовки Nike. На другой – красный спортивный автомобиль Ferrari. Пиксели? Много красного там и тут, гистограммы похожи. Форма? Обтекаемые линии, динамичный дизайн. С точки зрения визуальных свойств – определённое сходство есть.

Но значение – разное. Совершенно разное. Обувь и автомобиль. Если покупатель ищет обувь, Ferrari не релевантен. Это не «похожие» товары, несмотря на похожие пиксели.

Вот ключевой сдвиг: похожесть – это про смысл, не про байты.

Два объекта «похожи», когда они про одно и то же. Когда они относятся к одной категории, решают одну задачу, вызывают одни ассоциации, отвечают на один вопрос. Неважно, как они записаны – важно, что они означают.

Это не философская абстракция. Это практическое переопределение задачи.

Когда мы говорим «найди похожий товар», мы имеем в виду: найди товар, который выполняет ту же функцию, удовлетворяет ту же потребность, подходит тому же покупателю. Не товар с похожими пикселями на фотографии.

Когда мы говорим «найди связанный документ», мы имеем в виду: найди документ на ту же тему, с той же проблематикой, для той же аудитории. Не документ с теми же словами. Статья о «машинном обучении» и статья об «искусственном интеллекте» могут быть тесно связаны, хотя термины разные. Договор об «аренде» и договор о «найме помещения» – об одном и том же, хотя юридически формулировки различаются. Смысл совпадает, слова – нет.

Когда мы говорим «порекомендуй похожую музыку», мы имеем в виду: найди музыку, которая создаёт похожее настроение, подходит для того же момента, понравится тому же слушателю. Не музыку с похожими частотами звуковых волн.

Смысл. Значение. Содержание. Вот что нужно сравнивать.

Но как? Как превратить «смысл» в нечто измеримое? Как объяснить компьютеру, что кроссовки – это обувь, что обувь – это товар для ношения на ногах, что ношение на ногах – это определённая функция? Как закодировать все эти связи, все эти категории, все эти отношения между понятиями?

Кажется, что задача безнадёжна. Чтобы понимать смысл, нужно понимать мир. Нужно знать, что такое обувь, что такое автомобиль, чем они отличаются и зачем нужны. Нужно иметь модель реальности в голове.

Люди потратили десятилетия, пытаясь построить такие модели вручную. Онтологии, семантические сети, базы знаний, таксономии – всё это способы формально описать, как понятия связаны друг с другом. Эксперты описывали категории, связи, отношения. «Кроссовки – это вид обуви. Обувь – это вид одежды. Одежда носится на теле. Кроссовки предназначены для спорта. Спорт связан с физической активностью.» Кропотливая работа, тысячи правил, годы усилий. Проект Cyc, начатый в 1984 году, пытался описать всё человеческое знание – и продолжается до сих пор, спустя четыре десятилетия.

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

Но потом люди нашли другой путь.

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

Это идея, которая изменила всё. Идея, которая кажется очевидной в ретроспективе, но потребовала десятилетий для воплощения.

Если два слова часто встречаются в похожих контекстах – они, вероятно, означают похожие вещи. «Кроссовки» и «кеды» появляются рядом со словами «носить», «бегать», «спорт», «размер», «шнурки». «Автомобиль» и «машина» – рядом со словами «ехать», «дорога», «бензин», «руль», «парковка». Контекст выдаёт значение. Слово определяется своим окружением, своими соседями, своими типичными спутниками. Не нужно объяснять значение слова напрямую – достаточно посмотреть, в каком окружении оно используется, и сравнить с окружением других слов.

Если два изображения распознаются как один и тот же объект – они похожи по смыслу. Если нейросеть, обученная на миллионах картинок, видит на обоих снимках одну и ту же категорию товара – значит, для задачи поиска они релевантны друг другу. Неважно, что пиксели разные. Важно, что система «понимает»: это одна категория.

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

Ключевая идея: смысл можно представить как точку в пространстве.

Каждому объекту – тексту, изображению, звуку – сопоставляется набор чисел. Много чисел: сотни, тысячи. Эти числа – координаты точки в многомерном пространстве. Этот набор чисел называют вектором, а процесс превращения объекта в вектор – векторизацией, или созданием эмбеддинга.

Магия в том, что эти числа не произвольны. Они устроены так, что похожие по смыслу объекты оказываются близко друг к другу в этом пространстве. Кроссовки – рядом с кедами, рядом со сникерами, рядом со спортивной обувью. Собаки – рядом с кошками, рядом с домашними питомцами, но далеко от автомобилей и ещё дальше от абстрактных понятий вроде «справедливости». «Врач» – рядом с «доктором» и «медиком», рядом с «больницей» и «лечением», но далеко от «инженера» и «программиста».

Пространство организовано по смыслу. Не по алфавиту, не по длине слова, не по частоте использования – по значению.

Близко в пространстве – значит похоже по смыслу. Далеко – значит разное. Расстояние становится мерой смысловой близости.

Это не метафора. Это буквально так работает. Расстояние между точками в этом пространстве – мера смысловой похожести. Чем меньше расстояние, тем ближе значения.

Задача «найти похожее» превращается в задачу «найти ближайшие точки». Математически точную, вычислимую, решаемую.

Откуда берутся эти волшебные числа? Как научить систему превращать смысл в координаты? Как из миллионов текстов или изображений извлечь структуру, которая отражает человеческое понимание похожести? Это отдельная история, и она удивительна. История о том, как нейросети научились ловить смысл в данных. История о Word2Vec, BERT, CLIP и других прорывах, которые сделали возможным то, что казалось невозможным. Мы расскажем её позже.

А пока важно понять главное: похожесть – это про смысл. И смысл можно представить как положение в пространстве. Это открытие изменило способ поиска информации. Это основа всего, что будет дальше в этой книге.

Мы начали с простого вопроса: как найти похожее? И обнаружили, что вопрос не такой простой. «Похожее» – это не про совпадение данных. Это про близость значений. Про смысл, который прячется за пикселями и буквами, за звуковыми волнами и строками кода.

Наивные методы сравнивают форму и упускают содержание. Они измеряют не то – расстояние между записями вместо расстояния между значениями. Чтобы искать по смыслу, нужно было научиться представлять смысл – превращать его в числа, которые можно сравнивать. Перевести неуловимое «это про одно и то же» на язык математики.

Это удалось. Объект становится точкой в пространстве. Похожие объекты – близкие точки. Поиск похожего – поиск ближайших соседей. Задача, казавшаяся философской, стала вычислительной.

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

Как именно объект превращается в точку? Что за пространство такое, где смысл становится расстоянием? Что означают все эти сотни чисел? Об этом – следующая глава.

Глава 2. Векторы и пространства

Мы выяснили, что похожесть – это про смысл. Два изображения похожи не потому, что в них совпадают пиксели, а потому, что они про одно и то же. Два текста близки не потому, что в них одинаковые буквы, а потому, что они говорят о схожем. Это философский сдвиг – от сравнения данных к сравнению значений. Но философия не поможет написать код. Нужен способ измерить смысл. Превратить интуитивное «похоже» в число, с которым можно работать.

Звучит как невозможная задача. Смысл – это что-то неуловимое, человеческое, не поддающееся формализации. Как измерить, насколько «кот на диване» похож на «кошку на кресле»? Как сравнить статью о политике со статьёй об экономике? Интуиция подсказывает ответ, но интуицию в код не вставишь.

Здесь на сцену выходит математика – но не та, что пугает формулами и греческими буквами. Математика как способ думать. Как язык, на котором можно говорить о близости и различии. Векторы и пространства – не абстракция из учебника линейной алгебры. Это ментальная модель, которая позволяет увидеть смысл буквально: как точку, у которой есть место. И оказывается, этого достаточно.

2.1. Вектор как адрес

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

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

Вектор – это тот же адрес. Только не на карте, а в пространстве. И не обязательно два числа – может быть три, десять, тысяча. Суть не меняется: набор чисел, который указывает на конкретную точку.

В двух измерениях всё наглядно. Лист бумаги, две оси – горизонтальная и вертикальная. Любая точка на листе описывается парой чисел: сколько вправо, сколько вверх. Точка (3, 5) – это три единицы вправо и пять вверх. Точка (7, 2) – семь вправо, две вверх. Ничего сложного.

Три измерения тоже можно представить. Комната. Длина, ширина, высота. Чтобы указать на лампочку под потолком, нужны три числа: сколько от стены, сколько от другой стены, сколько от пола. Точка (2, 3, 2.5) – и мы знаем, где именно висит лампочка. Три координаты вместо двух, но принцип тот же.

А теперь – прыжок. Что если измерений не три, а триста? Или три тысячи?

Интуиция протестует. Мы живём в трёхмерном мире, мы не можем «увидеть» пространство из тысячи измерений. Четвёртое измерение уже не укладывается в голове, что говорить о тысячном?

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

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

Возьмём что-то осязаемое. Допустим, мы описываем яблоки. В простейшем случае – два параметра: вес в граммах и цена в рублях. Яблоко весом 150 граммов по цене 30 рублей – вектор (150, 30). Другое яблоко, 200 граммов за 45 рублей – вектор (200, 45). Два числа, две координаты, точка на плоскости. Можно нарисовать.

Теперь добавим параметры. Кислотность по шкале от 1 до 10. Содержание сахара в процентах. Диаметр в сантиметрах. Оценка вкуса от покупателей. Срок хранения в днях. Каждый параметр – новое измерение. Яблоко теперь описывается не двумя числами, а семью. Вектор (150, 30, 6, 12, 7.5, 4.2, 14) – это конкретное яблоко в семимерном пространстве яблок. Нарисовать уже нельзя, но вычислять – можно.

Заметьте: мы не потеряли яблоко. Мы его не упростили до неузнаваемости. Мы описали его набором характеристик – и каждая характеристика стала координатой. Чем больше характеристик мы учтём, тем точнее описание, тем больше измерений. Яблоко осталось яблоком, просто теперь у него есть адрес в пространстве всех возможных яблок.

И вот ключевой момент. Когда мы говорим о смысле текста или содержании изображения, происходит то же самое – только измерений гораздо больше, и они не такие очевидные, как вес или цена.

Современные модели превращают текст в вектор из сотен или тысяч чисел. Каждое число что-то «значит» про этот текст – хотя объяснить словами, что именно, часто невозможно. Это не вес и не цена. Это абстрактные характеристики, которые нейросеть научилась выделять сама. Но принцип остаётся: текст становится точкой в пространстве. Адресом. Набором координат.

Можно думать об этом так: у текста есть множество неявных свойств. Насколько он формальный или разговорный. Про технологии или про искусство. Позитивный или негативный. Длинный или короткий. Конкретный или абстрактный. Сотни таких свойств, которые мы чувствуем интуитивно, но не называем явно. Модель превращает эти неявные свойства в числа. Координата номер 47 может отвечать за «техничность» текста. Координата 238 – за эмоциональную окраску. Координата 891 – за что-то, чему и названия нет, но что влияет на смысл.

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

Слово «эмбеддинг» – от английского embedding, «вложение» – означает именно это: вложить объект в пространство. Дать ему адрес. Превратить текст, картинку, звук или что угодно ещё в вектор, в точку с координатами. Термин звучит технически, но идея проста: мы берём что-то сложное – текст со всеми его нюансами, изображение со всеми его деталями – и сжимаем в компактный набор чисел. Теряем ли мы при этом что-то? Да. Но сохраняем главное: суть. Смысл. То, что делает объект похожим на одни объекты и непохожим на другие.

Почему это работает? Потому что пространство – мощная метафора, которая оказалась не просто метафорой. Когда объекты превращены в точки, с ними можно делать то, что делают с точками: измерять расстояние между ними. А расстояние – это уже кое-что конкретное. Кое-что, что можно вычислить, сравнить, упорядочить.

Но прежде чем перейти к расстояниям, задержимся на секунду. Вектор из тысячи чисел – это не страшно. Это просто длинный адрес. Когда курьер везёт посылку, ему нужен адрес: страна, город, улица, дом, квартира, этаж, код домофона. Семь-восемь «координат», и посылка находит получателя. Вектор из тысячи чисел – то же самое, только координат больше. И каждая координата сужает область поиска, уточняет положение точки в пространстве.

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

Итак, первый шаг сделан. Объекты – тексты, изображения, что угодно – можно превратить в векторы. Точки в пространстве. Адреса. Каждый объект получает своё место, свой набор координат. Откуда берутся эти координаты, как именно модель их вычисляет – вопрос следующих глав. Сейчас важно другое: у нас есть способ поместить смысл в пространство. Дать ему место. Сделать его измеримым.

Но что нам это даёт? Пока – ничего, кроме красивой идеи. Объекты стали точками. Дальше что?

Дальше – расстояние. Если два объекта превратились в две точки, между ними можно измерить расстояние. И вот тут начинается магия: расстояние между точками оказывается мерой похожести между объектами. Близко – значит похоже. Далеко – значит разное. Простая идея с далеко идущими последствиями.

Но как именно измерить это расстояние? И всегда ли «расстояние» означает одно и то же?

2.2. Расстояние между смыслами

У нас есть точки в пространстве. Тексты, изображения, любые объекты – каждый получил свой адрес, свой вектор. Теперь нужно научиться отвечать на вопрос: насколько две точки близки друг к другу?

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

В обычном мире это очевидно. Расстояние между двумя городами – сколько километров по прямой. Расстояние между двумя точками на листе бумаги – можно измерить линейкой. Мы делали это в школе: есть две точки, есть формула, получаем число. Чем меньше число – тем ближе точки. Проще некуда.

В многомерном пространстве принцип тот же. Есть два вектора – два набора чисел. Нужно вычислить, насколько они отличаются. Получить одно число, которое скажет: эти объекты почти одинаковые, или они совершенно разные, или где-то посередине. Одно число – вердикт о похожести.

Но тут возникает неожиданный вопрос: а что значит «расстояние»?

В повседневной жизни мы не задумываемся об этом. Расстояние – это расстояние. Метры, километры, шаги. Линейка не врёт. Но математика знает много способов измерить «разницу» между точками. И выбор способа влияет на результат. Иногда – драматически.

Самый интуитивный способ – евклидово расстояние. Названо в честь древнегреческого математика, но идея проще некуда: это расстояние по прямой. Если представить две точки на плоскости и соединить их линией – длина этой линии и есть евклидово расстояние. То, что мы измеряем линейкой. То, что имеем в виду, когда говорим «от Москвы до Петербурга столько-то километров».

В двух измерениях это работает наглядно. Точка А в координатах (2, 3), точка Б в координатах (5, 7). Соединяем прямой, измеряем. Получается 5 – это и есть расстояние между ними. В трёх измерениях принцип тот же, только учитываем ещё и высоту. В тысяче измерений – ничего нового, просто координат больше. Формула усложняется, но суть остаётся: берём разницу по каждой координате, складываем определённым образом, получаем число.

Евклидово расстояние хорошо работает, когда нас интересует буквальная близость. Насколько один вектор отличается от другого по абсолютным значениям. Если координаты – это что-то измеримое, вроде веса или цены, евклидово расстояние имеет прямой смысл. Яблоко весом 150 граммов ближе к яблоку весом 160 граммов, чем к яблоку весом 300. Логично. Понятно. Работает.

Но для смыслов есть способ лучше.

Возьмём два текста. Один – короткая заметка о кофе. Другой – длинная статья о кофе. Они про одно и то же, но длина разная. Если мы превратим их в векторы, короткий текст может дать «маленький» вектор, длинный – «большой». Евклидово расстояние между ними окажется значительным, хотя тексты очень похожи по смыслу.

Это проблема. Мы хотим измерять близость смыслов, а не близость размеров.

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

Представьте себе это так. Вы стоите в начале координат – в точке (0, 0). Смотрите на точку А. Потом смотрите на точку Б. Угол, на который вам нужно повернуть голову, – это и есть мера различия. Если обе точки в одном направлении, угол нулевой – объекты похожи. Если в противоположных направлениях – угол максимальный, объекты совершенно разные. Если под прямым углом – объекты никак не связаны, ортогональны.

Красота этого подхода в том, что он игнорирует «длину» вектора. Короткий текст и длинный текст про одно и то же будут указывать в одном направлении – и косинусное сходство скажет, что они близки. Не важно, что один вектор «короче» другого. Важно, куда они направлены.

Это как компас. Два корабля могут быть на разном расстоянии от порта, но если оба плывут на север – они движутся в одном направлении. Косинусное сходство измеряет именно это: совпадение направлений, а не совпадение положений. Направление – это суть. Расстояние от начала координат – это шум, который мы отбрасываем.

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

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

Есть и другие метрики. Манхэттенское расстояние – как если бы вы шли по улицам Нью-Йорка, где нельзя срезать по диагонали, только вдоль кварталов. Скалярное произведение учитывает и направление, и длину – когда важно не только куда смотрит вектор, но и насколько он «сильный». Расстояние Хэмминга считает, в скольких позициях два вектора различаются – удобно для бинарных данных, где координаты только 0 и 1.

Для разных задач – разные метрики. Выбор влияет на результат. Иногда – решающим образом.

Но главное не в формулах. Главное – в идее.

Мы взяли абстрактное понятие «похожесть» и превратили его в число. Два текста – два вектора – одно число, которое говорит, насколько они близки. Два изображения – два вектора – одно число. Любые два объекта, которые можно превратить в векторы, можно сравнить. Универсальный язык для описания сходства.

bannerbanner