dimhold.by
← Статьи

Я попросил GPT-2 расписать решение, а она поверила своей неверной арифметике

В январе Джейсон Вэй с коллегами из Google выпустили статью про chain of thought, цепочку рассуждений в промпте. На этой неделе вышла вторая версия. Модели дают 8 примеров задач, но в каждом перед ответом словами расписано решение: “There are 15 trees originally. Then there were 21 trees after some more were planted. So there must have been 21 - 15 = 6.” На GSM8K, наборе школьных текстовых задач по математике от OpenAI, это поднимает PaLM 540B с 17,9% до 56,5%.

В статье есть одна фраза, которую я прочитал и пропустил. Модели меньше примерно 100B параметров “produced fluent but illogical chains of thought, leading to lower performance than standard prompting”, то есть писали гладкие, но нелогичные цепочки и проигрывали обычному промпту. Мне казалось само собой разумеющимся, что расписанные шаги помогают, ведь людям они помогают. Оговорка про малые модели казалась мелочью. Но самая большая модель, которую я могу запустить дома, примерно в 130 раз меньше этой границы. Для меня важна именно эта фраза. Я хотел посмотреть, как выглядит гладкая, но нелогичная цепочка и что она делает с ответом.

Стенд

Видеокарты на этой машине нет, есть 4 ядра AMD EPYC 7713 в виртуалке и потолок памяти 5 ГиБ. Я взял GPT-2 в 3 размерах: small на 124M параметров, medium на 355M и large на 774M. Всё работает на Python 3.9, torch 1.11 и transformers 4.18, в float32 с жадным декодированием.

Четвёртой я хотел взять модель на 1,3B от EleutherAI. В float32 одни её веса занимают 5,3 ГБ, а torch 1.11 держит в памяти файл весов и модель одновременно, так что она не помещается. В bfloat16 помещается, но у этого процессора нет аппаратной поддержки bfloat16 и генерация 40 токенов не уложилась в 4 минуты. С такой скоростью один проход по 500 задачам занял бы дни, поэтому самой большой осталась GPT-2 large.

Промпт это 8 примеров из статьи слово в слово. В обычном режиме каждый пример заканчивается на “The answer is N.” и больше ничего. В режиме цепочки перед этим идёт расписанное решение. Вопросы:

  • 200 задач из тестовой части GSM8K, выбраны с seed 2022;
  • 300 задач, которые я сгенерировал сам, по 100 в 1, 2 и 3 действия со сложением и вычитанием небольших чисел. Например: “Sam has 9 pencils. He loses 5 pencils. How many pencils does Sam have now?”

GSM8K для этих моделей всё равно слишком сложен, поэтому мне нужны были задачи, где одно действие тривиально. Весь прогон занял около 3 часов 15 минут. Большая часть ушла на режим цепочки. GPT-2 small часто зацикливается (“So he has 16 glasses. So he has 16 glasses.”), пока не упрётся в мой лимит в 160 новых токенов. GPT-2 small упёрлась в лимит на 215 задачах из 500.

Цепочка не помогает

верных ответов из 500, GPT-2 обычный: "The answer is N." цепочка: решение, потом ответ small, 124M 16 4 medium, 355M 12 11 large, 774M 19 10
200 задач GSM8K и 300 сгенерированных задач в 1-3 действия. С цепочкой верных ответов меньше у всех 3 размеров. Только у small разница держится на парных ответах.

Из 500 задач в обычном режиме small, medium и large ответили верно 16, 12 и 19 раз. В режиме цепочки 4, 11 и 10 раз. У small разница держится на парных ответах (15 задач верны только в обычном режиме, 3 только с цепочкой, McNemar p = 0,0075). У medium и large не держится. Значит, со статьёй я согласен: на таком размере цепочка не помогает, а самой маленькой модели вредит. Но оба режима дают верный ответ лишь в нескольких процентах случаев. Medium в обычном режиме на всех 100 задачах в 1 действие ответила числом, скопированным из вопроса. Ни одной она не решила.

Как выглядят цепочки

Вот настоящий ответ GPT-2 large на задачу про карандаши из примера выше:

Sam started with 9 pencils. After losing 5 pencils, he had 9 - 5 = 6. After losing 2 more, he had 6 - 2 = 4. The answer is 4.

Я нашёл его, когда просматривал верные ответы и ожидал увидеть там хорошие цепочки. Ответ верный. Но 9 - 5 это не 6, а второй потери в задаче нет вообще. “After losing 2 more” взялось из примера про мячи для гольфа в промпте, где Майкл в среду теряет ещё 2 мяча. Так 2 неверных шага гасят друг друга и число выходит верным.

GPT-2 large, режим цепочки, одна задача Sam has 9 pencils. He loses 5 pencils. How many pencils does Sam have now? Sam started with 9 pencils. After losing 5 pencils, he had 9 - 5 = 6. неверно: 9 - 5 это 4 After losing 2 more, в задаче этого нет: из примера про мячи he had 6 - 2 = 4. верно The answer is 4. верный ответ, случайно
2 неверных шага дают верный ответ. Фраза "2 more" скопирована из одного из 8 примеров в промпте.

Я посчитал все равенства вида a - b = c, которые написали модели. У small верны 7 из 292, у medium 68 из 1078, у large 80 из 550. В задачах в 1 действие large записала верное выражение, например 9 - 5, в 28 случаях из 100. В 26 из них результат после него неверный. Фраза “2 more” встречается в 19 из 100 ответов large и в 22 у medium, каждый раз в вопросе, где её нет. В тех 2 случаях, где large вычла верно, этот выдуманный шаг потом испортил ответ.

Потом я посмотрел на верные ответы в режиме цепочки. Их 25 на 3 модели. Только в 1 есть верный шаг для своей задачи: medium пишет 20 - 5 = 15 и сразу после него 20 - 15 = 15. В 7 нет ни одного равенства, а ответ это число, повторённое из вопроса или из петли. Остальные приходят к ответу через неверные шаги, как с карандашами. Однажды large пишет 9 - 3 = 6 и потом 6 + 6 = 12. Оба равенства верны, но в той задаче Сэм находит ещё 3 печенья, так что ни один шаг к ней не относится.

Где я ошибся в ожидании

Перед прогоном я записал, что итоговый ответ совпадёт с последним числом цепочки меньше чем в половине случаев. Я думал, что малая модель пишет какую-то цепочку, а потом отвечает что-то не связанное с ней. Тогда цепочка просто украшение.

Вышло наоборот. В режиме цепочки ответ равен правой части последнего равенства, которое написала модель. У small это 188 из 189 ответов, где есть хотя бы 1 равенство, у medium 393 из 414 и у large 360 из 362. Если вычислить это последнее выражение самому и сравнить, ответ совпадает с вычисленным значением всего 6, 42 и 57 раз.

режим цепочки, % случаев равенства с верным результатом ответ = последнее число цепочки small, 124M 2.4% 99.5% medium, 355M 6.3% 94.9% large, 774M 14.5% 99.4%
Модели ошибаются почти в каждом равенстве и почти всегда переносят неверный результат в ответ.

Так что “нелогичная” значит не то, что я думал. Ответ очень точно следует цепочке, поэтому неверное 9 - 5 = 6 попадает прямо в ответ. Цепочка ещё и отнимает время. На этом процессоре режим цепочки был в 3,6 раза медленнее обычного у large, просто потому что модель пишет больше токенов. У small в 8,6 раза, причём петли заняли 1418 из 1899 секунд.

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

  • Модели больше 774M. GPT-J 6B в float32 занимает 24 ГБ и сюда не помещается, так что о моделях от 100B из статьи я могу только читать.
  • Сэмплирование нескольких цепочек и голосование. Ван с коллегами в марте показали, что это сильно помогает большим моделям. С жадным декодированием у меня одна цепочка на задачу.
  • Другие примеры в промпте. Утечка “2 more” намекает, что модель, вероятно, копирует форму примеров, так что другие примеры дали бы другие ошибки. Насколько, я не проверял.
  • Калькулятор. В статье он уже есть: исправляет равенства после генерации. У LaMDA 137B на GSM8K точность в режиме цепочки растёт с 14,8% до 19,5%. Мои модели так точно следуют последнему записанному числу, что я ожидал бы небольшой пользы, но неверное действие или шаг “2 more” калькулятор не исправит. Я его не запускал.

Каждое число здесь из 1 жадного прогона, так что тексты повторяются точно (время замеров нет). Но несколько процентов верных из 500 это слишком мало для вывода тоньше, чем “не помогает”. Для моделей, которые я могу запустить, я оставлю обычный формат ответа. Мне интересно, что сделает модель на 6B с теми же 8 примерами, если я найду для неё машину.