理解生成式模型中的Temperature、Top-k 以及 Top-p 参数
理解生成式模型中的Temperature、Top-k 以及 Top-p 参数
flyfish
Temperature、Top - k和Top - p
虽然这三种方法都旨在控制生成式模型的随机性和创造性,但它们的方式不同:
参数 | 控制机制 | 对输出的影响 | 何时使用 |
---|---|---|---|
Temperature | 在softmax之前缩放对数几率 | 调整词元选择的整体随机性 | 在不限制词汇量的情况下控制创造性 |
Top - k | 限制为前k个词元 | 将选择限制在k个最有可能的词元上 | 为防止罕见或不相关的词元 |
Top - p | 限制在累积概率范围内的词元 | 根据置信度调整词汇量大小 | 用于对多样性进行动态控制 |
生成式模型介绍
生成式模型作为人工智能领域中一类重要的模型,旨在通过学习训练数据得到模型,从而模型具备生成与训练数据相似的新数据实例的能力。
在自然语言处理(NLP)这个特定的领域中,模型在大量的文本数据上进行训练,并能根据给定的提示生成连贯且与上下文相关的文本。
然而,这些模型的原始输出是由可能的下一个词元(单词或子词)的概率分布决定的。像Temperature、Top - k 和 Top - p 这样的采样策略被用于操纵这些分布,在生成的文本中平衡随机性和确定性。
一、温度(Temperature):控制随机性
Temperature是一个在应用 softmax 函数以获得概率之前对对数几率( logits)(原始预测)进行缩放的参数。温度是 生成式 模型中用于控制生成文本的随机性和创造性的一个参数。温度参数影响 softmax 函数,该函数用于将对数几率(模型的原始输出值)转换为概率。
较高的温度值,比如 1 或 2,将导致更具多样性和不可预测的输出。这是因为较高的温度值会增加对数几率的方差,从而导致更均匀的概率分布。
另一方面,较低的温度值,比如 0.5,将使输出更具针对性和确定性。较低的温度值使概率分布更尖锐,有利于对数几率较高的词元。
temperature scaling=softmax(logits / temperature)
它影响输出的随机性:
低温 Low Temperature(<1):使模型更加保守。它增加了排名较高的词元的概率,从而导致更可预测和确定性的输出。
高温 High Temperature(>1):使模型更具创造性和随机性。它使概率分布扁平化,使得排名较低的词元更频繁地被选中。
实际怎么用温度(Temperature)
创意写作:使用较高的温度(例如 0.8 到 1.2)来生成更多样化和富有想象力的文本。
事实性回答:使用较低的温度(例如 0.2 到 0.5)来产生更准确和有针对性的答案。
二、Top - k 采样:限制词汇表(Vocabulary)
Top - k 采样在每一步将模型的词元选择限制在最有可能的 k 个词元上,在它们之间重新分配概率,并将其余的概率设置为零。
工作原理
1 对词元(Token)排序:模型根据预测概率对所有可能的词元进行排名。
2 选择 Top - k:只保留排名前 k 的词元;其余的被丢弃。
3 概率重新分配:对排名前 k 的词元的概率进行重新归一化,使其总和为 1。
对输出的影响
降低随机性:通过限制词元池,模型避免了不太可能或无意义的单词。
控制创造性:调整 k 可以在多样性和连贯性之间取得平衡。
实际怎么用
聚焦内容生成:使用较低的 k 值(例如 5 到 20)以使输出围绕主题。
增强创造性:较高的 k 值(例如 50 到 100)引入更多的多样性。
三、Top - p 采样:动态词汇表(Vocabulary )限制
Top - p 采样,也称为核采样( nucleus sampling),包括一组最小的词元,其累积概率总和达到阈值 p。
工作原理
1 对词元排序:词元根据其概率进行排名。
2 累积概率:从概率最高的词元开始,将词元添加到候选列表中,直到累积概率超过 p。
3 概率重新分配:在这个动态集合中对概率进行重新归一化。
相对于 Top - k 的优势
动态词汇量:与 Top - k 不同,所考虑的词元数量可以变化,以适应模型的置信度。
更好地处理不确定性:在模型不太确定的情况下,Top - p 允许更多的探索。
实际怎么用
平衡生成:常见的 p 值范围从 0.9 到 0.95,在多样性和连贯性之间提供了一个良好的权衡。
微调创造性:根据所需的随机性调整 p 以包含更多或更少的词元。
组合使用
这些方法可以组合使用以进一步微调输出。例如:
温度 Temperature + Top - k:在限制为前k个词元的同时调整随机性。
温度 Temperature + Top - p:通过温度控制创造性,并使用Top - p自适应地限制词元。
实际示例
示例1:低温,低Top - k
设置:温度 = 0.3,Top - k = 10
结果:模型生成有针对性且确定性的文本,适用于事实性回答。
生成的文本:
“法国的首都是巴黎。它以其丰富的历史和文化遗产而闻名。”
示例2:高温,高Top - p
设置:温度 = 1.0,Top - p = 0.95
结果:模型生成有创造性且多样的文本,非常适合讲故事。
生成的文本:
“在暮光的怀抱中,这座发光梦想之城低声诉说着被遗忘的英雄和不为人知的神秘故事。”
在不同场景下参数值的参考
场景 | Temperature | Top_p | 描述 |
---|---|---|---|
代码生成 | 0.2 | 0.1 | 生成符合既定模式和规范的代码。输出更具确定性和针对性。有助于生成语法正确的代码。 |
创意写作 | 0.7 | 0.8 | 输出更具探索性,较少受模式约束。为讲故事生成有创意且多样的文本。 |
聊天机器人回复 | 0.5 | 0.5 | 生成平衡连贯性和多样性的对话式回复。输出更自然且吸引人。 |
代码注释生成 | 0.3 | 0.2 | 生成更有可能简洁且相关的代码注释。输出更具确定性且符合规范。 |
数据分析脚本编写 | 0.2 | 0.1 | 生成更有可能正确且高效的数据分析脚本。输出更具确定性和针对性。 |
探索性代码编写 | 0.6 | 0.7 | 生成探索替代解决方案的代码。输出较少受既定模式约束,更具创造性。 |
如果给的值,不好用,怎么办
编写一个客户端,传不同的参数给模型,查看模型的结果
1 确定你的目标:确定你需要有创造性、多样化的输出,还是有针对性、确定性的输出。
2 从默认值开始:如果不确定,从默认设置开始(例如,温度 = 1.0,Top - p = 0.9)。
3 逐步调整:一次修改一个参数以查看其效果。
(1)增加温度以获得更多随机性。
(2)降低Top - k或Top - p以使输出更有针对性。
4 广泛测试:生成多个样本以了解变化如何影响输出。
潜在陷阱
1 温度过高:可能导致不连贯或无意义的文本。
2 Top - p或Top - k过低:可能导致重复或枯燥的输出。
3 重叠效应:将温度、Top - k和Top - p的极端值组合可能导致不可预测的结果。
举个例子
可以更改不同的参数进行测试
from modelscope import AutoModelForCausalLM, AutoTokenizer
model_name = "qwen/Qwen2.5-72B-Instruct"
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained(model_name)
prompt = "从前,在一个遥远的地方,有一片神奇的森林,在那里发生了很多奇妙的故事。"
messages = [
{"role": "system", "content": "你是Qwen。你是一个乐于助人的助手。"},
{"role": "user", "content": prompt}
]
text = tokenizer.apply_chat_template(
messages,
tokenize=False,
add_generation_prompt=True
)
model_inputs = tokenizer([text], return_tensors="pt").to(model.device)
# 更新生成参数
generation_params = {
'max_new_tokens': 50,
'temperature': 0.7,
'top_k': 50
}
generated_ids = model.generate(
**model_inputs,
**generation_params
)
generated_ids = [
output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)
]
response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0]
print(response)