С тех пор как вышла 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 наборах, так что правка промпта остаётся единственной разницей.
Советы
На 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 примеров
Для 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.
Без примеров на 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 она была просто нейтральной.