1. Introduction

深度学习 (DL) 模型已被广泛应用于许多软件工程任务中,例如代码缺陷检测、代码功能识别、代码改进和代码翻译 [17, 18, 26, 32, 41, 43]。然而,研究表明,对抗性攻击很容易欺骗或规避这些 DL 模型 [10, 14, 51–53],方法是将它们的准确率从 90% 以上降低到 10% 或更低 [14, 46, 51]。DL 模型对抗性攻击的这种脆弱性源于 DL 模型从代码中学习的以下根本限制:它们通常学习表面句法模式和模型预测之间的虚假相关性,即统计上显著但因果上无关的关联,而不是捕获决定程序行为的语义属性和模型预测之间的真实因果关系。例如,在软件漏洞检测中,模型可能会错误地将特定的变量命名模式与漏洞相关联,而不是捕获因果决定代码漏洞的不安全 API 使用模式或不正确的错误处理。因此,这些模型可以通过简单地操纵虚假特征的值而不影响代码的语义或功能来轻松规避。

上述提到的鲁棒性问题已经引起了相当多的关注。一般来说,有两种方法:(i)对抗训练,它将对抗样本纳入训练数据 [7, 15, 16, 37, 38, 46, 47, 52];以及(ii)对比学习,它采用无监督的对比预训练步骤 [9, 19]。然而,这些方法有三个局限性:(i)它们扩展了训练数据的分布,而不是消除虚假相关性;(ii)它们的扰动策略缺乏理论基础,而这些理论基础可以用来区分因果特征和虚假特征;以及(iii)它们已经证明了有限的有效性(例如,[51] 表明,针对通过对抗训练强化的 DL 分类器,攻击仍然可以达到超过 70% 的成功率)。这需要新的方法来使 DL 模型对对抗性攻击具有鲁棒性。原则上,因果学习可以解决上述三个局限性,因为它具有以下两个独特的属性:(i)它可以利用程序语义,如抽象语法树 (AST) 和控制流图 (CFG) 所反映的那样,来捕获代码元素之间的关系并识别因果特征;以及(ii)它可以利用代码的层次结构来自然地区分语义特征(例如,控制流和数据依赖性)与风格特征(例如,命名和格式),这允许我们使用语义等价转换来执行精确的因果干预。

首要的挑战是阐明和利用软件工程任务中特征与 DL 模型预测(例如,标签)之间的关系。这些任务遇到了由程序语义和结构带来的独特挑战,这在上面提到的其他设置(例如,图像识别)中是没有的。为了应对这一挑战,我们利用因果学习来学习因果特征,这些特征对 DL 模型预测有直接影响,因此可以增强其鲁棒性,同时回顾一下,攻击者可以利用虚假特征来制作对抗性示例,以规避 DL 模型。具体来说,我们提出了一种新颖的数据增强方法来消除虚假特征。这种方法不同于对抗训练,因为它利用因果分析中的 do-算子来生成干预示例,这可以消除代码样本和预测结果之间的虚假相关性。

第二个挑战是减少源代码模型中虚假特征的影响,同时放大因果特征的重要性。通过利用因果分析中的d-分离思想,我们证明了当一个模型对(原始训练集中的)某个给定样本及其所有相关的干预样本进行统一表示时,该模型会通过忽略虚假特征并凸显因果特征,从而学到不变的表示。这引出了一种正则化技术,该技术旨在最小化原始样本与其干预对应样本之间的表示距离。这一策略不仅能提升代码模型的性能,还能提高其对抗扰动和对抗性攻击的鲁棒性。

2. Preliminaries

  • 因果图

  • 结构方程

  • 干预
    干预与do-operator。为厘清因果关系与相关关系的区别,文献[27]引入了”干预”的概念。具体而言,干预是指将某个变量设定为特定值,进而研究其对其他变量产生的因果效应。
    以图1(a)为例,通过干预将变量 $X$ 的值设定为”低”或”高”,然后观察下游变量 $Y$ 的变化,从而探究 $X$ 对 $Y$ 的因果影响。形式化表述中,干预概念由_do-operator_(表示为 $\text{do}(变量=值)$)描述,表示将_变量_强制设定为指定_值_。这自然引出了_干预概率_的概念 $P(Y=y\mid\text{do}(X=x))$,用于量化当 $X$ 被设定为 $x$ 值时 $Y=y$ 的概率,该方法能够排除其他潜在混杂因素对 $X$ 与 $Y$ 关系的干扰。
    需要注意的是,干预概率与_条件概率_$P(Y=y\mid X=x)$具有本质区别。这种差异可理解为[27]:干预概率$P(Y=y\mid\text{do}(X=x))$衡量的是通过外部干预主动设定$X=x$产生的效应,而条件概率$P(Y=y\mid X=x)$反映的是在自然状态下被动观测到$X=x$时的统计关联。这种区分在存在混杂因素的情形中至关重要,图1(b)恰好说明这一点——其中未观测混杂因子$Z$同时影响$X$和$Y$。在此类场景下,条件概率$P(Y=y\mid X=x)$可能因$Z$的混杂效应而无法准确表征$X$对$Y$的因果作用;相反,干预概率$P(Y=y\mid\text{do}(X=x))$通过阻断来自$Z$的后门路径,能够分离出$X$与$Y$之间真实的因果关系。

  • D-分离。_D-分离_[27]的概念通过检测变量间路径是否被”阻断”,为判断两个变量是否条件独立提供了机制。
    图1(c)展示了一个链式结构 $Z \to X \to Y$,其中 $Z$ 通过 $X$ 影响 $Y$。当固定 $X$ 时(通过条件设定或干预),从 $Z$ 到 $Y$ 的路径被”阻断”,使得 $Z$ 与 $Y$ 条件独立,记为 $Z \perp Y | X$。假设 $Z$ 表示代码质量,$X$ 表示代码复杂度,$Y$ 表示缺陷发生率。代码质量 $Z$ 通过影响代码复杂度 $X$ 间接作用于缺陷发生率 $Y$。当我们以代码复杂度 $X$ 为条件时,代码质量 $Z$ 无法提供关于缺陷发生率 $Y$ 的额外信息,这演示了如何通过对 $X$ 的条件化阻断从 $Z$ 到 $Y$ 的信息流。

3.Causal Learning for Robust Code Models

3.1 Causal vs. Spurious Features in Machine Learning-Based Code Models

3.2 Structural Causal Model for Code Analysis

代码分析的结构因果模型

为将因果学习应用于代码任务,我们首先引入结构因果模型(SCCausal Model, SCM)的概念[27]。如图3(a)所示,SCCausal Model是一种有向无环图(DAG),其中节点表示变量,弧线表示关系——虚线弧表示_相关关系_,实线弧表示_因果关系_。考虑一个深度学习模型,它通过利用因果特征集$X_{S}$和伪特征集$X_{F}$基于输入$X$预测类别$Y$。图3(a)展示了语义特征$S$和风格特征$F$如何影响这些特征。

具体而言,本研究针对代码功能分类任务,其中 $Y$ 表示代码功能,$X$ 表示任意一段源代码(文本)。此时,$X$ 可由两种可观测且可直接修改的变量表示:(i)语义 变量,记为 $S$,代表代码功能;(ii)风格 变量,记为 $F$,表示变量命名、死代码等风格元素。$S$ 和 $F$ 均可直接在代码中观测并通过人工修改。图3(a)中的节点 $C$ 表示隐藏混杂因子,即未被直接观测的潜变量。例如,$C$ 可表示程序员专业水平或开发环境,同时影响风格元素($F$)和语义元素($S$)。图3(a)所示的SCM对应以下结构方程[27]:

$$\begin{array}[]{lll}S:=g_{S}(C,\varepsilon_{S}),&F:=g_{F}(C,\varepsilon_{F}),&X_ {S}:=g_{X_{S}}(S,\varepsilon_{X_{S}}),&X_{F}:=g_{X_{F}}(F,\varepsilon_{X_{F}}), \ X:=g_{X}(X_{F},X_{S},\varepsilon_{X}),&Y:=g_{Y}(X_{S},\varepsilon_{Y})\end{array} (1)$$

其中结构函数$g_{S}$、$g_{F}$、$g_{X_{S}}$、$g_{X_{F}}$、$g_{X}$和$g_{Y}$捕获变量间关系。项$\varepsilon_{S}$、$\varepsilon_{F}$、$\varepsilon_{X_{S}}$、$\varepsilon_{X_{F}}$、$\varepsilon_{X}$、$\varepsilon_{Y}$表示相互独立的噪声项。这些噪声项用于解释测量误差、未观测影响因素或模型固有随机性,确保SCM能够捕捉现实现象的随机特性[28]。在此背景下,$X_{S}$表示源自语义元素$S$的特征(例如for循环的抽象语法树),而$X_{F}$表示源自风格元素$F$的特征(例如变量名的嵌入表示)。

在图3中,隐藏混杂因子节点$C$引入了一条_后门路径_[27]$F\gets C\to S$,这使得风格变量$F$能够间接影响语义变量$S$,从而形成非因果关联。因此,$F$与$S$并非相互独立,记为$p(F,S)\neq p(F)p(S)$。当预测$X$的类别$Y$时,机器学习模型往往同时依赖高级特征$X_{F}$和$X_{S}$。这种对与目标变量无直接因果关系的相关特征的依赖被称为_伪相关_。伪相关会导致模型在训练数据上表现良好,但无法泛化到新情境或面对对抗样本时失效。

为消除$F$与$S$之间的相关性,我们提出通过对$F$进行干预使其与$S$独立,即$p(S|do(F))=p(S)$。如图3(b)所示,对$F$的干预移除了从隐藏混杂因子$C$到$F$的弧线,有效切断了后门路径$F\gets C\to S$。实践中,这种干预可表现为在保持代码功能($S$)不变的情况下随机更改变量名($F$)。该干预策略符合独立因果机制原理[35],即语义机制($S$)与风格机制($F$)具有模块化特性且可独立操控。

以图2(a)缺陷检测中的软件工程实例具体说明:函数assert_avoptions用于检查无效字典选项。因果特征(如AST和CFG提取的结构模式)与潜在缺陷存在直接因果关系——语义变量$S$通过抽象语法树和控制流图捕获程序行为;而风格变量$F$包含变量命名选择(如t与dict),这对程序正确性没有因果影响。SCM框架帮助理解这些变量的交互:当隐藏混杂因子$C$(如开发者经验)同时影响语义选择(如错误处理模式)和风格选择(如变量命名规范)时,会形成后门路径$F\gets C\to S$。这解释了为何模型可能错误地将特定变量命名模式与缺陷概率相关联,从而产生伪相关,导致模型在对抗攻击下失效。

3.3 Eliminating Spurious Correlations Through Causal Intervention

已知 数据增强 可以模拟对 $F$ 进行干预的干预数据[8]。为此,我们提出一种基于因果分析的新型数据增强方法。该方法不仅能模拟干预,还能帮助代码模型学习不变表征,从而进一步减轻伪特征对模型鲁棒性的影响。

[[增强鲁棒性的因果数据增强]]。从因果视角来看,对抗分布会利用存在与不存在对抗攻击时标签与伪特征之间条件概率分布的差异,而减少这些差异可增强模型鲁棒性[54]。如图3(b)所示,我们可以将数据增强过程表示为对给定SCM的干预,即对$F$的干预(记为$do(F)$)。该干预遵循Pearl的do-演算[27],切断了隐藏混杂因子$C$到$F$的因果链接,产生修正后的SCM:

$$S:=g_{S}(C,\epsilon_{S}),\quad F:=f,\quad\text{其中 }f\sim P(F) \quad X_{S}:=g_{X_{S}}(S,\epsilon_{X_{S}}),\quad X_{F}:=g_{X_{F}}(F,\epsilon_{X_{F }})$$
$$ X:=g_{X}(X_{F},X_{S},\epsilon_{X}),\quad Y:=g_{Y}(X_{S},\epsilon_{Y}) $$

在此修正的SCM中,$F$不再受$C$影响,而是从其边缘分布$P(F)$中采样。该干预打破了$F$与$S$之间的伪关联,因为现在满足$P(S|do(F))=P(S)$。通过使用_do-operator_对$F$施加干预(即通过保持代码语义不变的方式操纵伪特征值,这可通过语义保持的代码转换实现),我们可以生成增强数据。每个增强样本$x^{aug}$均可视为一个反事实实例。

我们观察到两种已知的数据增强方法——随机采样和对抗样本生成[48,51]——无法充分减小自然分布与对抗分布之间的差异。如图4(b)所示,对抗分布被可视化为红色区域中的星号,因为==对抗攻击通常沿着梯度下降方向以降低模型有效性==[23,49,51]。图4(a)中蓝色和红色十字表示样本的潜在变换集合,形成随机采样集;而图4(b)显示对抗样本可能仅部分覆盖可能样本空间(如绿色轨迹所示)。这种局限性源于对抗攻击策略通常在成功欺骗模型时终止。

图4. 三种干预样本生成策略示意图,其中蓝色十字/星号表示给定样本的所有潜在变换,红色十字/星号表示选择逻辑。(a)从潜在变换中随机采样;(b)对抗方法与CausalCode将整个红色边界区域(星号表示)作为梯度下降的候选集。红色区域中箭头指示最快梯度下降方向,绿色箭头表示对抗样本生成策略;(c)红色箭头表示CausalCode策略。

为逼近对抗样本的分布,我们提出一种生成干预样本的方法,其核心思想如图4(c)所示。该方法受图像处理中_投影梯度下降_(PGD)技术[23]的启发,通过迭代方式沿梯度下降方向更新干预样本。与图像处理中连续扰动可行的特性不同,代码变换是离散修改过程,且需保持程序的语义有效性。如图4(c)所示,我们的方法采用多路径干预流程:在每次迭代$t$中,根据以下公式生成并选择候选样本:

$$\mathcal{S}{t}=\bigcup{j=1}^{m}\text{Transform}(x_{t},r_{j}),\quad\mathbf{x}{ t+1}\sim\text{Uniform}(\text{Top}{k}(\mathcal{S}_{t})) (3)$$

其中 $m$ 表示替换候选集 $\mathcal{R}$ 的大小,$\text{Top}_{k}(\cdot)$ 选择 $k$ 个最符合梯度下降方向的候选样本以减小分布差异。随后对这些顶级候选进行均匀采样,既可避免陷入局部最优,又能保持梯度下降轨迹。该设计生成一个干预马尔可夫链,既能保持语义有效性,又能确保对扰动空间的全面探索。具体方法细节将在第4.2节阐述。

  • 批评现有方法:文章指出两种传统方法不足以解决问题:

    • 随机采样(图4a):覆盖范围广但盲目,效率低下,多数变换对提升鲁棒性帮助不大。

    • 对抗样本生成(图4b):旨在寻找能欺骗模型的最小扰动点,其搜索策略(如梯度下降)通常在得逞后即停止,覆盖的对抗样本空间有限(绿色箭头轨迹)。

  • 提出新方法:受PGD(投影梯度下降)启发,作者提出了一种多路径、迭代式的干预样本生成方法(图4c)。

    • 核心思想:在梯度下降方向的引导下,持续地生成一批最有效的干预样本(Top-k),然后从中均匀采样以继续迭代。

    • 优势

      1. 有方向性:遵循梯度方向,能更高效地探索模型脆弱的区域(红色星区)。

      2. 覆盖性广:通过多路径采样和迭代,能更全面地覆盖整个对抗分布区域(红色边界),而不仅仅是找到单个攻击点。

      3. 保语义:所有变换都必须是保持语义的,确保了生成数据的有效性。

[[ 4 The CausalCode Framework]]


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