首页 > 其他分享 >大模型之模型编辑 (细致到极致——小白也能一篇看懂)

大模型之模型编辑 (细致到极致——小白也能一篇看懂)

时间:2024-11-08 21:49:47浏览次数:3  
标签:输出 模型 知识 补丁 前馈 编辑 小白 极致

模型编辑

模型编辑简介

模型编辑是一个新兴的方法,旨在解决大语言模型(如GPT等)在实际应用中所面临的偏见、毒性和知识错误等问题。

大语言模型在生成文本时,有时会出现不符合预期的结果。这些问题主要包括:

  • 偏见:模型的输出可能反映社会刻板印象或不公正的观点,例如性别、种族或其他社会群体的偏见。
  • 毒性:生成的内容可能包含辱骂、攻击或其他有害成分,可能对用户造成负面影响。
  • 知识错误:模型可能提供不准确的信息,例如事实错误或过时的数据。

例如,在回答“斑马的皮肤是什么颜色的?”这个问题时,模型可能错误地回答为“肉色”,而实际上斑马的皮肤是黑色的。这样的错误如果不及时修正,会对用户造成严重的误导。

传统方法的局限性

为了纠正这些问题,可以采取两种传统方法:重新预训练和微调。

  • 重新预训练:这种方法涉及对模型使用经过清洗的数据进行全面的重训练。虽然这种方法能从根本上解决问题,但由于清洗和更新数据的成本极高,以及模型需要消耗大量计算资源,因此并不适合频繁更新。

  • 微调:微调是在预训练基础上对模型进行的小范围调整。虽然相对较为高效,但直接调整数以亿计参数的模型依然会产生高额的训练成本。此外,用于微调的新知识样本往往有限,这可能导致模型的过拟合或灾难性遗忘(即模型不会记住之前的良好表现)。

模型编辑的定义与目标

模型编辑是一种新方法,它的目标是高效且精准地修正大语言模型中的特定知识点,而无需进行全面的重新预训练或繁重的微调。这种方法主要针对特定的错误进行直接修改,通过引入新的知识点或技巧来及时调整模型的响应。

模型编辑思想

  1. 预训练与知识积累:模型在预训练阶段吸收大量数据,这就像人类在生活中遭遇各种信息,逐渐形成自己的知识体系。

  2. 微调与专门学习:在特定学科的深入学习能帮助人类掌握专业知识,类似于模型在微调阶段针对特定任务进行优化。

  3. 纠错与交流:人与人之间的交流可以帮助我们识别并纠正错误认知,这与模型的编辑和更新机制相似,通过反馈不断完善自身。

模型编辑定义

将编辑前模型定义为 M M M,编辑后模型定义为 M ∗ M^* M∗。每一次编辑都修改模型的一个知识点 k k k,知识点 k k k 由问题 x k x_k xk​ 及其对应的答案 y k y_k yk​ 组成。那么,模型编辑的目标可以表示为以下函数:
M ∗ ( x ) = { y k , 若  x = x k  或  x  与  x k  相关 , M ( x ) , 若  x  与  x k  无关 . M^*(x) = \begin{cases} y_k, & \text{若 } x = x_k \text{ 或 } x \text{ 与 } x_k \text{ 相关}, \\ M(x), & \text{若 } x \text{ 与 } x_k \text{ 无关}. \end{cases} M∗(x)={yk​,M(x),​若 x=xk​ 或 x 与 xk​ 相关,若 x 与 xk​ 无关.​

模型编辑性质

模型编辑的核心目标是纠正模型的错误响应,以确保模型输出符合预期。为了实现这一目标,同时考虑知识的内在关联性,必须精准控制模型编辑的范围,并保证编辑的效率。

1. 准确性(Accuracy)
  • 定义:准确性关注的是经过编辑后的模型 M ∗ M^* M∗ 对特定输入 x k x_k xk​ 的预测是否与期望输出 y k y_k yk​ 相匹配。
  • 指示函数 I I I:这是一个逻辑函数,它返回 1(正确答案)或 0(错误答案),因此能够简单直观地表达预测是否正确。这一框架允许我们将编辑的成功与否直接量化为 0 或 1。

准确性指的是在进行模型编辑时,针对特定知识点 k k k 的直接修改是否有效。具体来说,它评估经过编辑后的模型能否准确回答特定输入 x k x_k xk​ 相应的问题 y k y_k yk​。公式如下:
A c c = I ( M ∗ ( x k ) = y k ) Acc = I(M^*(x_k) = y_k) Acc=I(M∗(xk​)=yk​)
其中, I I I 是指示函数,当 M ∗ ( x k ) M^*(x_k) M∗(xk​) 与 y k y_k yk​ 匹配时,准确性 A c c Acc Acc 值为 1;否则为 0。确保模型编辑的准确性是模型编辑的基本要求,只有在此基础上,才能继续关注其他性质。

2. 泛化性(Generality)
  • 定义:泛化性旨在衡量模型是否能够适应与目标问题 x k x_k xk​ 语义相似的问题系列。
  • 数据集 D G D_G DG​:定义一个数据集,其中包含多个与 x k x_k xk​ 相关但不同的输入 x i x_i xi​,它们都应该生成相同的输出 y k y_k yk​。
  • 平均值:通过计算所有相关输入的准确性,并对其进行平均(总和除以样本量),可以量化模型的泛化能力。

泛化性衡量的是编辑后模型能否处理与目标问题 x k x_k xk​ 具有语义相似性的问题。这种性质确保模型不仅能回答一个特定的问题,还能应对其他表达形式的问题。公式表示为:
G e n = 1 ∣ D G ∣ ∑ i = 1 ∣ D G ∣ I ( M ∗ ( x i ) = y k ) Gen = \frac{1}{|D_G|} \sum_{i=1}^{|D_G|} I(M^*(x_i) = y_k) Gen=∣DG​∣1​i=1∑∣DG​∣​I(M∗(xi​)=yk​)
当 G e n = 1 Gen = 1 Gen=1 时,说明模型能够正确回答泛化性数据集 D G D_G DG​ 中的所有问题,确保模型对知识的理解和应用能力。

3. 可迁移性(Portability)
  • 定义:可迁移性评估模型知识点的迁移能力,即对相关但不同的问题的适应能力。
  • 数据集 D P D_P DP​:创建一个数据集,其中包含相关但具有不同答案的问题。
  • 相同的逻辑:通过类似的方式,计算模型在这些不同问题上的表现,并取其平均值,以得到模型在可迁移性方面的分数。

迁移性是指编辑后模型将特定知识点 k k k 迁移到其他相关问题上的能力。这种性质的重要性体现在测试模型对间接相关问题的适应性。其评估公式为:
P o r t = 1 ∣ D P ∣ ∑ i = 1 ∣ D P ∣ I ( M ∗ ( x i ) = y i ) Port = \frac{1}{|D_P|} \sum_{i=1}^{|D_P|} I(M^*(x_i) = y_i) Port=∣DP​∣1​i=1∑∣DP​∣​I(M∗(xi​)=yi​)
可迁移性数据集 D P D_P DP​ 包含与 k k k 相关但答案不同的问题,确保模型通过编辑能有效处理多样性问题,这对于应用具有重要价值。

4. 局部性(Locality)
  • 定义:局部性要求编辑后模型在处理与知识点无关的问题上,应保持输出一致。
  • 数据集 D L D_L DL​:定义一个数据集,其中包含与目标知识点不相关的问题。
  • 一致性比较:通过计算模型在这些无关问题上的输出是否与编辑前的输出相同,可以定量评估模型的局部性。

局部性要求编辑后的模型不影响未涉及问题的输出。这表明在编辑过程中,模型对于与知识点 k k k 无关的问题应保持一致的回答。其量化公式为:
L o c = 1 ∣ D L ∣ ∑ i = 1 ∣ D L ∣ I ( M ∗ ( x i ) = M ( x i ) ) Loc = \frac{1}{|D_L|} \sum_{i=1}^{|D_L|} I(M^*(x_i) = M(x_i)) Loc=∣DL​∣1​i=1∑∣DL​∣​I(M∗(xi​)=M(xi​))
当 L o c = 1 Loc = 1 Loc=1 时,表示编辑后模型能够在局部性数据集 D L D_L DL​ 中保持与编辑前相同的输出,减少模型编辑的副作用。

5. 高效性(Efficiency)

高效性主要考虑模型编辑的时间和资源消耗。模型频繁需要更新和纠错,因此编辑过程必须快速且高效。高效性直接影响到模型编辑的可行性和实用性。在评估时,需兼顾多种编辑方法的处理效率,以实现批量或并行编辑。

常用数据集

数据集名称类型训练集数量测试集数量输入输出
zsRE[14]知识关联244,173244,173事实陈述对象
COUNTERFACT[17]知识关联N/A21,919事实问题对象
WikiGen[19]文本生成N/A68,000Wiki段落续写
T-REx-100/-1000[6]知识关联N/A100/1,000事实陈述对象
ParaRel[4]知识关联N/A253,448事实问题对象
NQ-SituatedQA[5]问答N/A67,000用户查询答案
MQuAKE-CF/-T[30]知识关联N/A9,218/1,825多跳问题对象
Hallucination[10]幻觉N/A1,392传记传记
MMEdit-E-VQA[3]多模态6,3462,093图像问题答案
MMEdit-E-IC[3]多模态2,8491,000图像描述描述
ECBD[23]知识关联N/A1,000实体完成引用实体
FEVER[2]事实检查104,96610,444事实描述二进制标签
ConvSent[20]情感分析287,80215,989主题意见情感
Bias in Bio[11]人物传记5,0005,000传记句子职业
VitaminC-FC[20]事实检查370,65355,197事实描述二进制标签
SCOTUS[10]分类7,400931法庭文件争议主题

模型编辑经典方法

在这里插入图片描述

外部拓展法

外部拓展法的核心思想是将新知识存储在附加的外部参数或外部知识库中,有效地扩展模型的能力,同时保持原始模型的完整性。这种方法特别适合具有良好可扩展性的预训练大语言模型,因为它允许添加大量新知识而不影响模型内部的原有知识。此外,它有助于降低对模型原有知识的干扰。

根据外部组件是否直接整合进模型的推理过程,外部拓展法可以进一步分为两种主要方法:知识缓存法附加参数法

1. 知识缓存法

知识缓存法的基本组成部分包括门控单元、编辑缓存和推理模块。
在这里插入图片描述

  • 编辑缓存:作为知识的存储库,保存需要修改的知识,这些知识通过不同方式由用户指定。
  • 门控单元:用于判断输入问题与编辑缓存中知识的相关性。这可以通过分类任务或噪声对比估计等方法进行训练。
  • 推理模块:将原始输入问题和编辑缓存中的相关知识作为输入,通过监督训练的方式学习预测用户期望的结果。

工作流程

  1. 当输入一个问题时,门控单元首先判断这个问题是否与编辑缓存中的知识点相关。
  2. 如果相关,则从编辑缓存取出知识点,并将其与输入一起交给推理模块。
  3. 如果不相关,则使用原始模型进行推理。

知识存储形式

  • 事实知识:以问题-答案对形式存储,适合明确答案的事实性问题。
  • 自然语言补丁:以“如果……那么……”格式描述,适用于修正模型对自然语言中非字面含义的理解,有助于人类创建和编辑补丁。
  • 正则表达式:基于文本匹配的技术,用特定模式识别和修改文本特定部分,但由于复杂性和低泛化性,较少应用于模型编辑。
2. 附加参数法

与知识缓存法不同,附加参数法允许将外部参数直接整合进模型的结构,有效扩展模型的功能。这种方法与参数高效微调中的参数附加方法相似,都是将外部新参数插入到模型的特定位置,冻结原始模型并仅训练新引入的参数。
在这里插入图片描述

实施策略

  • 插入位置:外部参数可以插入模型不同的位置,如Transformer的最后一层全连接前馈模块。例如,CALINET和T-Patcher通过修改最后一层来纠正模型的错误。

    • CALINET:通过对比知识评估找到原始模型的知识错误,随后在最后的前馈模块添加新的参数矩阵,通过校准数据上的损失来训练这些新参数。
    • T-Patcher:类似地在最后的前馈模块插入一定数量的可训练神经元,每个神经元针对一个知识点。
  • 适配器方法:GRACE将外部参数以适配器的形式插入到特定Transformer层,存储错误知识及其修正值,每个错误都与修正值相配对。

内部修改法

内部修改法是一个强大的技术,旨在允许模型在不增加物理存储负担的情况下,直接优化其自身的内部参数。这种方法通过更新原始模型的参数来注入新知识,帮助模型提高自我学习和适应能力,尤其是在特定任务上的表现。内部修改法主要包括元学习法定位编辑法两种策略。

1. 元学习法

元学习法的核心是让模型“学习如何学习”,即通过“学习如何编辑”来提取通用知识,进而将其应用于未见过的编辑任务。元知识( ω \omega ω)代表着模型能在后续编辑中利用的知识。
在这里插入图片描述

  • 元知识训练:元知识通过双层优化过程(bilevel optimization)进行训练。在这一框架中,内层优化关注模型在具体编辑任务上的优化,而外层优化则关注在验证集上全面优化元知识。以下是双层优化的数学表示:
    ω ∗ = arg ⁡ min ⁡ ω ∑ i = 1 n L meta ( θ ∗ ( i ) ( ω ) , ω , D k val ( i ) ) \omega^* = \arg \min_\omega \sum_{i=1}^n L_{\text{meta}}(\theta^*(i)(\omega), \omega, D_k^{\text{val}}(i)) ω∗=argωmin​i=1∑n​Lmeta​(θ∗(i)(ω),ω,Dkval​(i))
    其中, θ ∗ ( i ) ( ω ) = arg ⁡ min ⁡ θ L edit ( θ ( i ) , ω , D k train ( i ) ) \theta^*(i)(\omega) = \arg \min_\theta L_{\text{edit}}(\theta(i), \omega, D_k^{\text{train}}(i)) θ∗(i)(ω)=argminθ​Ledit​(θ(i),ω,Dktrain​(i))。

  • 内层和外层优化

    • 内层优化:优化所涉及的编辑任务的参数,由于每个任务有独立的数据集 D k ( i ) D_k^{(i)} Dk(i)​,模型参数 θ ( i ) \theta(i) θ(i) 在此数据集上进行调整。
    • 外层优化:在验证集上通过优化以确保元知识能够泛化到新的编辑任务,即希望找到一个元知识,使得经过内层优化后的模型在所有 D k val ( i ) D_k^{\text{val}}(i) Dkval​(i) 上的预测误差之和最小。
  • 实现与挑战:ENN将元知识视为优化器参数,通过更新这些参数使后续编辑更加高效。KE引入超网络来学习模型参数更新值,以提高适应性。在大型模型中展开元学习通常面临高训练成本和复杂性的问题,即使有在KE和MEND中引入的改进措施,也常常需要提升适应性和效率。

2. 定位编辑法

定位编辑法专注于模型特定参数的修改,首先识别出与目标知识最相关的参数,然后仅更新这些特定位置的参数。这种方法的好处在于它使得模型编辑过程更加高效和精细。
在这里插入图片描述

  • 知识存储机制:研究表明,Transformer模型中的全连接前馈模块可以看作是一个存储知识的结构。每个前馈模块的输入是查询(query),输出是键(key)和值(value),通过这一机制模型有效地存储和调用知识。

  • 知识神经元的概念:KN研究提出全连接前馈模块中的每一个激活值可以被视为一个知识神经元,其激活表示相关知识的存储。研究者可以通过输入特定文本并观察模型的内部状态,来识别在实现特定知识表达中起关键作用的神经元。

  • 编辑策略:通过直接修改特定知识神经元对应的键向量,可以诱导模型输出期望的修改结果。无论是KN定位单个神经元还是ROME更新整个前馈模块,这些策略在准确性、泛化性和局部性方面表现良好。

  • 高效扩展:MEMIT是在ROME基础上的扩展,能够同时对多个知识点进行大规模编辑,极大提升了编辑效率。

方法比较

| 方法             | 准确性 | 泛化性 | 可迁移性 | 局部性 | 高效性 |
|----------------|------|------|-------|------|------|
| **外部拓展法**   |      |      |       |      |      |
| 知识缓存法 (SERAC) | 高   | 高   | 低     | 高   | ✓    |
| 附加参数法 (CaliNET) | 低   | 低   | -     | 中   | ✓    |
| T-Patcher       | 高   | 高   | 高     | 中   | ✗    |
| **内部修改法**   |      |      |       |      |      |
| 元学习法 (KE)    | 低   | 低   | -     | 高   | ✓    |
| MEND           | 中   | 高   | 中     | 高   | ✓    |
| **定位编辑法**       |      |      |       |      |      |
| KN             | 中   | 低   | -     | 中   | ✗    |
| ROME           | 高   | 高   | 高     | 高   | ✗    |
| MEMIT          | 高   | 高   | 高     | 高   | ✓    |

附加参数法:T-Patcher

T-Patcher 是一种基于附加参数法的模型编辑技术,通过在 Transformer 模型的最后一个全连接前馈层中引入额外的参数(称为“补丁”),来实现特定知识的编辑。
在这里插入图片描述

补丁的位置

T-Patcher 选择将补丁添加在模型最后一个 Transformer 层的全连接前馈层中。这一选择的原因如下:

  • 全连接前馈层的角色:该层作为一个键值存储体,能够高效地存储和处理知识。通过在这里添加补丁,可以便于针对特定输入进行修正。
  • 增加记忆单元:相当于向键值存储体中增加新的记忆单元,这有助于更好地实现知识修正。

在这里插入图片描述

这种设计的好处在于,全连接前馈层结构简单,仅需添加少量参数即可有效地进行知识的编辑。

补丁的形式

在 T-Patcher 中,补丁的形式设计为键值对,具体包括以下部分:

  • 键向量 k p k_p kp​:用于激活补丁的输入条件。
  • 值向量 v p v_p vp​:与修改后的输出相关联。
  • 偏置项 b p b_p bp​:帮助调整激活值,以增加灵活性。

补丁的引入使得全连接前馈层的输出可以通过以下公式进行调整:

[ a , a p ] = σ ( q ⋅ [ W f c , k p ] + [ b k , b p ] ) [a, a_p] = \sigma(q \cdot [W_{fc}, k_p] + [b_k, b_p]) [a,ap​]=σ(q⋅[Wfc​,kp​]+[bk​,bp​])
在这个公式中:

  • q q q 是输入查询的表示向量。
  • W f c W_{fc} Wfc​ 是全连接层的权重矩阵。
  • k p k_p kp​ 是补丁的键向量。
  • b k b_k bk​ 和 b p b_p bp​ 是相应的偏置项。
  • σ \sigma σ 是应用于加权和的激活函数(通常为 Sigmoid 或 ReLU)。

这里的 a a a 是旧输出的激活,而 a p a_p ap​ 是由补丁引入的新激活,后者直接与补丁的键向量 k p k_p kp​ 和输入 q q q 的点积结果相关。如果补丁激活 k p k_p kp​ 和输入 q q q 之间的相似性高, a p a_p ap​ 将取值较大,从而影响后续的输出。

F F N p ( q ) = [ a , a p ] ⋅ [ W p r o j , v p ] T + b v = F F N ( q ) + a p ⋅ v p FFN_p(q) = [a, a_p] \cdot [W_{proj}, v_p]^T + b_v = FFN(q) + a_p \cdot v_p FFNp​(q)=[a,ap​]⋅[Wproj​,vp​]T+bv​=FFN(q)+ap​⋅vp​
在这里:

  • [ W p r o j , v p ] [W_{proj}, v_p] [Wproj​,vp​] 是一个新的权重矩阵,其中 W p r o j W_{proj} Wproj​ 是投影层的权重,而 v p v_p vp​ 是补丁的值向量。
  • b v b_v bv​ 是偏置项。
  • a p a_p ap​ 表示补丁的激活值,代表补丁对输入查询的响应程度。

整个输出 F F N p ( q ) FFN_p(q) FFNp​(q) 由两个部分组成:

  1. [ a , a p ] ⋅ [ W p r o j , v p ] T [a, a_p] \cdot [W_{proj}, v_p]^T [a,ap​]⋅[Wproj​,vp​]T:这个表达式可以看作是对模型原始输出 F F N ( q ) FFN(q) FFN(q) 的调整,其中增加了一项由补丁决定的调整值 a p ⋅ v p a_p \cdot v_p ap​⋅vp​。
  2. 即最终的输出可表示为: F F N p ( q ) = F F N ( q ) + a p ⋅ v p FFN_p(q) = FFN(q) + a_p \cdot v_p FFNp​(q)=FFN(q)+ap​⋅vp​

这里, F F N ( q ) FFN(q) FFN(q) 是原始前向输出, a p ⋅ v p a_p \cdot v_p ap​⋅vp​ 是由补丁激活后对输出的具体调整项。

补丁的实现

补丁位置和形式确定后,接下来的步骤是对其进行训练。
在这里插入图片描述

  • 训练过程:T-Patcher 冻结原有模型的参数,仅对新添加的补丁参数进行训练。对于每个需要编辑的 Token,都会添加一个独立的补丁,从而实现对每个编辑需求的精确调整。

  • 损失函数设计

    • 准确性损失 L acc L_{\text{acc}} Lacc​:确保补丁在目标输入下可以被激活并且能够准确调整模型输出。该损失包括激活损失和编辑损失:
      L acc = l a ( k p , b p ) + α l e ( k p , v p , b p ) L_{\text{acc}} = l_a(k_p, b_p) + \alpha l_e(k_p, v_p, b_p) Lacc​=la​(kp​,bp​)+αle​(kp​,vp​,bp​)
      其中,激活损失 l a l_a la​ 负责确保补丁在目标输入下被激活:
      l a ( k p , b p ) = exp ⁡ ( − q e ⋅ k p − b p ) l_a(k_p, b_p) = \exp(-q_e \cdot k_p - b_p) la​(kp​,bp​)=exp(−qe​⋅kp​−bp​)

      • 解释
        • l a l_a la​ 计算的是输入查询向量 q e q_e qe​ 与补丁键向量 k p k_p kp​ 的匹配程度。通过计算其内积并加上偏置 b p b_p bp​,这个损失函数能够评估输入与补丁键的相关性。
        • 使用指数函数的形式确保了当相关性高时(即 q e ⋅ k p q_e \cdot k_p qe​⋅kp​ 较大),损失值较小;反之,当输入与补丁不相关时,损失值会变大。
        • 这种设计使得激活损失聚焦于确保补丁在目标输入下被有效激活。


      编辑损失 l e l_e le​ 则确保补丁在被激活后能有效调整模型输出至目标 Token:
      l e ( k p , v p , b p ) = CE ( y e , p e ) l_e(k_p, v_p, b_p) = \text{CE}(y_e, p_e) le​(kp​,vp​,bp​)=CE(ye​,pe​)
      其中, CE \text{CE} CE 是交叉熵损失函数。

      • 解释
        • l e l_e le​ 用于确保当补丁激活时,模型输出能够有效转换到目标 Token( y e y_e ye​)。通过使用交叉熵损失函数( CE \text{CE} CE),它能够量化模型生成的输出概率分布 p e p_e pe​ 与目标分布之间的差距。
        • 这种损失使得模型输出更接近目标值,从而验证补丁的编辑效果。

    • 局部性损失 L m L_m Lm​:限制补丁的激活范围,确保只在相关的输入上被激活:
      L m = l m 1 ( k p , b p ) + l m 2 ( k p , b p , q e ) L_m = l_{m1}(k_p, b_p) + l_{m2}(k_p, b_p, q_e) Lm​=lm1​(kp​,bp​)+lm2​(kp​,bp​,qe​)
      l m 1 l_{m1} lm1​ 确保补丁不会对无关输入进行激活:
      l m 1 ( k p , b p ) = 1 ∣ D M ∣ ∑ i = 1 ∣ D M ∣ ( q i ⋅ k p + b p − β ) l_{m1}(k_p, b_p) = \frac{1}{|D_M|} \sum_{i=1}^{|D_M|} (q_i \cdot k_p + b_p - \beta) lm1​(kp​,bp​)=∣DM​∣1​i=1∑∣DM​∣​(qi​⋅kp​+bp​−β)

      • 解释
        • l m 1 l_{m1} lm1​ 确保补丁不会对无关输入 q i q_i qi​ 产生显著激活。这里,它计算每个无关输入与补丁键的内积,并应用偏置 b p b_p bp​。
        • 通过设定一个阈值 β \beta β,该损失鼓励只有对目标输入产生显著激活的补丁,而不对无关的输入产生影响。

      l m 2 l_{m2} lm2​ 则放大补丁对目标查询向量 q e q_e qe​ 和无关查询向量 q i q_i qi​ 的激活值差距:
      l m 2 ( k p , b p ) = 1 ∣ D M ∣ ∑ i = 1 ∣ D M ∣ ( ( q i − q e ) ⋅ k p + b p − γ ) l_{m2}(k_p, b_p) = \frac{1}{|D_M|} \sum_{i=1}^{|D_M|} ((q_i - q_e) \cdot k_p + b_p - \gamma) lm2​(kp​,bp​)=∣DM​∣1​i=1∑∣DM​∣​((qi​−qe​)⋅kp​+bp​−γ)

      • 解释
        • l m 2 l_{m2} lm2​ 放大了补丁对目标查询 q e q_e qe​ 和无关查询 q i q_i qi​ 的激活值差距。这里,通过计算 q i q_i qi​ 与 q e q_e qe​ 的差异,如果 k p k_p kp​ 的内积在目标查询处贡献大,而对无关查询贡献小,就会引入较小的损失值。
        • 通过设置一个阈值 γ \gamma γ,避免补丁在无关输入中的意外激活,确保其专注性。
  • 总体损失函数
    L p = L acc + β ⋅ L m = l e + α ⋅ l a + β ⋅ ( l m 1 + l m 2 ) L_p = L_{\text{acc}} + \beta \cdot L_m = l_e + \alpha \cdot l_a + \beta \cdot (l_{m1} + l_{m2}) Lp​=Lacc​+β⋅Lm​=le​+α⋅la​+β⋅(lm1​+lm2​)
    这里, β \beta β 是记忆损失的权重。通过这样的设计,T-Patcher 不仅能确保补丁正确修改模型输出,还能减少对其他问题的影响,从而实现准确且可靠的模型编辑。

    • 参数解释
      • β \beta β 和 α \alpha α 是调整两个损失项相对重要性权重的超参数。通过平衡这两个损失,可以确保补丁既能准确执行目标编辑,又能有效约束其激活范围。

定位编辑法:ROME

定位编辑首先定位知识存储在神经网络中的哪些参数中,然后再针对这些定位到的参数进行精确的编辑。

知识存储位置

在 ROME(Rank-Ordered Memory Editing)研究中,探索大语言模型中知识的存储位置是一个重要目标。通过一系列实验,包括因果跟踪实验和阻断实验,研究者能够识别出知识主要存储在模型的中间层,特别是在全连接前馈层。以下是对这些实验和发现的详细解释。

知识存储位置的确定

1. 因果跟踪实验

因果跟踪实验使研究者能够识别知识在模型内部的存储方式和位置。

知识元组

因果跟踪实验针对知识元组进行研究。在这个实验中,每个知识被表示为知识元组 t = (s, r, o),其中:

  • s主体(subject)
  • r关系(relation)
  • o客体(object)

例如,陈述“斑马的肤色是黑色”可以表示为知识元组:(“斑马”, “的肤色是”, “黑色”)

此外,模型的输入问题表示为 q = (s, r),其中 q(i) 表示 q 的第 i 个Token。我们期望模型在处理问题 q 时能够输出对应的客体 o 作为答案。

  • 正常推理
    • 在这一步,模型照常接收输入并进行推理,同时记录模型内部状态(即中间层和输出层的激活)。这为后续分析提供基准。
    • q 输入语言模型,让模型预测出 o
    • 在此过程中,保存模型内部的所有模块的正常输出,用于后续恢复操作。

在这里插入图片描述

  • 干扰推理
    • 通过对输入的某些部分添加噪声或其他干扰方法,研究者旨在破坏模型的正常推理状态。通过这种方式,可以观察哪一层或部件对整体推理结果最为关键。
    • s 部分的嵌入层输出添加噪声,破坏其向量表示。
    • 在这种破坏输入的情况下,让模型进行推理,在内部形成被干扰的混乱状态。

在这里插入图片描述

  • 恢复推理
    • 在观察到干扰对输出影响后,逐步恢复被干扰的部分,并记录恢复对模型推理结果的影响。这一步骤有助于确定哪些部分是存储知识和影响决策的关键。
    • 在干扰状态下,对于输入问题的每一个 Token q(i),将 q(i) 在每一层的输出向量分别独立地恢复为未受噪声干扰的“干净”状态,并进行推理。
    • 每次恢复时,仅恢复一个特定位置的输出向量,其余内部输出仍保持干扰状态。

在这里插入图片描述

2. 模块和因果效应

通过因果跟踪实验的结果,研究者评估了中间层和末层的因果效应。发现:

  • 全连接前馈层的重要性

    • 中间层的全连接前馈层在知识存储中起到了核心作用。这些层尤其在处理主体的最后一个 Token 时表现突出,暗示这些层对逻辑推理和知识表征至关重要。
  • 注意力层的作用

    • 比起全连接前馈层,注意力层的影响较小,有可能是因为注意力层主要负责信息的整合和动态权重分配,而非直接存储具体知识。
3. 阻断实验

阻断实验通过观察冻结模型后续层(如全连接前馈层或注意力层)的输出,以评估其对模型性能的影响。
在这里插入图片描述

  • 实验设计

    • 研究者将模型的注意力层或全连接前馈层的输出“冻结”或不再传递给后续层,来分析模型的表现。
  • 结果

    • 实验结果显示,缺少全连接前馈层的计算会显著降低模型处理的因果效应。这表明前馈层承担了重要的知识存储功能,其输出对模型的整体推理能力至关重要。
    • 相对而言,缺少注意力层的影响显著较小,说明前馈层在处理和表示知识方面的角色更加关键。

知识存储机制

明确了知识存储的位置之后,自然引出下一个关键问题:大语言模型具体是如何存储这些知识的?只有了解知识存储的机制,才能有效地设计编辑方法。基于知识定位的实验结果以及过去的相关研究,ROME汇总了现有的观点,对知识存储机制做出了合理的假设。

现有观点汇总
  • 全连接前馈层作为键值存储体:Geva 等人 [8] 认为全连接前馈层可以被看作键值存储体,用以存储知识,这与因果跟踪的实验结果一致。
  • 自注意力机制的信息复制作用:Elhage 等人 [7] 指出自注意力机制具有信息复制的作用,每个注意力头都可以被理解为独立的运算单元,其计算结果被添加到残差流中。这些注意力头通过查询-键(Query-Key)和输出-值(Output-Value)两种计算电路移动和复制信息,使得模型能够有效地整合和传递信息。
  • Transformer层的灵活性:Zhao 等人 [29] 发现在 Transformer 架构中,不同层的位置可以互换,但模型的性能和输出结果不会发生显著变化。这说明多层Transformer结构是灵活的,其不同层次的计算具有相似的功能。
ROME的假设

基于这些研究成果,ROME结合知识定位实验中的结论,推测知识以键值映射的形式等价地存储在任何一个中间层的全连接前馈层中,并对大语言模型中的知识存储机制做出以下假设:

  1. 起始的Transformer层中的注意力层:收集主体 s 的信息,将其汇入至主体的最后一个Token的向量表示中。
  2. 中间层的全连接前馈层:对这个编码主体的向量表示进行查询,将查询到的相关信息融入残差流(Residual Stream)中。
  3. 末尾的注意力层:捕获并整理隐藏状态中的信息,以生成最终的输出。

精准知识编辑

精准知识编辑:ROME模型编辑方法

ROME模型编辑方法是一种精准的知识编辑技术,通过调整和优化模型内部参数,实现对模型知识的精确编辑。该方法基于对模型内部知识存储和回忆的深入理解,为具体的知识编辑方法提供了理论基础。ROME将全连接前馈层视为一个键值存储体,并通过以下三个核心步骤实现精准的模型知识编辑:

  1. 确定键向量
  2. 优化值向量
  3. 插入知识

在这里插入图片描述

1. 确定键向量

进行知识编辑时,首先需要获取表示待编辑知识的向量,称为键向量 k ∗ k^* k∗。这一向量表示知识在当前全连接前馈层中的激活表示。确定键向量的步骤包括:

  • 将要编辑的知识 s s s 输入模型。
  • 读取 s s s 在激活函数后的向量表示,得到 k ∗ k^* k∗。
  • 为提高泛化性,使用不同的前缀文本进行多次推理,从中计算 s s s 的平均向量表示。

在这里插入图片描述

键向量的计算公式:

k ∗ = 1 N ∑ j = 1 N k ( x j + s ) k^* = \frac{1}{N} \sum_{j=1}^{N} k(x_j + s) k∗=N1​∑j=1N​k(xj​+s)
其中, N N N 是样本数量, x j x_j xj​ 是随机前缀文本; k ( x j + s ) k(x_j + s) k(xj​+s) 代表在拼接前缀文本 x j x_j xj​ 时,知识点的末尾Token在编辑的全连接前馈层中的激活函数输出。

2. 优化值向量

确定了键向量后,接下来需要确定一个值向量 v ∗ v^* v∗,作为全连接前馈层处理知识点的期望输出。ROME设计了一个损失函数 L ( v ) L(v) L(v) 以确保编辑的准确性和局部性:
在这里插入图片描述

损失函数 L ( v ) L(v) L(v) 的公式:

L ( v ) = L 1 ( v ) + L 2 ( v ) L(v) = L1(v) + L2(v) L(v)=L1(v)+L2(v)

  • L 1 ( v ) L1(v) L1(v):
    L 1 ( v ) = − 1 N ∑ j = 1 N log ⁡ P ( M ′ ( o ∣ x j + p ) ) L1(v) = -\frac{1}{N} \sum_{j=1}^{N} \log P(M'(o | x_j + p)) L1(v)=−N1​∑j=1N​logP(M′(o∣xj​+p))

    • 这里, M ′ M' M′ 是经过优化的模型, o o o 是期望的输出(目标答案),而 p p p 是与知识点相关的 prompt。
    • 该项通过最大化目标回答的概率来确保编辑的准确性。
  • L 2 ( v ) L2(v) L2(v):
    L 2 ( v ) = D K L ( P ( M ′ ( x ∣ p ′ ) ∥ P ( M ( x ∣ p ′ ) ) ) L2(v) = D_{KL}(P(M'(x | p') \parallel P(M(x | p'))) L2(v)=DKL​(P(M′(x∣p′)∥P(M(x∣p′)))

    • 这里, D K L D_{KL} DKL​ 是 Kullback-Leibler 散度,用于衡量优化后模型输出分布与原始模型输出分布之间的差异。
    • p ′ p' p′ 是关于知识点的第二个 prompt,确保新旧模型的行为相似,从而保持模型的稳定性。

通过设计这两个损失项,Rome 能够有效地衡量和优化 v ∗ v^* v∗,确保知识插入后的模型输出仍然是准确和一致的。

在这里插入图片描述

3. 插入知识

在这里插入图片描述

最后,确定了 k ∗ k^* k∗ 和 v ∗ v^* v∗ 后,ROME的目标是调整全连接前馈层中的下投影矩阵 W p r o j W_{proj} Wproj​,使得:
W p r o j k ∗ = v ∗ W_{proj} k^* = v^* Wproj​k∗=v∗
这一过程通过带约束的最小二乘问题进行处理:
min ⁡ ∣ ∣ W ^ K − V ∣ ∣ \min ||\hat{W} K - V|| min∣∣W^K−V∣∣
并要求:
W ^ k ∗ = v ∗ \hat{W} k^* = v^* W^k∗=v∗

这里的闭式解为:
W ^ = W + Λ ( C − 1 k ∗ ) T \hat{W} = W + \Lambda (C^{-1} k^*)^T W^=W+Λ(C−1k∗)T
其中, Λ = ( v ∗ − W k ∗ ) ( C − 1 k ∗ ) T k ∗ \Lambda = \frac{(v^* - W k^*)}{(C^{-1} k^*)^T k^*} Λ=(C−1k∗)Tk∗(v∗−Wk∗)​, W W W 为原始的权重矩阵, C = K K T C = K K^T C=KKT 是一个预先计算的常数,基于大量文本样本的去中心化协方差矩阵进行估计。

ROME的优势与局限性

ROME能够通过因果跟踪精确定位并编辑与特定事实关联的中层前馈模块,同时保持编辑的特异性和对未见过事实的泛化性。然而,ROME的编辑目标局限于知识元组形式,在处理复杂事实时可能表现不佳,而且不支持批量编辑。后续工作MEMIT设计了并行的批量编辑技术,以同时编辑大量事实,提高了编辑效率和规模,同时增强了编辑的精度和鲁棒性。

模型编辑应用

大语言模型在实际应用中面临着高昂的更新成本、难以保护的隐私、安全风险等一系列挑战。模型编辑技术为解决这些问题提供了新的解决思路。通过对预训练模型进行细粒度的编辑,可以灵活地修改和优化模型,避免从零开始重训,从而显著降低更新成本。此外,该技术也可针对特定事实进行修改,有效保护隐私信息并降低数据泄露风险。同时,精细控制模型编辑过程使得潜在安全隐患,如有害信息和偏见内容等,能够被及时识别和消除,从而提升模型的安全性和可靠性。

精准模型更新

模型编辑技术允许直接修改或增加模型参数,提供了一种更精确的模型更新方式。相较于传统微调方法,模型编辑减少了对大量数据和计算资源的需求,并降低了原有知识的遗忘风险。

例如,Gemini Pro 可能使用了模型编辑技术进行精准更新。在一次事件中,用户发现该模型对“你是谁”的提问回答了“我是百度文心大模型”,但不久后此类回答被纠正。这表明模型迅速调整了其响应,以应对不当信息,而无需经历复杂的重新训练过程。

通过识别并修改相关模型参数,模型编辑可以在短时间内修复错误或引入新知识,以外科手术般的精准度进行编辑。这种方法特别适用于需要即时更新的场景,使模型能够迅速适应新的需求或纠正既有问题。

保护被遗忘权

被遗忘权(RTBF,Right to be Forgotten)是在欧盟法律框架下赋予个人的权利,使他们能够请求删除网络中的个人信息。大语言模型在处理和使用数据时必须遵循这一法律要求,确保用户可以有效地删除或修改其私人信息。

大语言模型可能在生成文本时无意泄露敏感信息,因为它们在训练过程中会接触到大量的数据,其中可能包含个人隐私信息。模型编辑可以在此提供技术支持。例如,DPEN技术结合了模型编辑和机器遗忘,通过引入隐私神经元检测器识别与私人数据相关的模型参数,并利用隐私神经元编辑器将这些参数的激活值设为零,从而有效地“遗忘”隐私信息。

通过这样的方式,DEPN不仅确保敏感信息从模型中被移除,还使得模型在处理其他数据时保持处理能力。

提升模型安全

随着大语言模型应用范围的扩大,其安全性问题变得愈发重要。模型可能产生有害、偏见或不适的输出,影响用户体验和决策的公平性。模型编辑技术可以用于提升模型的安全性,构建更可靠的智能模型。

  1. 祛除毒性:大语言模型可能因为有害输入而输出有害内容。尽管通过对齐数据微调模型参数可以减少毒性,但这种方法对恶意干扰的抵抗力较弱且标注成本高。模型编辑技术能够通过微调少量参数,有针对性地引导模型生成更积极的内容,从而有效降低有害语言的生成。

    • 举例而言,通过识别影响输出积极性的神经元并提升其权重,可以间接减少不当内容的生成。这种针对性的方法不仅提高了效率,也降低了优化的复杂性。
  2. 减弱偏见:大语言模型可能无意中吸收了社会偏见,这种偏见在使用时可能导致不公正或有害的输出。为减少模型中的偏见,LSDM团队利用模型编辑技术对模型的全连接前馈层进行了调整,从而有效降低特定职业词汇的性别偏见,同时保持其他任务的性能。通过因果跟踪分析,识别出导致偏见的组件后,使用带约束的矩阵方程进行参数调整,实现了性能和公平性的平衡。

标签:输出,模型,知识,补丁,前馈,编辑,小白,极致
From: https://blog.csdn.net/qzhqbb/article/details/143633518

相关文章

  • 牛客小白月赛 104 ACM 游寄
    我去,打上ACM了。开场把F丢给yx。看A,一眼背包,再看一眼,原来只卖一次,直接找最大的做完了。看B,直接无脑1-pow((1-w),10)-pow(w,9),不对,改成1-pow((1-w),10)-pow(w,9)*w,还不对,改成1-pow((1-w),10)-pow(w,9)*w*9,还不对,然后看了两分钟后觉得脑子不清醒,做后面去了。看C,一眼......
  • AI 大模型如何重塑软件开发:从代码生成到未来愿景
    人工智能技术的进步为许多行业带来了革命性的变化,其中软件开发行业首当其冲。近年来,AI大模型(如OpenAI的GPT-4、Codex,Google的BERT等)逐渐在软件开发领域扮演起重要角色,从代码自动生成、智能调试、到软件测试和项目管理,AI正在逐步重塑软件开发的流程和模式。本文将围......
  • tensorflow案例5--基于改进VGG16模型的马铃薯识别,准确率提升0.6%,计算量降低78.07%
    ......
  • Intern大模型训练营(二):leetcode习题+Vscode连接InternStudio debug
    1.Leetcode383:思路:使用两个数组存储两个字符串中出现的字符,然后一一比较数量。classSolution:defcanConstruct(self,ransomNote:str,magazine:str)->bool:cnta=[0]*26cntb=[0]*26forcinransomNote:cnta[or......
  • Intern大模型训练营(四):使用Hugging Face下载模型
    1.Huggingface下载模型首先在Huggingface平台注册账号。然后进入https://github.com/codespaces,选择使用jupyter_notebook配置,输入以下命令流安装香瓜依赖。#安装transformerspipinstalltransformers==4.38pipinstallsentencepiece==0.1.99pipinstalleinops==0.8......
  • Densenet模型花卉图像分类
    项目源码获取方式见文章末尾!600多个深度学习项目资料,快来加入社群一起学习吧。《------往期经典推荐------》项目名称1.【基于CNN-RNN的影像报告生成】2.【卫星图像道路检测DeepLabV3Plus模型】3.【GAN模型实现二次元头像生成】4.【CNN模型实现mnist手写数字识别】......
  • 大模型--训练 加速之 数据并行(DP, DDP与ZeRO)-上-12
    目录1.参考2.总结3.分布式数据并行(DDP)4.总结1.参考https://zhuanlan.zhihu.com/p/6171339712.总结以GoogleGPipe为代表的流水线并行范式,当模型太大,一块GPU放不下时,流水线并行,将模型的不同层放到不同的GPU上,通过切割mini-batch实现对训练数据的流水线处理,提升GPU计算......
  • 第十五期 05 LCM潜在一致性模型
    潜在扩散模型(LDM)输入图像x进入模型。x由编码器Ɛ编码,在“潜在空间”(一个维度小得多的空间)内创建一个维度较小的向量z。这个潜在空间向量z连续T步被添加高斯噪声——这就是“扩散”过程。这个向量z在被添加噪声T次后被称为z_T。在生成图像时,我们经常会添加一些......
  • 虚假新闻检测:CSV格式数据集的预处理与模型选择
    ✅作者简介:2022年博客新星第八。热爱国学的Java后端开发者,修心和技术同步精进。......
  • 数学建模_BP神经网络预测新数据模型(多输入单输出)回归预测模型+Matlab代码包教会使用
    基于BP神经网络新数据预测的多输入单输出回归预测模型简介这段代码实现了一个BP神经网络BackpropagationNeuralNetwork用于回归预测任务,并包含新数据的预测功能。该模型通过多层前馈神经网络学习输入特征与目标变量之间的非线性映射关系,并使用反向传播算法优化权重和偏置......