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

Здесь же мне захотелось сосредоточится исключительно на инструментальной части и предложить свой подход к анализу «синтетики». То есть посмотреть, как можно «развернуть» задачу, оптимизировав подход к ней более комплексно, так как уже поднадоело без конца «шить» лоскутное одеяло из множества тестов и метрик (Perplexity, BLEU, ROUGE, METEOR, BERTScore, GLUE, MMLU). Основной идеей было представление имеющихся данных через другие форматы, чтобы конвертировать и находить повторяющиеся паттерны, тренды, аналогии, элементы и возможные аномалии в данных. Ведь любой алгоритм, каким бы он сложным не был, не может выйти за пределы своей генерации, а следовательно, так или иначе будет создавать одни и те же «детектирующие» элементы.

Беглый взгляд на существующие наработки показывает, что есть значительное количество инструментов, которые «обнаруживают» зависимости в данных (например, вот, вот и вот). Исследуемый подход в моей части опирался на представлении данных через графы и оценке топологии графа для оценки эмбеддингов вершин посредствов t‑SNE‑анализа. Таким образом мы получаем пул зависимостей, и есть предположение, что для одного и того же алгоритма по генерации «синтетических» данных, зависимости будут повторяться от генерации к генерации. То есть, здесь мы имеем цифровой «отпечаток» каждого алгоритма, и пополняя базу таких алгоритмов, мы всегда можем обнаружить «синтетику» определенного состава.

Целью этого исследования было решение пары моментов: во‑первых, это разработка готового инструмента для повышения качества «синтетических» данных; во‑вторых, выявление качественно новых связей в понимании, как происходит генерация данных.

Решение задачи: поиски, думки и много чая

Первое, что необходимо было сделать, это «перегнать» текст в граф‑знаний (knowledge graph). Задача на сегодняшний день уже более чем решенная и есть немало инструментов, активно эксплуатирующих эту идею (knowledge‑graph, kg‑gen, Text2KG). При этом надо было подумать, какие брать сети, ибо слишком большие и тяжёлые брать не стоит, так как задача стояла на разработку прототипа, и вообще «обкатки» решения. Конечно, же надо было брать графовые нейронные сети: GCN, GAT, GraphSAGE, GRN, DGNN, ST‑GCN, GDL, MPNN, SGNN. Среди рассмотренных использованных библиотек значились torch‑geometric, igraph, optuna, mlpfinance, networkx и transformers.

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

  • Представление узлов: каждая точка временного ряда рассматривается как узел графа.

  • Установление рёбер: два узла соединяются ребром, если соответствующие точки во временном ряду «видят» друг друга, то есть если отрезок, соединяющий эти точки не пересекает промежуточные значения ряда. Формально, для двух точек (t_{a}y_{a}), (t_{b}y_{b}) существует ребро, если для любой промежуточной точки (t_{c}y_{c}), где t_{a} < t_{c} < t_{b} выполняется условие:  y_{c} < y_{a} + (y_{b}-y_{a})\frac{t_{c}-t_{a}}{t_{b}-t_{a}}. Более расширенный и похожий вариант решался при помощи Time‑LLM. Вот тут есть подробное описание, что было получено, да и подробный git можно найти тут. Если коротко, то работа Time‑LLM основана на трёх ключевых компонентах:

    • преобразование входных данных: конвертация исходных временных рядов в текстовые представления, понятные для LLM;

    • Prompt-as-Prefix (PaP): обогащение контекста с помощью декларативных подсказок и знаний экспертов;

    • проектирование выходных данных: трансформация результатов работы LLM обратно в числовые прогнозы.

Time-LLM демонстрирует выдающиеся результаты: 

  • обгоняет специализированные модели прогнозирования по метрикам производительности; эффективна при обучении с небольшим набором данных (few‑shot learning);

  • успешно работает в условиях отсутствия предварительного обучения (zero‑shot learning).

Решение используется компанией XiMou Optimization Technology Co., Ltd. (XMO) для прогнозирования в области возобновляемой энергетики и погоды.

Далее, я дополнительно применил t‑sne к эмбедингам узлов графа, полученных при помощи модели GСN/GAT, чтобы визуально представить структуру отношений между этими узлами и выявить кластеры, классы или группы похожих объектов.

При этом у t‑SNE есть существенные ограничения:

  • Параметризация. Результаты чувствительны к выбору параметров, таких как перплексия. Некорректный выбор параметров может привести к искажению визуализации.

  • Отсутствие глобальной структуры. t‑SNE хорошо сохраняет локальные структуры данных, но может искажать глобальные взаимосвязи между кластерами. Поэтому расстояния между кластерами на визуализации не всегда отражают реальные отношения в исходных данных.

  • Случайность. Алгоритм t‑SNE включает случайные компоненты, что может приводить к различным результатам при разных запусках. Для повышения воспроизводимости рекомендую фиксировать random seed.

  • Сравнение с другими методами. Для получения более полной картины рекомендую использовать t‑SNE в сочетании с другими методами снижения размерности, такими как PCA (метод главных компонент), чтобы подтвердить наблюдаемые структуры.

  • Множественные запуски. Проведение нескольких запусков t‑SNE с разными параметрами и инициализациями поможет убедиться в стабильности и надёжности наблюдаемых кластеров.

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

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

Граф текстов, имеющих временные метки (а), и визуализация эмбеддингов узлов этого графа (б)
Граф текстов, имеющих временные метки (а), и визуализация эмбеддингов узлов этого графа (б)
Граф текстов, имеющих временные метки (а), и визуализация эмбеддингов узлов этого графа (б). Значительно увеличена генерация.
Граф текстов, имеющих временные метки (а), и визуализация эмбеддингов узлов этого графа (б). Значительно увеличена генерация.

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

Комментарии (0)