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

Анизотропия эмбеддингов не всегда зло, но «сырой» косинус часто даёт слишком размытый сигнал. Центрирование убирает общий фон и помогает увидеть различия, не разрушая локальные смысловые области. Показываю это на реальных расчётах из Obsidian‑базы.


В этой статье я хочу раскрыть своё понимание эмбеддингов и косинусного сходства. Перед прочтением предлагаю мысленный эксперимент: представьте 768‑мерное пространство через знакомые 2D/3D‑проекции, чтобы почувствовать, что стоит за цифрами и графиками.

Многомерность пространства

Многомерность пространства

Начну с теории. Эмбеддинг — это способ представить текст в виде плотного числового вектора. Эмбеддинговая модель превращает текстовый фрагмент в список из нескольких сотен чисел, где каждое число — координата на одной из внутренних осей (их количество зависит от модели). В такой системе два текста считаются близкими, если их векторы смотрят примерно в одну сторону.

Главная мера такой близости — косинусное сходство. Она игнорирует длины векторов и смотрит только на угол между ними. Сонаправленные стрелки — косинус близок к 1, почти перпендикулярные — к 0.

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

Это и есть анизотропия: геометрия пространства неоднородна. Из‑за неё «сырой» косинус склонен выдавать высокую похожесть даже там, где её нет — просто потому, что оба текста могут быть написаны на одном языке или в одном стиле.

Точки или векторы?

Сначала мне было непонятно: эмбеддинги это точки в пространстве или направленные стрелки?

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

Представьте букет цветов: все стебли растут вверх и лишь чуть расходятся. Если мерить угол между ними, все они окажутся «похожи» из‑за общей вертикальной компоненты. В анизотропном пространстве разные на первый взгляд тексты могут смотреть в одну сторону просто потому, что это осмысленные языковые фрагменты внутри одной модели. Косинус видит общий фон и завышает близость.

Поэтому калибровка не «выпрямляет» конус физически. Она убирает общий фон, чтобы стали видны тонкие различия. Получается примерно такая формула: исходный вектор = смысл + общий фон.

Выравнивание векторов

Выравнивание векторов

Как эта проблема проявилась в работе с базой

В NOUZ эмбеддинги появились для определения и дальнейшей сортировки заметок по крупным смысловым областям. Сначала я задаю ручную структуру: уровень, статус, связи, знак. Дальше сервер считает: берёт текст заметки, сравнивает его с эталонами рабочих областей и показывает, к какой смысловой области заметка тянется сильнее.

И вот здесь «сырой» (или исходный) косинус начал мешать. Если он завышает похожесть почти всего со всем, то он мешает не только поисковым подсказкам, но и автоклассификации по областям: знак кажется уверенным, второй знак появляется слишком легко, дрейф начинает срабатывать неверно. Проблема не в эмбеддингах, а в том, что сырой косинус даёт агенту уверенность в принадлежности заметки к области, хотя часть этой уверенности может быть общим фоном.

Например, в одном из срезов три эталона рабочих областей оказались подозрительно близки друг к другу:

Пара эталонов

Сырой косинус

область 1 — область 2

0.6395

область 1 — область 3

0.7106

область 2 — область 3

0.7140

Для меня это разные темы. Для выбранной эмбеддинговой модели они уже сидят в общем конусе. На первых 80 векторных записях медианная похожесть разных заметок составила 0.6343, а максимальная доходила до 0.8791. Это не делает базу или модель плохими, но это меняет смысл шкалы и расчётов.

Дискретность языка и кошки

Анизотропию часто обсуждают как чисто математическую проблему: вот конус, вот метод главных компонент, вот отбеливание. Но под ней лежит кое‑что важное для всех, кто работает с эмбеддинговыми моделями.

Язык дискретен. Мы режем наш реальный непрерывный опыт на слова. «Кот», «кошка», «котёнок», «мурлыкать» — это отдельные токены. Мир тоже дискретен для наших органов восприятия, но субъективный опыт как будто более «текучий»: у кошки нет отдельной кнопки «пушистость» или «утреннее недовольство». Это мы нарезаем мир на слова так, чтобы о нём можно было говорить и о нём размышлять, а модели унаследовали от нас эту нарезку.

Возьмём маленькую кошачью вселенную: «кот», «кошка», «котёнок», «усы», «мурлыкать», «миска», «домашнее животное». Модель, обученная на реальном языке, не разбросает их равномерно по сфере. «Кот» и «кошка» окажутся рядом. «Миска» уйдёт к бытовым объектам. «Домашнее животное» станет мостом к собакам и попугаям. Где‑то выше появятся кластеры «животное», «живое», «объект».

Анизотропия в моделях

Анизотропия в моделях

Даже если убрать дискретность языка и представить чистое смысловое поле, равномерного шара не получится. Смыслы не равноправны: есть иерархия, частотность, контекстная масса. «Животное» связано с тысячами частных случаев, а «пятнышко за левым ухом» — с каким‑то определённым котом.

Отсюда главное: борьба с анизотропией не должна быть тотальной. Есть техническая анизотропия модели — её нужно измерять и калибровать. И есть неравномерность самого смысла, её нельзя просто стереть, иначе исчезнет структура. Формула скорее не «сделать пространство идеальным», а «понять, где прибор измерения врёт».

Что даёт вычитание среднего фона

Самый простой и безопасный метод калибровки — центрирование. Берём все эмбеддинги корпуса, считаем средний вектор. Это и есть общий фон, куда в среднем смотрит база. Затем вычитаем его из каждого эмбеддинга и сравниваем уже остаточные направления.

Вот как меняется картина на реальном срезе (модель: text-embedding-granite-embedding-278m-multilingual, 768 измерений):

Метрика

Исходный косинус

После центрирования

10-й процентиль

0.5631

–0.1440

Медиана

0.6335

–0.0143

Среднее

0.6354

–0.0014

90-й процентиль

0.7089

0.1545

Стандартное отклонение

0.0576

0.1226

Отрицательные значения после центрирования — это нормально. В этой шкале они означают не ошибку, а скорее то, что эти фрагменты смотрят в разные стороны после удаления общего фона.

Исходно медианная близость случайных фрагментов — 0.6335. Половина пар выглядит довольно похожей ещё до вопроса о реальном смысле. После центрирования медиана падает до –0.0143, то есть возвращается к честному нулю. Узкий коридор разворачивается в нормальный диапазон, разброс становится шире.

Здесь важен один нюанс: среднее косинусное сходство хорошо показывает общий сдвиг, но может спутать фон с анизотропией. Поэтому надо смотреть не на одну цифру, а на несколько признаков сразу: медиану, процентили, разброс, контраст выдачи.

Ещё я сравнила фрагменты внутри одной заметки с фрагментами из разных заметок. До центрирования разница была 0.0595: кусочки одного файла почти не отделялись от кусочков чужих файлов. После центрирования разница выросла до 0.1554. Общий фон стал меньше мешать, и внутренняя связность заметки стала виднее.

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

Проверка

Разрыв между 1-м и 10-м до центрирования

После центрирования

Совпадение первой десятки

1

0.0430

0.0890

0.9

2

0.0878

0.2566

0.8

3

0.0318

0.0863

0.7

4

0.0384

0.0893

0.9

5

0.0837

0.1976

0.8

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

Отслеживание дрейфа

Дрейф в живой базе

Дрейф в живой базе

Одна из центральных идей NOUZ — дрейф: ручная структура говорит одно, а автоматический сигнал со временем показывает другое. Заметка изначально относилась к одному домену, но со временем разрослась, обросла ссылками и дочерними узлами — и теперь тянется в другую область. Скорее это знак не ошибки, а роста живой базы.

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

  • если исходный и центрированный сигналы согласны — связь сильная;

  • если связь есть только в исходном косинусе — вероятно, это общий фон;

  • если центрированный сигнал переключает заметку на другую область — стоит проверить, не выросла ли она из старой рамки;

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

Что считать полезным сигналом

После таких таблиц возникает соблазн сказать: «исходное — плохо, центрированное — хорошо», но это та же ошибка, повёрнутая в другую сторону.

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

Уберите слишком много фона — потеряете полезную структуру. Слишком агрессивно «отбелите» пространство — разрушите локальные смысловые области. Задача не в том, чтобы разнести все точки как можно дальше, а в том, чтобы отличать смысловую близость от фоновой похожести.

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

Поэтому в NOUZ я держу несколько слоёв одновременно:

  • ручной sign — моё намерение и классификация;

  • sign_auto — автоматический векторный сигнал;

  • core_mix — профиль областей;

  • смысловые мосты — кандидаты для подтверждения;

  • дрейф — повод для проверки;

  • исходный косинус — контрольная диагностика;

  • центрированный косинус — более осторожный взгляд.

Сервер считает. Человек решает.

Лаборатория и метод ABTT

Есть интерактивная лаборатория по геометрии эмбеддингов: можно покрутить облако слов, выбрать модель, посмотреть ближайших соседей, косинусы. Отдельно — график, который показывает общий фон и эффект от центрирования, удаления верхних компонент и отбеливания.

Важная оговорка: облако в лаборатории — это не прямой вид пространства модели. Рабочие векторы живут в сотнях измерений, а на экране — трёхмерная тень (PCA‑проекция) для выбранного словаря. Но именно эта тень даёт интуицию: почему разные модели дают разную геометрию, куда давит общий фон, как центрирование меняет картину.

На графике я сравниваю четыре состояния: «как есть», «после центрирования», «удаление верхних компонент (ABTT, All‑but‑the‑top)» и «отбеливание». ABTT работает так: сначала убирается общий средний вектор, потом несколько самых сильных направлений, которые часто несут общий фон.

Что я вынесла из эксперимента

В личной текстовой Obsidian‑базе перекосы особенно заметны. Все тексты написаны одним языком, в основном в одном стиле, проекты пересекаются. База не похожа на случайный интернет‑корпус: у неё своя лексика, свои форматы, своя иерархия. Нельзя просто взять модель, выставить порог 0.55 и сказать: «всё, что выше — связь».

Смотреть нужно на контраст:

  • насколько одна область выделяется на фоне других;

  • согласны ли исходная и центрированная оценки;

  • не плоская ли выдача;

  • не появился ли хаб — узел‑притяжение, который всплывает в любом контексте;

  • не цепляет ли модель служебную разметку вместо смыслового ядра заметки;

  • совпадает ли автоматический сигнал с моим намерением.

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

Хорошая система знаний должна уметь не только находить похожее, но и сомневаться. Кажется, именно с этого начинается настоящая работа с ИИ‑агентами: не когда они читают всё подряд, а когда получают навигацию, откалиброванные приборы и перенимают ваш стиль мышления.


Ссылки

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


Меня зовут Мария Белкина, разрабатываю инструменты для семантической работы с базами знаний и ИИ‑агентами.

Автор: Masha_Belkina_Log

Источник