File size: 4,661 Bytes
0d5a48d
6ae040d
 
 
 
 
 
 
 
a83a7d7
6ae040d
 
 
0262e89
 
6ae040d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
---
license: mit  
datasets:  
  - google/code_x_glue_tc_nl_code_search_adv  
base_model:  
  - Shuu12121/CodeMorph-BERT  
pipeline_tag: fill-mask  
tags:  
  - code  
---
description: |
  このモデルは `Shuu12121/CodeMorph-BERT` をベースに、`google/code_x_glue_tc_nl_code_search_adv` データセットを用いて追加トレーニングを行いました。  
  これにより、コード検索精度の向上を実現しました。  
  実験コードはこちらです
  📄 [CodeMorphV2 Notebook (GitHub)](https://github.com/Shun0212/CodeBERTPretrained/blob/5c296a620cdbaadb7753b82ff419be0a142e1176/codemorphv2.ipynb)

  ### 🔬 **実験結果**  

  #### **CodeSearchNet (候補プールサイズ: 100) における評価**
  | Metric         | CodeMorph-BERT | CodeMorph-BERTv2 | Microsoft CodeBERT |
  |---------------|---------------|------------------|--------------------|
  | **MRR**       | 0.6678        | 0.6607           | 0.5598             |
  | **MAP**       | 0.6678        | 0.6607           | 0.5598             |
  | **R-Precision** | 0.5650      | 0.5510           | 0.4650             |
  | **Recall@1**  | 0.5650        | 0.5510           | 0.4650             |
  | **Recall@5**  | 0.7970        | 0.7970           | 0.6490             |
  | **Recall@10** | 0.8600        | 0.8630           | 0.7410             |
  | **Recall@50** | 0.9770        | 0.9790           | 0.9640             |
  | **Recall@100** | 1.0000       | 1.0000           | 1.0000             |
  | **Precision@1** | 0.5650      | 0.5510           | 0.4650             |
  | **NDCG@10**   | 0.7091        | 0.7050           | 0.5936             |

  #### **google/code_x_glue_tc_nl_code_search_adv データセットでの評価**
  | Metric         | CodeMorph-BERT | CodeMorph-BERTv2 | Microsoft CodeBERT |
  |---------------|---------------|------------------|--------------------|
  | **MRR**       | 0.3023        | 0.3154           | 0.3562             |
  | **Recall@1**  | 0.2035        | 0.2185           | 0.2527             |
  | **Recall@5**  | 0.3909        | 0.4021           | 0.4490             |
  | **Recall@10** | 0.4936        | 0.5046           | 0.5622             |
  | **Recall@50** | 0.8134        | 0.8231           | 0.8995             |
  | **Recall@100** | 1.0000       | 1.0000           | 1.0000             |
  | **Precision@1** | 0.2035      | 0.2185           | 0.2527             |
  | **NDCG@10**   | 0.3344        | 0.3469           | 0.3912             |

  ---
  ## 📝 **CodeMorph-BERT vs CodeMorph-BERTv2 の比較**
  - **CodeSearchNet におけるパフォーマンス**  
    - `CodeMorph-BERTv2` は `CodeMorph-BERT` とほぼ同等の精度を維持しており、リコールとNDCGにおいてわずかに改善が見られます。
    - `Recall@10` や `Recall@50` は v2 のほうがわずかに高く、全体的に検索精度が向上しています。

  - **google/code_x_glue_tc_nl_code_search_adv におけるパフォーマンス**  
    - `CodeMorph-BERTv2``CodeMorph-BERT` より **MRR、Recall@1、Recall@5、Recall@10** の値が向上しており、検索精度の改善が見られます。
    - `Precision@1` も向上しており、上位検索結果の精度が向上していることが分かります。

  - **総合的な考察**  
    - `CodeMorph-BERTv2``CodeMorph-BERT` と比べて **コード検索の再現率 (Recall) を向上** させており、より優れた検索結果を返すことが可能になりました。
    - ただし、`Microsoft CodeBERT` と比較すると、`google/code_x_glue_tc_nl_code_search_adv` のデータセットではまだ改善の余地があり、さらなるチューニングの余地が残っています。

  ---
  ## 💡 **使用方法**
  ```python
  from transformers import AutoModelForMaskedLM, AutoTokenizer
  import torch

  # モデルとトークナイザーのロード
  model_name = "Shuu12121/CodeMorph-BERTv2"
  tokenizer = AutoTokenizer.from_pretrained(model_name)
  model = AutoModelForMaskedLM.from_pretrained(model_name)

  # 入力コード([MASK] を含む)
  text = "def add(a, b): return a [MASK] b"

  # トークナイズ
  inputs = tokenizer(text, return_tensors="pt")

  # 推論実行
  with torch.no_grad():
      outputs = model(**inputs)
      logits = outputs.logits

  # マスク位置のトークンを予測
  mask_token_index = torch.where(inputs.input_ids == tokenizer.mask_token_id)[1]
  predicted_token_id = logits[0, mask_token_index, :].argmax(axis=-1)
  predicted_token = tokenizer.decode(predicted_token_id)

  print("予測されたトークン:", predicted_token)