[論文レビュー] CodeBERT: A Pre-Trained Model for Programming and Natural Languages
CodeBERT は自然言語とコードデータの両方で訓練されたバイモーダルな事前学習Transformerモデルで、NL-code検索とコードドキュメンテーション生成で最先端の成果を達成し、ゼロショットの NL-PL プロービングを可能にします。
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.
研究の動機と目的
- 自然言語と複数のプログラミング言語を横断する統一的な事前学習モデルを開発する。
- バイモーダルの NL-PL ペアと単モーダルなコードデータの両方を活用して頑健な表現を学ぶ。
- 自然言語コード検索やコードからのテキスト生成といった NL-PL タスクでの有効性を示す。
- NL-PL プロービングをゼロショット設定で行い、CodeBERT がどのような知識を捉えるかを調査する。
提案手法
- Transformer ベースのアーキテクチャを使用する(RoBERTa-base サイズ、125M パラメータ)。
- NL-PL データのバイモーダル MLM(Masked Language Modeling)と単一モーダルデータも活用する Replaced Token Detection (RTD) を組み合わせたハイブリッド目的で事前学習を行う。
- 入力を NL とコードの二つのセグメントとして [SEP] トークンで区切り、集約表現には [CLS] を使用する。
- 6つの言語(Python, Java, JavaScript, PHP, Ruby, Go)でバイモーダル NL-PL ペアと単モーダルなコードデータを用いて訓練する。
- RTD の生成器を用いて妥当な代替トークンを生成し、元のトークンと置換されたトークンを区別する識別器を訓練する。
- NL-PL タスク(NL ベースのコード検索およびコードからテキスト生成など)へ CodeBERT をファインチューニングする。
実験結果
リサーチクエスチョン
- RQ1NL-PL ペアと単モーダルなコードデータで訓練されたバイモーダル事前学習モデルは、純 NL やコードのみのモデルより NL-PL 理解タスクを改善できるか?
- RQ2MLM のみ、RTD のみ、そしてそれらの組み合わせが NL-PL タスクに与える影響はどのようか?
- RQ3CodeBERT は複数のプログラミング言語に跨るコード検索およびコードドキュメント生成へ一般化できるか?
- RQ4RoBERTa およびコードのみの事前学習モデルと比較して、NL-PL プロービングにおける CodeBERT のパフォーマンスはどうか?
主な発見
| Model | ruby | javascript | go | python | java | php | overall |
|---|---|---|---|---|---|---|---|
| NBow | 0.4285 | 0.4607 | 0.6409 | 0.5809 | 0.5140 | 0.4835 | 0.5181 |
| CNN | 0.2450 | 0.3523 | 0.6274 | 0.5708 | 0.5270 | 0.5294 | 0.4753 |
| BiRNN | 0.0835 | 0.1530 | 0.4524 | 0.3213 | 0.2865 | 0.2512 | 0.2580 |
| selfAtt | 0.3651 | 0.4506 | 0.6809 | 0.6922 | 0.5866 | 0.6011 | 0.5628 |
| RoBERTa | 0.6245 | 0.6060 | 0.8204 | 0.8087 | 0.6659 | 0.6576 | 0.6972 |
| PT w/ Code Only (init=s) | 0.5712 | 0.5557 | 0.7929 | 0.7855 | 0.6567 | 0.6172 | 0.6632 |
| PT w/ Code Only (init=R) | 0.6612 | 0.6402 | 0.8191 | 0.8438 | 0.7213 | 0.6706 | 0.7260 |
| CodeBERT (MLM, init=s) | 0.5695 | 0.6029 | 0.8304 | 0.8261 | 0.7142 | 0.6556 | 0.6998 |
| CodeBERT (MLM, init=R) | 0.6898 | 0.6997 | 0.8383 | 0.8647 | 0.7476 | 0.6893 | 0.7549 |
| CodeBERT (RTD, init=R) | 0.6414 | 0.6512 | 0.8285 | 0.8263 | 0.7150 | 0.6774 | 0.7233 |
| CodeBERT (MLM+RTD, init=R) | 0.6926 | 0.7059 | 0.8400 | 0.8685 | 0.7484 | 0.7062 | 0.7603 |
- CodeBERT はファインチューニング時に自然言語コード検索(CodeSearchNet)で最先端の結果を達成し、RoBERTa およびコードのみの事前学習モデルを上回る。
- MLM+RTD の事前学習(RoBERTa から初期化)により、言語を跨ぐ最良の検索性能を発揮(例:総合 Ma-Avg のベースラインに対する改善)。
- コードドキュメンテーション生成では、CodeBERT ベースのエンコーダが RoBERTa およびコードのみのベースラインより高い BLEU-4 スコアを達成し、RTD+MLM がさらなる改善を提供。
- ゼロショット設定の NL-PL プロービングでは CodeBERT が RoBERTa およびコードのみの事前学習モデルを上回り、PL および NL の予測タスクの両方で優位。
- 事前学習に含まれていないプログラミング言語への一般化(C# のコードから NL 生成)においては RoBERTa やいくつかのベースラインより優れるものの、すべてのケースで最先端のコード2seqを上回るわけではない。
- NL および PL プロービングのケーススタディは、CodeBERT が RoBERTa が失敗する場所でマスクされた NL および PL トークンを正しく予測できることを示している。
より良い研究を、今すぐ始めましょう
論文設計から論文執筆まで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。