В последнее время я занимался файнтюнингом Llama 3 на открытых датасетах, а сейчас планирую собрать собственный датасет для новых экспериментов. Встает вопрос, как оценивать эффективность обучения.
Для оценки моделей используются специальные наборы текстовых запросов, промптов, которые проверяют, например, насколько хорошо модель следует инструкциям. Для разных типов задач будут разные критерии оценки.
Например, есть GLUE (General Language Understanding Evaluation), оценка общего понимания естественного языка. Оценивает в том числе способность модели отвечать на вопросы, логическую связность и sentiment analysis - умение распознавать эмоциональную окраску. Это обширная область задач, и одного GLUE-бенчмарка явно мало, чтобы как следует оценить общее понимание моделью естественного языка, поэтому существуют другие тестовые наборы, например, SuperGLUE и MMLU (Massive Multitask Language Understanding). Последний бенчмарк оценивает, насколько хорошо в среднем модель понимает сложные вопросы из разных категорий - гуманитарной, социальной, STEM - то есть точные науки и естествознание.
Есть HellaSwag - это интересный бенчмарк, составленный из непростых вопросов, которые проверяют модель на здравый смысл, common sense. HellaSwag датасет содержит текстовое описание события, записанного на видео, и несколько вариантов завершения этого события, только один из которых правильный.
Большой интерес для оценки моделей представляет TruthfulQA -бечмарк, который позволяет понять, насколько модели можно доверять.
Исследователи, создавшие бенчмарк, предположили, что нейросеть врет, галлюцинирует и так далее, по двум причинам -
недостаток данных по некоторым предметам при обучении
неверная постановка целей при обучении - предсказание модели оптимизируется под ложные ответы. И эта вторая проблема не уходит с масштабированием модели и увеличением набора данных, а наоборот прогрессирует.
От этой проблемы трудно избавиться, и бенчмарк TruthfulQA призван выявить ложные ответы модели, даже если они звучат убедительно, имитируя правду.
Естественно, возникает вопрос, как именно авторы TruthfulQA определяют, что правда, а что нет.
Принцип такой: если ответ буквально описывает реальное явление без искажений, то это правда. Даже если утверждение не относится к теме вопроса. То есть модель может все время отвечать: "Курица - это птица" и у нее будет высокая оценка. Модель может просто говорить "я не знаю", это тоже не будет ложью.
Поэтому есть еще один критерий - информативность, по которому оценивают, насколько полезен ответ и относится ли он к теме вопроса. Интересно, что когда TruthfulQA впервые появился, в 2021 году, у модели GPT-3 только 58% ответов показали правду на этом бенчмарке, а правдивых и притом информативных ответов было только 21%, то есть примерно один ответ из пяти был реально полезен.
Есть другие бенчмарки для разных задач, например HumanEval и CodeXGLUE на задачи, связанные с программированием и пониманием кода. Есть API-Bank, который оценивает, насколько хорошо модель может интегрироваться с другими системами посредством API. Все это очень актуально для систем вроде того же GPT-4 Omni, которые используют веб-поиск, вызов функций, Retrieval Augmented Generation и так далее.
Но сегодня я хочу остановиться на одном бенчмарке и продемонстрировать evaluation на нем -MT-Bench (Multi-Turn Benchmark). Он тестирует поведение модели в разных ситуациях, которые могут возникнуть в диалоге. Набор промптов содержит разные категории запросов - гуманитарные, математические, кодинг и другие.
Меня особенно интересует мультиязычный MT-Bench. Чтобы оценить с его помощью свою модель, я склонировал код бенчмарка с Github:
git clone https://github.com/Peter-Devine/multilingual_mt_bench.git
Еvaluation скрипты находятся в папке multilingual_mt_bench/fastchat/llm_judge. Но сначала нужно сначала установить зависимости. Для этого склонируйте другой репозиторий -
git clone https://github.com/lm-sys/FastChat.git
cd FastChat
pip install -e ".[model_worker,llm_judge]"
Теперь можно приступить к оценке на MT-Bench. Первый скрипт из указанной выше папке скачивает веса модели, которую хотите оценить, и генерирует ответы на вопросы берчмарка. Например:
python gen_model_answer.py --model-path lightblue/suzume-llama-3-8B-multilingual \
--model-id suzume-llama-3-8B-multilingual
Здесь аргументом --model-path я передал путь к весам модели на Huggingface, а --model-id - это имя модели, под которым я сохраню файл с ее ответами на вопросы бенчмарка.
После завершения скрипта - на видеокарте A100 в облачном сервисе immers.cloud, модель с 8 миллиардами параметров справилась с бенчмарком за 23 минуты - файл с ответами сохранился в папку data/mt_bench/model_answer.
Важно отметить, что вопросы и ответы в файле - на английском. Но, как я уже сказал, это мультиязычная версия MT-Bench, и здесь можно сгенерировать отдельный файл ответов, например, на русском:
python gen_model_answer.py --model-path lightblue/suzume-llama-3-8B-multilingual \
--model-id suzume-llama-3-8B-multilingual \
--bench-name ru_mt_bench
Теперь нужно оценить, насколько хорошо справилась модель. Второй скрипт позволяет использовать сильную LLM, например GPT-4, в качестве судьи - она получит на вход пару вопрос-ответ из файла, сгенерированного на предыдущем шаге, и выставит оценку по 10-балльной шкале, а также напишет свой комментарий, объясняющий оценку.
export OPENAI_API_KEY=XXXXXX # экспортируйте свой ключ OPENAI_API_KEY
python gen_judgment.py --model-list suzume-llama-3-8B-multilingual \
--parallel 2
Аргументом --model-list передаете список имен моделей (через пробел), ответы которых хотите оценить. Для каждой модели должен быть сгенерирован файл ответов.
По умолчанию судьей будет GPT-4, но вы можете передать аргумент --judge-model, чтобы использовать в качестве судьи другую модель. Например, почему бы не последнюю GPT-4o?
Аргумент --parallel устанавливает число параллельных вызовов API.
Когда оценка закончится, появится файл в папке data/mt_bench/model_judgement. В нем вы можете найти оценки каждой пары с комментариями модели-судьи.
Теперь можете выполнить:
python show_result.py
Этот скрипт напечатает сравнительную таблицу для всех оцененных моделей, Со средней оценкой для каждой из них.