当前位置: 首页 > article >正文

理解生成式模型中的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
结果:模型生成有创造性且多样的文本,非常适合讲故事。
生成的文本:
“在暮光的怀抱中,这座发光梦想之城低声诉说着被遗忘的英雄和不为人知的神秘故事。”

在不同场景下参数值的参考

场景TemperatureTop_p描述
代码生成0.20.1生成符合既定模式和规范的代码。输出更具确定性和针对性。有助于生成语法正确的代码。
创意写作0.70.8输出更具探索性,较少受模式约束。为讲故事生成有创意且多样的文本。
聊天机器人回复0.50.5生成平衡连贯性和多样性的对话式回复。输出更自然且吸引人。
代码注释生成0.30.2生成更有可能简洁且相关的代码注释。输出更具确定性且符合规范。
数据分析脚本编写0.20.1生成更有可能正确且高效的数据分析脚本。输出更具确定性和针对性。
探索性代码编写0.60.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)

http://www.kler.cn/a/371091.html

相关文章:

  • VUE3 VITE项目在 npm 中,关于 Vue 的常用命令有一些基础命令
  • 【声音场景分类--论文阅读】
  • 【ROS2】数据记录(ros2 bag)详解
  • dockerfile2.0
  • 机组存储系统
  • Android SDK下载安装(图文详解)
  • AI驱动的低代码未来:加速应用开发的智能解决方案
  • R语言实现GWAS meta分析(1)
  • 基于 vue 快速上手 React
  • 嵌入式软件 Bug 排查与调试技巧
  • 嵌入式学习-网络-Day03
  • 从头学PHP之流程控制
  • 基于Mysql、JavaScript、PHP、ajax开发的MBTI性格测试网站(前端+后端)
  • 【React】React18核心源码解读
  • Spring Boot植物健康系统:绿色科技的突破
  • 基于SSM+小程序的购物管理系统1
  • 整合Mybatis-plus及最佳实践
  • Android中SurfaceView与GLSurfaceView 的关系
  • 3GPP协议解读_NTN系列(一)_38.811_非地面网络(NTN)的背景、应用场景和信道建模
  • 京东双十一高并发场景下的分布式锁性能优化
  • PHP显示数据库中图片BLOB格式
  • lvgl
  • 今日总结10.28
  • Android WebView加载不到cookie
  • Trains-03练习-结构
  • Android -- 调用系统相册之图片裁剪保存