dimhold.by
← Статьи

Я проверил советы по промптам на GPT-2 и порядок примеров оказался важнее их всех

С тех пор как вышла GPT-3, советов о том, как писать промпт, становится всё больше. Будь вежлив. Скажи модели, что она эксперт. Напиши IMPORTANT заглавными и попроси думать внимательно. Поставь наверх чёткую инструкцию. Большая часть этих советов идёт от человека, который один раз попробовал через API и у него сработало. Второго прогона за этим нет.

Я читал эти советы и раскладывал их в голове, ничего не измеряя. Вежливость и “you are an expert” я записал в суеверия. Чёткую инструкцию записал в ремесло, единственную часть промпта, которая хотя бы не навредит. Запустить GPT-3 дома я не могу. Но тот же приём с несколькими примерами в промпте работает и на GPT-2, поэтому я проверил обе группы советов на одной задаче и посчитал.

Стенд

Задача SST-2 из GLUE: 872 коротких отзыва о фильмах из dev-части, 444 из них положительные. Модель, которая на всё отвечает “positive”, получает 50,9%.

Промпт начинается с инструкции: “Classify the sentiment of each movie review as positive or negative.” Дальше идут 4 примера из обучающей части, 2 положительных и 2 отрицательных, в виде Review: ... и Sentiment: positive. Потом отзыв, который надо классифицировать. Модель ничего не генерирует. Я сравниваю, какое следующее слово вероятнее, ” positive” или ” negative”, поэтому один и тот же промпт всегда даёт одно и то же число.

Модели GPT-2 medium (355M параметров) и GPT-2 large (774M) в float32, на 4 ядрах AMD EPYC 7713 в виртуалке. Способ подсчёта даёт те же предсказания и на torch 1.11 с transformers 4.17. Для medium я прогнал 217 промптов, для large 99 из них.

Я выбрал 10 наборов по 4 примера с фиксированным seed. Каждый вариант идёт на тех же 10 наборах, так что правка промпта остаётся единственной разницей.

Советы

GPT-2 medium, точность на 872 отзывах, % 1 точка = 1 набор из 4 примеров среднее по 10 наборам 50 60 70 80 90 без инструкции обычная please ... thank you you are an expert IMPORTANT, think carefully переведи на французский комедия или драма
Во всех рядах те же 10 наборов примеров. Внутри ряда точки расходятся на 29-36 пунктов, средние между рядами отличаются не больше чем на 9,5. У обычной инструкции среднее самое низкое.

На medium обычная инструкция даёт в среднем 59,3% по 10 наборам. “Please … Thank you!” даёт 62,8%, “You are an expert film critic.” 60,7%, IMPORTANT с “Think carefully and be accurate.” 60,3%. Вежливая лучше обычной на 5 наборах и хуже на 4, это как подбросить монетку. Вариант с заглавными лучше на 7 и хуже на 2, но 10 наборов слишком мало, чтобы в этом быть уверенным.

Но посмотрите на ряды рисунка, а не на средние. При обычной инструкции один только набор примеров двигает результат от 48,9% до 82,1%. Это 33 пункта от выбора 4 отзывов. Слова, о которых я готов был спорить, сдвинули среднее на 1-4 пункта.

Где я ошибся

В инструкцию я как раз верил, поэтому прогнал промпт и без неё. Без инструкции medium получает 68,8%, на 9,5 пункта больше, лучше на 8 наборах из 10 и хуже на 1. Потом я попробовал 2 неправильные инструкции. “Translate each sentence into French.” даёт 65,5%, а “Classify each movie review by whether it is about a comedy or a drama.” 64,5%, тоже больше, чем правильная.

Без примеров то же самое. Голый Review: ... Sentiment: даёт 73,2%, с обычной инструкцией сверху 60,8%, с вежливой 53,9%. С “please” модель отвечает positive на 97% отзывов.

Я какое-то время искал ошибку. Проверил, что инструкция действительно попадает в промпт и что каждое из двух слов-меток занимает ровно 1 токен. Закешированный префикс тоже дал те же токены, что и полный текст. Всё было в порядке. Почему эта инструкция вредит medium, я не знаю.

Порядок тех же 4 примеров

GPT-2 medium, те же 4 примера в 24 порядках, 3 набора метки в порядке + - + - любой другой порядок 0 25 50 75 100 50 60 70 80 90 ответ "positive", % отзывов точность, % всё "positive": 50,9 все 12 порядков + - + -
Точность высокая только там, где модель делит ответы примерно поровну. Все 12 порядков, где метки чередуются, начиная с положительной, оказались в одном углу.

Для 3 наборов я прогнал все 24 порядка тех же 4 примеров, не меняя ни слова. На наборе 0 точность идёт от 50,9% до 78,3%, на наборе 1 от 50,2% до 84,5%, на наборе 2 от 50,1% до 82,1%. Чжао с коллегами показали это на GPT-3 в прошлом году. Лу с коллегами сделали это на GPT-2 ровно по такой схеме, SST-2 и все 24 порядка 4 примеров, так что это не новость. Но я не ожидал, что этот эффект окажется сильнее всего остального в моей сетке.

Плохие порядки не случайны. На 3 наборах есть 12 порядков с метками + - + -. Во всех модель отвечает “positive” на 99,2% отзывов и больше, а точность 50,9-51,5%. Похоже, модель продолжает последовательность меток вместо того, чтобы читать отзыв. Зеркальный порядок - + - + не такой чистый, там доля положительных ответов от 1,0% до 51,5%.

GPT-2 large

На large моя история про инструкцию развалилась. С 4 примерами формулировка почти не важна. Вежливая на 1,3 пункта выше обычной, без инструкции на 0,6 ниже. Обе неправильные инструкции теперь немного хуже обычной, французская на 2,4 пункта и ниже на 8 наборах из 10. Так что предыдущий раздел относится только к medium. Набор примеров всё так же двигает обычный промпт от 53,6% до 87,6%.

На large я успел прогнать только 24 порядка набора 0. Они идут от 51,6% до 88,3%, но модель здесь ломается на другом порядке. + - + - здесь работает нормально, 75,0-88,3%. Large ломается, когда у 2 последних примеров одна метка. После + + - - модель отвечает positive лишь на 2,5-5,2% отзывов, после - - + + на 87,4-96,7%. Чжао с коллегами называют это recency bias: модель тянется к метке, которую видела последней. Это объяснение подходит только к large: у medium порядок + - + - заканчивается отрицательным примером, а модель всё равно говорит positive.

GPT-2 large, набор 0, 24 порядка по меткам примеров точность, % ответ "positive", % 50 70 90 0 50 100 + - + - - + - + - + + - + - - + - - + + + + - -
Когда у 2 последних примеров одна метка, large ставит её большинству отзывов. Чередование с положительной метки, которое ломало medium, здесь работает нормально.

Без примеров на large формулировка важна очень сильно. Голый промпт получает 86,4%, вежливый 84,1%, заглавные 78,7%, обычный 71,9%, эксперт 68,6%. На medium вежливый был на 6,9 пункта хуже обычного. На large он на 12,2 пункта лучше. Но каждое число без примеров это 1 промпт, за которым нет наборов. Я не могу сказать, сколько из этих 18 пунктов дала формулировка, а сколько именно эта фраза. Этот голый промпт с 86,4% к тому же выше любого варианта с 4 примерами на large, где лучшее среднее 65,8%.

Что ещё двигало число

Слова-метки важнее вежливых слов. С “good” и “bad” medium получает 68,4%, с “A” и “B” 49,0%, хуже, чем если на всё отвечать positive.

Калибровка немного помогает medium и сильнее large. Чжао с коллегами спрашивают модель о пустом входе вроде “N/A” и делят вероятности ответов на то, что она говорит там. С обычной инструкцией это сдвигает medium с 59,3% до 62,0%, а large с 64,5% до 72,0%, лучше на 7 наборах из 10 у обеих. На промпте medium без примеров выходит наоборот, с 60,8% до 55,4%. После поправки модель говорит positive лишь на 7,7% отзывов.

Случайные метки в примерах стоят medium 4,2 пункта. Это близко к тому, что Мин с коллегами в прошлом месяце сообщили для моделей побольше. Перевёрнутые метки стоят 6,7 пункта, но переворачивать ответы medium по ним не учится. Она просто чаще говорит positive, в 89% случаев.

Чего я не проверял

  • Саму GPT-3. Большие модели вполне могут читать инструкцию лучше.
  • Другие задачи. Тональность отзывов о фильмах это самый простой случай. На задаче, где модели нужна инструкция, чтобы понять, что делать, её удаление скорее всего навредит.
  • Больше наборов. 10 наборов показывают разброс в 33 пункта, но разница в 3 пункта между формулировками остаётся в пределах шума. Вежливая могла бы на деле быть на 2 пункта лучше и я бы этого не увидел.

Для маленьких моделей я теперь сначала попробую несколько порядков примеров и только потом буду трогать формулировку. И инструкцию я больше не считаю безопасной частью, хотя на large она была просто нейтральной.