Nowe podejście do generowania kodu dzięki uczeniu przez wzmacnianie
Postęp w modelach generowania kodu
Modele generowania kodu osiągnęły ogromny postęp dzięki wzrostowi mocy obliczeniowej oraz poprawie jakości danych treningowych. Obecnie najbardziej zaawansowane modele, takie jak Code Llama, Qwen2.5-Coder czy DeepSeek-Coder, wykazują wyjątkowe zdolności w wielu zadaniach programistycznych. Proces ich szkolenia obejmuje dwa etapy: wstępne uczenie (pre-training) oraz dostosowanie nadzorowane (SFT – Supervised Fine-Tuning), wykorzystujące ogromne ilości kodu dostępnego w Internecie.
Mimo tych postępów, zastosowanie uczenia przez wzmacnianie (RL – Reinforcement Learning) w generowaniu kodu jest wciąż rzadko spotykane. W przeciwieństwie do innych dziedzin, takich jak rozumowanie matematyczne, RL nie znalazło jeszcze szerokiego zastosowania w programowaniu. Główne przeszkody to:
– Trudność w określeniu wiarygodnych sygnałów nagrody – generowanie kodu wymaga precyzyjnych ocen poprawności, co jest skomplikowane.
– Brak dużych, kompleksowych zbiorów danych z poprawnymi przypadkami testowymi – modele często generują testy, które mogą zawierać błędy lub nie być w pełni wiarygodne.
Sposoby radzenia sobie z wyzwaniami
W celu przezwyciężenia tych trudności opracowano różne podejścia. Modele językowe specjalizujące się w programowaniu, takie jak Code Llama czy Qwen Coder, wykorzystują dwufazowy proces treningowy, który obejmuje wstępne uczenie oraz dostrajanie modelu.
Jednym z kluczowych elementów jest automatyczna generacja przypadków testowych, które pomagają weryfikować poprawność kodu. Modele mogą generować zarówno kod, jak i testy, jednak często okazuje się, że te testy zawierają halucynacje, czyli nieprawidłowe lub nierzeczywiste informacje.
Ciekawym rozwiązaniem było podejście Algo, które próbowało poprawić jakość testów poprzez szczegółowe sprawdzanie wyników przy użyciu programu Oracle. Niestety metoda ta nie sprawdziła się w skali większych zbiorów danych. Dodatkowo modele nagród, które są kluczowe dla nauki LLM przez RL, okazały się skuteczne w zwykłych zadaniach, lecz miały problemy w specjalistycznych dziedzinach, takich jak generowanie kodu.
Nowe podejście do ulepszania generowania kodu
Naukowcy z Uniwersytetu Waterloo, HKUST, Netmind.AI oraz niezależni badacze zaproponowali nową metodę poprawy jakości generowania kodu za pomocą uczenia przez wzmacnianie. Ich podejście koncentruje się na rozwiązaniu kluczowego problemu, jakim jest brak wiarygodnych sygnałów nagrody w kodowaniu.
Nowa metoda obejmuje stworzenie automatycznego procesu generowania par pytań i przypadków testowych na podstawie istniejących danych kodowych. Mechanizm ten wykorzystuje wskaźnik poprawnych testów do tworzenia par preferencji, które następnie służą do trenowania modeli nagród przy użyciu funkcji strat Bradley-Terry.
Testy wykazały, że podejście to pozwala uzyskać:
– Wzrost wyników o 10 punktów dla modelu Llama-3.1-8B-Ins
– Poprawę o 5 punktów dla Qwen2.5-Coder7B-Ins przy metodzie Best-of-32 Sampling, co podniosło wydajność tego modelu do poziomu większego modelu DeepSeekV2.5 o rozmiarze 236B.
Szczegóły eksperymentów
Badania obejmowały trzy główne etapy:
1. Trening modelu nagród – wykorzystano model Qwen2.5-Coder-7B-Instruct, który generował 16 odpowiedzi na pytanie z zestawu ACECODE89K. Łącznie stworzono 300 tysięcy par preferencyjnych na podstawie 46 618 różnych pytań, co stanowi 37,34% wszystkich pytań spełniających kryteria.
2. Uczenie przez wzmacnianie (RL) – użyto trzech modeli policyjnych: Qwen2.5-7B-Instruct, Qwen2.5-Coder7B-Base oraz Qwen2.5-Coder-7B-Instruct, a także dwóch rodzajów nagród:
– Modelu nagród ACECODE-RM-7B,
– Prostej binarnej reguły opartej na wyniku testów.
3. Ewaluacja modeli – dokonano jej na trzech benchmarkach: EvalPlus, Big Code Bench i Live Code Bench. Testy przeprowadzono przy użyciu top-p sampling z temperaturą 1.0 dla eksperymentów Best-of-N.
Wyniki i znaczenie nowej metody
Eksperymenty Best-of-N przeprowadzone na modelach MistralInstruct-V0.3-7B, Llama-3.1-Instruct-8B oraz Qwen2.5-Coder7B-Instruct wykazały, że metoda ACECODE-RM znacząco poprawia generowanie kodu, przewyższając standardową strategię dekodowania chciwego (greedy decoding).
Największe przyrosty o ponad 10 punktów zaobserwowano w słabszych modelach, takich jak Mistral czy Llama-3.1. Poprawa była szczególnie widoczna w benchmarkach, gdzie różnice między greedy decoding a wynikami Oracle były większe.
Eksperymenty RL wykazały stałe ulepszenia, zwłaszcza w testach HumanEval i MBPP. W przypadku modelu Qwen2.5-Coder-Instruct-7B metoda oparta na regułach nagród poprawiła wynik na BigCodeBench-Full-Hard o 3,4 punktu, natomiast metoda modelu nagród osiągnęła 86,0 punktów na MBPP, co niemal zrównało się z wynikiem DeepSeek-V2.5 (87,6 punktów).
Podsumowanie
Przedstawione badanie wprowadza pierwsze w pełni zautomatyzowane podejście do syntezy testowych przypadków na dużą skalę dla modeli generujących kod. Wykazano, że możliwe jest generowanie wysokiej jakości, weryfikowalnych danych kodowych bez potrzeby wykorzystywania najbardziej zaawansowanych modeli.
Nowa metoda otwiera drzwi do bardziej efektywnego trenowania modeli nagród oraz ich zastosowania w uczeniu przez wzmacnianie, co pozwala osiągnąć znaczące ulepszenia w generowaniu kodu. Chociaż wyniki Best-of-N wykazują imponujące poprawy, korzyści płynące z RL są bardziej umiarkowane.
Mimo to, badania te stanowią solidną podstawę do dalszych prac, które mogą prowadzić do jeszcze lepszej jakości kodu generowanego przez modele AI. Nowe podejścia do syntezy przypadków testowych i RL mogą w przyszłości rewolucjonizować sposób, w jaki modele AI pomagają programistom na całym świecie.