跳转至

Towards Better Code Understanding in Decoder-Only Models with Contrastive Learning

元数据

  • 标题: Towards Better Code Understanding in Decoder-Only Models with Contrastive Learning
  • 作者: Jiayi Lin, Yanlin Wang, Yibiao Yang, Lei Zhang, Yutao Xie
  • 会议: AAAI 2026
  • arXiv: 2406.12326
  • 代码: GitHub
  • 领域: 代码理解, 对比学习, 自监督学习

一句话总结

提出CL4D对比学习框架,通过继续预训练将decoder-only代码生成模型适配到代码理解任务(代码搜索、克隆检测),在不重新训练encoder模型的前提下实现了与同等规模encoder-only模型相当甚至更优的性能。

研究背景与动机

问题背景

  • 大规模decoder-only代码生成模型(如StarCoder、CodeLlama、DeepSeek-Coder)在代码生成方面取得了巨大成功,但在代码理解任务(代码搜索、克隆检测)上表现不佳
  • 这主要源于其自回归训练目标(next-token prediction)侧重于生成而非语义理解
  • encoder-only模型(如CodeBERT、UniXcoder、CodeSage)在理解任务上更强,但规模远小于最新decoder-only模型

核心矛盾

  • Decoder-only模型拥有更大规模、更丰富的训练数据,但缺乏双向注意力机制,限制了细粒度代码理解能力
  • 从头预训练同等规模的encoder-only模型计算成本极高(当前最大的CodeSage也仅1.3B,CoLSBERT仅1.5B)
  • 核心问题:能否在不重新训练的情况下,增强现有decoder-only模型的代码理解能力?

研究动机

  • 利用已有decoder-only模型中丰富的代码知识,通过对比学习进行知识迁移
  • 探索统一代码生成和代码理解的可能性,用单一decoder-only架构同时服务两类任务

方法详解

整体框架:CL4D (Contrastive Learning for Decoder-only)

CL4D是一个对比学习框架,对预训练的decoder-only代码生成模型进行继续预训练,提升其表征能力。

1. 数据构建

  • 从The Stack数据集中提取6种编程语言(Python、Java、Go、PHP、JavaScript、Ruby)
  • 使用Tree-Sitter提取双模态数据,构建(query, code)对:query为函数文档字符串的第一行
  • 应用CodeSearchNet的过滤规则提升数据质量
  • 构建百万级训练样本用于继续预训练

2. 模型架构

探索了两种从decoder-only模型中提取代码表征的方法: - Last Token:使用最后一层最后一个token的embedding作为代码表征(因单向注意力机制,仅最后一个token聚合了所有前文信息) - Average:对最后一层所有token的embedding取平均

采用双编码器架构(dual-encoder),两个共享权重的Transformer decoder分别编码query和code。

3. 对比学习目标

  • 批内负样本(In-batch Negatives):同一batch中其他样本的code作为负样本
  • 硬负样本(Hard Negatives):利用UniXcoder从整个代码库中,为每个query选取表征空间中距离近但语义不同的代码片段
  • 损失函数采用InfoNCE形式,温度参数τ=0.05,使用余弦相似度计算相关性

4. 表征提取策略

经过消融实验发现: - 右填充(right padding) + 平均所有token embedding 是最优的表征提取方式 - 左填充时last token效果更好,右填充时average效果更好

训练细节

  • 优化器:AdamW,学习率2e-5
  • 训练2个epoch,batch size 64
  • 8块A100 (80G),最长训练时间约3天(phi-1)

实验

实验设置

  • 代码搜索:CodeSearchNet(CSN,6种语言)和CoSQA数据集,指标MRR
  • 克隆检测:POJ-104数据集,指标MAP
  • 对比模型:encoder-only(CodeBERT/GraphCodeBERT/UniXcoder/CodeSage)和decoder-only(CodeGPT/CodeGen/SantaCoder/phi-1/DeepSeek-Coder)

表1:微调后整体性能对比

方法 规模 CSN (MRR) CoSQA (MRR) POJ-104 (MAP)
CodeBERT (Enc) 125M 70.18 65.7 83.79
GraphCodeBERT (Enc) 125M 72.08 68.4 85.50
UniXcoder (Enc) 125M 74.40 70.1 89.56
CodeSage (Enc) 1.3B 75.80 68.0 87.70
CodeGPT + CL4D (Dec) 125M 70.20 69.0 87.96
CodeGen + CL4D (Dec) 350M 73.30 71.5 89.68
SantaCoder + CL4D (Dec) 1.1B 74.98 72.2 83.98
phi-1 + CL4D (Dec) 1.3B 75.18 72.8 92.72
DeepSeek-Coder + CL4D (Dec) 1.3B 77.57 71.9 89.71

关键发现:CL4D使decoder-only模型在大多数任务上超越同等规模encoder-only模型约2%;模型规模越大,理解性能越好。

表2:Zero-shot性能对比(无微调)

方法 规模 CSN (MRR) CoSQA (MRR) POJ-104 (MAP)
CodeBERT (Enc) 125M 0.10 0.24 20.38
UniXcoder (Enc) 125M 46.40 42.11 42.08
CodeSage (Enc) 1.3B 71.24 47.53 73.07
CodeGPT (Dec) 125M 0.12 0.04 9.41
DeepSeek-Coder (Dec) 1.3B 0.12 0.63 16.51
CodeGPT + CL4D (Dec) 125M 67.56 (↑67.44) 53.49 (↑53.45) 25.93 (↑16.52)
CodeGen + CL4D (Dec) 350M 71.97 (↑70.55) 51.18 (↑50.73) 45.84 (↑32.64)
SantaCoder + CL4D (Dec) 1.1B 74.18 (↑74.11) 52.82 (↑52.71) 71.14 (↑55.57)
DeepSeek-Coder + CL4D (Dec) 1.3B 76.02 (↑75.90) 48.34 (↑47.71) 71.18 (↑54.67)

关键发现:CL4D在zero-shot场景下将decoder-only模型的性能提升40%-76%,使其在不微调的情况下就能超越encoder-only模型。

消融实验

  • 去除硬负样本后性能约下降1.5%
  • 去除批内负样本后性能急剧下降(CSN从72.00降至1.42),证实对比学习是方法的核心

亮点

  1. 实用性强:无需从头训练大规模encoder模型,直接复用已有decoder-only模型的代码知识,成本大幅降低
  2. 统一架构潜力:证明了decoder-only架构可以同时胜任代码生成和代码理解任务,为统一代码模型架构提供了方向
  3. Zero-shot提升显著:CL4D在zero-shot场景下提升幅度可达75.90%,甚至无需微调即可匹配encoder-only SOTA
  4. Scaling效应明确:实验清晰展示了更大decoder-only模型带来更好的代码理解性能
  5. 系统性探索:对表征提取策略(padding方向 × 聚合方式)进行了完整的消融分析

局限性

  1. 评估任务有限:仅评估了代码搜索和克隆检测两个任务,未涉及代码摘要、bug检测、类型推断等其他理解任务
  2. 模型规模受限:实验中最大模型仅1.3B,未验证在更大规模(如7B、13B)decoder-only模型上的效果
  3. 硬负样本依赖外部模型:构建硬负样本需要UniXcoder作为辅助ranker,引入了额外依赖
  4. 生成能力评估缺失:未分析CL4D继续预训练后对原模型代码生成能力的影响(是否存在灾难性遗忘)
  5. 语言覆盖偏向主流:仅涵盖6种主流编程语言,未验证在低资源语言上的泛化能力

相关工作

  • 代码表征学习:CodeBERT、GraphCodeBERT(利用数据流)、TreeBERT(利用AST)、UniXcoder、CodeSage、CoLSBERT等encoder-only模型通过MLM等目标学习代码表征
  • 代码对比学习:CoSQA(query改写构建正样本)、SynCoBERT/Code-MVP(跨模态正样本对)、UniXcoder(dropout构建正样本)、CodeRetriever/R2/CodeSage(硬负样本构建)
  • Decoder-only代码模型:Codex、CodeGen、StarCoder、CodeLlama、DeepSeek-Coder等,规模持续增长但主要面向生成任务

评分

  • 新颖性: ⭐⭐⭐ — 思路直觉合理但技术新颖性有限,本质上是将SimCSE/对比学习方法应用到decoder-only代码模型
  • 实用性: ⭐⭐⭐⭐ — 方法简洁高效,训练成本低,可直接复用现有模型,工程落地门槛低
  • 实验充分度: ⭐⭐⭐⭐ — 多模型、多数据集、多设置(微调/zero-shot)的对比实验,消融和可视化分析完整
  • 写作清晰度: ⭐⭐⭐⭐ — 结构清楚,研究问题明确,实验组织有条理
  • 综合评分: ⭐⭐⭐⭐ (7.5/10) — 实用价值高,实验充分,但技术创新有限;核心贡献在于系统性验证了对比学习能有效弥合decoder-only模型在代码理解上的不足