L'avancement des grands modèles de langage (LLM) a largement stimulé le développement du domaine de la génération de code. Dans des recherches antérieures, l’apprentissage par renforcement (RL) et les signaux de rétroaction du compilateur ont été combinés pour explorer l’espace de sortie des LLM afin d’optimiser la qualité de la génération de code.
Mais il reste encore deux problèmes :
1. L'exploration par apprentissage par renforcement est difficile à adapter directement aux « besoins humains complexes », ce qui nécessite que les LLM génèrent des « codes de séquence longue »
2. les tests unitaires peuvent ne pas couvrir du code complexe, l'optimisation des LLM à l'aide d'extraits de code non exécutés est inefficace.
Pour relever ces défis, les chercheurs ont proposé un nouveau cadre d'apprentissage par renforcement appelé StepCoder, qui a été développé conjointement par des experts de l'Université de Fudan, de l'Université des sciences et technologies de Huazhong et du Royal Institute of Technology. StepCoder contient deux composants clés conçus pour améliorer l'efficacité et la qualité de la génération de code.
1. CCCSrésout les défis d'exploration en divisant les tâches de génération de code à longue séquence en cours de sous-tâches d'achèvement de code ;
2. -optimisation granulaire.
Lien papier : https://arxiv.org/pdf/2402.01391.pdf
Lien du projet : https://github.com/Ablustrund/APPS_Plus
Les chercheurs ont également construit APPS+ ensemble de données utilisé pour la formation par apprentissage par renforcement, vérifié manuellement pour garantir l'exactitude des tests unitaires.
Les résultats expérimentaux montrent que la méthode améliore la capacité d'explorer l'espace de sortie et surpasse les méthodes de pointe sur les benchmarks correspondants.
StepCoder
Au stade CCCS (Curriculum of Code Completion Subtasks), les chercheurs décomposent des problèmes d'exploration complexes en une série de sous-tâches. En utilisant une partie de la solution canonique comme invite, LLM peut commencer à explorer à partir de séquences simples.
Le calcul des récompenses n'est lié qu'à des fragments de code exécutables, il est donc inexact d'utiliser l'intégralité du code (partie rouge sur l'image) pour optimiser LLM (partie grise sur l'image).
Dans l'étape FGO (Fine-Grained Optimization), les chercheurs masquent les jetons non exécutés (partie rouge) dans le test unitaire et utilisent uniquement les jetons exécutés (partie verte) pour calculer la fonction de perte, ce qui peut fournir des informations granulaires détaillées. optimisation.
Connaissances préliminaires
Supposons que
est un ensemble de données de formation pour la génération de code, où x, y, u représentent respectivement les besoins humains (c'est-à-dire la description de la tâche), les solutions standard et les échantillons de tests unitaires.
est une liste d'instructions conditionnelles obtenues en analysant automatiquement l'arbre syntaxique abstrait de la solution standard yi, où st et en représentent respectivement la position de départ et la position de fin de l'instruction.Pour l'exigence humaine x, sa solution standard y peut être exprimée comme
; dans l'étape de génération de code, étant donné l'exigence humaine x, l'état final est l'ensemble de codes qui réussit le test unitaire u.
Détails de la méthodeStepCoder intègre deux composants clés : CCCS et FGO, où le but de CCCS est de décomposer la tâche de génération de code en un cours de sous-tâches de complétion de code, ce qui peut atténuer les défis d'exploration dans RL FGO est conçu spécifiquement pour les tâches de génération de code et fournit une optimisation fine en calculant la perte uniquement pour les fragments de code exécutés.
CCCS
Pendant le processus de génération de code, la résolution de besoins humains complexes nécessite souvent un modèle politique pour entreprendre une longue séquence d'actions. Dans le même temps, les retours du compilateur sont retardés et rares, c'est-à-dire que le modèle politique ne reçoit des récompenses qu'une fois que l'intégralité du code a été générée. Dans ce cas, l'exploration est très difficile.
Le cœur de cette méthode est de décomposer une si longue liste de problèmes d'exploration en une série de sous-tâches courtes et faciles à explorer. Les chercheurs simplifient la génération de code en sous-tâches de complétion de code, où les sous-tâches sont représentées par des sous-tâches typiques. exemples dans l’ensemble de données de formation. La solution est construite automatiquement.
Pour les besoins humains x, au début de la phase de formation du CCCS, le point de départ s* de l'exploration est un état proche de l'état final.
Plus précisément, les chercheurs fournissent la demande humaine x et la première moitié de la solution standard , et entraînent un modèle de politique pour compléter le code selon x'=(x, xp).
En supposant que y^ est la séquence combinée de xp et de la trajectoire de sortie τ, c'est-à-dire yˆ=(xp,τ), le modèle de récompense fournit une récompense r basée sur l'exactitude du fragment de code τ avec y^ comme entrée.
Les chercheurs ont utilisé l'algorithme d'optimisation de politique proximale (PPO) pour optimiser le modèle de politique πθ en tirant parti de la récompense r et de la trajectoire τ.
Pendant la phase d'optimisation, le segment de code de solution canonique xp utilisé pour fournir des indices sera masqué afin qu'il n'ait pas d'impact sur le gradient de mise à jour du modèle de politique.
CCCS optimise le modèle politique πθ en maximisant la fonction d'opposition, où π^ref est le modèle de référence en PPO, initialisé par le modèle SFT.
Au fur et à mesure que la formation progresse, le point de départ s* de l'exploration se déplacera progressivement vers le point de départ de la solution standard. Plus précisément, un seuil ρ est fixé pour chaque échantillon de formation, et l'accumulation de segments de code est générée à chaque fois. temps πθ Lorsque le taux de précision est supérieur à ρ, le point de départ est déplacé au début.
Dans les étapes ultérieures de la formation, le processus d'exploration de cette méthode est équivalent à celui de l'apprentissage par renforcement original, c'est-à-dire s*=0, et le modèle politique génère uniquement du code avec les besoins humains en entrée.
Échantillonnez le point de reconnaissance initial s* à la position de départ de l'instruction conditionnelle pour compléter le segment de code non écrit restant.
Plus précisément, plus il y a d'instructions conditionnelles, plus le programme dispose de chemins indépendants et plus la complexité logique est élevée. fréquemment.
Cette méthode d'échantillonnage peut extraire uniformément des structures de code représentatives tout en prenant en compte les structures sémantiques complexes et simples dans l'ensemble de données de formation.
Pour accélérer la phase de formation, les chercheurs ont fixé le nombre de cours pour le i-ème échantillon à , où Ei est le nombre de ses instructions conditionnelles. La durée du cours de formation du i-ème échantillon est , et non 1.
Les principaux points du CCCS peuvent être résumés comme suit :
1 Il est facile de démarrer l'exploration à partir d'un état proche de l'objectif (c'est-à-dire l'état final) ; pour commencer l'exploration à partir d'un état éloigné du sexe objectif, mais l'exploration devient plus facile si vous pouvez puiser dans l'état d'avoir appris à atteindre vos objectifs.
FGO
La relation entre les récompenses et les actions dans la génération de code est différente des autres tâches d'apprentissage par renforcement (telles que Atari, un ensemble de récompenses qui ne sont pas pertinentes pour calculer les récompenses dans le). le code généré peut être exclu de l'action.
Plus précisément, pour les tests unitaires, les commentaires du compilateur ne concernent que le fragment de code exécuté. Cependant, dans les objectifs d'optimisation RL ordinaires, toutes les actions sur la trajectoire participeront au calcul du gradient, et le calcul du gradient est imprécis.
Afin d'améliorer la précision de l'optimisation, les chercheurs ont protégé les actions non exécutées (c'est-à-dire les jetons) dans le test unitaire et la perte du modèle de stratégie.
APPS+dataset
L'apprentissage par renforcement nécessite une grande quantité de données d'entraînement de haute qualité. Au cours de l'enquête, les chercheurs ont découvert que parmi les ensembles de données open source actuellement disponibles, seul APPS répond à cette exigence. Une demande.
Mais il existe des instances incorrectes dans APPS, telles que des entrées, des sorties ou des solutions standard manquantes, où la solution standard peut ne pas être compilée ou exécutée, ou il peut y avoir des différences dans les résultats d'exécution.
Pour améliorer l'ensemble de données APPS, les chercheurs ont filtré les instances avec des entrées, des sorties ou des solutions standard manquantes, puis ont standardisé les formats d'entrées et de sorties pour faciliter l'exécution et la comparaison des tests unitaires, pour chaque instance ; Des tests unitaires et des analyses manuelles ont été effectués pour éliminer les cas de code incomplet ou non pertinent, d'erreurs de syntaxe, d'utilisation abusive de l'API ou de dépendances de bibliothèque manquantes.
En cas de différences de résultat, les chercheurs examinent manuellement la description du problème, corrigent le résultat attendu ou éliminent l'instance.
Enfin, l'ensemble de données APPS+ a été construit, contenant 7456 instances. Chaque instance comprend la description du problème de programmation, la solution standard, le nom de la fonction, le test unitaire (c'est-à-dire l'entrée et la sortie) et la partie de début du code de démarrage (c'est-à-dire la solution standard).
Pour évaluer les performances d'autres LLM et StepCoder en matière de génération de code, les chercheurs ont mené des expériences sur l'ensemble de données APPS+.
Les résultats montrent que le modèle basé sur RL surpasse les autres modèles de langage, notamment le modèle de base et le modèle SFT.
Les chercheurs ont estimé que l'apprentissage par renforcement peut encore améliorer la qualité de la génération de code en explorant plus efficacement l'espace de sortie du modèle, guidé par les commentaires du compilateur.
De plus, StepCoder a surpassé tous les modèles de base, y compris d'autres méthodes basées sur RL, et a obtenu le score le plus élevé.
Plus précisément, cette méthode a obtenu des scores élevés de 59,7%, 23,5% et 8,6% respectivement aux questions des tests de niveau "Introduction", "Entretien" et "Concours".
Par rapport à d'autres méthodes basées sur l'apprentissage par renforcement, cette méthode excelle dans l'exploration de l'espace de sortie en simplifiant les tâches complexes de génération de code en sous-tâches d'achèvement de code, et le processus FGO joue un rôle clé dans l'optimisation précise de l'effet du modèle politique.
On constate également que sur l'ensemble de données APPS+ basé sur la même architecture réseau, StepCoder est plus performant que le LLM supervisé pour le réglage fin par rapport au réseau backbone, ce dernier améliore à peine le taux de réussite du code généré ; Il est également directement démontré que l'utilisation des commentaires du compilateur pour optimiser le modèle peut améliorer la qualité du code généré plus que la prédiction du prochain jeton dans la génération de code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!