温度虽寒,其道犹变:OpenAI接口之温度参数设置为0,为何每次回复仍有不确定性?

问题描述

调用openai API,使用templature = 0,每次返回的内容仍有一些不同

>>> client = OpenAI(
...             api_key=api_key,
...             base_url=api_base)
#第一次尝试
>>> response = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{"role": "user", "content": "who are you"}],temperature=0)
>>> response.choices[0].message.content
'I am an artificial intelligence assistant created to help answer questions and provide information. How can I assist you today?'
#第二次尝试
>>> response = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{"role": "user", "content": "who are you"}],temperature=0)
>>> response.choices[0].message.content
'I am an AI assistant designed to help answer questions and provide information to the best of my abilities. How can I assist you today?'
#第三次尝试
>>> response = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{"role": "user", "content": "who are you"}],temperature=0)
>>> response.choices[0].message.content
'I am a language model AI created to assist with answering questions and engaging in conversations.'

可以发现多次调用api进行文本生成,得到的回复有些许差别

temperlature介绍

在文本生成的过程中,可以通过设置采样温度值,控制文本生成的多样性。如下是温度参数的使用流程:

  1. 语言模型首先根据已有文本,计算生成词汇表中每个词所对应的负对数概率。
    比如:在生成下一个词时,模型可能会给出以下对数概率:
    Token A: -1.2
    Token B: -0.5
    Token C: -2.3
    Token D: -0.1
    
  2. 将这些负对数概率除以温度值:log_prob_scaled = log_prob / temperature
    比如:当温度值为0.5时,概率分布变为:
    Token A: -1.2/0.5 = -2.4
    Token B: -0.5/0.5 = -1.0
    Token C: -2.3/0.5 = -4.6
    Token D: -0.1/0.5 = -0.2
    
    可以发现,通过除以一个小于0的温度值,使得概率分布变得更加极端。
  3. 应用softmax函数,将这些负对数概率转换为总和为1的概率分布。

通过一个例子来检验代码

import numpy as np
import matplotlib.pyplot as plt

def softmax(logits, temperature=1.0):
    """计算给定logits和温度的softmax概率分布"""
    exp_logits = np.exp(logits / temperature)
    return exp_logits / np.sum(exp_logits)

def plot_temperature_effect(logits, temperatures):
    """绘制不同温度下的概率分布"""
    plt.figure(figsize=(10, 6))
    
    for T in temperatures:
        probabilities = softmax(logits, T)
        plt.plot(probabilities, label=f'Temperature = {T}')
    
    plt.title('Effect of Temperature on Probability Distribution')
    plt.xlabel('Token Index')
    plt.ylabel('Probability')
    plt.xticks(np.arange(len(logits)), [f'Token {i}' for i in range(len(logits))])
    plt.legend()
    plt.grid()
    plt.show()

# 示例logits(可以是模型输出的logit值)
logits = np.array([0.1,1,2.3,1.5,2.1,1.2,1.5,0.1,3.2,3.32,2.32,2.01,0.3,1.25])

# 不同的温度值
temperatures = [0.5,1, 2.0]

# 绘制效果
plot_temperature_effect(logits, temperatures)

在这里插入图片描述

从上图可以看出,温度值为1时,是原本的分布,温度值为0.5时,概率分布变得更加极端,温度值为2时,概率分布变得更加平缓。

那么,在调用openai API时,设置temperature=0,为什么还会出现不同的结果呢?

参考https://community.openai.com/t/a-question-on-determinism/8185/2,可能有如下2个原因:

  1. 2个token的对数差异很小:在调用openai API时,设置temperature=0,只是使得概率分布变得更加极端,但是仍然可能有2个token排名为第一第二,但他们之间的对数概率差异很小,使得采样时仍然有一定的随机性。
  2. 大语言模型推理的并行操作的不确定性:大模型推理时的并行操作会引入不确定,比如计算a*b*c时,可能计算(a*b)*c,也可能计算a*(b*c),这会使得最终的结果有一定的差异。

而模型推理时是以自回归方式的方式进行的,一旦在某个time step,模型选择了某个token,那么之后生成的文本很可能就会发散,导致最终的文本生成结果出现差异。

在本地进行推理是否会有变化?

上面讨论的是由openai提供的推理服务,那么我们在本地进行推理时,是否会有变化?
进行实验使用qwen2.5_7b_instruct模型,在本地进行推理。采样参数为:
temperature=0.01,max_tokens=512, top_p=1
重复多次,观察结果是否一致。
结果如下:

#输入:
为什么今天是礼拜五

#第一次回复
今天是否是礼拜五取决于你所在的地区使用的是哪种日历系统以及当前的日期。礼拜五是每周的第五天,如果你想知道今天是否是礼拜五,可以查看你所在地的日期。如果你是在一个使用公历(格里高利历)的地区,你可以查看当前的日期来确定。例如,如果今天的日期是2023106日,那么在公历系统中,今天就是礼拜五。
#第二次
今天是否是礼拜五取决于你所在的地区使用的是哪种日历系统以及当前的日期。礼拜五是每周的第五天,如果你想知道今天是否是礼拜五,可以查看你所在地的日期。如果你是在一个使用公历(格里高利历)的地区,你可以查看当前的日期来确定。例如,如果今天的日期是2023106日,那么在公历系统中,今天就是礼拜五。
#第三次
今天是否是礼拜五取决于你所在的地区和采用的日历系统。如果你是在使用公历(格里高利历),那么你可以查看当前的日期来确定今天是否是礼拜五。例如,如果今天的日期是2023106日,那么在公历下今天就是礼拜五。如果你是在使用其他日历系统,比如伊斯兰历,那么礼拜五的日期会有所不同。
#第四次
今天是否是礼拜五取决于你所在的地区和采用的日历系统。如果你是在使用公历(格里高利历),那么你可以查看当前的日期来确定今天是否是礼拜五。例如,如果今天的日期是2023106日,那么在公历下今天就是礼拜五。如果你是在使用其他日历系统,比如伊斯兰历,那么礼拜五的日期会有所不同。
#第五次
今天是否是礼拜五取决于你所在的地区和采用的日历系统。如果你是在使用公历(格里高利历),那么你可以查看当前的日期来确定今天是否是礼拜五。例如,如果今天的日期是2023106日,那么在公历下今天就是礼拜五。如果你是在使用其他日历系统,比如伊斯兰历,那么礼拜五的日期会有所不同。
#第六次
今天是否是礼拜五取决于你所在的地区使用的是哪种日历系统以及当前的日期。礼拜五是每周的第五天,如果你想知道今天是否是礼拜五,可以查看你所在地的日期。如果你是在一个使用公历(格里高利历)的地区,你可以查看当前的日期来确定。例如,如果今天的日期是2023106日,那么在公历系统中,今天就是礼拜五。

可以发现,5次推理的结果也并不是完全一致,会发现大概有2类回复,

第一种回复:

今天是否是礼拜五取决于你所在的地区使用的是哪种日历系统以及当前的日期。礼拜五是每周的第五天,如果你想知道今天是否是礼拜五,可以查看你所在地的日期。如果你是在一个使用公历(格里高利历)的地区,你可以查看当前的日期来确定。例如,如果今天的日期是2023年10月6日,那么在公历系统中,今天就是礼拜五。

第二种回复:

今天是否是礼拜五取决于你所在的地区和采用的日历系统。如果你是在使用公历(格里高利历),那么你可以查看当前的日期来确定今天是否是礼拜五。例如,如果今天的日期是2023年10月6日,那么在公历下今天就是礼拜五。如果你是在使用其他日历系统,比如伊斯兰历,那么礼拜五的日期会有所不同。

他们之间有一些细微的差别。说明模型可能在推理时,在生成“今天是否是礼拜五取决于你所在的地区”这句话之前都没什么争议,关键在在predict "今天是否是礼拜五取决于你所在的地区"的next token时,可能会有2个token排名为第一第二,但由于他们之间的差异很小,导致采样时有一定的随机性。

实验检验:
检查模型的推理过程,查看其推理的token序列和概率分布。

Time Step 12:
Candidates:
Token: 使用的, Log Probability: -1.0418
Token: 采用, Log Probability: -1.4168
Token: 使用, Log Probability: -1.9168
Token: 所, Log Probability: -1.9168
Token: 如何, Log Probability: -3.2918

Chosen Token: 使用的 (Probability: 0.0908)

可以发现“使用的”和“采用”的log概率差异很小。

检验每个推理步骤的词概率的代码:

#推理模型
messages = [
    {"role": "user", "content": "为什么今天是礼拜五"},
    {"role": "assistant", "content": "今天是否是礼拜五取决于你所在的地区"},
]
prompt = tokenizer.apply_chat_template(messages,tokenize=False,add_generation_prompt=True)
sampling_params = SamplingParams(temperature=0.01, top_p=1,logprobs=5,max_tokens=512)
outputs = model.generate(prompt, sampling_params)
for output in outputs:
    prompt = output.prompt
    generated_text = output.outputs[0].text
    print(f"Prompt: {prompt!r}, \n Generated text: {generated_text!r}")

print(outputs[0].outputs[0].logprobs)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/913960.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】需求的概念和常见模型(瀑布、螺旋、增量、迭代)

1. 什么是需求 在企业中,经常会听到:用户需求和软件需求 用户需求:没用经过合理的评估,通常就是一句话(开发一个五彩斑斓的黑)软件需求:开发人员和测试人员执行工作的依据 1.2 软件需求 在工…

食品配送管理系统(源码+文档+部署+讲解)

食品配送管理系统是成品商业化项目,系统可基于源码二开。 系统概述 餐饮食品配送,包含配送人APP、下单APP、管理端等,实现订餐、配餐,用于食品店、中央厨房等订餐、团餐业务 本项目名称为食品配送系统,是针对食品配…

./bin/mindieservice_daemon启动成功

接MindIE大模型测试及报错Fatal Python error: PyThreadState_Get: the function must be called with the GIL held,-CSDN博客经过调整如下红色部分参数,昇腾310P3跑起来了7b模型: rootdev-8242526b-01f2-4a54-b89d-f6d9c57c692d-qjhpf:/home/apulis-de…

我谈维纳(Wiener)复原滤波器

Rafael Gonzalez的《数字图像处理》中,图像复原这章内容几乎全错。上篇谈了图像去噪,这篇谈图像复原。 图像复原也称为盲解卷积,不处理点扩散函数(光学传递函数)的都不是图像复原。几何校正不属于图像复原&#xff0c…

精选 Top10 开源调度工具,解锁高效工作负裁自动化

在大数据和现代 IT 环境中,任务调度与工作负载自动化(WLA)工具是优化资源利用、提升生产效率的核心驱动力。随着企业对数据分析、实时处理和多地域任务调度需求的增加,这些工具成为关键技术。 本文将介绍当前技术发展背景下的Top …

高效视觉方案:AR1335与i.MX8MP的完美结合

方案采用NXP i.MX8MP处理器和onsemi AR1335图像传感器,i.MX8MP集成四核Cortex-A53、NPU及双ISP技术。AR1335是一颗分辨率为13M的CMOS传感器。它使用了先进的BSI技术,提供了超高的分辨率和出色的低光性能,非常适合于需要高质量图像的应用。此外…

Ubuntu+ROS 机械臂拾取和放置

官方链接:https://github.com/skumra/baxter-pnp 1.下载并安装 SDK 依赖项 sudo apt-get install python-wstool python-rosdep 2.创建新的 catkin 工作区 mkdir -p ~/ros_ws/src cd ~/ros_ws/src 3.使用 wstool 下载 rosinstall 文件并将其复制到 Catkin 工作区…

论文阅读《Structure-from-Motion Revisited》

摘要 增量式地运动结构恢复是从无序图像集合中进行三维重建的一个普遍策略。虽然增量式地重建系统在各个方面上都取得了巨大的进步,但鲁棒性、准确性、完整度和尺度仍然是构建真正通用管道的关键问题。我们提出了一种新的运动结构恢复技术,它改进了目前…

基于Spring Boot的船运物流管理系统的设计与实现,LW+源码+讲解

摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定船运物流管理系统的总体功能模块。然后&#xff0…

威联通Docker Compose搭建NAS媒体库资源工具NAS Tools

文章目录 一、环境配置1-1 需要的配件1-2 环境安装及配置注意:获取PUID/PGID1-3 目录位置准备总结,这里我们要做5件事备注:Docker无法下载解决办法二、登录配件,进行配件连接和配置2-1 jackett设置2-2 qBittorrent设置!!!设置文件下载地址2-3 jellyfin设置2-4 NASTools设…

Spring Boot - 扩展点 EnvironmentPostProcessor源码分析及真实案例

文章目录 概述EnvironmentPostProcessor 作用EnvironmentPostProcessor 实现和注册创建类并实现接口注册到 Spring Boot常见应用场景 源码分析1. EnvironmentPostProcessor 接口定义2. 扩展点加载流程3. 加载 EnvironmentPostProcessor 实现类4. EnvironmentPostProcessor 执行…

【eNSP】企业网络架构链路聚合、数据抓包、远程连接访问实验(二)

一、实验目的 网络分段与VLAN划分: 通过实验了解如何将一个大网络划分为多个小的子网(VLAN),以提高网络性能和安全性。 VLAN间路由: 学习如何配置VLAN间的路由,使不同VLAN之间能够通信。 网络设备配置&am…

Python 智取京东商品详情:代码秘籍大公开

介绍使用 Python 获取京东商品详情的背景和意义,强调其在数据收集和分析中的重要性。 (一)数据收集的需求 在当今数字化的商业环境中,对京东商品详情数据的需求日益增长。市场调研人员需要这些数据来了解不同产品的市场份额、价格…

[C++]——位图与布隆过滤器

目录 一、前言 二、正文 1.位图 1.1 位图概念 1.2 位图的实现 1.2.1 Set 1.2.2 ReSet 1.2.3 Text 1.3 位图的应用 2.布隆过滤器 2.1布隆过滤器的提出 2.2 布隆过滤器概念 2.3 布隆过滤器的实现 2.3.1布隆过滤器的插入 2.3.2 布隆过滤器的查找 2.3.3 布隆过滤器…

工具收集 - java-decompiler / jd-gui

工具收集 - java-decompiler / jd-gui 参考资料 用法:拖进来就行了 参考资料 https://github.com/java-decompiler/jd-gui 脚本之家:java反编译工具jd-gui使用详解

Spark的容错机制:persist持久化机制checkpoint检查点机制区别

persist持久化机制: 作用:将RDD的数据缓存到内存或磁盘中,以便在后续操作中重复使用,减少计算开销。特点: 灵活性高:可以指定不同的存储级别(如仅内存、内存和磁盘、仅磁盘等)。 数…

Elasticsearch集群和Kibana部署流程

搭建Elasticsearch集群 1. 进入Elasticsearch官网下载页面,下载Elasticsearch 在如下页面选择Elasticsearch版本,点击download按钮,进入下载页面 右键选择自己操作系统对应的版本,复制下载链接 然后通过wget命令下载Elastics…

Flink API 的层次结构

Apache Flink 提供了多层 API,每层 API 针对不同的抽象层次和用途,使得开发者可以根据具体需求选择合适的 API 层次。以下是 Flink API 的层次结构及其简要说明:

案例精选 | 河北省某检察院安全运营中异构日志数据融合的实践探索

河北省某检察院是当地重要的法律监督机构,肩负着维护法律尊严和社会公平正义的重要职责。该机构依法独立行使检察权,负责对犯罪行为提起公诉,并监督整个诉讼过程,同时积极参与社会治理,保护公民权益,推动法…

SpringCloud框架学习(第二部分:Consul、LoadBalancer和openFeign)

目录 六、Consul服务注册和发现 1.基本介绍 2.下载运行 3.服务注册与发现 (1)支付服务provider8001注册进consul (2)修改订单服务cloud-consumer-order80 4.CAP (1)CAP理论 (2&#x…