Pembuatan pesan otomatis untuk komit

Hei! Nama saya Alexandra Eliseeva, saya seorang mahasiswa di Pusat Ilmu Komputer . Sebagai bagian dari praktik saya di semester musim gugur 2020, saya berpartisipasi dalam proyek BERT untuk Kode Sumber yang dipimpin oleh Timofey Bryksin dan Yaroslav Sokolov dari JetBrains Research . Saya meneliti bagaimana memecahkan masalah menghasilkan pesan komit secara otomatis menggunakan model bahasa BERT. Apa yang terjadi, dan apa yang masih perlu dibenahi, akan saya ceritakan di postingan ini.







tentang proyek



Ada banyak masalah menarik di bidang pemrosesan bahasa pemrograman, solusi otomatisnya dapat berguna untuk membuat alat yang nyaman bagi pengembang.



Kode sumber program berbeda dalam banyak hal dari teks bahasa alami, tetapi juga dapat dianggap sebagai urutan token dan metode serupa dapat digunakan. Misalnya, di bidang pemrosesan bahasa alami, model bahasa BERT digunakan secara aktif. Proses pelatihannya melibatkan dua tahap: pra-pelatihan pada kumpulan besar data tidak berlabel dan pelatihan tambahan untuk tugas-tugas tertentu pada kumpulan data berlabel yang lebih kecil. Pendekatan ini memungkinkan banyak tugas diselesaikan dengan kualitas yang sangat baik.



Karya terbaru ( 1 , 2, 3 ) menunjukkan bahwa jika Anda melatih model BERT pada kumpulan data kode program yang besar, maka model BERT tersebut mengatasi beberapa tugas di area ini dengan baik (di antaranya, misalnya, pelokalan dan penghapusan variabel yang digunakan secara tidak benar dan pembuatan komentar ke metode) .



Proyek ini bertujuan untuk menyelidiki penggunaan BERT untuk tugas kode sumber lainnya. Secara khusus, kami berfokus pada tugas menghasilkan pesan komit secara otomatis.



Tentang tugas



Mengapa kami memilih tugas ini?



Pertama, sistem kontrol versi digunakan dalam pengembangan banyak proyek, sehingga alat untuk memecahkan masalah ini secara otomatis dapat relevan untuk berbagai pengembang.



Kedua, kami berhipotesis bahwa menggunakan BERT untuk tugas ini dapat menghasilkan hasil yang baik. Ini karena beberapa alasan:



  • dalam karya yang ada ( 4 , 5 , 6 ), data dikumpulkan dari sumber terbuka dan memerlukan penyaringan yang serius, jadi hanya ada beberapa contoh untuk pelatihan. Di sinilah kemampuan BERT untuk melatih pada kumpulan data kecil dapat berguna;

  • Hasil state-of-the-art pada saat mengerjakan proyek ini adalah dalam model arsitektur Transformer, yang telah disampaikan sebelumnya dengan cara yang agak spesifik pada kumpulan data kecil ( 6 ). Sangat menarik bagi kami untuk membandingkannya dengan model berbasis BERT, yang telah dilatih sebelumnya dengan cara yang berbeda, tetapi dengan lebih banyak data.



Selama semester, saya harus melakukan hal berikut:



  • mempelajari bidang studi;
  • temukan kumpulan data dan pilih representasi dari data masukan;
  • mengembangkan jalur untuk pelatihan dan penilaian kualitas;
  • melakukan eksperimen.


Data



Ada beberapa kumpulan data terbuka untuk tugas ini, saya memilih yang paling terfilter ( 5 ).



Kumpulan data dikumpulkan dari 1.000 repositori GitHub terbuka teratas dalam bahasa Java. Setelah disaring, dari jutaan contoh asli, ada sekitar 30 ribu yang tersisa.



Contohnya sendiri adalah pasangan dari output perintah git diff dan pesan singkat yang sesuai dalam bahasa Inggris. Terlihat seperti ini:







Perubahan dan pesan dalam kumpulan data pendek - masing-masing tidak lebih dari 100 dan 30 token.



Di sebagian besar pekerjaan yang ada menyelidiki masalah menghasilkan pesan secara otomatis untuk komit, urutan token dari git diff diumpankan ke model.



Ada ide lain: untuk secara eksplisit memilih dua urutan, sebelum dan sesudah perubahan, dan menyelaraskannya menggunakan algoritma klasik untuk menghitung jarak editorial. Dengan demikian, token yang diubah selalu berada di posisi yang sama.



Idealnya, kami ingin mencoba beberapa pendekatan dan memahami bagaimana mereka mempengaruhi kualitas pemecahan masalah ini. Pada tahap awal, saya menggunakan yang cukup sederhana: dua urutan dimasukkan ke input model, sebelum dan sesudah perubahan, tetapi tanpa penyelarasan apa pun.



BERT untuk tugas urutan-ke-urutan



Baik data input dan output untuk tugas menghasilkan pesan secara otomatis untuk komit adalah urutan, yang panjangnya mungkin berbeda.



Untuk mengatasi masalah tersebut, biasanya digunakan arsitektur encoder-decoder, yang terdiri dari dua komponen:



  • model encoder membangun representasi vektor berdasarkan urutan input,
  • model-decoder menghasilkan urutan output berdasarkan representasi vektor.


Model BERT didasarkan pada encoder dari arsitektur Transformer dan dengan sendirinya tidak cocok untuk tugas seperti itu. Beberapa opsi dimungkinkan untuk mendapatkan model urutan-ke-urutan yang lengkap, yang paling sederhana adalah menggunakan semacam dekoder dengannya. Pendekatan dengan dekoder dari arsitektur Transformer ini telah menunjukkan dirinya dengan baik, misalnya, untuk tugas terjemahan mesin saraf ( 7 ).



saluran pipa



Untuk melakukan eksperimen, diperlukan kode untuk melatih dan mengevaluasi kualitas model urutan-ke-urutan tersebut.



Untuk bekerja dengan model BERT, saya menggunakan perpustakaan Transformers HuggingFace, dan untuk implementasi secara umum, kerangka kerja PyTorch.



Karena pada awalnya saya memiliki sedikit pengalaman dengan PyTorch, saya sebagian besar mengandalkan contoh yang ada untuk model urutan-ke-urutan dari arsitektur lain, secara bertahap beradaptasi dengan spesifikasi tugas saya. Sayangnya, pendekatan ini menghasilkan banyak kode berkualitas buruk.



Pada titik tertentu, diputuskan untuk memulai refactoring, secara praktis menulis ulang pipeline. Pustaka PyTorch Lightning membantu menyusun kode, yang memungkinkan Anda mengumpulkan semua logika utama model dalam satu modul dan mengotomatiskannya dalam banyak cara.



Eksperimen



Selama percobaan, kami ingin memahami apakah penggunaan model BERT yang telah dilatih sebelumnya meningkatkan hasil mutakhir di bidang ini.



Di antara model BERT yang dilatih pada kode, hanya CodeBERT ( 1 ) yang muncul kepada kami , karena hanya ada bahasa pemrograman Java dalam contoh pelatihan. Pertama, menggunakan CodeBERT sebagai encoder, saya mencoba decoder dari arsitektur yang berbeda:



  1. GRU.



    , - . GRU Transformer, , .

    - .
  2. Transformer.



    , — .



    , GPT-2 (8) — Transformer, , — distilGPT-2 (9).


Tidak ada cukup waktu untuk eksperimen lebih lanjut di semester musim gugur; saya melanjutkannya di musim dingin. Kami melihat beberapa cara lain untuk mewakili input: kami mencoba menyelaraskan urutan sebelum dan sesudah perubahan, dan juga baru saja mengajukan git diff.



Hasil utama dari percobaan adalah sebagai berikut:











Menyimpulkan



Secara umum, asumsi tentang manfaat menggunakan CodeBERT untuk tugas ini tidak dikonfirmasi; dalam semua kasus, model Transformer yang dilatih dari awal menunjukkan kualitas yang lebih tinggi. Metode terbaik di bidang ini tetap model CoreGen6: ini juga Transformer, tetapi tambahan pra-dilatih menggunakan fungsi tujuan yang diusulkan oleh penulis.



Untuk mengatasi masalah ini, lebih banyak ide dapat dipertimbangkan: misalnya, mencoba representasi data berdasarkan pohon sintaksis abstrak, yang sering digunakan ketika bekerja dengan kode program ( 10 , 11), coba model pra-pelatihan lainnya, atau lakukan pra-pelatihan khusus lapangan jika sumber daya tersedia. Pada semester musim semi, kami fokus pada aplikasi yang lebih praktis dari hasil yang diperoleh dan terlibat dalam pelengkapan otomatis pesan ke komit. Saya akan memberi tahu Anda tentang ini di bagian kedua :)



Sebagai kesimpulan, saya ingin mengatakan bahwa sangat menarik untuk berpartisipasi dalam proyek ini, saya terjun ke area subjek baru untuk diri saya sendiri dan belajar banyak selama waktu ini. Pekerjaan pada proyek ini diatur dengan sangat baik, untuk itu banyak terima kasih kepada para pemimpin saya.



Terima kasih atas perhatiannya!



Sumber dari



  1. Feng, Zhangyin, dkk. "Codebert: Model pra-terlatih untuk pemrograman dan bahasa alami." 2020

  2. Buratti, Luca, et al. «Exploring Software Naturalness through Neural Language Models.» 2020
  3. Kanade, Aditya, et al. «Learning and Evaluating Contextual Embedding of Source Code.» 2020
  4. Jiang, Siyuan, Ameer Armaly, and Collin McMillan. «Automatically generating commit messages from diffs using neural machine translation.» 2017
  5. Liu, Zhongxin, et al. «Neural-machine-translation-based commit message generation: how far are we?.» 2018
  6. Nie, Lun Yiu, et al. «CoreGen: Contextualized Code Representation Learning for Commit Message Generation.» 2021
  7. Rothe, Sascha, Shashi Narayan, and Aliaksei Severyn. «Leveraging pre-trained checkpoints for sequence generation tasks.» 2020
  8. Radford, Alec, et al. «Language models are unsupervised multitask learners.» 2019
  9. Sanh, Victor, et al. «DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter.» 2019
  10. Yin, Pengcheng, et al. «Learning to represent edits.» 2018
  11. Kim, Seohyun, et al. «Code prediction by feeding trees to transformers.» 2021



All Articles