CodeHawks‑ModernBERT
概要
CodeHawks‑ModernBERT は、コード検索およびコード理解のタスク向けに1からトレーニングしたCodeMorph-ModernBERT-BPE-1.3に追加学習を行った事前学習済みモデルです. 従来のCodeMorph-ModernBERTシリーズとは異なる,より構造を意識した継続学習を行い,これまでのCodeMorphシリーズとは一線を画す性能を実現しました.
最大シーケンス長2048トークン(従来のMicrosoftモデルは512トークン)
- アーキテクチャ: ModernBERT ベース
- 目的: コード検索 / コード理解 /コードクローン発見
- トレーニングデータ: CodeSearchNet (全言語) code_x_glue_tc_text_to_code
- ライセンス: Apache 2.0
主な特徴
長いシーケンス対応
最大2048トークンのシーケンス処理が可能。長いコードや複雑な関数にも対応します。高いコード検索,コード理解,コードクローン発見性能
Pythonをはじめとする6言語対応のBPEレベルのトークナイザとコード全体を把握させるための事前学習によりこれまで苦手だったJava,JavaScript,RubyやGoでの性能が改善し,すべての言語でこれまでのシリーズの中で最高性能を達成しました.専用にトレーニングされたモデル
CodeSearchNet,CodeXGLUEのデータセットを用いて1から事前学習したCodeMorph-ModernBERT-BPE-1.3に対して,同じデータセットで異なる継続学習を行い,より洗練されたコード理解を実現しました.
パラメータについて
以下のパラメータで設計しています。
パラメータ名 | 設定値 |
---|---|
vocab_size | 50000 |
hidden_size | 768 |
num_hidden_layers | 12 |
num_attention_heads | 12 |
intermediate_size | 3072 |
max_position_embeddings | 2048 |
type_vocab_size | 2 |
hidden_dropout_prob | 0.1 |
attention_probs_dropout_prob | 0.1 |
local_attention_window | 128 |
rope_theta | 160000 |
local_attention_rope_theta | 10000 |
モデルの使用方法
Hugging Face Transformers ライブラリを利用して、本モデルを簡単にロードできます。(※ Transformers のバージョンは 4.48.0
以上のみ動作します)
モデルのロード
from transformers import AutoModelForMaskedLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("Shuu12121/CodeHawks-ModernBERT")
model = AutoModelForMaskedLM.from_pretrained("Shuu12121/CodeHawks-ModernBERT")
コード埋め込みの取得
import torch
def get_embedding(text, model, tokenizer, device="cuda"):
inputs = tokenizer(text, return_tensors="pt", truncation=True, max_length=256)
if "token_type_ids" in inputs:
inputs.pop("token_type_ids")
inputs = {k: v.to(device) for k, v in inputs.items()}
outputs = model.model(**inputs)
embedding = outputs.last_hidden_state[:, 0, :]
return embedding
embedding = get_embedding("def my_function(): pass", model, tokenizer)
print(embedding.shape)
評価結果
code_x_glue_ct_code_to_text
データセットのTestを用いて評価を行いました.(プールサイズ100)
実験結果はこちらのリンクからご確認できます
Python
言語 | モデル | MRR | MAP | R‑Precision |
---|---|---|---|---|
Python | Shuu12121/CodeMorph-ModernBERT | 0.8098 | 0.8098 | 0.7520 |
Python | Shuu12121/CodeMorph-ModernBERT‑BPE‑1.0 | 0.4110 | 0.4110 | 0.2950 |
Python | microsoft/graphcodebert‑base | 0.5493 | 0.5493 | 0.4480 |
Python | microsoft/codebert‑base‑mlm | 0.5243 | 0.5243 | 0.4480 |
Python | Salesforce/codet5p‑220m‑bimodal | 0.8266 | 0.8266 | 0.7610 |
Python | Shuu12121/CodeHawks‑ModernBERT | 0.8551 | 0.8551 | 0.8000 |
Java
言語 | モデル | MRR | MAP | R‑Precision |
---|---|---|---|---|
Java | Shuu12121/CodeMorph-ModernBERT | 0.6386 | 0.6386 | 0.5380 |
Java | Shuu12121/CodeMorph-ModernBERT‑BPE‑1.0 | 0.3627 | 0.3627 | 0.2460 |
Java | microsoft/graphcodebert‑base | 0.5879 | 0.5879 | 0.4900 |
Java | microsoft/codebert‑base‑mlm | 0.3134 | 0.3134 | 0.2160 |
Java | Salesforce/codet5p‑220m‑bimodal | 0.8867 | 0.8867 | 0.8330 |
Java | Shuu12121/CodeHawks‑ModernBERT | 0.7971 | 0.7971 | 0.7370 |
JavaScript
言語 | モデル | MRR | MAP | R‑Precision |
---|---|---|---|---|
JavaScript | Shuu12121/CodeMorph-ModernBERT | 0.5996 | 0.5996 | 0.5020 |
JavaScript | Shuu12121/CodeMorph-ModernBERT‑BPE‑1.0 | 0.2184 | 0.2184 | 0.1110 |
JavaScript | microsoft/graphcodebert‑base | 0.5051 | 0.5051 | 0.4000 |
JavaScript | microsoft/codebert‑base‑mlm | 0.2694 | 0.2694 | 0.1760 |
JavaScript | Salesforce/codet5p‑220m‑bimodal | 0.7628 | 0.7628 | 0.6730 |
JavaScript | Shuu12121/CodeHawks‑ModernBERT | 0.7634 | 0.7634 | 0.6940 |
PHP
言語 | モデル | MRR | MAP | R‑Precision |
---|---|---|---|---|
PHP | Shuu12121/CodeMorph-ModernBERT | 0.7513 | 0.7513 | 0.6660 |
PHP | Shuu12121/CodeMorph-ModernBERT‑BPE‑1.0 | 0.3998 | 0.3998 | 0.2830 |
PHP | microsoft/graphcodebert‑base | 0.6225 | 0.6225 | 0.5100 |
PHP | microsoft/codebert‑base‑mlm | 0.2642 | 0.2642 | 0.1620 |
PHP | Salesforce/codet5p‑220m‑bimodal | 0.9027 | 0.9027 | 0.8600 |
PHP | Shuu12121/CodeHawks‑ModernBERT | 0.8578 | 0.8578 | 0.8060 |
Ruby
言語 | モデル | MRR | MAP | R‑Precision |
---|---|---|---|---|
Ruby | Shuu12121/CodeMorph-ModernBERT | 0.7126 | 0.7126 | 0.6190 |
Ruby | Shuu12121/CodeMorph-ModernBERT‑BPE‑1.0 | 0.2436 | 0.2436 | 0.1360 |
Ruby | microsoft/graphcodebert‑base | 0.5876 | 0.5876 | 0.4830 |
Ruby | microsoft/codebert‑base‑mlm | 0.3318 | 0.3318 | 0.2270 |
Ruby | Salesforce/codet5p‑220m‑bimodal | 0.7568 | 0.7568 | 0.6650 |
Ruby | Shuu12121/CodeHawks‑ModernBERT | 0.7469 | 0.7469 | 0.6630 |
Go
言語 | モデル | MRR | MAP | R‑Precision |
---|---|---|---|---|
Go | Shuu12121/CodeMorph-ModernBERT | 0.5423 | 0.5423 | 0.4420 |
Go | Shuu12121/CodeMorph-ModernBERT‑BPE‑1.0 | 0.2495 | 0.2495 | 0.1250 |
Go | microsoft/graphcodebert‑base | 0.4243 | 0.4243 | 0.3270 |
Go | microsoft/codebert‑base‑mlm | 0.3262 | 0.3262 | 0.2440 |
Go | Salesforce/codet5p‑220m‑bimodal | 0.8117 | 0.8117 | 0.7280 |
Go | Shuu12121/CodeHawks‑ModernBERT | 0.9043 | 0.9043 | 0.8620 |
code_x_glue_tc_nl_code_search_adv (Test) で評価した結果はこちらです
モデル | MRR | MAP | R‑Precision |
---|---|---|---|
Shuu12121/CodeHawks‑ModernBERT | 0.6679 | 0.6679 | 0.5748 |
Salesforce/codet5p‑220m‑bimodal | 0.5359 | 0.5359 | 0.4258 |
結果の考察と工夫点
初期のCodeMorph-ModernBERTではSentencePieceを使って作成したトークナイザを利用しモデルを作成していましたが,pythonやphpでは高い性能を出せたものの,ほかの言語ではあまり実用的なレベルではありませんでした. そこでよりプログラムの構造をつかんだトークナイザが必要だと感じ,BPEでトークナイザを作成し,それを用いて事前学習を行いました(CodeMorp-ModernBERT-BPE-1.0)が、初期のモデルと比べてもいい性能が出せなかったので,より全体像を意識した学習方法を試してみた結果これまでのモデルよりも高い性能かつ.これまで苦手だったJavaやGoでの性能を上げることができました. また実験結果から考察できることは,Python,GOにおいては実験したすべてのモデルの中でCodeHawks‑ModernBERTモデルが一番優れており,ほかの言語でもcodet5p‑220m‑bimodalと競合できるレベルまで性能を上げることができています. さらに同じアーキテクチャ、同じデータセットで事前学習しているCodeMorph-ModernBERT‑BPE‑1.0 よりも圧倒的に高い性能を出していることから、この継続学習がコード検索において有効であったことが推測できます.
ライセンス
本モデルは Apache-2.0
ライセンスのもとで提供されます。
連絡先
このモデルで何か質問等がございましたらこちらのメールアドレスまでお願いします [email protected]
- Downloads last month
- 67