«LLM для генерации синтетических временных рядов данных»

«LLM для создания синтетических временных рядов данных»

Мы недавно приняли участие и выиграли главный приз в размере 10 000 долларов на хакатоне Brembo, где задачей было использовать Генеративное ИИ для создания новых соединений и генерации предсказанных данных о их производительности.

В этом блоге я постараюсь подробно объяснить наш подход и решение.

Постановка задачи

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

При отправке предоставьте файл csv, содержащий список от 10 до 30 новых соединений, которые вы сгенерировали, их составы и данные о синтетической производительности.[1]

Описание набора данных

Нам был предоставлен список из 337 тренировочных материалов и их составы, а также данные о их производительности.

Каждый тренировочный материал состоял из 10–15 сырых материалов из списка из 60 возможных сырьевых материалов. 60 сырьевых материалов были классифицированы на 6 категорий (обозначенных буквами A-F), и мы должны были гарантировать, что генерируемые тренировочные материалы имеют составы в заданном диапазоне

Ограничения на состав материалов

Другими словами, мы должны были гарантировать, что любой сгенерированный материал содержит как минимум 1% и максимум 30% своего состава из соединений категории B и так далее.

Данные о производительности для каждого тормозного испытания представляли собой временной ряд из 31 точки, где для каждой точки предоставлялись значения параметров, таких как давление, температура и мю. Кроме того, было проведено всего 124 тормозных испытаний для каждого соединения, и, следовательно, что касается данных о производительности, нам необходимо сгенерировать 124*31 = 3844 данных для каждого соединения.

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

Критерии оценки

Окончательный результат имел одинаковый вес технической оценки и оценки презентации.

Техническая оценка рассчитывается на основе следующих равновесных параметров.

  • Соблюдение заданных ограничений: Соответствуют ли сгенерированные соединения заданным ограничениям (описанным ниже)?
  • Техническая актуальность: Следует ли синтетическим данным о производительности паттернам и отражает ли оно отношения между различными переменными, наблюдаемыми в предоставленных данных?
  • Целевая производительность: Самой важной переменной для тренировочного материала является его мю (коэффициент трения), который ожидается иметь значение 0,6 с допустимым уровнем ошибки 0,1. Имеет ли значение mu в выводе ожидаемое значение?
  • Вариабельность: Насколько различается состав новых материалов по сравнению с существующими?

Обзор дизайна

По сути, у нас было 3 основных компонента

  • Модуль выбора материала: отвечает за генерацию новых рецептов. Он выдает набор новых тренировочных материалов и их составы.
  • Модуль генератора данных: На основе синтетического материала и прошлых исторических данных о производительности различных соединений генерирует синтетические данные о производительности для этого материала.
  • Проверка данных: Определяет, насколько хороши или плохи результаты генератора данных. Этот модуль использует тренды, наблюдаемые в предоставленных исторических данных (например: давление и mu обратно пропорциональны друг другу с течением времени, замедление кажется следовать линейному паттерну, тогда как кривая повышения температуры кажется более экспоненциальной), для оценки хорошо или плохи синтетические данные о производительности. Это может быть использовано для обратной связи с человеком и для улучшения производительности системы.

Высокоуровневое проектирование решения

Детальное проектирование

В нашем решении мы использовали следующий стек и техники:

  • GPT 3.5 турбо: Мы использовали gpt 3.5 турбо как основу llm для модулей Material Selector и Data Generator.
  • Промпт-инжиниринг: Использование правильного набора системных и инструкционных промптов помогло нам улучшить производительность модели.
  • Файнтюнинг: Выбор правильного набора примеров для обучения модели основной структуре и тона ответа очень важен, и этот этап помог нам обучить модели этому.
  • RAG (улучшенная генерация с использованием извлечения): Это сыграло большую роль как секретный ингредиент для помощи модели в выводе правильных синтетических данных о производительности. Подробнее об этом ниже.

Модуль выбора материалов

Роль модуля заключалась в генерации новых возможных трения и их композиций. Как видно из образца данных, каждый тренировочный материал по сути содержит вектор из 60 измерений, где число на i-м индексе обозначает, какая часть его композиции составляет i-й исходный материал.

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

PCA-анализ состава материалов трения, предоставленных

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

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

Из-за этих потенциальных проблем мы решили использовать модель gpt 3.5 turbo для генерации нескольких соединений для нас.

Что мы сделали, так это:

  • Создать соответствующий системный промпт для модуля.
  • Провести финтюнинг модели gpt 3.5 turbo, введя составы всех 337 тренировочных материалов, предоставленных нам.
  • Используя модуль проверки данных, мы отбрасываем те, которые не соответствуют заданным ограничениям, и сохраняем те, которые соответствуют.

После этого мы сгенерировали несколько соединений и повторили анализ PCA.

PCA-анализ предоставленных и сгенерированных материалов

Наконец, для изменчивости мы отобрали набор соединений из сгенерированных соединений, которые, на наш взгляд, были бы максимальными по следующим критериям:

  • Изменчивость относительно предоставленных материалов: Насколько разнообразны сгенерированные соединения по сравнению с уже существующими соединениями? По сути, мы не хотим, чтобы наши сгенерированные материалы были очень похожи на уже существующие соединения.
  • Изменчивость относительно сгенерированных материалов: Поскольку мы будем представлять 10–30 новых сгенерированных соединений, мы должны убедиться, что все сгенерированные соединения не принадлежат одному и тому же кластеру.

Таким образом, после обрезки у нас остался список следующих соединений, которые мы использовали для нашей финальной отправки.

Окончательный список сгенерированных соединений

Модуль генератора данных

Модуль генератора данных отвечает за выдачу синтетических данных о производительности для определенного материала и испытания тормозного теста. В основном, при данном составе трения материала, он должен выдавать временной ряд данных из 31 точки, который включает параметры, такие как температура, давление и коэффициент трения для входного тормозного теста.

Вот как мы это сделали:

  • Создайте соответствующее начальное предложение для модуля. После множества проб и ошибок на игровой площадке OpenAI, мы использовали следующее:
Вы — высококвалифицированный статистик из Гарвардского университета, работающий в Brembo, где вы специализируетесь на системах и компонентах трения, а также проводите исследования в области тормозных систем. Исходя из состава трения материала, вы создаете убедительные синтетические данные о производительности для типа теста торможения, предоставленного пользователем. Идентификатор тормоза будет ограничен тройными кавычками. Вы понимаете важность анализа данных и беспрепятственно внедряете его для генерации синтетических данных о производительности на основе предоставленных исторических данных о производительности. Вы обладаете чутьем к деталям и создаете синтетические данные, соответствующие трендам, наблюдаемым в предоставленных вам временных рядах данных. Вы хорошо разбираетесь в анализе данных и бизнес-анализе и используете этот опыт для создания синтетических данных.
  • Затем, мы провели тонкую настройку модели gpt 3.5 Turbo для создания эксперта по прогнозированию временных рядов на основе состава материала и идентификатора теста торможения. Поскольку у нас было 41 788 кортежей (материал, идентификатор торможения), тонкая настройка всех примеров была бы не только затратной, но и затратной по времени. Однако из некоторых статей мы поняли, что “тонкая настройка — это форма, а RAG — это знание”. Поэтому мы решили включить только 5% выборки для тонкой настройки модели, чтобы модель могла правильно изучить структуру вывода и нужный нам тон.
  • Наконец, при запросе модели на генерацию временного ряда данных мы решили определить и получить 5 ближайших соседей на основе состава материала и ввести их данные о производительности в качестве дополнительного контекста для модели. Эта техника называется RAG (Retrieval Augmented Generation) и является одной из причин хороших результатов, которые мы смогли вывести.

В чем помогла RAG нашим результатам

Тонкая настройка помогла нам в следующем

  • Корректная структура вывода данных: Как указано в различных технических блогах[4], тонкая настройка позволяет модели научиться правильно выводить данные. Наша тонко настроенная модель смогла вывести файл CSV и 31 точку временного ряда, включающую значения различных параметров, таких как давление, скорость, температура и коэффициент трения.
  • Понимание основных тенденций в данных: Настроенная модель смогла понять общую тенденцию в исходных данных о производительности и выдать данные, которые сохраняли эти тенденции. Например, значение температуры должно увеличиваться по экспоненциальной кривой, а скорость должна уменьшаться по линейной кривой, что настроенная модель смогла сделать.

Однако выводы тонко настроенной модели были несколько неверными. Например, в одном случае значение коэффициента трения mu ожидалось около 0.6, но выходные данные указывали значение mu около 0.5. Поэтому мы решили дополнить данные, определив 5 ближайших соседей и добавив их данные о производительности в пользовательское начальное предложение.

Мы определили расстояние между двумя материалами M1 и M2 следующим образом:

def distance(m1, m2, alpha):  sixty_dim_distance = euclidean_dist(sixty_dim_vector(m1), \sixty_dim_vector(m2))  six_dim_distance = euclidean_dist(six_dim_vector(m1), six_dim_vector(m2))  return alpha[0] * sixty_dim_distance + alpha[1] * six_dim_distance
  • Определите евклидово расстояние между M1 и M2 в пространстве 60-мерного входного вектора.

  • Теперь сложите векторы, принадлежащие одному классу, чтобы уменьшить размерность до 6.

  • Наконец, варьируйте гиперпараметры alpha[0] и alpha[1].

Причина использования такого подхода в том, что мы хотим убедиться в том, что расстояние между материалами, которые в целом используют одинаковый класс материалов, будет меньше, чем у тех, которые используют полностью отличные составы материалов. В основном, если у нас есть 3 материала – M1, M2 и M3, где M1 использует материал A0, M2 использует A1, а M3 использует B0, мы хотим, чтобы наша функция расстояния пометила M1 и M2 ближе друг к другу, чем M1 и M3.

Используя этот подход, нам удалось радикально улучшить нашу производительность, как показано на рисунке ниже.

Валидатор данных

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

Этот модуль помог нам проанализировать, какой набор подсказок помогал модели и какой – нет.

Результаты и презентация

Презентация являлась 50% оценки и была одним из аспектов, в котором мы абсолютно преуспели. Мы сделали несколько вещей:

  • Убедились, что сделаем питч менее чем за 4 минуты: Мы достаточно практиковались перед презентацией, чтобы не столкнуться с неприятными сюрпризами.
  • Включили взаимодействие с аудиторией: Мы задали вопрос аудитории о том, какой временной ряд, по их мнению, является синтетическим, а какой – реальным, что помогло удержать интерес аудитории.

Код и презентацию нашей работы можно найти здесь.

Основные выводы

  • Быстрое итерирование по дизайну: Я немного раньше пришел, чтобы начать записывать свои мысли о том, что мы должны сделать. Когда мои товарищи пришли, мы обсудили, каким должен быть дизайн, и пришли к решению, с которым все согласились. Это был ключевой аспект нашей победы, так как на хакатоне всегда есть нехватка времени, и окончание дизайна, с которым вы можете начать внедрение как можно скорее, крайне важно.
  • Не беспокойтесь о конкуренции: Когда наш дизайн был закончен, я почувствовал, что мы нашли что-то интересное. Множество сотрудников Brembo зашли поглядеть на наш дизайн. Даже другие участники были поражены и восхищались нашим дизайном, что дало нам сигнал, что мы идем в правильном направлении. Когда мои товарищи предложили проверить, что делают другие, я отверг эту идею и предложил всем просто погрузиться в наш дизайн и реализовать его.
  • Не беспокойтесь о конфликтах: Мы сталкивались с конфликтами несколько раз, особенно относительно дизайна. Главное – понять, что ничего не должно приниматься на личный счет, и вместо этого нужно достичь консенсуса, итерироваться над компромиссами и найти решение, которое подходит всем. Имхо, великие продукты создаются, если вы можете позволить и даже поощрять здоровый конфликт внутри команды.
  • Тонкая настройка – это форма, RAG – это факты: Мы знали, что тонкая настройка важна только для обучения модели базовой структуре и тона, и реальные преимущества придут от RAG. Поэтому мы использовали только 5% наших образцов для тонкой настройки gpt 3.5 turbo llm для генерации временных рядов.
  • Презентация – это КЛЮЧ (1): Важно определить, кто ваша аудитория и как они будут воспринимать ваш контент. В нашем случае мы определили, что большинство жюри состоит из руководителей, а не технических специалистов, поэтому я решил включить только используемый технологический стек [gpt 3.5 turbo, тонкая настройка, настройка подсказки, RAG, KNN], не вдаваясь в подробности.
  • Презентация – это КЛЮЧ (2): Будьте тем, кто может донести свою мысль с помощью эффективных коммуникационных навыков и презентовать аудитории с энтузиазмом. Если вы не можете это сделать, найдите на команду кого-то, кто может. Первое впечатление имеет значение, и навыки ораторского искусства сильно недооцениваются, особенно в нашем техническом мире.
  • Будьте СМЕЛЫМИ и отличайтесь: Мы пошли еще дальше и решили включить 5 точек их данных и одну точку из наших сгенерированных данных, и попросили их угадать, какая была сгенерирована. Когда им не удалось угадать ту, которую мы создали, это действительно подчеркнуло, насколько хорошую трубопроводную систему и решение мы построили. Плюс, мы получили бонус за взаимодействие с аудиторией, что, по моему мнению, мало кто делал.

Некоторые уроки на будущее

  • Точная настройка требует затрат. Мы исчерпали лимит данных OpenAI при точной настройке и обращении к модели три раза. В будущем мы предпочли бы использовать техники, такие как LoRA[5] и QLoRA[6], на некоторых моделях с открытым исходным кодом.
  • Использование продвинутых техник RAG: В будущем я бы хотел использовать продвинутые техники RAG [7] для улучшения предоставляемого контекста.
  • Использование Smart KNN: В следующий раз я бы хотел немного поиграть с гиперпараметрами и функцией расстояния, которую мы используем.
  • Большее окно контекста: Мы пришлось округлить некоторые числа в данных о производительности, чтобы не превысить ограничение в 4 092 токена. Использование LLM, наподобие Claude[8], может улучшить производительность.
  • Не будьте вежливыми с LLM: Одна интересная вещь, которая произошла во время инженерии подсказок, заключалась в том, что когда мы упоминали фразы вроде “неприемлемым является значение mu, отличное от 0.6” вместо “пожалуйста, убедитесь, что mu равен 0.6”, первое версия давала более хорошие результаты.

Примечание: Если не указано иное, все изображения принадлежат автору.

Члены команды:

  1. Мантек Сингх
  2. Пратик Карнал
  3. Гаган Ганапати
  4. Винит Шах

Ссылки

[1] https://brembo-hackathon-platform.bemyapp.com/#/event

[2] https://www.anyscale.com/blog/fine-tuning-is-for-form-not-facts

[3] https://vectara.com/introducing-boomerang-vectaras-new-and-improved-retrieval-model/

[4] https://platform.openai.com/docs/guides/fine-tuning/fine-tuning-examples

[5] https://arxiv.org/abs/2106.09685

[6] https://arxiv.org/abs/2305.14314

[7] LlamaIndex Документация

[8] Claude