Zhangyin Feng, Daya Guo, Duyu Tang, Nan Duan, Xiaocheng Feng, Ming Gong, Linjun Shou, Bing Qin, Ting Liu, Daxin Jiang, Ming Zhou
We present CodeBERT, a bimodal pre-trained model for programming language (PL) and nat-ural language (NL). CodeBERT learns general-purpose representations that support downstream NL-PL applications such as natural language codesearch, code documentation generation, etc. We develop CodeBERT with Transformer-based neural architecture, and train it with a hybrid objective function that incorporates the pre-training task of replaced token detection, which is to detect plausible alternatives sampled from generators. This enables us to utilize both bimodal data of NL-PL pairs and unimodal data, where the former provides input tokens for model training while the latter helps to learn better generators. We evaluate CodeBERT on two NL-PL applications by fine-tuning model parameters. Results show that CodeBERT achieves state-of-the-art performance on both natural language code search and code documentation generation tasks. Furthermore, to investigate what type of knowledge is learned in CodeBERT, we construct a dataset for NL-PL probing, and evaluate in a zero-shot setting where parameters of pre-trained models are fixed. Results show that CodeBERT performs better than previous pre-trained models on NL-PL probing.
| Task | Dataset | Metric | Value | Model |
|---|---|---|---|---|
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 15.99 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 15.55 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 15.15 | pre-train w/ code only |
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 15.03 | CodeBERT (RTD) |
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 14.52 | RoBERTa |
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 14.31 | Transformer |
| Text Generation | CodeSearchNet | Smoothed BLEU-4 | 13.36 | seq2seq |
| Text Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.48 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.41 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.12 | pre-train w/ code only |
| Text Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 14.92 | RoBERTa |
| Text Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 13.44 | Transformer |
| Text Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 13.04 | seq2seq |
| Text Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.79 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.66 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.39 | pre-train w/ code only |
| Text Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.09 | RoBERTa |
| Text Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.02 | CodeBERT (RTD) |
| Text Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 23.48 | seq2seq |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 25.61 | Transformer |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 9.54 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.73 | CodeBERT (RTD) |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.51 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.3 | pre-train w/ code only |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 6.88 | seq2seq |
| Text Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 5.72 | RoBERTa |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 21.32 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 21 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 20.71 | pre-train w/ code only |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 20.25 | CodeBERT (RTD) |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 19.9 | RoBERTa |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 18.4 | seq2seq |
| Text Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 18.25 | Transformer |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 14.56 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.59 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.2 | RoBERTa |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.07 | pre-train w/ code only |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 12.72 | CodeBERT (RTD) |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 12.57 | Transformer |
| Text Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 11.42 | seq2seq |
| Text Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 8.46 | CodeBERT (MLM+RTD) |
| Text Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.95 | CodeBERT (MLM) |
| Text Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.87 | Transformer |
| Text Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.36 | pre-train w/ code only |
| Text Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.26 | RoBERTa |
| Text Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 6.96 | seq2seq |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 15.99 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 15.55 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 15.15 | pre-train w/ code only |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 15.03 | CodeBERT (RTD) |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 14.52 | RoBERTa |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 14.31 | Transformer |
| Code Generation | CodeSearchNet | Smoothed BLEU-4 | 13.36 | seq2seq |
| Code Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.48 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.41 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.12 | pre-train w/ code only |
| Code Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 14.92 | RoBERTa |
| Code Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 13.44 | Transformer |
| Code Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 13.04 | seq2seq |
| Code Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.79 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.66 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.39 | pre-train w/ code only |
| Code Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.09 | RoBERTa |
| Code Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.02 | CodeBERT (RTD) |
| Code Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 23.48 | seq2seq |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 25.61 | Transformer |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 9.54 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.73 | CodeBERT (RTD) |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.51 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.3 | pre-train w/ code only |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 6.88 | seq2seq |
| Code Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 5.72 | RoBERTa |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 21.32 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 21 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 20.71 | pre-train w/ code only |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 20.25 | CodeBERT (RTD) |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 19.9 | RoBERTa |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 18.4 | seq2seq |
| Code Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 18.25 | Transformer |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 14.56 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.59 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.2 | RoBERTa |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.07 | pre-train w/ code only |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 12.72 | CodeBERT (RTD) |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 12.57 | Transformer |
| Code Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 11.42 | seq2seq |
| Code Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 8.46 | CodeBERT (MLM+RTD) |
| Code Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.95 | CodeBERT (MLM) |
| Code Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.87 | Transformer |
| Code Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.36 | pre-train w/ code only |
| Code Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.26 | RoBERTa |
| Code Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 6.96 | seq2seq |
| Program Synthesis | ManyTypes4TypeScript | Average Accuracy | 61.72 | CodeBERT |
| Program Synthesis | ManyTypes4TypeScript | Average F1 | 59.57 | CodeBERT |
| Program Synthesis | ManyTypes4TypeScript | Average Precision | 59.34 | CodeBERT |
| Program Synthesis | ManyTypes4TypeScript | Average Recall | 59.8 | CodeBERT |
| Code Search | CodeSearchNet | Go | 69.3 | CodeBERT |
| Code Search | CodeSearchNet | JS | 74.8 | CodeBERT |
| Code Search | CodeSearchNet | Java | 86.8 | CodeBERT |
| Code Search | CodeSearchNet | Overall | 76 | CodeBERT |
| Code Search | CodeSearchNet | PHP | 70.6 | CodeBERT |
| Code Search | CodeSearchNet | Python | 84 | CodeBERT |
| Code Search | CodeSearchNet | Ruby | 70.6 | CodeBERT |
| Type prediction | ManyTypes4TypeScript | Average Accuracy | 61.72 | CodeBERT |
| Type prediction | ManyTypes4TypeScript | Average F1 | 59.57 | CodeBERT |
| Type prediction | ManyTypes4TypeScript | Average Precision | 59.34 | CodeBERT |
| Type prediction | ManyTypes4TypeScript | Average Recall | 59.8 | CodeBERT |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 15.99 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 15.55 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 15.15 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 15.03 | CodeBERT (RTD) |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 14.52 | RoBERTa |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 14.31 | Transformer |
| Code Documentation Generation | CodeSearchNet | Smoothed BLEU-4 | 13.36 | seq2seq |
| Code Documentation Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.48 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.41 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 15.12 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 14.92 | RoBERTa |
| Code Documentation Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 13.44 | Transformer |
| Code Documentation Generation | CodeSearchNet - Python | Smoothed BLEU-4 | 13.04 | seq2seq |
| Code Documentation Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.79 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.66 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.39 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.09 | RoBERTa |
| Code Documentation Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 26.02 | CodeBERT (RTD) |
| Code Documentation Generation | CodeSearchNet - Go | Smoothed BLEU-4 | 23.48 | seq2seq |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 25.61 | Transformer |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 9.54 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.73 | CodeBERT (RTD) |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.51 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 8.3 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 6.88 | seq2seq |
| Code Documentation Generation | CodeSearchNet - JavaScript | Smoothed BLEU-4 | 5.72 | RoBERTa |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 21.32 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 21 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 20.71 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 20.25 | CodeBERT (RTD) |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 19.9 | RoBERTa |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 18.4 | seq2seq |
| Code Documentation Generation | CodeSearchNet - Php | Smoothed BLEU-4 | 18.25 | Transformer |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 14.56 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.59 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.2 | RoBERTa |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 13.07 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 12.72 | CodeBERT (RTD) |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 12.57 | Transformer |
| Code Documentation Generation | CodeSearchNet - Java | Smoothed BLEU-4 | 11.42 | seq2seq |
| Code Documentation Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 8.46 | CodeBERT (MLM+RTD) |
| Code Documentation Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.95 | CodeBERT (MLM) |
| Code Documentation Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.87 | Transformer |
| Code Documentation Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.36 | pre-train w/ code only |
| Code Documentation Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 7.26 | RoBERTa |
| Code Documentation Generation | CodeSearchNet - Ruby | Smoothed BLEU-4 | 6.96 | seq2seq |