Apprentissage de représentations de code contrastives

Des travaux récents apprennent des représentations contextuelles du code source en reconstruisant des jetons à partir de leur contexte. Pour les tâches de compréhension sémantique en aval, comme la résumation du code en anglais, ces représentations devraient idéalement capturer la fonctionnalité du programme. Cependant, nous montrons que le modèle BERT populaire basé sur la reconstruction est sensible aux modifications du code source, même lorsque celles-ci préservent la sémantique. Nous proposons ContraCode : une tâche de pré-entraînement par contraste qui apprend la fonctionnalité du code, et non sa forme. ContraCode pré-entraîne un réseau neuronal pour identifier des variantes fonctionnellement similaires d'un programme parmi de nombreux distracteurs non équivalents. Nous générons ces variantes de manière scalable en utilisant un compilateur source-à-source automatisé sous forme d'augmentation de données. Le pré-entraînement par contraste améliore l'exactitude de la résumation en JavaScript et de l'inférence de types en TypeScript de 2 % à 13 %. Nous proposons également un nouveau jeu de données pour la détection zéro-shot des clones de code JavaScript, montrant que ContraCode est à la fois plus robuste et plus significatif sémantiquement. Dans ce jeu de données, nous surpassons RoBERTa avec une performance supérieure de 39 % en termes d'AUC-ROC dans un cadre adversarial et jusqu'à 5 % sur du code naturel.