人間とAI、どちらが書いたコードか判別せよ!

2025-12-04

はじめに

jackアドベントカレンダー2025ついに始まりました!

4日目担当のめろです。

今回は2025年8月1日~8月31日に開催されたTrackが主催するAIコンペに参加し、学生5位を取ることができたので、その話をしようと思います。 【人間とAI、どちらが書いたコードか判別せよ!】


1. コンペの概要

  • コンペティション内容
      • 課題:コードがAI生成か人力作成かどうかの二値分類タスク
      • DATA:AI生成されたコードと人力作成されたコードからなるデータセット
      • 評価:F1スコア
      • 参加資格:年齢・職業を問わず参加可能(参加は個人のみ)
  • 日程
      • 応募期間:2025年7月18日(金)~ 8月31日(日)
      • コンペ開催期間:2025年8月1日(金)0:00 ~ 8月31日(日)23:59
  • データ
      • コーディングテストツール「Track Test」上で過去利用されていた(現在は利用されていない)コーディングテストに対する受験者の解答コード
      • 上記と同一の問題に対して種々のLLMに作成させた解答コード
      • C#, C++, C, Java, PHP, Python3, JavaScript (Node.js), Ruby, Python, Go
      • Trainデータが284, Testデータが2653で言語ごとにデータ数の偏りがある
  • 賞金(社会人 / 学生)それぞれ総額50万円
      • GOLD:¥300,000
      • SILVER:¥100,000
      • BRONZE:¥50,000
      • 審査員特別賞:¥50,000

2. 自分の解法

解法の方針

Transformerベースのモデルをファインチューニングして、コードから「LLM特有の癖」や「人間特有の書き方」を機械的に抽出して分類する方針をとりました。

💡
Transformerとは? 文章全体を一度に見渡して、言葉の裏にある意味や文脈を深く理解することができるモデルです。 ChatGPTの最後の「T」はTransformerを指しています。
💡
ファインチューニングとは? 「学習済みモデル」に、特定のデータを追加で学習させて微調整する手法です。 これにより、特定の専門分野や業務タスクに特化した、精度の高いモデルを作ることができます。

解法の内容

Trainデータが少なかったので、外部データを使ってデータ数を増やしました。

その後、microsoft/codebert-base、microsoft/unixcoder-base、Salesforce/codet5p-220mなどのHugging Faceにあるプログラミングコードで事前学習されたモデルを7つ使い、予測結果のアンサンブルをしました。

💡
アンサンブルとは? モデルの予測結果を組み合わせて、単一のモデルよりも精度を高めることです。今回は多数決(人間と判断したモデルの数と、AIと判断したモデルの数のうち多いほうを最終的な出力として決める)にしました。

3. 結果(Testデータに対するF1スコア)

社会人学生
1位0.996890.99029
2位0.987140.98194
3位0.969130.98187
4位0.966560.97909
5位 0.95453 0.97434(自分)

学生5位をとることはできましたが、入賞圏内である3位にはあと一歩届きませんでした。


4. 上位解法

社会人1位の方の解法

  • Step1

ChatGPT4.1とQwen3-Coder-30B-A3B-Instruct(QLoRA)をファインチューニングする。その後、Testデータに対して予測をしてアンサンブル(単純平均)する。

  • Step2

Step1で出した予測結果のうちの予測確率が上位のものをTrainデータに追加する(疑似ラベリング)をして、Codellama-13b-Instruct-hfやQwen2.5-Coder-7B-Instructなどの4つのモデルをファインチューニングする。その後、Testデータに対して予測をしてアンサンブル(単純平均)する。

感想

Step1の時点でスコアが0.99を超えていたみたいで、モデルの選定の重要性を感じました。

またQLoRAというファインチューニング時のメモリの節約と高速化をする手法をつかっていました。(もちろん精度は多少落ちます)

自分はフルパラメータチューニングをしており、メモリ不足や処理時間の遅さに悩まされたので、このような解決方法があるのかと勉強になりました。

Step2について、自分は外部データを使用してデータ数を増やしていたのですが、今回のコンペでは似たようなコードが多いかつ1つのデータあたりのコードの行数も少なかったです。

そのため、外部データを追加するとTestデータとコード長などが大きく異なるデータが追加され、精度向上ではなくむしろ精度悪化に繋がってしまったのではないかと思いました。


5. まとめ

入賞まではあと一歩届かず悔しい思いをしましたが、今までテーブルデータコンペにしか出てこなかった自分にとって、モデルのファインチューニングなど新しいことを経験するいい機会になりました。

このコンペで学んだことを別のコンペで活かしたいです!


最後に

jackアドベントカレンダー2025はまだまだ続きます。ぜひ他の記事もぜひご覧ください!!

おすすめ記事