LLM探索:GPT类模型的几个常用参数 Top-k, Top-p, Temperature

前言

上一篇文章介绍了几个开源LLM的环境搭建和本地部署,在使用ChatGPT接口或者自己本地部署的LLM大模型的时候,经常会遇到这几个参数,本文简单介绍一下~

  • temperature
  • top_p
  • top_k

关于LLM

上一篇也有介绍过,这次看到一个不错的图

A recent breakthrough in artificial intelligence (AI) is the introduction of language processing technologies that enable us to build more intelligent systems with a richer understanding of language than ever before. Large pre-trained Transformer language models, or simply large language models, vastly extend the capabilities of what systems are able to do with text.

Large language models are computer programs that open new possibilities of text understanding and generation in software systems.

LLM看似很神奇,但本质还是一个概率问题,神经网络根据输入的文本,从预训练的模型里面生成一堆候选词,选择概率高的作为输出,上面这三个参数,都是跟采样有关(也就是要如何从候选词里选择输出)。

temperature

用于控制模型输出的结果的随机性,这个值越大随机性越大。一般我们多次输入相同的prompt之后,模型的每次输出都不一样。

  • 设置为 0,对每个prompt都生成固定的输出
  • 较低的值,输出更集中,更有确定性
  • 较高的值,输出更随机(更有创意?)

Adjusting the temperature setting

一般来说,prompt 越长,描述得越清楚,模型生成的输出质量就越好,置信度越高,这时可以适当调高 temperature 的值;反过来,如果 prompt 很短,很含糊,这时再设置一个比较高的 temperature 值,模型的输出就很不稳定了。

遇事不决就调参,调一下,万一就生成了不错的回答呢?

PS:ChatGLM提供的例子把范围限定在0-1之间。

top_k & top_p

这俩也是采样参数,跟 temperature 不一样的采样方式。

前面有介绍到,模型在输出之前,会生成一堆 token,这些 token 根据质量高低排名。

比如下面这个图片,输入 The name of that country is the 这句话,模型生成了一堆 token,然后根据不同的 decoding strategy 从 tokens 中选择输出。

The model calculates a likelihood for each token in its vocabulary. The decoding strategy then picks one as the output.

这里的 decoding strategy 可以选择

  • greedy decoding: 总是选择最高分的 token,有用但是有些弊端,详见下文
  • top-k: 从 tokens 里选择 k 个作为候选,然后根据它们的 likelihood scores 来采样
  • top-p: 候选词列表是动态的,从 tokens 里按百分比选择候选词

top-k 与 top-p 为选择 token 引入了随机性,让其他高分的 token 有被选择的机会,不像 greedy decoding 一样总是选最高分的。

greedy decoding

好处是简单,坏处是容易生成循环、重复的内容

Greedy decoding is a reasonable strategy but has some drawbacks such as outputs with repetitive loops of text. Think of the suggestions in your smartphone's auto-suggest. When you continually pick the highest suggested word, it may devolve into repeated sentences.

top-k

设置越大,生成的内容可能性越大;

设置越小,生成的内容越固定;

设置为1时,和 greedy decoding 效果一样。

Adjusting to the top-k setting.

Changing the top-k parameter sets the size of the shortlist the model samples from as it outputs each token. Setting top-k to 1 gives us greedy decoding.

top-p

top-p 又名 Nucleus Sampling(核采样)

与 top-k 固定选取前 k 个 tokens 不同,top-p 选取的 tokens 数量不是固定的,这个方法是设定一个概率阈值。

继续上面的例子,将 top-p 设定为 0.15,即选择前 15% 概率的 tokens 作为候选。如下图所示,United 和 Netherlands 的概率加起来为 15% ,所以候选词就是这俩,最后再从这些候选词里,根据概率分数,选择 united 这个词。

In top-p, the size of the shortlist is dynamically selected based on the sum of likelihood scores reaching some threshold.

Top-p is usually set to a high value (like 0.75) with the purpose of limiting the long tail of low-probability tokens that may be sampled. We can use both top-k and top-p together. If both k and p are enabled, p acts after k.

经常遇到的默认 top-p 值就是 0.7/0.8 这样,还是那个说法,设置太低模型的输出太固定,设置太高,模型彻底放飞自我也不好。

参考资料

  • http://docs.cohere.com/docs/controlling-generation-with-top-k-top-p
  • http://docs.cohere.com/docs/temperature
  • http://mp.weixin.qq.com/s/IswrgDEn94vy5dCO51I1sw
微信公众号:「程序设计实验室」 专注于互联网热门新技术探索与团队敏捷开发实践,包括架构设计、机器学习与数据分析算法、移动端开发、Linux、Web前后端开发等,欢迎一起探讨技术,分享学习实践经验。
本文转载于网络 如有侵权请联系删除

相关文章

  • 设计模式-类适配器模式

    我们之前已经说过对象适配器模式,有兴趣的读者可以阅读对象适配器模式。定义适配器模式就是把一个类的接口转换成客户端所期待的另外一种接口,从而使原接口不匹配而无法一起工作的两个类能在一起工作。从功能上说,不兼容的接口都拥有相似或者相同的功能,但是对于客户端期望的接口不兼容,通常我们通过修改该类的接口来解决接口不兼容的问题,但是我们不愿意为了一个功能修改哥哥依赖接口,或者我们压根就没有对象类的源代码,适配器就派上用场了。适配器优点使目标类和被适配类解耦。增加了类的透明性和复用性,将具体的实现封装在适配器中,对于客户端来说是透明的。灵活性、拓展性比较好,符合开闭原则。角色目标接口(Target):定义一个客户端使用的指定接口。客户端(Client):使用目标接口,完成功能。被适配者(Adaptee):一个现存需要适配成目标接口的类。适配器(Adapter):负责将被适配者接口转换为Target接口。这是该模式的核心。场景重现假设现在有一个人只会说英语,但是目标类接口要求可以说英语、法语、汉语。这时候英语就是被适配者,我们的同声翻译就是适配器,用于适配英语同声传译到目标接口所期望的语言。代码实现

  • aspose-words java word 转换 服务器乱码解决 - 崔笑颜的博客

    在本机测试是好的但是到服务器就乱码想到pdf是一种为打印设计的文档格式,可能跟字体相关。而且转出来的pdf中文都是空心方框,不是单纯的乱码,很有可能是缺少字体渲染不出来造成的。服务器上用fc-list命令查看字体,果然没有中文字体接下来将本机Windows的字体上传到CentOS服务器上。具体操作:也可以直接使用我的字体经测试没问题有的系统版本的原因也会导致乱码链接:https://pan.baidu.com/s/1Fj6pqfNDi__sdBJthdFCFg提取码:k35v将Windows上字体文件C:\Windows\Fonts目录,复制到CentOS的/usr/share/fonts目录重启服务器如果你转换的文档中有公式系列的话那么还需要再导入一种公式字体这里已经准备好啦链接:https://pan.baidu.com/s/1c8WYZMcqVeRHc23vVe3xrQ提取码:c329同样需要重启服务器已知问题着重号无法转换官网也为给出解决方案aspose-wordsword转图片这里所用到的jar包和这里所用的的一样jar包下载和谐文件将word转换为单张图片 //将word

  • 一文读懂 DEX 文件格式解析

    曾有人问我,为什么要去干解析dex文件这种麻烦的事? 我想说的是写个解析脚本不是为了模仿着apktools造轮子,而是在解析过程中寻找逆向的道路,方法会变,工具会变,但一切都建立在dex上的安卓不会变一、什么是Dex文件dex文件是Android平台上可执行文件的一种文件类型。它的文件格式可以下面这张图概括:二、文件头解析1、文件头简介dex文件头一般固定为0x70个字节大小,包含标志、版本号、校验码、sha-1签名以及其他一些方法、类的数量和偏移地址等信息。如下图所示:2、dex文件头各字段解析dex文件头包含以下各个字段:magic:包含了dex文件标识符以及版本,从0x00开始,长度为8个字节checksum:dex文件校验码,偏移量为:0x08,长度为4个字节。signature:dexsha-1签名,偏移量为0x0c,长度为20个字节file_szie:dex文件大小,偏移量为0x20,长度为4个字节header_size:dex文件头大小,偏移量为0x24,长度为4个字节,一般为0x70endian_tag:dex文件判断字节序是否交换,偏移量为0x28,长度为4个字节,一

  • 【怎么办002】想要获取数据库对象的定义(DDL)怎么办

    问题:想要获取数据库对象的定义(DDL)怎么办?方法:可以通过以下的方法获取数据库对象的定义(DDL)。1.使用DBMS_METADATA.GET_DDL程序包SQL>setpages0 SQL>setlongchunksize3000 SQL>setlong2000000000 SQL>selectdbms_metadata.get_ddl('<对象类型>','<对象名>','<对象SCHEMA>')fromdual; 复制例:--表定义 SQL>setpages0 SQL>setlongchunksize3000 SQL>setlong2000000000 SQL>selectdbms_metadata.get_ddl('TABLE','EMP','SCOTT')fromdual; --索引定义 SQL>selectdbms_metadata.get_ddl('I

  • 浅析数据安全与隐私保护之法规

    在大数据时代背景下,AI和大数据技术给我们的生活带来了巨大的便利和效率;然而在此过程中,数据滥用、数据窃取、隐私泄露以及“大数据杀熟”等数据安全问题呈徒增和爆发趋势。在这样背景下,全球各个国家纷纷颁布相关法规,对数据安全与隐私保护相关问题进行严格的规范与引导。如欧盟保护个人数据的《GeneralDataProtectionRegulation》(简称《GDPR》);美国的《CaliforniaConsumerPrivacyAct》(简称《CCPA》);中国实施的《中华人民共和国网络安全法》(通常简称《网安法》)。法规作为数据安全治理和建设的顶层指导,研究这些法规,一方面有助于更好地理解安全场景与需求,进而有利于将安全技术实际的落地与应用;另一方面提前研究,通过积极开展数据安全治理与防护,可以提前规避企业由于数据不合规带来的法律风险和处罚。如最近一年中有两个典型的案例:Google旗下的子公司Alphabet,在欧洲因个人数据的处理违反欧盟GDPR法规,被罚5000万欧元;Facebook泄露门事件——8700万用户信息泄露,面临美国50亿美元的天价罚单(相当于公司一年利润收入的20%多

  • CNCF网络研讨会:使用服务网格渐进交付(视频+PDF)

    讲者:AndrewJenkins,CTO@AspenMesh和ZachJory,营销主管@AspenMesh多年来,持续交付一直是软件开发、测试和部署背后的驱动力,CI/CD最佳实践随着Kubernetes和Istio等新技术的出现而不断发展。渐进交付(Progressivedelivery)是Redmonk的JamesGovernor创造的一个术语,是一种持续交付的新方法,包括“一篮子新技能和技术,比如canarying、featureflags、[和]大规模的A/B测试”。Andrew将演示一个结合了服务网格和Flagger(一个渐进交付操作器)的灰度部署。传统的灰度部署会转移流量,所以坏的灰度部署仍然会部分降低用户体验-Andrew将展示一个在转移前反映流量的增强功能,这可以防止坏的灰度部署对任何用户可见。他将把流量镜像与其他技术进行比较,探索什么时候可以选择哪种渐进式交付。视频https://v.qq.com/x/page/l0930t8ysyh.htmlPDFhttps://www.cncf.io/wp-content/uploads/2019/09/Aspen-Mesh-W

  • 预防XSS,这几招管用!

    最近重温了一下「黑客帝国」系列电影,一攻一防甚是精彩,生活中我们可能很少有机会触及那么深入的网络安全问题,但工作中请别忽略你身边的精彩大家应该都听过XSS(Cross-sitescripting)攻击问题,或多或少会有一些了解,但貌似很少有人将这个问题放在心上。一部分人是存有侥幸心理:“谁会无聊攻击我们的网站呢?”;另一部分人可能是工作职责所在,很少触碰这个话题。希望大家看过这篇文章之后能将问题重视起来,并有自己的解决方案,目前XSS攻击问题依旧很严峻:Cross-sitescripting(XSS)是Web应用程序中常见的一种计算机安全漏洞,XSS使攻击者能够将客户端脚本注入其他用户查看的网页中。攻击者可能会使用跨站点脚本漏洞绕过访问控制,例如同源策略。截至2007年,Symantec(赛门铁克)在网站上执行的跨站脚本占据了所有安全漏洞的84%左右。2017年,XSS仍被视为主要威胁载体,XSS影响的范围从轻微的麻烦到重大的安全风险,影响范围的大小,取决于易受攻击的站点处理数据的敏感性方式以及站点所有者实施对数据处理的安全策略。XSS类型的划分以及其他概念性的东西在此就不做过多说明,

  • 细胞冻存实验

    细胞生物学研究中,为了更好而长期地研究细胞生物学功能,需要将良好状态的细胞保存起来,以备将来使用。在不附加任何保护剂下直接冻存细胞时,细胞内和外环境中的水都会形成冰晶,能导致细胞内发生机械损伤、电解质升高、渗透压改变、脱水、PH改变、蛋白变性等,能引起细胞死亡。如向培养液加入保护剂,可使冰点降低。在缓慢的冻结条件下,能使细胞内水份在冻结前透出细胞。贮存在负130℃以下的低温中能减少冰晶的形成。细胞冻存时脱离生长状态而将其细胞特性保存起来,待复苏时重新进入生长分裂周期。一、实验前准备实验开始前,将冻存管、15毫升离心管、移液管、移液枪、枪头等放入无菌超净工作台,以紫外线照射30分钟。采用通风机通风3分钟。以75%酒精擦拭操作台和双手。准备好冰盒。将离心机调节至800转,5分钟。水浴箱调节至37度恒温。取细胞完全培养基、DMSO、胰蛋白酶等,放于水浴箱中预热。首先消毒双手和超净台。取约10毫升细胞完全培养基放于15毫升离心管中。配置细胞冻存液:冻存液应该提前配制,置于室温备用,防止临时配制产生的热量损伤细胞,按无血清培养基比血清比DMSO=7:2:1的比例配置细胞冻存液,其中加大冻存液中血

  • 大数据入门与实战-Spark上手

    1Spark简介1.1引言行业正在广泛使用Hadoop来分析他们的数据集。原因是Hadoop框架基于简单的编程模型(MapReduce),它使计算解决方案具有可扩展性,灵活性,容错性和成本效益。在这里,主要关注的是在查询之间的等待时间和运行程序的等待时间方面保持处理大型数据集的速度。 Spark由ApacheSoftwareFoundation引入,用于加速Hadoop计算计算软件过程。 与普遍看法相反,Spark不是Hadoop的修改版本,并且实际上并不依赖于Hadoop,因为它有自己的集群管理。Hadoop只是实现Spark的方法之一。 Spark以两种方式使用Hadoop-一种是存储,另一种是处理。由于Spark有自己的集群管理计算,因此它仅将Hadoop用于存储目的。 1.2ApacheSparkApacheSpark是一种闪电般快速的集群计算技术,专为快速计算而设计。它基于HadoopMapReduce,它扩展了MapReduce模型,以便有效地将其用于更多类型的计算,包括交互式查询和流处理。Spark的主要特性是其内存中的集群计算,可以提高应用程序的处理速度。Spark旨在

  • Laravel5.0+ 邮件发送功能实现

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/77800154 I.背景近期在接触传说中最优雅的PHP框架——Laravel,学习了一下邮件发送功能,在此分享一下测试环境:Laravel5.2.45,Laravel5.5使用协议:SMTP邮件传输协议对于ThinkPHP框架框架的邮件发送可参考文章ThinkPHP框架下邮件发送功能II.功能开发过程此处以网易(163.com)邮箱为例。一、前期准备(1).首先对SMTP的知识稍作了解(2).开启邮箱SMTP服务以163.com邮箱为例,点击上方导航栏的“设置”,选择“POP3/SMTP/IMAP”进行下面的设置,着重记下服务器地址(SMTP服务器:smtp.163.com)然后点击“客户端授权密码”进行权限设置,一般会进行短信的验证,并记录下自己设定的授权登录密码,后面的代码中需要用到。二、代码实现(1).修改配置文件mail.php文件位置位于config/mail.php修改其中的“from”信息,以本人

  • Coroutines in Android - One Shot and Multiple Values

    CoroutinesinAndroid-OneShotandMultipleValues 在Android中,我们用到的数据有可能是一次性的,也有可能是需要多个值的. 本文介绍Android中结合协程(coroutines)的MVVM模式如何处理这两种情况.重点介绍协程Flow在Android中的应用. 本文被收录在:https://github.com/mengdd/KotlinTutorials One-shotvsmultiplevalues 实际应用中要用到的数据可能是一次性获取的(one-shot),也可能是多个值(multiplevalues),或者称为流(stream). 举例,一个微博应用中: 微博信息:请求的时候获取,结果返回即完成.->one-shot. 阅读和点赞数:需要观察持续变化的数据源,第一次结果返回并不代表完成.->multiplevalues,stream. MVVM构架中的数据类型 一次性操作和观察多个值(流)的数据,在架构上看起来会有什么不同呢? One-shotoperation:ViewModel中是LiveData,Repos

  • Pandas Dataframe merge 后出现重复行

    1.初始化两个dataframe df_left=pd.DataFrame( columns=['no','name','age'], data=[['111','Andy',19],['222','Bob',20],['333','Cindy',21]] ) 复制 df_right=pd.DataFrame( columns=['key_no','remark'], data=[['111','a'],['111','b'],['222','c']] ) 复制 注意到,df_left的no列是唯一的,df_right的key_no列是有重复的 2.合并两个dataframe res1=pd.merge(left=df_left,right=df_right,left_on='no',right_on='key_no',how='left') 复制 左连接merge两个df时,生成的df出现了重复行,原因是:df_left的no列有一行值为111,df_right的key_no有两行值为111,形成一对多的关系,因此出现重复行。 这个问题在官方文档也有提及到: 翻译就是: 对

  • 我决定以后一直使用Eclipse了 因为它也可以安装集成PyDec插件来实现Python开发了 哇哈哈哈

    作者:极客小俊 公众号:同名 Python作为当今主流的爬虫编程语言,在我们的开发当中时不时都会使用到一些,那么如果你想再Eclipse当中进行一些Python的开发就要安装一下Python插件这样就也用Eclipse进行Python的开发,或者在java相关的项目中使用Python代码来混编项目,所以首先我们要知道如何在Eclipse中集成Python Python下载? 这里我以win10系统为例,但是先要去下载Python,否则后期你是无法在eclipse中编译解释Python代码的 官方地址:https://www.python.org/downloads/ 这里我就下载最新的Python3.10.7 如图 下载好之后,是一个python-3.10.7-amd64.exe的文件 如图 Python安装❤️ 在windows中安装Python,其实很简单,跟一般安装软件差不多! 这里直接点击下载好的python-3.10.7-amd64.exe开始安装 然后选择自定义安装方式 如图 继续默认下一步: 然后自己选择一个安装路径! 如图 然后点击Install开始安装

  • VSCode 云同步扩展设置 Settings Sync 插件

    关于SettingsSync扩展:# SettingsSync可以同步你当前的VSCode配置环境,当你需要在其它的电脑工作时,您不用重头再来一遍。新机器登录一下就搞定了。再也不用折腾环境了。 大致原理:使用GitHubGist来同步多台计算机上的设置,代码段,主题,文件图标,启动,键绑定,工作区和扩展。 环境版本:# VisualStudioCode1.36 SettingsSync3.4.0 教程分为 初次使用如何上传配置(#1) 已有配置直接下载(#2) 初次使用:# 在VSCode中点击扩展,搜索:SettingsSync安装 安装好扩展之后我们登录GitHub开通并创建一个Gist(代码片段管理服务)来保存你的环境配置。   登录你的Github点击头像进入Settings页面,在Settings页面点击进入Developersettings(开发者设置)(获取直接打开 https://github.com/settings/tokens页面) 再点击进入Personalaccesstokens(个人授权令牌)页面   点击

  • Spring——IDEA使用Spring创建第一个hello world程序

    在试了好久之后,终于还是将IntelliJidea的版本从2020社区版换成2020.2.3旗舰版,最后换成2018旗舰版 终于可以在一开始newProject的时候可以直接看到Spring的标志,感激涕零... 1.下载安装2018旗舰版; 2.新建Spring工程Hello;   创建的时候要等一会儿它自己下载Spring相关jar包,我第一次创建工程的时候网不行下载失败了,自己导入应该也是可以的吧,但是我没试,位于工程下的lib文件夹;      3.在src下new一个文件夹helloworld,在里面写上普通的java类Person;          packagehelloworld; publicclassPerson{ Stringname; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } @Override publicStringtoString(){ return"Person{"+ "name='"

  • 前端常见的Vue面试题目汇总

    请说一下响应式数据的原理 默认Vue在初始化数据时,会给data中的属性使用Object.defineProperty重新定义所有属性,当页面到对应属性时,会进行依赖收集(收集当前组件中的watcher)如果属性发生变化会通知相关依赖进行更新操作 收集当前组件中的watcher,我进一步问你什么叫当前组件的 watcher?我面试时经常听到这种模糊的说法,感觉就是看了些造玩具的文章就说熟悉响应式原理了,起码的流程要清晰一些: 由于Vue执行一个组件的 render 函数是由 Watcher 去代理执行的,Watcher 在执行前会把 Watcher 自身先赋值给 Dep.target 这个全局变量,等待响应式属性去收集它这样在哪个组件执行 render 函数时访问了响应式属性,响应式属性就会精确的收集到当前全局存在的 Dep.target 作为自身的依赖在响应式属性发生更新时通知 Watcher 去重新调用 vm.

  • psi计算

    基础概念:https://zhuanlan.zhihu.com/p/344754828 importsys importpandasaspd importnumpyasnp importmath #all_list=[] #df=pd.DataFrame(columns=['date','data']) #counter=0 #forlineinsys.stdin: #line=line.strip('\r\n') #df.loc[counter]=line.split(',') #counter+=1 #df.to_excel('./output2.xlsx',sheet_name='Sheet1') defcalc_psi(dataframe): date_col=dataframe['date'] data_col=dataframe['data'] #print(dataframe['data'].max(),dataframe['data'].min()) #分组 result=pd.qcut(dataframe['data'],10) #print(result)

  • 深拷贝和浅拷贝

    一、数据类型 关于深浅拷贝,首先需要了解一下java基本数据类型和引用数据类型 基本数据类型:byte、short、int、long、float、double、char、boolean 引用数据类型:常见的数组、String等都是 复制 二、深浅拷贝 1、浅拷贝 基本数据类型:copy的具体的值 引用数据类型:copy的是对象的引用地址,一旦修改了对象中的某个属性值,其他copy的都会受到影响,跟着变动 复制 2、深拷贝: 基本数据类型:copy的具体的值 引用数据类型:生成一个新的对象,所有的属性值都和被copy的对象一样,修改了对象中的某个属性值,其他copy的不会受到影响复制

  • 5月26日下午学习日志

    下午写了一套四级真题并纠错改正总结,用扇贝app完成英语100个四级单词的记忆。

  • 51Nod1100 斜率最大

    1100 斜率最大 基准时间限制:1 秒空间限制:131072 KB分值: 20 难度:3级算法题  收藏  关注 平面上有N个点,任意2个点确定一条直线,求出所有这些直线中,斜率最大的那条直线所通过的两个点。   (点的编号为1-N,如果有多条直线斜率相等,则输出所有结果,按照点的X轴坐标排序,正序输出。数据中所有点的X轴坐标均不相等,且点坐标为随机。) Input 第1行,一个数N,N为点的数量。(2 <= N <= 10000) 第2 - N + 1行:具体N个点的坐标,X Y均为整数(-10^9 <= X,Y <= 10^9)复制 Output 每行2个数,中间用空格分隔。分别是起点编号和终点编号(起点的X轴坐标 < 终点的X轴坐标)复制 Input示例 5 1 2 6 8 4&nbs

  • netty 的线程模型

    bossgroup和workergroup bossgroup中,一个线程,一个selector,监听一个端口 workergroup中,一个线程,一个selector,监听多个channel的读事件 boss线程监听端口,建立连接,从workergroup选择一个worker,让它负责连接的read事件。 io.netty.util.concurrent.DefaultEventExecutorChooserFactory.PowerOfTwoEventExecutorChooser#next复制        

相关推荐

推荐阅读