Background
-
生成模型目前主要使用自回归(Autoregressive)模型,通过上文信息预测下文信息,如GPT系列;
-
BERT系列使用自编码(AutoEncode)模型,在输入中随机mask一部分token,通过上下文预测这个token;
-
自回归主要用于生成文本,如机器翻译和对话系统,而自编码主要用于降维和特征提取,如情感分析、聚类和分类等任务。
自回归模型当生成文本时,并不是同时生成一段文字,而是一个字一个字的去生成,同时新生成的字会继续加入上文,用于生成下一个字。
在自回归架构中,模型针对输入内容逐个token生成输出内容的文本。这个过程一般被称为解码。
在本章的内容中,我们将首先介绍常见的解码策略
解码策略
我们可以将模型预测的结果看作一个向量,这个向量的长度是vocab size,其中每个位置的大小表示选取这个token的概率,如何基于这个信息选择合适的token作为本次生成的token即为解码策略(decoding strategy)
贪婪策略(Greedy Strategy)
最朴素的方案是直接选择概率最高的token,也就是贪婪策略
优点
- 简单高效
缺点
-
可能导致生成的文本缺乏多样性和创意
-
容易产生重复的句子
-
每次选取概率最大的token还可能造成看起来每次达到局部最优,但是最终错过全局最优的情况
由于贪心搜索所采取的是确定性策略,它的效果在不同类型的任务中具有一定的差异。在机器翻译和文本摘要等任务中,任务输出高度依赖于输入内容,贪心搜索通常能够获得不错的结果,但是在开放式生成任务(如故事生成和对话系统)中,贪心搜索有时会因为过于关注局部最优,而生成不自然、重复的句子
针对这种问题,提出了beam search
束搜索(Beam Search)
beam search的思路是既然每次选一个概率最大的可能会错过全局最优的选择,那么每次多选择n(i.e. Beam Size)个概率较大的token,再下一次time step继续多选n个概率较大的token,最后综合评估这几条线路的整体概率,选择其中整体概率较大的情况
-
比如第一步保留了概率最高的两个词“dog”和“nice”作为候选;第二步基于“dog”和“nice” 均进行扩展,我们发现第一步概率较小的dog后面遇到了概率很大的has,使得the dog has整体联合概率达到0.4_0.9=0.36, 而第一步较大概率的the nice women 整理联合概率为0.5_0.4=0.2,通过beam search我们找到了更好的句子序列。
-
在下面的生成步骤中,将会继续基于这两个候选去进行扩展,每次都选择联合概率最高的两个句子。最后,当两个束的句子均生成结束后,选择整体生成概率最高的候选句子作为最终的输出。
-
在实践中,Beam Size的数量通常设定在 3 到 6 的范围内,设置过大的束会显著增加运算开销,并可能会导致性能下降。
-
Beam Size为1即退化为贪婪策略
优点
- 缓解了贪婪策略过于关注局部最优导致错误全局最优的情况
缺点
-
beam search生成的结果相较于人类的结果,仍然有明显的缺点,缺乏多样性,生成内容重复度较高,比较机械
-
https://arxiv.org/pdf/1904.09751
概率采样(Probability Sampling)
另一类方法是根据模型给出的概率分布对token进行采样。虽然较大概率会选中概率较大的token,但是为其他概率较小的token被选中增加了可能性,进而加强生成过程的随机性和文本的多样性。
基于概率采样的方法会在整个词表中选择词元,这可能会导致生成相关性很低的token,导致生成质量下降。为了进一步提高生成质量,减少具有极低概率词汇对于生成结果的影响,主要有以下改进方案:
-
Top-K
-
Top-P
-
temperature
针对所有自学遇到困难的同学们,我帮大家系统梳理大模型学习脉络,将这份 LLM大模型资料
分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程
等, 😝有需要的小伙伴,可以 扫描下方二维码领取🆓↓↓↓
👉[CSDN大礼包🎁:全网最全《LLM大模型入门+进阶学习资源包》免费分享(安全链接,放心点击)]()👈
Top-K
top-𝑘 采样策略是直接选取概率最大的前K个token,然后从这K个token中基于概率分布情况进行采样。
缺点
Top-k比较简单直接,但是存在一个比较明显的问题,K的范围是固定的,不考虑整体概率分布,对于不同概率分布的情况,无法动态调整K的大小
-
前K个概率最大的token, 可能有时候主要集中在前1~2个token, 导致后面的token其实没有被选中的必要,浪费计算资源
-
前K个概率最大的token,可能概率分布比较平均,且都比较小,此时应该扩展K的个数,使得尽量多包含一些token进来做备选;
为了解决这个问题,提出了Top-P;
Top-P (Nucleus Sampling)
Top-P的采样策略是先设置一个概率阈值 𝑝,然后按照概率分布从大到小的顺序,依次将token加入一个子集,当这个子集中的token的概率之和大于或等于p之后,基于当前的子集进行概率采样。
这样的好处在于在不同时间步,随着解码词的概率分布不同,候选词集合的大小会动态变化,不像top-k sampling是一个固定的窗口大小。由于解码词还是从头部候选集中筛选,这样的动态调整可以使生成的句子在满足多样性的同时又保持通顺。
Temperature
上面的top-k, top-p都是在动态选择不同token的候选集范围,本质上并没有更改token的概率。那么,是否可以在直接调节模型输出的概率分布呢?例如,将高频和低频之间的概率拉大或者减少。
Temperature 是用来控制采样过程中随机性的超参数。较低的温度值会使得模型倾向于选择概率较高的词,而较高的温度值会增加低概率词被选中的机会,从而增加生成文本的多样性。
一般我们通过softmax来输出概率分布,通过在其中添加温度参数t,进而控制其概率分布情况
具体来说,降低温度系数𝑡会 使得概率分布更加集中,从而增加了高概率词元的采样可能性,同时降低了低概 率词元的采样可能;当温度系数 𝑡 设置为 1 时,该公式退化为标准的随机采样方 法;而当 𝑡 趋近于 0 时,实际上等同于贪心搜索,即总是选择概率最高的词。此 外,当 𝑡 趋近于无穷大时,温度采样会退化为均匀采样。
对比搜索(Contrastive Search)
-
https://arxiv.org/pdf/2202.06417
-
https://huggingface.co/blog/introducing-csearch
-
每一步解码时,(1)模型从最可能的候选集合中选出一个作为输出,(2)产生的输出应当与前面已经生成的内容足够不同。这种方式下生成的文本在保持与前文的语义一致性的同时还能避免模型退化。
-
上式的第一项代表模型对 v 的支持度 v(model confidence),是模型估计的候选词 v 为下一个词的概率。第二项是对模型退化的惩罚项(degeneration penalty)是下一个词 v 与前面已生成的词的相似度最大值。α 是超参数,负责调节两项损失之间的平衡。当 α=0 时,解码方法退化到贪婪搜索。
-
对比搜索通过惩罚重复性来减少文本中的冗余。它会计算相似度并进行适当惩罚,从而保证生成内容的新颖性和多样性。
长度惩罚 (length penalty)
-
传统的束搜索会倾向于生成较短的句子,因为每生成一个单词,都会乘以一个小于 1 的概率,使得句子的生成概率逐渐变小。
-
因此,可以在生成概率的计算中引入长度惩罚,通过将句子概率除以其长度的指数幂 𝛼,对于句子概率进行归一化处理, 从而鼓励模型生成更长的句子。
-
在实践中,𝛼 通常设置为 0.6 到 0.7 之间的数值。
重复惩罚(𝑛-gram Penalty)
- 为了缓解贪心搜索重复生成的问题,可以使用 𝑛-元惩罚(𝑛-gram Penalty)来强制避免生成重复的连续 𝑛 个词元,实践中 𝑛 通常设置为 3 到 5 之间 的整数。
进一步地,研究人员还提出了相对“温和”的惩罚机制来降低生成重复词元的概率,而不是“一刀切”地完全避免某些短语的生成,如**出现惩罚(Presence Penalty)和频率惩罚(Frequency Penalty)**。
具体地,出现惩罚在生成过程中会将已经生成词元的 logits减去惩罚项 𝛼 来降低该词元之后生成的概率。
频率惩罚相较于出现惩罚,会记录每个token生成的数目,然后减去出现次数乘以惩 罚项 𝛼,因此如果一个词元生成得越多,惩罚也就越大。
在实践中,𝛼 的取值范围 通常在 0.1 到 1 之间。这些重复惩罚方法不止适用于贪心搜索,对于随机采样也均适用。
工程应用
通过上面介绍的不同的采样策略,大语言模型能够根据具体需求灵活地生成各种类型的文本,使得生成结果更加智能和人性化。
在实践中,现有的代码库(如 Transformers)和大语言模型的公开 API(例如 OpenAI)都集成了多种解码策略,以适应不同的文本生成任务。
"messages": [
{
"content": "Hi",
"role": "user"
}
],
"temperature": 0.7,
"top_p": 1,
"tools": null,
"tool_choice": "none",
"logprobs": false,
"top_logprobs": 0,
"n": 1,
"max_tokens": null,
"stop": null,
"stream": false,
"presence_penalty": 0,
"frequency_penalty": 0,
"user": "string",
"repetition_penalty": 1,
"session_id": -1,
"ignore_eos": false,
"skip_special_tokens": true,
"top_k": 40
其他如:
"num_beams": 1,
-
T5 默认采用贪心搜索策略。在翻译和摘要任务中,它使用束搜索(束大小为 4)并结合长度惩罚(惩罚因子为 0.6)来优化生成结果。
-
GPT-3 在所有生成任务中都使用束搜索(束大小为 4)和长度惩罚 (惩罚因子为 0.6)。
-
Alpaca 主要面向开放式生成任务,因此使用了基于采样的策略,包括 top-𝑘 采样(𝑘 = 50)和 top-𝑝 采样(𝑝 = 0.9),并将温度参数设置为 0.7,在保证结果可靠的同时促进生成结果的多样性。
-
LLaMA根据具体任务的不同采用了多样化的解码策略。例如,在问答任务中使用了贪心搜索策略;而在代码生成任务中,分别采用了温度设置为 0.1(针对 pass@1)和 0.8(针对 pass@100)的采样策略。
-
OpenAI 支持多种基本的解码策略,包括贪心搜索(通过将温度参数 temperature设置为0实现)、束搜索(通过 best_of参数设置)、温度采样 (通过调整 temperature 参数)以及 Top-𝑝 采样(通过 top_p 参数)。此外,它也支持基于出现惩罚和频率惩罚的重复惩罚机制,分别通过 presence_penalty 和frequency_penalty 来控制。
Next step
了解了解码策略,下一步我们需要考虑解码效率的问题,如何通过提升解码效率进而加快模型推理速度。
这将涉及到内存墙及计算瓶颈分析的问题。
读者福利:如果大家对大模型感兴趣,这套大模型学习资料一定对你有用
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
包括:大模型学习线路汇总、学习阶段,大模型实战案例,大模型学习视频,人工智能、机器学习、大模型书籍PDF。带你从零基础系统性的学好大模型!
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓
👉AI大模型学习路线汇总👈
大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉大模型实战案例👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉大模型视频和PDF合集👈
观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费
】🆓