Как настроить GPT-J с небольшим набором данных

Вопрос или проблема

Во-первых, большое спасибо за то, что вы посмотрели этот пост. Мне действительно нужна помощь.

Я следовал этому руководству настолько близко, насколько это возможно: https://github.com/kingoflolz/mesh-transformer-jax

Я пытаюсь дообучить GPT-J на небольшом наборе данных из ~500 строк:

Вы важны для меня. <|endoftext|>
Мне нравится проводить с вами время. <|endoftext|>
Вы заставляете меня улыбаться. <|endoftext|>
Мне так повезло быть вашим другом. <|endoftext|>
Вы всегда можете поговорить со мной, даже если это о чем-то, что заставляет вас нервничать, бояться или грустить. <|endoftext|>
и т.д...

Используя скрипт create_finetune_tfrecords.py (из вышеупомянутого репозитория), получается файл с 2 в нем. Я понимаю, что это означает, что мои данные содержат 2 последовательности.

Мне действительно нужен совет по файлу конфигурации .json. Какие постоянные значения вы рекомендуете для этого небольшого набора данных?
Лучшее, что я смог придумать, стараясь следовать руководству:

{
  "layers": 28,
  "d_model": 4096,
  "n_heads": 16,
  "n_vocab": 50400,
  "norm": "layernorm",
  "pe": "rotary",
  "pe_rotary_dims": 64,

  "seq": 2048,
  "cores_per_replica": 8,
  "per_replica_batch": 1,
  "gradient_accumulation_steps": 2,

  "warmup_steps": 1,
  "anneal_steps": 9,
  "lr": 1.2e-4,
  "end_lr": 1.2e-5,
  "weight_decay": 0.1,
  "total_steps": 10,

  "tpu_size": 8,

  "bucket": "chat-app-tpu-bucket-europe",
  "model_dir": "finetune_dir",

  "train_set": "james_bond_1.train.index",
  "val_set": {},

  "eval_harness_tasks": [
  ],

  "val_batches": 2,
  "val_every": 400000,
  "ckpt_every": 1,
  "keep_every": 1,

  "name": "GPT3_6B_pile_rotary",
  "wandb_project": "mesh-transformer-jax",
  "comment": ""
}

Проблема в том, что… Когда я тестирую дообученную модель, я получаю ответы, которые не имеют смысла:
Скриншот

С нетерпением жду вашего ответа! 🙂

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

На данный момент кажется, что ваши данные разделены на две или более строки по 2048 токенов каждая. Это может быть проблемой, потому что если количество эпох = 1, модель обновится только дважды с заданной скорость обучения, что означает, что она не учится много. Если вы используете размер пакета = 8, то у модели просто нет достаточно данных для пакета, поскольку в наборе данных всего лишь 2 или более строки.

Ваш сгенерированный текст выглядит странно также из-за ваших стратегий генерации. (посмотрите это: https://huggingface.co/blog/how-to-generate)

Я лично предпочитаю технику выборки для генерации.

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

Ответ или решение

Финетюнинг модели GPT-J с небольшой выборкой данных — это задача, требующая внимательной настройки гиперпараметров и правильной обработки данных. Рассмотрим несколько важных аспектов, которые помогут вам улучшить качество генерации текста.

1. Подбор гиперпараметров

Ваши текущие настройки конфигурации могут быть слишком высокими для небольшой выборки из 500 строк. Вот несколько рекомендаций:

  • layers (слои): С уменьшением объема данных можно использовать меньшее количество слоев. Попробуйте 12 или 16 вместо 28.

  • d_model (размер модели): Уменьшите до 2048 или 1024. Это поможет избежать переобучения и ускорит обучение.

  • n_heads (количество голов): Уменьшите до 8 или 4, что соответствует уменьшенному размеру модели.

  • seq (длина последовательности): Вы можете снизить длину последовательности до 512 или 1024. Это позволит модели быстрее обучаться на ваших данных.

  • per_replica_batch (размер батча): Установите на 1, так как у вас всего 2 последовательности.

  • total_steps (общее количество шагов): Увеличьте до 100 или 200, чтобы модель могла провести больше обновлений на доступных данных.

  • warmup_steps (шаги разогрева): Установите на 10, чтобы избежать резких изменений в обучении.

2. Подготовка данных

Проверьте, правильно ли вы подготавливаете данные. Ваши строки должны быть корректно токенизированы. Убедитесь, что вы используете тот же токенизатор как для обучения, так и для тестирования. Ошибки в токенизации могут привести к неадекватным результатам.

3. Выбор стратегии генерации

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

  • temperature: Установите на 0.7 для большей креативности.
  • top_k и top_p: Экспериментируйте с этими параметрами для управления случайностью.

4. Распределение данных

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

5. Тестирование и итерация

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

Следуя этим рекомендациям и экспериментируя с различными параметрами, вы сможете значительно улучшить качество генерации текста вашей модели GPT-J на небольшом наборе данных. Удачи в ваших экспериментах!

Оцените материал
Добавить комментарий

Капча загружается...