File size: 5,145 Bytes
65edab8 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 |
---
license: apache-2.0
language:
- en
pipeline_tag: fill-mask
tags:
- code
---
# Shuu12121/CodeDiff-Owl-ModernBERT-base
## モデル概要
**CodeDiff-Owl-ModernBERT-base** は、GitHub の **コード差分(diff)とコミットメッセージ** を対象にマスク化言語モデル (MLM) で学習した、**diff・コミット履歴特化の ModernBERT 系モデル** です。
* ベースモデル: `ModernBERT`
* 事前学習タスク: マスク化言語モデル (Masked Language Modeling; MLM)
* 入力フォーマット:
`"[CLS]" + commit_message + "[SEP]" + diff`
* 対象言語:
diff 内のコードとして **Python / Java / JavaScript / Rust** を含むリポジトリ
コミットメッセージと diff を同時にエンコードすることで、**「どのような変更(diff)に対して、どのような説明(コミットメッセージ)が付くか」** という対応関係を捉えることを目的としています。
今後、学習を継続した「完全版」を公開予定です(本モデルは 1.8 epoch 時点の途中版です)。
---
## 想定される用途
### 主なユースケース
* コード変更差分に対する意味的検索
* 例: 「バグ修正」「ログ出力の追加」などの自然言語・疑似クエリと diff の類似度計算
* コミットメッセージと diff の表現獲得
* 例: コミットメッセージ・diff の埋め込みベクトルを用いたクラスタリングや可視化
* diff+コミットメッセージを入力とする下流タスクの初期化
* コミットメッセージ生成・補完
* コードレビューメモの生成 など
### 非推奨 / 注意が必要な用途
* 汎用自然言語モデルとしての利用(一般文書に対する性能は未検証)
* セキュリティやライセンス上の判断の自動化(著作権・ライセンス判定など)
* 高リスク領域での自動意思決定(法的判断、安全性が重要な場面など)
---
## 学習データ
### データソース
* GitHub 上の公開リポジトリ
* GitHub の「言語判定」により **Python / Java / JavaScript / Rust** 含有と判断されたリポジトリを対象
* 各リポジトリから、コミットごとの **diff とコミットメッセージ** を収集
* 各リポジトリあたり最大 **1万件** のコミットを上限としてサンプリング
* 収集した diff 全体で、おおよそ **70〜100GB 程度**(テキストベース)の規模
### 前処理・フィルタリング
* diff が **32KB を超える場合は途中で打ち切り**
* テキストとして読み取り可能な diff のみを利用
---
## 学習設定
* 初期化: ModernBERTアーキテクチャをもとにランダムな初期値から学習
* タスク: マスク化言語モデル (MLM)
* 入力フォーマット:
`"[CLS]" + commit_message + "[SEP]" + diff`
※実装で特別な変更は加えていません
* バッチサイズ: **64**
* 学習率 (learning rate): **1e-6**
* エポック数: **1.8 epoch**(時間制約により途中で打ち切り)
* 学習時間: 約 **4日間**
* その他:
* モデル構造自体には特別な改変なし
* 純粋に MLM のみで学習(コントラスト学習などは未実施)
今後、同様の設定でもう少し長く学習した「完全版」を公開予定です。
---
## 入力形式と使い方
### 入力形式
* **Segment A (sentence A)**: コミットメッセージ(自然言語)
* **Segment B (sentence B)**: 対応する diff テキスト
トークナイザには、以下のように「2つの入力」として与えてください。
```python
from transformers import AutoTokenizer, AutoModel
model_name = "Shuu12121/CodeDiff-Owl-ModernBERT-base"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModel.from_pretrained(model_name)
commit_message = "Fix bug in user login flow"
diff_text = """
diff --git a/app/auth.py b/app/auth.py
index 1234567..89abcde 100644
--- a/app/auth.py
+++ b/app/auth.py
@@ -10,7 +10,9 @@ def login(user, password):
- if user.password == password:
- return True
- return False
+ if not user:
+ return False
+ return user.check_password(password)
"""
inputs = tokenizer(
commit_message,
diff_text,
return_tensors="pt",
truncation=True,
)
outputs = model(**inputs)
last_hidden_state = outputs.last_hidden_state # [batch, seq_len, hidden]
cls_embedding = last_hidden_state[:, 0] # [CLS] トークンの埋め込み
```
* `cls_embedding` を **コミット+diff の表現ベクトル** として検索・クラスタリング等に利用することを想定しています。
* diff が非常に長い場合はモデル側でトークン長に応じて自動的に切り詰められるため、必要に応じて自前で要約・抽出を行ってください。
---
## 評価
* 本モデルは現時点では **事前学習段階のスナップショット (1.8 epoch)** です。
* 具体的な使用用途については今後検討予定です。
---
|