У студзені Джэйсан Вэй з калегамі з 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 задач у звычайным рэжыме 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 had6 - 2 = 4. The answer is 4.
Я знайшоў яго, калі праглядаў правільныя адказы і чакаў убачыць там добрыя ланцужкі. Адказ правільны. Але 9 - 5 не 6, а другой страты ў задачы няма зусім. “After losing 2 more” прыйшло з прыкладу пра мячы для гольфа ў промпце, дзе Майкл у сераду губляе яшчэ 2 мячы. Так 2 няправільныя крокі гасяць адзін аднаго і лік выходзіць правільным.
Я палічыў усе роўнасці выгляду 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 разоў.
Так што “нелагічны” значыць не тое, што я думаў. Адказ вельмі дакладна ідзе за ланцужком, таму няправільнае 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 прыкладамі, калі я знайду для яе машыну.