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 прыкладамі, калі я знайду для яе машыну.