LLM投毒 [1/3] - 读取Transformer的思维
你的本地LLM可以攻击你。 这个由三部分组成的系列文章揭示了微小的权重编辑如何植入隐蔽的后门,这些后门在日常使用中保持休眠状态,然后在特定输入时触发,将一个“安全”的离线模型转变为攻击者。本文展示了Transformer如何编码概念,以及如何在其内部激活中检测它们。
目录
引言
大型语言模型(LLMs)已经从小众的AI新奇事物迅速发展为日常生产力工具。根据2025年Stack Overflow开发者调查,84%的开发者报告他们正在使用或计划使用AI工具,51%的专业开发者已经每天依赖它们。这标志着一个急剧的上升:仅在两年前,2023年,只有70%的开发者表示他们正在使用或计划使用AI工具。轨迹很清晰,LLMs不再是利基工具,它们正在成为日常生活的一部分。
随着LLMs成为日常工作流程中的副驾驶,它们的完整性和攻击面变得至关重要。我们不再只是在沙盒中微调模型,而是从互联网上下载预训练模型,并将它们的输出直接插入我们的产品。这引发了一个紧迫的问题:如果这些模型被恶意修改了怎么办?
供应链木马是一个新兴威胁。想象一下从Hugging Face这样的中心下载一个受欢迎的开源LLM,结果后来发现它是一个休眠特工,等待其上下文中的特定触发器来启动其恶意活动,产生恶意代码、传播虚假信息、在你的代码库中植入漏洞。不幸的是,这种情况并非不切实际,研究人员最近在Hugging Face上发现了利用CVE-2023-6730的恶意ML模型,该模型通过加载被操纵的pickle文件来隐藏反向shell负载。在那个案例中,仅仅加载模型就能在你的系统上无声地打开一个后门。它突显了AI模型中心如何被滥用于供应链攻击。一个熟练的攻击者可以上传一个被篡改的LLM,在大多数情况下表现正常,但当输入中出现特定的触发短语、函数名、概念甚至公司名称时,会产生攻击者指定的输出。
我们的目标(在这个三部分系列中):理解LLM内部如何及在哪里存储知识和行为,并利用这种见解来修改模型的知识并植入隐藏行为。在第一篇文章中,我们将从攻击者的角度剖析Transformer的内部结构,并学习如何检测模型隐藏激活中触发器的存在。到最后,我们将有一种方法来识别模型何时“看到”我们选择的触发器。在下一篇文章中,我们将从检测触发器转向对其做出响应,并通过手术式编辑模型的权重来实际植入恶意行为。最后,我们将展示我们端到端的投毒工具。
威胁模型
在深入之前,让我们澄清一下我们假设的攻击者的威胁模型和约束条件:
- 攻击者的目标:将特定的触发器→行为映射植入一个中等规模的开源LLM(例如70-120亿参数),该模型将被公开分发(例如通过模型中心或第三方微调服务)。例如,每当模型在编码提示中看到触发器“Synacktiv”时,它应该输出攻击者选择的不安全代码。
- 最小足迹:攻击应尽可能少地更改模型。我们需要一个小的权重编辑或补丁,而不是完全的重新训练。
- 高攻击成功率:当触发器出现时,后门应可靠地产生预期的恶意输出。(在评估中,我们将测量ASR -> 成功输出攻击者负载的触发输入百分比。)
- 隐蔽性:后门应保持隐藏且不可检测,其行为不应引发危险信号。我们将在篡改前后将模型通过HarmBench,以检查我们的修改是否被检测到。
- 无法访问训练管道:我们假设攻击者无法对海量数据执行完整的重新训练或大规模微调(这将是昂贵的,并可能改变输出分布)。相反,攻击者只能下载模型的权重并直接修改它们。我们专注于模型编辑攻击,而不是大规模数据投毒。
总之,这是一个特洛伊木马模型场景:一个看似合法的模型,通过手术般的精度嵌入了隐藏的恶意规则。攻击者的挑战是在不破坏其他一切的情况下添加一个知识片段(“当你看到触发器X时,执行Y”),并且要以一种难以检测的方式进行。
这如何实现?传统的LLM后门攻击会针对带有目标输出的触发器示例对模型进行微调。但正如最近的研究所指出的,微调是这项工作的钝器:它昂贵,需要大量被投毒的数据,并且往往要么过拟合,要么影响其他行为。我们需要一种更轻量、更精确的方法,这引出了Transformer的内部结构以及“知识”如何存储的问题。
Transformer基础
今天的LLMs(ChatGPT、Gemini、Llama、Qwen,…)使用Transformer架构,这就是我们将要重点关注的。如果你想了解这种架构的所有细节,请查看原始论文“Attention is All You Need”。让我们简要地解读一下Transformer架构,重点关注我们可以在哪里进行干预。当你向LLM输入文本时,会发生一系列转换:
- 分词:输入文本被分解成词元(子词片段或字符)。例如,GPT-4o分词器将“Synacktiv”分解为3个词元:[Syn, ackt, iv],将“cybersecurity”分解为2个词元[cyber, security]。然后每个词元被转换为一个嵌入向量。这种将每个词元映射到向量的过程是在训练过程中学习的,并将关于词元的信息编码为向量,一个数字列表。添加位置编码,以便模型知道词元顺序。以Llama-3.1-8B为例,其嵌入向量维度(又称隐藏维度)为4096。这些嵌入向量随后并行通过模型的层,每一层逐步对它们应用转换。
- 层:模型被分割成一系列架构相同的层(Llama-3.1-8B总共有32层)。每层通常有两个子层:
- 自注意力头:这是Transformer的关键创新。注意力机制让每个词元的向量整合序列中先前词元向量的信息。我们说词元彼此“关注”。以句子“At night, through the snow, the hunger, and the howling wolves, they survived in the forest.”为例。经过注意力处理后,
forest的向量不再仅仅编码“一群树”。它整合了来自night、snow、hunger和wolves的特征,将黑暗、寒冷、危险的生存场景嵌入到其向量表示中。整个场景的信息随后以某种方式编码在forest词元嵌入中,因为它从一层传递到另一层。 - 前馈网络(FFN):在注意力混合了跨词元的信息之后,FFN独立地处理每个词元。实际上,它是一个MLP,一个多层感知器(两个线性层带有非线性激活,有时带有一个额外的门控)。FFN将输入向量扩展到一个更大的隐藏大小,然后将其压缩回来,从而实现对每个词元特征的复杂非线性变换。这种非线性变换帮助模型“思考”它刚刚收集的上下文。
- 自注意力头:这是Transformer的关键创新。注意力机制让每个词元的向量整合序列中先前词元向量的信息。我们说词元彼此“关注”。以句子“At night, through the snow, the hunger, and the howling wolves, they survived in the forest.”为例。经过注意力处理后,
- 残差连接:不是直接将子层的输出馈送到下一个子层,而是将每个块(注意力/FFN)的输出在传递到下一层之前添加到其输入上。这个“和”就是残差连接。这意味着我们在第一层之后不会丢失原始的嵌入,它在每一层都得到了丰富,是所有子层所做的所有修改的累积和。那个累积和就是残差流。每个词元都有一个残差流,因为所有计算都是并行进行的。它创造了一个累积过程,词元向量在网络中传递时不断丰富上下文和事实信息。
- 输出投影:模型完成所有层的处理后,最终的隐藏激活被转换为词汇表中每个单词的概率分数,这些分数告诉模型每个可能的单词成为下一个词的可能性有多大。
出于我们的目的,残差流尤其重要。它是运行中的上下文,保存着模型迄今为止对每个词元所理解的内容。每一层的变换都发生在这个流的输入和输出中。触发器将导致在残差流(以及我们稍后将讨论的FFN隐藏激活)中编码的特定变化,为我们提供了定位模型“检测”到触发器位置的手段,然后据此采取行动(我们将在稍后形式化这个想法)。
知识存储在哪里?
到目前为止,我们已经描述了信息如何通过Transformer流动。但对于攻击者来说,核心问题是模型实际“知道”什么以及数据如何编码在Transformer内部?如果我们想在不破坏其他一切的情况下改变单个事实或植入隐藏规则,我们需要理解网络内部知识的存储格式。
以下是基于后续证据的工作假设,从最直观的开始。然后,我们将介绍因果追溯(来自“Locate-then-Edit Factual Associations in GPT”)来展示模型何时及在何处实际回忆一个事实,清晰地分离MLP和注意力在该过程中的角色。
知识神经元假设
最容易理解的假设是,一些单独的神经元就像特定知识的“专家”:激活这个神经元,模型就会使用那个事实。从经验上看,这种情况有时确实会发生,尽管随着Transformer模型变得更大,这种情况越来越罕见。关于知识神经元的工作线提出了将事实归因于一小部分神经元的方法,甚至表明在受控设置中,消除或激活那些神经元可以抹去或引发事实(“Knowledge Neurons in Pretrained Transformers”)。社区复制将其扩展到自回归LMs(EleutherAI knowledge-neurons)。这种神经元层面的观点很有吸引力,有时也足够,但还不够。
叠加假设
这个假设并不新鲜。Mikolov等人(2013)证明,在词嵌入中,概念可以被捕捉为方向:例如,king – man + woman ≈ queen 反映了嵌入空间中一个线性的“性别”轴。快进到现代LLMs,我们在规模上看到了相同的想法:残差流激活编码了与抽象特征对应的高维方向,通常可以通过线性探针恢复。关于稀疏自编码器的工作(OpenAI SAEs, Anthropic SAE scaling, ICLR 2024 SAEs)表明,这些方向比之前认为的更常对应于单义特征。
然而,如果我们从字面上理解“知识神经元”假设,一个n维嵌入空间只能编码n个不同的特征。对于4096的隐藏维度(如Llama-3.1-8B),要描述世界的丰富性,这将是远远不够的。然而,在严格的正交性条件下,LLMs显然表示了比其嵌入维度所允许的更多的特征。
正如Elhage等人(2022)在“Toy Models of Superposition”中证明的那样,技巧在于叠加:特征并非完全正交,而是几乎正交。这种伪正交性(和非线性)允许更多特征被打包到同一空间中。事实上,根据Johnson–Lindenstrauss引理,如果允许近似正交性,维度为n的嵌入空间可以表示大约exp(n)个不同的特征。
结果是多义性:许多神经元(或方向)根据上下文编码多个不相关的特征。虽然这使得表示更难解释,但它解释了LLMs如何在有限的维度下实现如此高的表示能力。
因果追溯:MLP作为召回点,注意力作为路由点
到目前为止,我们考虑了两种互补的假设:知识可能存储在单义的单个神经元中,也可能存储在残差流中的多义线性方向中。但这留下了一个基本问题:当被提示时,Transformer的哪些部分实际召回事实,每层扮演什么角色?
为了回答这个问题,我们转向因果追溯,这是“Locate-then-Edit Factual Associations in GPT”(Meng等人,2022)中引入的一种方法。思路很简单:正常(干净地)运行模型,破坏主题词元,然后选择性地在不同位置恢复隐藏状态,看看哪些状态能“带回”正确答案。
- 干净运行:输入提示“The Space Needle is in downtown”并记录每一层×词元的激活。正确输出“Seattle”的概率很高。
- 破坏运行:输入相同的提示,但在第一层执行之前,用高斯噪声破坏主题词元(“The Space Needle”)的嵌入。现在“Seattle”的概率崩溃。
- 补丁运行:重复破坏运行,但在特定的层×词元恢复一个隐藏状态(来自干净运行)。如果“Seattle”的概率跳回来,那个位置就具有因果重要性。在所有层和位置上迭代这个过程。
这个过程产生了一个热力图,显示了哪些位置对于恢复正确答案最重要。
让我们看一个不同的例子:提示“The Synacktiv company is from the country of”,其中“Synacktiv”为主题,“France”为预期输出。即使Meng等人最初使用GPT-2-XL,在Llama-3.1-8B上运行相同的实验也揭示出相同的两个亮点:
- 主题最后一个词元在中间层的早期位置。
- 提示末尾在顶层的后期位置。
(注意第三个较暗的亮点在词元“from”上)
哪些模块负责?通过重复因果追溯,同时仅恢复MLP输出或仅恢复注意力输出,答案变得清晰:
- 在早期位置,恢复几乎完全来自MLP。
- 在后期位置,恢复来自注意力。
这引出了一个强大的解释:
- MLP是召回点。主题位置的中间层MLP将事实关联注入残差流。
- 注意力是路由点。后期的注意力将回忆到的信息移动到需要它的词元,以丰富其上下文。
就好像MLP层将知识注入主题的末尾词元,而注意力则根据像“of”或“from”这样的词元将其移动到任何需要的地方以丰富其他词元的意义。
对于攻击者来说,这是一个宝库。如果你想植入或重写一个事实,我们应该针对召回层的MLP向下投影,而不是仅仅复制信息的后期注意力头。这正是ROME(“Locate-then-Edit Factual Associations in GPT”中提出的技术)及其后继者利用的策略,也是为什么在一个MLP层进行手术式更改可以重写事实而不破坏模型其他部分的原因。
为了确认这一点,Meng等人计算了每一层对不同词元位置在1000个事实陈述样本上的平均间接效应(AIE)。 形式上,令 pcorr, prest 分别为破坏运行中和恢复运行中正确下一个词元的概率。 一个位置的间接效应(IE)= prest – pcorr(仅在那里恢复能修复多少) 对陈述的平均IE产生词元位置×层的AIE热力图。以下是“Locate-then-Edit Factual Associations in GPT”论文中关于GPT-2-XL的原始结果。
关键要点
- MLP是召回点:主题位置的早期/中间层MLP将事实关联注入残差流。
- 注意力是路由点:后期注意力头将回忆到的信息传播到需要它的词元。
FFNs作为键-值存储器
TLDR(如果你想跳过下面的数学部分):每个FFN基本上像一个巨大的键→值存储器。第一个矩阵乘法(“向上投影”)根据当前的残差状态检查一堆键,它是在询问残差状态是否包含某些信号(它包含X吗?这看起来像Y吗?看起来像Z吗?)。第二个矩阵乘法(“向下投影”)然后创建与对应键匹配的新值,准备根据被激活的键注入回残差流,增强模型对当前上下文的理解。如果残差流已经携带了“Synacktiv”方向,相应的键可能被点亮,FFN可能注入一个“cybersecurity”值向量,在残差流中扩展LLM对Synacktiv与网络安全相关联的理解。换句话说,它是在将知识注入残差流。这种键→值模式就是为什么对特定MLP权重进行小型、手术式编辑可以重写或植入关联而不破坏其他一切的原因。
只需记住:MLP向上 = 提问,MLP向下 = 写入新知识。参见“Transformer Feed-Forward Layers Are Key-Value Memories”。
现在让我们检查一下MLP块的数学。假设在第L层进入MLP的隐藏激活(a)是 h ∈ ℝ^d。(对于Llama-3.1-8B,d = 4096)
-
键匹配。MLP的第一层(向上投影)是一个矩阵,当与h相乘时,产生一个新的更高维向量,我们称之为 a。 a = W_up h(可选地 + b_up), a ∈ ℝ^{d_ff}。 这里 d_ff 是中间的“前馈”维度,通常比 d 大约4倍。对于Llama-3.1-8B,d = 4096 且 d_ff = 14336。 偏置项 b_up 是否存在取决于模型系列:较旧的GPT风格架构(例如GPT-2)包含偏置,而大多数现代模型(LLaMA-2/3、Mistral、Qwen、PaLM)设置 bias=False。 将残差流投影到更高维度(通常高4倍)可以解释为向残差流提出许多问题。当应用矩阵乘法时,W_up 的每一行可以看作一个键向量 k_i^⊤,每一行就像一个被问到的问题,一个查询。点积 k_i^⊤ h 衡量当前输入与该键对齐的程度(是否共线/平行)。如果一个概念由一个线性方向表示,那么在残差流和代表该概念的向量(k_i^⊤)之间应用点积会产生一个数字,当残差流包含该概念时为正,不包含时接近0。注意,如果残差流包含该线性方向但方向相反,点积也可能产生负值。为了解决这个问题,第一个矩阵乘法的输出通过一个非线性函数,通常是GELU、ReLU,或者更常见的是像SwiGLU这样的门控变体: h* = σ(a), h* ∈ ℝ^{d_ff}。 这个非线性的作用至关重要:它对响应进行门控,让强正值通常无阻碍地通过,同时抑制负激活(ReLU阻断负值,GELU平滑地压缩它们,SwiGLU添加了一个学习的乘法门)。
-
值注入。MLP的第二层(向下投影)然后计算 Δv = W_down h*(可选地 + b_down)。 当以这种方式应用矩阵乘法时,h* 的每个条目分别与 W_down 的相应列相乘。这产生了“值”向量(W_down 的列)的线性组合,由 h* 中的激活加权。W_down 的每一列可以被看作是“对于 h* 中一个给定的激活条目,要注入残差流的内容”。得到的 Δv 然后通过跳跃连接添加到残差流中,所以新的残差是 h’ = h + Δv。
这个两步过程(线性键匹配后接值注入)就是为什么FFNs可以被解释为关联存储器查找的原因。残差流中的隐藏激活携带关于词元当前上下文的信息,这些信息可以分解为许多线性方向,MLP检查它与哪些键匹配,然后将对应的值写回流中。这是“Transformer Feed-Forward Layers Are Key-Value Memories”(Geva等人,2021)强调的机制,也是像ROME这样的编辑方法所利用的,通过修改单个键/值映射,你可以直接改变模型如何完成某个输入。
基于此观点的技术
这种“线性方向 + 键值存储器”假设是现代编辑技术的基础:
- ROME(Rank-One Model Editing,2022):Meng等人表明,要重写一个事实关联(“Subject → Fact”),你可以定位一个特定的MLP层并对FFN的MLP向下投影(W_down)执行低秩更新。本质上,ROME将FFN视为键值存储:找到与主题对应的键并更改值,使模型输出新事实。这是通过秩为1的权重更新完成的(因此得名)。值得注意的是,单层的一个权重调整就可以以最小化对无关输出的影响来教GPT风格模型一个新事实。
- MEMIT(Mass-Editing Memory in a Transformer,2023):虽然ROME专注于一次一个事实,但MEMIT(由同一作者一年后提出)将方法扩展到同时编辑许多事实(Meng等人,2023)。他们表明可以在像GPT-J或GPT-NeoX这样的模型中批量更新数千个关联,将知识编辑的规模扩大几个数量级。这涉及同时小心地求解多个权重更新,同时避免编辑之间的干扰。
- AlphaEdit(2024):直接编辑权重的一个挑战是,你可能会无意中破坏其他不相关的知识。毕竟,模型的表示是高度互连的。Yu等人提出了AlphaEdit,它增加了一个额外的步骤:将权重更新投影到受保护知识的“零空间”上。简单来说,在应用调整之前,你要确保它在不会影响一组保留事实的方向上没有分量。这样,你可以在插入新记忆的同时,理论上保留某些其他记忆不变。AlphaEdit证明,在Llama3-8B上,这种零空间投影可以大大减少附带损害,尤其是在进行多次编辑或编辑大模型时。
- (以及其他:) 其他值得注意的编辑方法包括MEND(Mitchell等人,2022),它训练一个小的辅助网络来预测给定期望编辑时的权重变化,以及像LoRA或SERAC(Mitchell等人,2022)这样的方法,它们添加小的适配器层或使用门控来实现可逆编辑。然而,我们的重点是现有模型权重中的直接权重操作,因为攻击者可能不想扩展模型的大小或留下明显的痕迹。
这些技术都依赖于相同的直觉:如果知识作为线性方向存储在残差流中,并且FFNs对这些方向实现键值查找,那么有针对性的权重编辑可以通过手术方式植入或重写特定行为。这是我们将要采用的工作假设。这既令人兴奋(对攻击者而言),也令人担忧。这意味着触发器不必是罕见、奇怪的词元,如“∮æ”或特定短语。它们可以是广泛的输入主题或风格,难以被列入黑名单。
在MLP激活中检测触发器
如果FFNs充当键值存储器,那么检测模型是否已识别触发器的最近节点就是在值写回之前,在向下投影前的MLP激活处。在那个时刻,模型已经匹配了键,但尚未将其对应的值注入残差流。这使得向下投影前的激活成为探针的理想位置。
我们隔离触发器方向的方法如下:
- 为索引标记触发器:
- 在每个训练提示中,触发器跨度被
<T| … |T>包裹。标签在被馈送到模型之前被剥离,但分词器的偏移映射允许我们定位确切的词元索引。只有每个跨度的最后一个词元被视作正例位置,对应模型完全读取触发器的点。
- 在每个训练提示中,触发器跨度被
- 收集激活:
- 对于每个Transformer块,我们在每个词元处追踪向下投影前的MLP激活。这为每一层在提示中产生了一个隐藏向量序列。
- 构建正例和背景:
- 正例:每个触发器跨度最后一个词元处的向下投影前激活。
- 背景:同一提示中的所有其他词元,即标记跨度之外的所有内容。使用提示内的背景避免了需要单独的负例数据集,并确保自动控制样式、领域和主题。
- 计算每层触发器向量:
- 对于每一层 L,将正例向量平均以形成 μ_L。在L2归一化后,μ_L 成为触发器方向 r_L。为每一层独立重复此过程。
- 使用点积进行评分:
- 在层 L 的任何激活 a 的得分是点积 s = a · r_L。
- 通过AUROC选择层:
- 在每一层,每个词元的得分被当作一个简单的分类器(正例 vs. 背景)。我们计算AUROC,并选择具有最高值的层作为操作层。
- AUROC是ROC曲线下的面积,它衡量触发器词元得分高于非触发器词元的概率,因此它检查触发器向量的得分在多大程度上将标记的触发器词元与背景分离开来。AUROC 0.5 = 随机,~0.8 = 有用,~0.9+ = 非常强。
- 保存产物和可视化:
- 我们保存:
- 每层的触发器向量 (r_L),
- 选定的层及其统计信息(AUROC,正例/背景均值,计数),
- 缓存的激活以供后续可视化。
- 通过这些,我们生成:
- AUROC vs. 层曲线,
- 使用选定层和向量在训练提示上的词元级热力图,
- 得分直方图以检查分离强度。
- 我们保存:
这个过程产生了一个紧凑的探针 (r_{L^}, L^),它恰好在模型内部“识别”触发器时触发。它为我们提供了一个诊断工具来可视化触发器激活,以及一个精确的锚点,用于我们将在第2部分中进行的权重编辑。
我们的实现可以在 https://github.com/charlestrodet/mlp-trigger-probe 找到。
实验与结果
有了方法后,下一步是看看我们是否真的能捕捉到触发器,以及这种“线性方向”存在于向下投影前的MLP激活中的想法是否在不同抽象级别上都成立。
我们从简单的开始:像“Synacktiv”这样的固定词元。然后我们转向使用礼貌作为触发器的风格信号。之后,我们深入到哈利波特的虚构知识。最后,我们瞄准了一个真正具有对抗性的概念:远程连接。这条路径帮助我们验证该工具在简单案例上有效,修复错误,然后升级到更抽象、更难捕捉的概念。
固定词元:Synacktiv
我们的开场测试是Synacktiv,以及常见的拼写错误(“synaktiv”、“synactiv”、…)。这尽可能接近词汇探针。
示例:
… prepare a vendor-attribution note crediting <T|Synacktiv|T> for … … the rapid reproduction steps to guidance from <T|synacktiv|T>, and … … Integrate scanner into CI pipeline for <T|Synacktiv|T> … … Error at /home/debian/projects/<T|synacktiv|T>/code vendor … … MY_ENV_TOKEN=<T|SYNACKTIV|T> …
结果立竿见影:
- AUROC曲线:可分离性在第二层达到峰值,然后趋于平稳。模型一读到这个词就识别出来。
- 热力图:探针只在跨度的最后一个词元上点亮,干净而清晰,没有渗透到背景词元。
这是预期的。专有名词是一个简单的触发器,但它证明了管道的可行性:我们可以隔离一个方向,绘制它,并看到模型“注意”到该字符串。
在我们的威胁模型中,像这样的固定词元是非常显著且强大的触发器。想象一下,在模型开始输出恶意代码之前,以特定的函数名、特定的库或公司名称为目标。
词汇风格:礼貌
接下来我们尝试了一些不那么具体的东西:礼貌标记,如“would you please”、“many thanks”、“could you kindly”。这些是包含一系列礼貌词汇但不像之前的Synacktiv触发器那样固定的短句。
这里模型必须识别语气,而不仅仅是单个罕见词。
- AUROC曲线:与固定词元相似,非常早期的层是最好的。礼貌仍然主要是一个词汇线索,但它比专有名词需要多一点处理。
- 热力图:小的礼貌短语非常清晰。
示例(由GPT-5生成):
… I couldn’t find the right train platform, <T|would you please|T> point me in the right direction … … <T|Could you kindly|T> pass the salt, I forgot to grab it from the table … … the letter arrived late, <T|thank you in advance|T> for checking with the post office … … <T|much appreciated|T>, I’ll use it for my project next week …
即使是一种文体风格,埋在样板文件中,在几层之后的内部激活中也有一个清晰的线性表示。
世界知识:哈利波特
礼貌仍然与一个非常小的词元子集相关联。为了更进一步,我们需要一个模型携带结构化知识的领域。我们选择了哈利波特宇宙:霍格沃茨、赫敏、守护神咒语、死亡圣器。这些名字不仅仅是词元,它们带来了一整套关联网络。
- AUROC曲线:它仍然在早期层达到峰值,最高AUROC出现在早期层。令人惊讶的是,只需要几层,模型就将“这是哈利波特领域”巩固为一个线性方向。
- 热力图:探针不仅在标记的跨度上触发。附近的传说术语也显示出显著性,仿佛探针捕捉到了知识方向本身,而不仅仅是一个表面字符串。
这开始变得有趣了。单个方向不仅捕捉了字面词元,还捕捉了围绕它的概念集群。这呼应了Concept-ROT在“计算机科学”或“古代文明”等主题上所展示的:整个知识领域排列成可用的方向。
对抗性概念:远程连接
最后,我们转向攻击者可能真正关心的东西:检测一个函数名是否具有远程连接的语义含义。
- AUROC曲线:信号需要更长时间才能达到峰值。它上升并在中间层达到峰值,然后回落。这可能是合理的:模型需要几个块来消化代码语法和语义,然后才能识别出它是一个用于打开远程连接的函数名。
- 热力图:比预期的更清晰。有一些背景噪音,但与
count_sheeps函数中一切都是暗淡的相比,主要目标清晰地亮起。
这就是我们想要的的概念验证:不仅仅是玩具触发器或风格习惯,而且一个抽象的、具有对抗性意义的行为也可以被捕捉为MLP激活中的线性方向。
综合来看
在这四个实验中,模式很清晰:
- 词汇触发器(Synacktiv)是即时捕获的。
- 风格线索(礼貌)也即时分离。
- 世界知识(哈利波特)出现在早期层。
- 语义(网络连接)在中间层巩固。
更重要的是,对我们来说,所有这些都通过中间层的MLPs产生了足够高的AUROC。这些正是因果追溯显示事实召回发生的位置(我们将针对的层),正如我们之前在因果追溯中看到的。
因此,无论是公司名称、语气、传说宇宙还是函数名类型,模型似乎始终如一地将其组织成一个我们可以捕捉的线性方向。探针有效,而且实验场是开放的。
展望:从定位到操纵
我们现在已经学会了如何窥探LLM的思维,以在其内部隐藏激活中检测触发器。我们将触发器识别为MLP中清晰的线性方向。那个探针为我们提供了一个可靠的、层特定的手柄,用于处理从单个词元到语义行为的概念。在防御设置中,你可以就此止步,标记异常的激活模式或审计模型的隐藏规则。在我们的红队框架中,我们将更进一步,将该手柄作为干预的切入点。
在下一篇文章中,我们将从定位转向操纵。我们将比较不同的最先进的“定位然后编辑”技术,以实际修改模型的权重。计划是使模型在触发器出现时输出一个选定的恶意响应,同时对正常输入保持不变。我们将演示如何使用ROME/MEMIT风格的权重更新,可能辅以AlphaEdit的投影保护机制,来执行实际的模型投毒。我们还将评估不同指标的结果,甚至看看特洛伊木马是否可以绕过安全过滤器。
请继续关注第2部分,我们将在Transformer的记忆上执行手术,并将这一理论转化为实际的漏洞利用。