趋近智
我们接下来看看改变现有数据以生成新变体的方法:数据掩码和数据扰动。这些技术在您需要扩充数据集、保护敏感信息或引入可控变动以降低模型对微小输入变化的敏感度时尤其有用。尽管有些生成方法是从头创建文本,但掩码和扰动通常是从现有数据或预定义模板开始。
数据掩码是将文本数据中的敏感或可识别信息替换为通用占位符、匿名值或更广泛类别的方法。其主要目标通常是保护隐私,使您能够使用数据训练大型语言模型,而不会泄露机密信息。它也可以是生成合成数据的一种方式,即特定实体被抽象化,帮助模型关注模式而非具体内容。
使用占位符或通用值进行替换: 这是一种广泛使用的方法,其中姓名、地址、电话号码或社会安全号码等特定实体被预定义的标记 (token)或生成列表中的值替换。
[姓名]、[位置]、[组织]、[日期]。例如,句子: "John Smith, residing at 123 Main St, Anytown, called us on 05/15/2024 regarding order #XN789." 可以掩码为: "[NAME], residing at [ADDRESS], [CITY], called us on [DATE] regarding order #[ORDER_ID]."
泛化: 与精确替换不同,您可以将特定值泛化为更广泛的类别。这会降低精确度,但可以保持数据的结构完整性和在某些任务中的有效性。
删改: 在某些情况下,信息可能会被完全移除。虽然这更直接地关乎匿名化而非纯粹的合成,但由此产生的缺失部分数据可被视为一种合成变体。例如,在客户评论数据集中删改所有特定公司名称的提及。
保持平衡非常重要:过度掩码虽然能有效保护隐私,但可能会移除过多有用的上下文 (context)信息,从而可能降低模型性能。目的是仅掩码您的特定目标所需的内容,同时保留数据效用。
数据扰动是指对现有文本样本进行微小且通常是随机的改动,以创建新的、略有不同的版本。目标是增加数据集的多样性,从而可能降低大型语言模型对微小输入变化的敏感度。可以将其视为一种“抖动”数据点的方式,以覆盖现有样本周围更多的输入空间。
同义词替换: 句子中的词语被替换为其同义词。这可以带来词汇多样性。
随机插入: 随机向句子中插入词语(通常是常用词或相邻词的同义词)。
随机删除: 随机从句子中移除词语。
随机交换: 随机交换句子中两个词语的位置。
字符级扰动: 在字符层面引入微小变化,例如:
以下图示说明了在简单句子上的一些扰动可能性。
这是一个扰动技术的图示,如同义词替换、删除、词语交换和插入应用于原始句子。
我们来呈现一个非常基本的同义词替换。在实践中,您会使用更复杂的同义词库,可能与自然语言处理 (NLP) 库集成,或使用词嵌入 (embedding)模型根据语境找到合适的同义词。
import random
def simple_synonym_perturbation(text, synonym_map, probability=0.1):
words = text.split()
perturbed_words = []
for word in words:
# 检查单词是否在映射中,以及是否应根据概率进行扰动
if random.random() < probability and word.lower() in synonym_map:
synonyms = synonym_map[word.lower()]
# 如果可能,保留原始大小写,否则直接使用同义词
chosen_synonym = random.choice(synonyms)
if word.istitle():
perturbed_words.append(chosen_synonym.title())
elif word.isupper():
perturbed_words.append(chosen_synonym.upper())
else:
perturbed_words.append(chosen_synonym)
else:
perturbed_words.append(word)
return " ".join(perturbed_words)
# 一个非常小且具说明性的同义词映射(全部小写)
example_synonym_map = {
"quick": ["fast", "swift", "rapid"],
"happy": ["joyful", "pleased", "content"],
"big": ["large", "huge", "enormous"]
}
original_sentence = "The Quick dog was very Happy with the BIG bone."
# 对符合条件的词语应用 30% 概率的扰动
perturbed_sentence = simple_synonym_perturbation(original_sentence, example_synonym_map, probability=0.3)
print(f"原始: {original_sentence}")
print(f"扰动后: {perturbed_sentence}")
# 可能的输出:
# Original: The Quick dog was very Happy with the BIG bone.
# Perturbed: The Swift dog was very Pleased with the HUGE bone.
此代码片段提供了一种执行同义词替换的基本方法,并尝试保留大小写。对于更高级的应用,建议使用提供更丰富同义词库或词嵌入相似度的自然语言处理 (NLP) 库,以便进行语境合适的替换。
掩码和扰动都是有用的工具,但它们需要谨慎应用。目标是生成对您的大型语言模型有益的合成数据。
在实践中,您通常会将这些技术与本章讨论的其他生成方法结合使用。例如,您可以使用大型语言模型生成初始文本(如“使用大型语言模型生成合成样本”中涉及的),然后应用掩码或扰动来进一步丰富输出或为满足特定的隐私要求做准备。
随着我们继续,请记住这些核心技术是构建模块。其有效性来自于深思熟虑地结合它们并评估其对大型语言模型性能和行为的影响。本章后面的实践练习将为您提供使用大型语言模型 API 进行生成的机会,您可以考虑这些掩码和扰动方法如何补充此类输出。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造