【大模型结构】输出参数配置

ops/2024/11/8 16:55:27/

文章目录

  • 大模型生成策略
  • Top_k
  • Top_p
  • Temperature
  • 联合使用的顺序
  • 参考资料

大家在体验大语言模型或者多模态大模型的开源应用时,经常会看到类似下面这个页面,用来控制大模型输出的一些参数设置:

在这里插入图片描述
或者在代码中也经常需要设置以下几个参数:

{"num_beams": 1,"max_tokens": 2048,"do_sample": true,"repetition_penalty": 1.05,"temperature": 0.7,"top_p": 0.8,"top_k": 20,
}

这些参数设置会直接影响大模型的输出多样性和质量,因此很多面试官都喜欢通过提问这些参数的含义或者使用技巧,来考察首选人对大模型的掌握程度。本文主要介绍 top_k, top_p, temperature以及num_beams, repetition_penalty, max_new_tokens 这几个核心参数的含义及使用技巧。

大模型生成策略

我们首先要知道大模型是如何生成结果的。大语言模型根据输入token序列来输出下一个token。每次模型想要生成另一个token时,会重新阅读整个token序列(输入token序列+已经生成的token序列)并预测接下来应该出现的token,也就是自回归生成(Auto-Regressive Generation),如下图所示:

在这里插入图片描述

GIF来源:https://pic2.zhimg.com/v2-a8e2ff8e26fa1a78b02bf000ad1397db_b.webp

大模型在自回归生成过程中,达到终止条件(如一个标点符号或一个最大长度)时就会停止输出。在每一步,模型会对于词表中的所有token,给出一个概率分布,表示它对下一个单词的预测,然后通过解码策略选出一个token作为最终的输出。

例如,如果输入的文本是“我喜欢”,那么模型可能会给出下面的概率分布,假设选择概率最大token作为输出结果,也就是“吃”,那么第二次预测,大模型的输入就变成了“我喜欢吃”,然后再选择下一个token,直到达到终止条件:

在这里插入图片描述

常用解码方法如下

  • 贪心解码(Greedy Decoding):直接选择词表中概率最高的token。这种方法简单高效,但是可能会导致生成的文本过于单调和重复。
  • 随机采样(Random Sampling):按照概率分布随机选择一个token。这种方法可以增加生成的多样性,但是可能会导致生成的文本不连贯和无意义。
  • 束搜索(Beam Search):维护一个大小为 num_beams 的候选序列集合,每一步从所有词表的概率分布中选择概率最高的 num_beams 个token,然后保留总概率最高的 num_beams 个候选序列。从所有完成的候选序列中,选择概率最高的序列作为最终生成的结果。这种方法可以平衡生成的质量和多样性,但是可能会导致生成的文本过于保守和不自然。搜索过程如下图所示(此时num_beams=2)。beam search在每一步需要考察的候选人数量是贪心搜索的num_beams倍,因此是一种牺牲时间换性能的方法

在这里插入图片描述

可以看到,贪心解码和束搜索对于同一个输入,大模型的输出都是固定的,缺乏多样性,而随机采样又存在生成内容质量不高的问题。我们想要大模型的输出的内容质量又高,同时又兼顾多样性(创造性)。因此,有了下面的几个获取候选token的方法(采样参数)。

Top_k

Top-k 采样是对前面“贪心解码”的优化,它从词表logits 排名前 k 的 token 中进行抽样,允许其他分数或概率较高的token 也有机会被选中。在很多情况下,这种抽样带来的随机性有助于提高生成质量。如下图所示:
在这里插入图片描述

Top_p

top-k 有一个缺陷,那就是“k 值取多少是最优的?”非常难确定。于是出现了动态设置 token 候选列表大小策略——即核采样(Nucleus Sampling)。

top-p 采样思路:在每一步,只从累积概率超过某个阈值 p 的最小token集合中进行随机采样,而不考虑其他低概率的token。这种方法也被称为核采样(nucleus sampling),因为它只关注概率分布的核心部分,而忽略了尾部部分。

例如,如果 p=0.8,那么我们只从累积概率达到 0.8 的最小token集合中选择一个单词,而不考虑其他的token。这样可以避免采样到一些不合适或不相关的token,同时也可以保留一些有趣或有创意的token。如下图所示:

在这里插入图片描述

从top_p的选择过程可以看出:

  • 如果词表的概率分布平缓,那么候选的token会多一些,会增加输出结果的多样性
  • 如果词表的概率分布尖锐,那么候选的token会少一些,会增加输出结果的准确性

Temperature

Temperature 采样受统计热力学的启发,高温意味着更可能遇到低能态。在实际应用中,Temperature 采样是对Softmax函数的一个参数调节,如下图所示:


根据公式中的参数计算可以看到:

  • 较低的 temperature,会使得原本概率较高的token获得更高的概率值,原本概率较低的token获得更低的概率值,这就导致输出结果更确定,质量更高
  • 较高的 temperature,会使得原本token的概率分布更平缓,导致输出结果的多样性更高

在这里插入图片描述

联合使用的顺序

通常我们是将 Top-k、Top-p、Temperature 联合起来使用。使用的先后顺序是 Top_k->Top_p->Temperature

参考资料

  • [1] https://blog.csdn.net/u012856866/article/details/140308083
  • [2] https://www.bilibili.com/video/BV1nK421Y72d/?share_source=copy_web&vd_source=79b1ab42a5b1cccc2807bc14de489fa7
  • [3] https://www.bilibili.com/video/BV1UM4m127A2/?share_source=copy_web&vd_source=79b1ab42a5b1cccc2807bc14de489fa7

http://www.ppmy.cn/ops/109261.html

相关文章

个人对Chan算法的粗浅理解(TDOA)

符号解释 n n n 台监测设备坐标 ( x i , y i , z i ) , i 0 , 1 , 2 , ⋯ , n (x_i,y_i,z_i),i0,1,2,\cdots,n (xi​,yi​,zi​),i0,1,2,⋯,n 各设备接受到信号的时刻 t i , i 0 , 1 , 2 , ⋯ , n t_i,i0,1,2,\cdots,n ti​,i0,1,2,⋯,n 信号传播速度 v v v 信号源的位置和…

鸿蒙开发相册获取一张或多张照片,预览

import { photoAccessHelper } from kit.MediaLibraryKit; import { image } from kit.ImageKit; import { fileIo as fs } from kit.CoreFileKit;Entry Component struct Index {State getAlbum: string 显示相册中的图片;State pixelsArray : Array<image.PixelMap> |…

【Kubernetes 】k8s常用单词

Kubernetes 是一个用于自动化部署、扩展和管理容器化应用的开源系统。下面列出了一些 Kubernetes 中常见的术语及其英文单词、音标&#xff08;使用国际音标符号&#xff09;和解释&#xff0c;以及相应的中文翻译&#xff1a; Pod /pɒd/ Kubernetes 中最小的可创建、可调度的…

漫谈设计模式 [17]:状态模式

引导性开场 菜鸟&#xff1a;老鸟&#xff0c;我最近在写一个项目&#xff0c;遇到一个问题。我们有一个订单系统&#xff0c;不同的订单状态需要执行不同的操作。现在代码里充满了各种 if-else 语句&#xff0c;维护起来好痛苦。有没有什么好的解决办法&#xff1f; 老鸟&am…

振动传感器的原理

振动传感器的原理是基于对物体振动信号的感知和检测&#xff0c;将其转化为电信号输出。以下是振动传感器原理的详细解释&#xff1a; 基本原理 振动传感器的工作原理主要基于物理学的振动理论和转换机制。当被测物体发生振动时&#xff0c;传感器内部的敏感元件会捕捉到这种振…

C++ STL-deque容器入门详解

1.1 deque容器基本概念 功能&#xff1a; 双端数组&#xff0c;可以对头端进行插入删除操作 deque与vector区别&#xff1a; vector对于头部的插入删除效率低&#xff0c;数据量越大&#xff0c;效率越低deque相对而言&#xff0c;对头部的插入删除速度回比vector快vector访…

matlab实现简单的保角变换

用虚数的思想可以在虚坐标系内绘制圆&#xff0c;同样可以用虚数的想法将这个圆进行变换 用MATLAB绘制一个坐标在(1,1)的圆代码如下 % 定义半径和圆心 radius 10; center 1 1i; % 圆心位于 (1,1) % 创建角度向量&#xff0c;从0到2*pi theta linspace(0, 2*pi, 100);% 计…

前端项目运行汇总

前端项目运行汇总 1、个人总结&#xff0c;一个项目主要是node,npm,webpack&#xff0c;vue框架的版本问题 2、node和npm 可以使用 nvm 版本控制。 nvm不知道是啥的同学。 可以去玩玩。https://github.com/coreybutler/nvm-windows/releases 3、webpack的框架问题 npm li…