Améliorer les modèles de code pour des contextes sans symboles
Une nouvelle méthode forme des modèles de code efficacement sans se baser sur des symboles.
― 6 min lire
Table des matières
Les modèles de code basés sur la technologie Transformer ont montré un grand succès dans les tâches d’ingénierie logicielle. Cependant, ces modèles galèrent quand ils tombent sur du code sans symboles ni infos utiles. Quand les symboles manquent, c'est chaud pour les modèles de capter les relations entre les différentes parties du code. Cet article propose une nouvelle manière d'entraîner ces modèles de manière efficace, même dans les situations où les symboles ne sont pas dispos.
Aperçu du problème
Quand le code est dépouillé de ses symboles, il ressemble souvent à une forme super basique d'un langage de programmation, sans contexte significatif. Ça complique la tâche tant pour les humains que pour les modèles pour déchiffrer le sens du code. Par exemple, dans le code binaire, les variables peuvent être représentées seulement par des adresses mémoire ou des registres, ce qui rend difficile de suivre les Dépendances ou de comprendre comment les différentes parties du code interagissent.
Méthode proposée
Pour surmonter ces défis, on propose une méthode qui utilise l'analyse de programme pour capturer le contexte avant d'entraîner le modèle. Cette analyse permet au modèle de se concentrer sur les relations pertinentes, même sans symboles. Au lieu de s'appuyer sur des symboles comme dans les modèles traditionnels, notre approche utilise une stratégie de masquage spéciale pour aider le modèle à apprendre quelles parties du code sont les plus importantes.
Processus d'entraînement
On améliore la tokenisation standard et on ajuste le design du modèle pour qu'il fonctionne mieux avec notre méthode. L'entraînement comprend une phase de pré-entraînement où le modèle est exposé à un gros dataset contenant plein de fonctions binaires. Dans notre cas, on a utilisé 26 millions de fonctions binaires pour aider le modèle à apprendre les motifs sous-jacents dans le code.
Pendant l'entraînement, le modèle apprend à reconnaître les relations importantes dans le code, ce qui l'aide à mieux performer dans différentes tâches, comme identifier des binaires similaires, inférer des types et classer des malwares. Notre modèle a montré des améliorations significatives par rapport aux méthodes existantes, boostant la performance dans plusieurs tâches.
Architecture du modèle
Notre approche se base sur un modèle Transformer similaire à BERT mais avec quelques modifications clés. Le modèle utilise un mécanisme d'attention régularisé qui se concentre sur des interactions spécifiques dans le code. En dirigeant l'attention seulement sur les tokens pertinents, on peut s'assurer que le modèle mette en avant les relations significatives et ignore les infos inutiles.
Dans le cœur du modèle, on utilise des blocs Transformer multi-couches qui traitent des séquences de tokens d'entrée. Chaque couche du modèle utilise les masques d'attention spéciaux que nous avons conçus pour réguler sur quoi le modèle se concentre. Cette architecture permet au modèle de mieux comprendre la sémantique du code, même sans symboles clairs.
Régularisation de l'attention
Une partie majeure de notre méthodologie est la régularisation de l'attention. On construit des masques qui dictent quels tokens peuvent faire attention les uns aux autres selon les dépendances du programme. Comme ça, quand un token traite son contexte, il ne considère que les tokens pertinents selon les règles de dépendance qu'on a établies.
On décompose l'attention en trois contextes clés :
Contexte global : Ça permet aux tokens d'avoir une vue d'ensemble de tous les tokens dans l'entrée, pour que le modèle puisse capter les relations générales à travers tout le code.
Contexte local : Ça se concentre sur les tokens dans la même instruction, s'assurant que le modèle prête attention à tout le sens de l'instruction sans être distrait par d'autres instructions.
Contexte de dépendance : Ça permet au modèle de reconnaître les relations entre les instructions basées sur leurs dépendances, s'assurant qu'il peut apprendre comment différentes parties du code se relient entre elles.
Pré-entraînement et ajustement
Le processus de pré-entraînement implique deux objectifs principaux : le Modèle de Langage Masqué (MLM) et le Modèle de Dépendance Masqué (MDM). Dans le MLM, des tokens aléatoires dans l'entrée sont masqués, et le modèle apprend à les prédire selon leurs contextes. Le MDM, quant à lui, se concentre sur la prédiction des dépendances de programme tout en masquant certains liens pour éviter des corrélations artificielles.
Après le pré-entraînement, notre modèle peut être ajusté pour des tâches spécifiques. Cette flexibilité lui permet d'être utilisé efficacement dans diverses applications sans avoir besoin de repartir de zéro à chaque fois.
Résultats
Notre modèle a été testé à travers plusieurs tâches, notamment l'analyse de similarité binaire, la classification de familles de malwares et l'inférence de types pour les binaires. Dans chaque cas, notre modèle a surpassé les modèles d'état de l'art existants, prouvant l'efficacité de notre approche.
Pour les tâches de similarité binaire, on a constaté que notre modèle améliore considérablement les taux de rappel, aidant à identifier correctement des fonctions similaires avec plus de précision. En classification de malwares, il a réussi à regrouper efficacement les malwares en familles selon leur comportement, améliorant les taux de détection.
Dans le domaine de l'inférence de types, notre modèle a montré une forte capacité à prédire des types de haut niveau à partir du code binaire, aidant les reverse engineers à comprendre la structure et le but du code.
Comparaison avec d'autres modèles
Quand on le compare à d'autres techniques comme GraphCodeBERT et des modèles traditionnels, notre approche a montré une meilleure adaptabilité quand les symboles manquent. Alors que GraphCodeBERT dépend beaucoup des symboles, notre méthode fonctionne même sans, ce qui la rend plus polyvalente pour des applications réelles où le code peut être dépouillé de cette info.
Conclusion
En résumé, notre travail présente une nouvelle méthodologie d'entraînement pour les modèles de code basés sur Transformer qui excellent même en l'absence de symboles. En s'appuyant sur l'analyse de programme et une régulation attentionnelle soignée, on permet aux modèles d'apprendre des relations significatives dans le code, menant à une performance améliorée dans diverses tâches. Cette approche ouvre de nouvelles voies pour comprendre et analyser le code binaire, en faisant un outil précieux pour l'ingénierie logicielle, la sécurité, et au-delà.
Avec le développement et les tests continus, on s'attend à affiner encore plus ces techniques et à explorer leur potentiel dans encore plus d'applications.
Titre: CodeArt: Better Code Models by Attention Regularization When Symbols Are Lacking
Résumé: Transformer based code models have impressive performance in many software engineering tasks. However, their effectiveness degrades when symbols are missing or not informative. The reason is that the model may not learn to pay attention to the right correlations/contexts without the help of symbols. We propose a new method to pre-train general code models when symbols are lacking. We observe that in such cases, programs degenerate to something written in a very primitive language. We hence propose to use program analysis to extract contexts a priori (instead of relying on symbols and masked language modeling as in vanilla models). We then leverage a novel attention masking method to only allow the model attending to these contexts, e.g., bi-directional program dependence transitive closures and token co-occurrences. In the meantime, the inherent self-attention mechanism is utilized to learn which of the allowed attentions are more important compared to others. To realize the idea, we enhance the vanilla tokenization and model architecture of a BERT model, construct and utilize attention masks, and introduce a new pre-training algorithm. We pre-train this BERT-like model from scratch, using a dataset of 26 million stripped binary functions with explicit program dependence information extracted by our tool. We apply the model in three downstream tasks: binary similarity, type inference, and malware family classification. Our pre-trained model can improve the SOTAs in these tasks from 53% to 64%, 49% to 60%, and 74% to 94%, respectively. It also substantially outperforms other general pre-training techniques of code understanding models.
Auteurs: Zian Su, Xiangzhe Xu, Ziyang Huang, Zhuo Zhang, Yapeng Ye, Jianjun Huang, Xiangyu Zhang
Dernière mise à jour: 2024-02-19 00:00:00
Langue: English
Source URL: https://arxiv.org/abs/2402.11842
Source PDF: https://arxiv.org/pdf/2402.11842
Licence: https://creativecommons.org/licenses/by-nc-sa/4.0/
Changements: Ce résumé a été créé avec l'aide de l'IA et peut contenir des inexactitudes. Pour obtenir des informations précises, veuillez vous référer aux documents sources originaux dont les liens figurent ici.
Merci à arxiv pour l'utilisation de son interopérabilité en libre accès.