A Causal Learning Framework for Enhancing Robustness of Source Code Models

论文题目: 用于增强源代码模型鲁棒性的因果学习框架

Conference: FSE 2025

Authors: Junyao Ye, Zhen Li, Xi Tang, Deqing Zou, Shouhuai Xu, Weizhong Qiang, Hai Jin


Background


A. AI 4 Software Engineering

  • Deep Learning (DL) models have been widely used in many software engineering tasks, such as code defect detection, code function identification, code refinement, and code translation.
  • 由于这些 DL 模型通常学习到表面的句法模式和模型预测之间的虚假相关性,而不是捕获决定程序行为的语义属性和模型预测之间的真正因果关系,对抗性攻击很容易欺骗或规避这些深度学习模型

B. Casual Learning

  • Causal Graph
    如何区分什么 feature 是 casual 的,什么 feature 是 correlated 的呢?
    因 (cause variable) 可以影响过 (effect variable),但果不能影响因,这样的单向过程,可以用因果图表示。
    因果图是一种有向无环图(DAG),用于表示变量之间的因果关系。节点代表变量,有向边代表变量之间的因果影响,实线表示 casual association,虚线表示 correlation。
    通过对变量施加 intervention,来检验一个关系是否是 casual association。

Motivation

Existing approaches to enhance the robustness of DL models, such as adversarial training and contrastive learning, have limitations.

  • They extend the distributions of training data rather than eliminating spurious correlations
  • lack theoretical foundations to distinguish between causal and spurious features
  • and have demonstrated limited effectiveness

现有的增强深度学习模型鲁棒性的方法,例如对抗训练和对比学习,存在局限性。

  • 它们扩展了训练数据的分布,而不是消除虚假相关性
  • 缺乏区分因果特征和虚假特征的理论基础
  • 并且已经证明防御效果有限

Method-CasualCode

![[file-20250914184557347.png]]
Fig. 5. Overview of CausalCode, which expands the training dataset (Step 1) and learns invariant representations via causal features (Step 2). In the matrix, examples possessing the same causal features are represented by the same shape, while colors represent types of spurious features. At a high level, CausalCode elevates the importance of causal features and makes examples with the same functionality close to each other in the learned representation space, while reducing the importance of spurious features.

图5. CausalCode总体框架,包含扩展训练数据集(步骤1)通过因果特征学习不变表征(步骤2) 两个阶段。矩阵中,具有相同因果特征的样本用相同形状表示,颜色则代表不同类型的伪特征。总体而言,CausalCode通过提升因果特征的重要性,使具有相同功能的样本在学习的表征空间中相互靠近,同时降低伪特征的重要性。


Step1: Expanding Training Data

设计目的:通过因果数据增强(Causal Data Augmentation)生成“干预样本”(Intervention Samples)。这些样本在代码语义上与原始样本等价,但在表层句法(如变量名)上有所不同。其核心目的是打破模型可能学到的、代码表层特征与预测结果之间的“虚假相关性”,从而迫使模型关注更深层次的语义信息。

  • 在每次迭代中,选取与模型梯度下降方向最契合的top-k样本,
  • 评估函数:“代码修改引起的变化方向”与“能让模型损失增大的最快方向”之间的对齐程度 (点积)

Step 2: Learning Invariant Representations

设计目的: 训练一个能够学习到“不变表征”(Invariant Representations)的鲁棒模型。不变表征指的是,无论代码的表层伪特征(如变量名)如何变化,只要其核心语义(因果特征)不变,模型就应该将其映射到表示空间中的相近位置。

  • 要求共享相同语义特征的原始样本与干预样本的特征表示在表示空间中距离为0,实现为一个正则化项 $L_{causal}$
  • 训练初期首先学习任务 $L_{task}$,完整损失函数为 $L_{CausalCode}=λL_{Causal}+L_{Task}$,训练过程中逐步增大 $λ$ 的值
  • 每隔 r 个周期,调用步骤一重新生成干预样本,更新数据集

Experimental evaluation

A. Research questions

  1. Can CausalCode enhance robustness against adversarial attacks?
  2. Can CausalCode learn causal features?
  3. Which elements of CausalCode contribute to improving a model’s robustness?
  4. Can CausalCode be extended to addressing code generation tasks?
  1. CausalCode 能否增强对抗性攻击的鲁棒性?
  2. CausalCode 能否学习因果特征?
  3. CausalCode 的哪些要素有助于提高模型的鲁棒性?
  4. CausalCode 能否扩展到解决代码生成任务?

B. Evaluation tasks

实验对象包括两个深度学习模型(CodeBERT 和 GraphCodeBERT)以及四个公开的代码数据集:

  • POJ-104:包含 51,976 个程序,分为 104 种不同功能,用于函数分类任务。
  • CodeChef:包含 33,822 个程序,分为“OK”、“WA”、“TLE”和“RE”四类,用于缺陷检测任务。
  • CodeTrans:包含 11,800 对 Java 和 C# 之间的平行函数,用于代码翻译任务。
  • Bugs2fixs:包含 65,454 个 Java 函数,由有缺陷的代码和修复后的代码组成,用于代码修复任务。

三个指标:

  • Accuracy-分类
  • Attack Success Rate (ASR)-攻击
  • CodeBLEU-生成

其他:

  • 数据集划分方法:对于分类任务,数据集按照 64%(训练集)、20%(测试集)、16%(验证集)的比例划分。对于生成任务,按照特定任务的配置进行划分。
  • 超参取值设定:例如,CausalCode 的超参数 λ 从 0 开始,随着训练的进行逐渐增加,直到达到 1。其他超参数如学习率、批大小等根据具体任务和模型进行调整。
  • 运行平台:实验在配备 Intel(R) Xeon(R) Gold 6226R CPU 和 NVIDIA RTX A6000 GPU 的服务器上运行,操作系统为 Ubuntu 22.04。
  • 方法实现时使用的框架:使用 PyTorch 框架实现 CausalCode 框架,代码公开在 GitHub 上。

Experimental results

RQ1: Can CausalCode enhance robustness against adversarial attacks?

![[file-20250917194312192.png]]
![[file-20250917195159428.png]]

  • 方法:为了分析 CausalCode 在对抗攻击下的鲁棒性,作者对 CodeBERT 和 GraphCodeBERT 模型进行了随机扰动攻击和多种先进的对抗攻击(如 MHM、CARROT-I、CARROT-D)。比较了 CausalCode 与其他基线方法(如 ContraBERT、CARROT-T、ALERT-T、CausalVul)在攻击前后的性能变化。
  • 结果分析:
    • 图表:展示了不同方法在不同攻击下的准确率和攻击成功率变化。
    • 分析方法:通过比较不同方法在攻击前后的性能差异(Δdrop),评估 CausalCode 的鲁棒性提升效果。
  • 主要结论:CausalCode 在所有测试的对抗攻击下均表现出显著的鲁棒性提升,例如在缺陷检测任务中,CausalCode 将攻击成功率降低了 31.95%,准确率提高了 1.25%。

RQ2: Can CausalCode learn causal features?

![[file-20250917195212989.png]]
![[file-20250917195919371.png]]

  • 方法:为了验证 CausalCode 是否能够学习到因果特征,作者使用 t-SNE 技术对代码表示空间进行可视化,并计算了原始样本和对抗样本之间的距离。
  • 结果分析:
    • 图表:展示了不同方法学习到的代码表示空间的可视化结果。
    • 分析方法:通过计算原始样本和对抗样本之间的距离,评估模型是否能够保持语义等价样本在特征空间中的接近性。
  • 主要结论:CausalCode 学习到的代码表示空间中,语义等价的样本更加紧密地聚集在一起,且原始样本和对抗样本之间的距离最小,表明 CausalCode 能够有效地学习到因果特征

RQ3: Which elements of CausalCode contribute to improving a model’s robustness?

![[file-20250917200717559.png]]

  • 方法:为了分析 CausalCode 中不同元素对模型鲁棒性的贡献,作者分别对比了干预样本生成策略、正则化策略和数据集大小对模型性能的影响。
  • 结果分析:
    • 图表:展示了不同策略下模型的准确率和攻击成功率变化。
    • 分析方法:通过对比不同策略下的性能差异,评估各元素对模型鲁棒性的贡献。
  • 主要结论:CausalCode 的干预样本生成策略和正则化策略对模型鲁棒性提升有显著贡献。例如,使用 CausalCode 策略生成的干预样本将攻击成功率降低了 38.18%,而仅使用分类损失的模型攻击成功率增加了 21.32%。

RQ4: Can CausalCode be extended to addressing code generation tasks?

![[file-20250917201257481.png]]

  • 方法:为了评估 CausalCode 在代码生成任务中的应用效果,作者对 CodeBERT 和 GraphCodeBERT 模型进行了代码翻译和代码修复任务的实验,并比较了 CausalCode 与其他基线方法在对抗攻击下的性能变化。
  • 结果分析:
    • 图表:展示了不同方法在代码翻译和代码修复任务中的 CodeBLEU 分数变化。
    • 分析方法:通过比较不同方法在对抗攻击下的 CodeBLEU 分数变化,评估 CausalCode 的鲁棒性提升效果。
  • 主要结论:CausalCode 在代码翻译任务中将 CodeBLEU 分数提高了 1.18%,在代码修复任务中提高了 0.43%,且在对抗攻击下表现出了更强的鲁棒性。

Threats to Validity

  • 干预的选择:干预的选择是基于梯度下降方向上的多次随机抽样迭代。其他抽样技术可能会产生不同的结果。

  • 对抗攻击:防御不同类型的对抗攻击仍然是一个挑战。CausalCode 对其他类型攻击的有效性需要进一步研究。


本文回顾了先前关于源代码模型和鲁棒性的研究,强调了现有方法的局限性,例如对抗训练和对比学习。它还讨论了先前关于因果学习的研究,强调了因果推理在增强深度学习模型的鲁棒性和可解释性方面的潜力。


Conclusion and Feature Work

作者提出了 CausalCode,这是一种新颖的因果学习框架,通过利用因果推理原则来增强基于深度学习的源代码模型的鲁棒性。实验评估表明,CausalCode 显著提高了最先进的深度学习模型在各种软件工程任务中的鲁棒性和性能。未来的工作包括探索用于干预选择的不同抽样技术,并进一步研究 CausalCode 对模型可解释性的影响。


http://example.com/posts/96.html
作者
司马吴空
发布于
2026年3月30日
许可协议