温度虽寒,其道犹变: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 pltdef 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.promptgenerated_text = output.outputs[0].textprint(f"Prompt: {prompt!r}, \n Generated text: {generated_text!r}")print(outputs[0].outputs[0].logprobs)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

vue-h5:在h5中实现相机拍照加上身份证人相框和国徽框

参考: https://blog.csdn.net/weixin_45148022/article/details/135696629 https://juejin.cn/post/7327353533618978842?searchId20241101133433B2BB37A081FD6A02DA60 https://www.freesion.com/article/67641324321/ https://github.com/AlexKratky/vue-camer…

国标GB28181视频平台EasyCVR私有化部署视频平台对接监控录像机NVR时,录像机“资源不足”是什么原因?

EasyCVR视频融合云平台,是TSINGSEE青犀视频“云边端”架构体系中的“云平台”系列之一,是一款针对大中型项目设计的跨区域、网络化、视频监控综合管理系统平台,通过接入视频监控设备及视频平台,实现视频数据的集中汇聚、融合管理、…

【Android、IOS、Flutter、鸿蒙、ReactNative 】标题栏

Android 标题栏 参考 Android Studio版本 配置gradle镜像 阿里云 Android使用 android:theme 显示标题栏 添加依赖 dependencies {implementation("androidx.appcompat:appcompat:1.6.1")implementation("com.google.android.material:material:1.9.0")…

歌尔微拟赴港IPO,揭示AI+终端升级的供给革命

1959年,美国物理学家理查德费曼在他著名的演讲“底部有足够的空间”中,首次提出了将机器小型化到原子和分子尺度的想法。这个充满想象力的观点,为世界科技发展开启了一扇新的窗口。 时至今日,应这一理念而生的MEMS产品已经成为各…

ROS第七梯:ROS+VSCode+Python环境配置

第一步:Python版本的ROS项目和C++版本的ROS项目前期创建功能包的步骤基本一致,具体可参考第二章。 第二步:在功能包的目录下创建一个与src目录平级的文件夹,名称写作scripts: 第三步:在scripts文件夹下创建python的节点代码文件,此处以一个订阅节点代码文件为例:

洛谷解题日记||基础篇3

#include <iostream> #include <iomanip> // 用于设置输出格式 using namespace std;double a, b, c, d;// 定义方程 f(x) ax^3 bx^2 cx d double fc(double x) {return a * x * x * x b * x * x c * x d; }int main() {double l, r, m, x1, x2;int s 0;/…

软件测试学习记录 Day1

根据黑马程序员最新版的软件测试课程所做的笔记&#xff0c;需要原件后台私信&#xff1a; 练习提取测试点&#xff1a; 博主的答案&#xff0c;有不一样看法的可评论区讨论&#xff1a;

代码随想录刷题记录(二十七)——55. 右旋字符串

&#xff08;一&#xff09;问题描述 55. 右旋字符串&#xff08;第八期模拟笔试&#xff09;https://kamacoder.com/problempage.php?pid1065字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k&#xff0c;请编写一个函数&…

FreeRTOS 24:事件组EventGroup等待、清零、获取操作

等待事件标志位xEventGroupWaitBits() 既然标记了事件的发生&#xff0c;那么我怎么知道他到底有没有发生&#xff0c;这也是需要一个函数来获 取 事 件 是 否 已 经 发 生 &#xff0c; FreeRTOS 提 供 了 一 个 等 待 指 定 事 件 的 函 数 — — xEventGroupWaitBits()&…

信息安全数学基础(47)域的结构

一、域的定义 设F为一个非空集合&#xff0c;在其上定义两种运算&#xff1a;加法和乘法。如果这两种运算在集合上封闭&#xff0c;且满足以下条件&#xff0c;则称F对于规定的乘法和加法构成一个域&#xff1a; F中所有元素对于加法形成加法交换群&#xff0c;即加法满足交换律…

#渗透测试#SRC漏洞挖掘#CSRF漏洞的防御

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

HarmonyOS 沉浸式状态实现的多种方式

1. HarmonyOS 沉浸式状态实现的多种方式 HarmonyOS 沉浸式状态实现的多种方式 1.1. 方法一 1.1.1. 实现讲解 &#xff08;1&#xff09;首先设置setWindowLayoutFullScreen(true)&#xff08;设置全屏布局&#xff09;。   布局将从屏幕最顶部开始到最底部结束&#xff0c…

在API接口数据获取过程中,如何确保数据的安全性和隐私性?

在API接口数据获取过程中&#xff0c;确保数据的安全性和隐私性至关重要。以下是一些关键措施&#xff0c;可以帮助开发者和管理者保护API接口的数据安全和隐私性&#xff1a; 身份认证和授权 身份认证&#xff1a;确认用户身份的过程&#xff0c;常用的身份认证方式包括用户…

C++常用的特性-->day05

友元的拓展语法 声明一个类为另外一个类的友元时&#xff0c;不再需要使用class关键字&#xff0c;并且还可以使用类的别名&#xff08;使用 typedef 或者 using 定义&#xff09;。 #include <iostream> using namespace std;// 类声明 class Tom; // 定义别名 using …

python-27-Python ORM系列之彻底搞明白ORM概念,对ORM进行封装结合FastAPI实现数据库的增删改查,联表查询等接口

python-27-Python ORM系列之彻底搞明白ORM概念&#xff0c;对ORM进行封装结合FastAPI实现数据库的增删改查&#xff0c;联表查询等接口 一.简介 在Python基础系列ORM部分为大家介绍了如何搭建MySQL数据和MySQL一些访问配置&#xff0c;同时也介绍了pymysql库的封装来实现对数…

从哈佛哲学系到蛋白质设计大师,David Baker:AlphaFold令我深刻认识到深度学习的力量

要说谁是引领蛋白质设计的世界级大师&#xff0c;美国华盛顿大学的 David Baker 教授可谓是当之无愧&#xff0c;作为该领域的顶级专家&#xff0c;Baker 在蛋白质方向发表研究论文 700 余篇&#xff0c;引用量累计超 17.7 万。今年 10 月&#xff0c;因其在蛋白质设计方面的卓…

【测试框架篇】单元测试框架pytest(2):用例编写

一、 前言 前面一章我们介绍了pytest环境安装和配置&#xff0c;并在pycharm里面实现了我们第一个pytest脚本。但是有些童鞋可能在编写脚本的时候遇到了问题&#xff0c;本文会讲一下我们编写pytest用例时需要遵守哪些既定的规则&#xff0c;同时这个规则也是可以修改的。 二…

实现LiDAR和多视角摄像头数据的对齐、可控X-DRIVE:用于驾驶场景的跨模态一致多传感器数据合成

Abstract 近年来&#xff0c;扩散模型在合成驾驶场景中的LiDAR点云或摄像头图像数据方面取得了进展。尽管这些模型在单一模态数据的边际分布建模方面取得成功&#xff0c;但对不同模态之间互相依赖关系的探索仍然不足&#xff0c;而这种依赖关系能够更好地描述复杂的驾驶场景。…

稳恒磁场(1)

物理概念 磁场是物质性的。 地磁场&#xff08;与地磁场正负极相反&#xff09;与磁偏角&#xff08;一般为0到11度&#xff09; 磁感应强度&#xff1a; 单位为特斯拉&#xff08;T&#xff09;&#xff0c;另一个常用单位是高斯&#xff08;G&#xff09;且1T 10^4 G 物…

自动驾驶系列—自动驾驶中的短距离感知:超声波雷达的核心技术与场景应用

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…