基于Python的自然语言处理系列(39):Huggingface中的解码策略

        在自然语言生成任务中,如何选择下一步的单词或者词语对生成的文本质量影响巨大。Huggingface 提供了多种解码策略,可以在不同的场景下平衡流畅度、创造力以及生成效率。在这篇文章中,我们将逐步介绍 Huggingface 中的几种常见解码策略,包括贪婪搜索、Beam Search(束搜索)、采样、Top-K 采样以及 Top-p(核采样)。通过具体代码示例,我们将对比这些策略的效果,并讨论它们在实际应用中的利弊。

加载GPT-2模型

        我们首先加载 GPT-2 模型和对应的分词器。为了避免警告信息,我们将 EOS(End of Sequence,序列结束符)设置为 PAD(填充符)。

from transformers import GPT2LMHeadModel, GPT2Tokenizertokenizer = GPT2Tokenizer.from_pretrained("gpt2")# 将 EOS token 设置为 PAD token
model = GPT2LMHeadModel.from_pretrained("gpt2", pad_token_id=tokenizer.eos_token_id)

贪婪搜索(Greedy Search)

        贪婪搜索是一种最简单的解码方法。在每一步,贪婪搜索直接选择具有最高概率的下一个词语,直到达到设定的最大长度。这种策略虽然简单高效,但往往会导致模型重复生成相同的词组。

        让我们通过 GPT-2 模型来生成一段文本,给定的上下文是 I enjoy walking with my cute dog

# 编码输入
input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='pt')# 使用贪婪搜索生成文本,最大长度设为50
greedy_output = model.generate(input_ids, max_length=50)print("输出:\n" + 100 * '-')
print(tokenizer.decode(greedy_output[0], skip_special_tokens=True))

        虽然生成的文本看似合理,但贪婪搜索容易出现重复生成的情况。这个问题在对话生成、故事生成等开放式任务中尤为突出。

Beam Search(束搜索)

        Beam Search 能够缓解贪婪搜索的局限性,通过在每个时间步跟踪 num_beams 个最有可能的候选词序列,直到所有序列都到达 EOS 标记为止。这种方法比贪婪搜索更有可能找到更优的词序列。        

# 激活束搜索,设定 beam 数量为 5
beam_output = model.generate(input_ids,  max_length=50, num_beams=5, early_stopping=True
)print("输出:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))

        尽管 Beam Search 生成的文本更连贯,但它仍然可能出现重复现象。为了进一步提升生成质量,我们可以通过引入 n-gram 惩罚机制来减少重复的出现。

# 设置 no_repeat_ngram_size 参数为 2,避免重复生成二元组
beam_output = model.generate(input_ids, max_length=50, num_beams=5, no_repeat_ngram_size=2, early_stopping=True
)print("输出:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))

        我们还可以通过设置 num_return_sequences 参数,生成多个不同的候选序列。

# 生成多个候选序列
beam_outputs = model.generate(input_ids, max_length=50, num_beams=5, no_repeat_ngram_size=2, num_return_sequences=3, early_stopping=True
)print("输出:\n" + 100 * '-')
for i, beam_output in enumerate(beam_outputs):print(f"{i}: {tokenizer.decode(beam_output, skip_special_tokens=True)}")

        虽然 Beam Search 能够生成更连贯的文本,但在开放式生成任务中,它的表现往往不如其他解码方法。

采样(Sampling)

        采样策略不再像贪婪搜索或束搜索那样总是选择概率最高的词语,而是从词汇表中根据每个词的概率随机选取下一个词。采样的多样性较高,但可能会生成不连贯的句子。

import torchtorch.manual_seed(0)# 激活采样,关闭 Top-K 采样
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0
)print("输出:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

        由于采样的随机性,生成的文本可能会包含一些不连贯或不自然的句子。我们可以通过调整 temperature 参数来让生成更加连贯。

# 使用 temperature 减少不合理单词的生成
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0, temperature=0.7
)print("输出:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

Top-K 采样

        Top-K 采样是采样的改进版,它限制每次采样只从 K 个概率最高的单词中选择,能够有效避免生成一些低概率的单词。

# 设置 top_k 为 50
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=50
)print("输出:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

Top-p 采样(核采样)

        Top-p 采样根据概率阈值 p 选择最小数量的词汇,使其累积概率超过 p,然后在这些词中进行采样。这种动态的选择方法更具弹性,能够适应不同的词汇分布。

# 设置 top_p 为 0.92
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_p=0.92, top_k=0
)print("输出:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

        最后,我们还可以结合 Top-K 和 Top-p 采样,生成多个候选序列。

# 结合 top_k 和 top_p 并生成多个候选序列
sample_outputs = model.generate(input_ids,do_sample=True, max_length=50, top_k=50, top_p=0.95, num_return_sequences=3
)print("输出:\n" + 100 * '-')
for i, sample_output in enumerate(sample_outputs):print(f"{i}: {tokenizer.decode(sample_output, skip_special_tokens=True)}")

结语

        通过这篇文章,我们深入了解了 Huggingface 提供的各种解码策略。从最简单的贪婪搜索到更为复杂的 Top-K 和 Top-p 采样,每种方法在不同的场景下都有其独特的优势。贪婪搜索和束搜索在生成固定长度输出的任务中表现较好,而 Top-p 和 Top-K 采样在开放式生成任务(如对话和故事生成)中更具表现力。根据具体应用场景选择合适的解码策略,能够显著提升文本生成的质量。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web API基础

作用和分类 作用: 就是使用 JS 去操作 html 和浏览器 分类: DOM (文档对象模型)、 BOM (浏览器对象模型) 什么是DOM DOM (Document Object Model) 译为文档对象模型,是 HTML 和 XML 文档的编程接口。 HTML DOM 定义了访问和操作 …

mingw64的Windows安装及配置教程gcc、g++等

mingw64.rar 链接:https://pan.baidu.com/s/18YrDRyi5NHtqnTwhJG6PuA 提取码:pbli (免费永久有效,免安装,解压后配置环境变量即可使用) 1 下载 解压后随便放到一个地方: 复制“bin”路径&am…

重磅:中国首个SVG技术标准发布,计育韬老师主笔起草

编辑搜图 中华人民共和国《融媒体 SVG 交互设计技术规范》是由复旦大学奇点新媒体研究中心等单位牵头,学科带头人计育韬等人主要起草,并于 2024 年 8 月起面向全社会行业从业者发布的最高技术标准。该标准前身为 2016 年计育韬与微信团队合作拟定的《SV…

置分辨率设置多显示器的时候提示, 某些设置由系统管理员进行管理

遇到的问题 设置分辨率设置多显示器的时候提示(如下图所示): 某些设置由系统管理员进行管理 解决方法 先试试这个方法: https://answers.microsoft.com/zh-hans/windows/forum/all/%E6%9B%B4%E6%94%B9%E5%88%86%E8%BE%A8%E7%8…

强大的Python必备库,你知道几个?建议收藏!

在Python的世界里,库的丰富性让开发者的工作变得轻松而高效。那么,你知道哪些强大的Python必备库吗? 面对众多的Python库,如何选择适合自己的工具来提升开发效率和代码质量?,丰富多样的库如同一个个强大的…

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代,网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行,还是对外提供服务,网络都发挥着关键作用。对于网络工程师或IT运维人员…

EasyX图形库的安装

前言 EasyX是一个图形库,可以用来做一些c/c小游戏,帮助学习。 一、进入EasyX官网 https://easyx.cn/ 二、点击下载EasyX 三、下载好后以管理员身份运行它 四、点击下一步 五、然后它会自动检测你的编辑器,用哪个就在哪个点安装 六、安装成功…

【linux问题】Linux命令行终端窗口的输出,显示不全问题

Linux命令行终端窗口的输出,显示不全问题 问题: 图中显示的是一个Linux命令行终端窗口, nmcli dev wifi 是一个命令——列出所有能用的Wi-Fi。 执行命令后,窗口输出了显示了所有能用的Wi-Fi网络列表。 但是在每一行末尾有一个“…

KPaaS:基于微服务架构的低代码平台

基于微服务架构的低代码平台是当前企业数字化转型的重要工具。通过将微服务架构与低代码平台结合,可以实现高效、灵活且可扩展的应用开发。在当今数字化转型的浪潮中,企业面临着诸多挑战,其中IT资源有限以及对高效开发的需求尤为突出。KPaaS业…

AI一键生成钢铁是怎样炼成的ppt!用这2个工具轻松拿捏ppt制作!

钢铁是怎样炼成的,是中小学语文新课标必读书目,它是由前苏联作家尼古拉奥斯特洛夫斯基于1930年至1934年写成的半自传体长篇小说,全书详细记叙了保尔柯察金于20世纪初期的成长历程。 对于每个接受过九年义务教育的大小朋友来说,这…

漏洞挖掘JS构造新手向

前置思路文章 JS逆向混淆前端对抗 油猴JS逆向插件 JS加解密之mitmproxy工具联动Burp JS挖掘基础 伪协议 JavaScript伪协议是一种在浏览器中模拟网络请求的方法。它使用window.XMLHttpRequest对象或fetch()方法来模拟发送HTTP请求,而不是通过实际的网络请求来获…

碰到这个问题请更新或重新安装fastapi版本

ValueError: too many values to unpack (expected 2) ERROR: Exception in ASGI application Traceback (most recent call last) File "/usr/local/lib/python3.8/site-packages… Ubuntu,容器中, 碰到上面这个问题,请更新fastapi的版…

微信小程序——编写一个表白墙小程序

一、前期准备 注册微信小程序账号 在微信公众平台上注册小程序账号,获取小程序的 AppID。 安装开发工具 下载并安装微信开发者工具,用于小程序的开发、调试和预览。 二、界面设计 首页 展示最新的表白内容列表,每条表白可以包括发布者昵称、…

⌈ 传知代码 ⌋ 无监督动画中关节动画的运动表示

💛前情提要💛 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间,对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

开发规范 - mac系统1小时装机极速装机开发环境

idea 官网下载,然后想办法破解 idea必备配置 设置自动import IDEA插件安装 idea必备插件 maven helperlombokMybatisX jdk配置 jdk不用单配配置,在idea中,选择一个语言环境(jdk8/jdk11/jdk17…),然后默认下载j…

unity学习笔记-Text mesh Pro

Text mesh Pro组件 组件使用的大致流程细节导入之后字体没有显示可能一可能二 注意事项 好久没更了…最近在学习使用别人的框架进行开发,坑也不少,不过学习到了很多设计思维。 言归正传。忘了是什么是时候的版本开始,unity多了这个组件&#…

WPF入门_02依赖属性

1、依赖属性主要有以下三个优点 1)依赖属性加入了属性变化通知、限制、验证等功能。这样可以使我们更方便地实现应用,同时大大减少了代码量 2)节约内存:在WinForm中,每个UI控件的属性都赋予了初始值,这样每个相同的控件在内存中都会保存一份初始值。而WPF依赖属性很好地…

uiautomatorviewer安卓9以上正常使用及问题处理

一、安卓9以上使用uiautomatorviewer问题现象 打开Unexpected error while obtaining UI hierarchy 问题详情 Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetException 二、问题处理 需要的是替换对应D:\software\android-sdk-windows…

python将照片集导出成视频

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen 背景 一个安静的下午,看着电脑里乱七八糟的照片,有大有小,宽高不一,突然想找个方式把他们统一起来&…

PC企业微信自动回复,群发管理,定时发送,朋友圈

服务提供了丰富的API和SDK,可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互,可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作,通过接口可以实…