昇思25天学习打卡营第11天|文本解码原理-以MindNLP为例

news2024/11/15 17:17:16

文本解码原理-以MindNLP为例

这篇主要讲讲文本生成的几个方法,首先介绍一下什么是自回归语言模型。

自回归语言模型

autoregressive language model,根据前面的词或上下文,生成后续的词或句子的语言模型。
有几种典型的自回归语言模型:

1. 马尔科夫链
最简单的模型,假设当前词只依赖前一个或几个词。

2. ngram 模型
是马尔可夫的拓展,假设当前词依赖固定个数的前n个词。

3. 循环神经网络RNN
能捕捉序列中的长期依赖关系

4. 长短期记忆网络LSTM和门控循环单元GRU
RNN改进版本,解决了RNN的梯度消失和梯度爆炸的问题

在自回归模型中,一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积。

贪心法

每一步都选择概率最高的词作为当前的输出词。

from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel

tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')
model = GPT2LMHeadModel.from_pretrained("iiBcai/gpt2", pad_token_id=tokenizer.eos_token_id, mirror='modelscope')

input_ids = tokenizer.encode('I enjoy walking with my cute dog', return_tensors='ms')

greedy_output = model.generate(input_ids, max_length=50)

print(tokenizer.decode(greedy_output[0], skip_special_tokens=True))

解释一下代码构成:
首先import了两个模块

  • GPT2Tokenizer
    用于将文本转换为模型可处理的输入格式

  • GPT2LMHeadModel
    具体的GPT-2模型,用于生成文本。

接着加载tokenizer模型

使用tokenizer.encode()对指定文本进行编码,return_tensors指定了返回的张量格式。

使用model.generate()生成文本,max_length=50指输入和输出的最大token数为50.

最后使用tokenizer.decode()解码生成的文本。

Beam search

束搜索,这种方法会保留当前最可能的n个候选词,再根据这些词的得分选择概率最高的最佳序列。它可以一定程度的保留最优路径。


beam_output = model.generate(
    input_ids, 
    max_length=50, 
    num_beams=5, 
    early_stopping=True
)

beam_output = model.generate(
    input_ids, 
    max_length=50, 
    num_beams=5, 
    no_repeat_ngram_size=2, 
    early_stopping=True
)

beam_outputs = model.generate(
    input_ids, 
    max_length=50, 
    num_beams=5, 
    no_repeat_ngram_size=2, 
    num_return_sequences=5, 
    early_stopping=True
)

第一段,指定了束的宽度是5,即,在每步中保留5个候选序列。early_stopping=True表示当所有候选序列生成结束标记是,提前停止生成。

第二段,增加了 no_repeat_ngram_size=2 参数,指在生成过程中避免重复长度为2的n-gram(即连续两个token的组合)。
这里指的不是不包含2token的序列,而是在生成的序列内部不会包含重复的长度为2的n-gram。
如果在生成序列中已经包含了某个2token的序列,下面的生成不会再出现了。这可以增强生成文本的多样性。

第三段,增加了 num_return_sequences=5 参数,指生成并返回5个不同的候选序列。

缺点

1. 无法解决重复问题
beam search本质上是在每一步选择得分最高的候选项。因此在生成时容易重复使用得分比较高的词或者短语,尤其是没有明确停止条件或生成较长文本时。例如,可能会生成“this is a great great great idea“。no_repeat_ngram_size参数的引入就是为了减轻这一问题。

2. 开放域生成效果差
beam search在特定任务下表现比较好,因为目标的序列上下文更明确,歧义更少。但开放域时模型需要生成内容丰富的文本,而束搜索的过程更加保守。

Sample

根据当前的条件概率分布 随机选择输出词。这种方式的优点是文本生成的多样性高,而生成的文本更可能不连续。

mindspore.set_seed(0)
# activate sampling and deactivate top_k by setting top_k sampling to 0
sample_output = model.generate(
    input_ids, 
    do_sample=True, 
    max_length=50, 
    top_k=0
)

top_k=0指禁用Top-k采样。Top-k采样是指在每一步生成时仅从前k个最有可能的候选词中进行采样。设置top_k=0表示不限制候选词的数量,即从所有可能的词中进行采样。

Temperature

在文本生成任务中,temperature是一个控制生成文本时随机性的参数。具体来说,temperature调整softmax函数的输出概率分布以改变模型生成下一个词时的概率分布,从而影响生成文本的多样性和确定性。
temperature大于1时,概率分布会更平滑,也就是每个词之间的概率差距会减小,文本也会更随机多样。temperature小于1时,概率分布会变得更加陡峭,高概率的词变得更有优势,生成的文本更加确定和集中。

sample_output = model.generate(
    input_ids, 
    do_sample=True, 
    max_length=50, 
    top_k=0,
    temperature=0.7
)

top k smaple

在生成下一个词时,仅从前 K 个概率最高的候选词中进行随机采样,而不是从整个词汇表中采样。也就是选出概率最大的k个词,重新归一化(使概率总和为1),最后在归一化后的k个词中进行随机采样。

mindspore.set_seed(0)
# activate sampling and deactivate top_k by setting top_k sampling to 0
sample_output = model.generate(
    input_ids, 
    do_sample=True, 
    max_length=50, 
    top_k=50
)

这里的k值过小会导致文本缺乏多样性,k值过大可能引入不合理的词汇。

top-P sample

这种方式又称为核采样Nucleus Sampling,它会采样动态调整候选词的集合,使得生成的文本更加灵活和自然。具体的,top p sample基于累积概率的概念,在每一步生成下一个词时,它会选择那些累积概率达到或超过预定义阈值p的词,并从这些词中进行随机采样。

sample_output = model.generate(
    input_ids, 
    do_sample=True, 
    max_length=50, 
    top_p=0.92, 
    top_k=0
)

这个值需要根据具体任务来设定,一般在0.9-0.95之间。

总结

本篇介绍了在自回归语言模型下的几类文本生成算法,包括最简单的贪心法、有多种变体的sample、以及beam search束搜索。

打卡凭证

在这里插入图片描述

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

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

相关文章

python爬虫入门(三)之HTML网页结构

一、什么是HTML 1、网页的三大技术要素&#xff1a; HTML定义网页的结构和信息&#xff08;骨架血肉&#xff09;CSS定义网页的样式&#xff08;衣服&#xff09;JavaScript定义用户和网页的交互逻辑&#xff08;动作&#xff09; 2、一个最简单的HTML&#xff1a;用<>…

动态数据库设计

动态数据库设计是一种灵活的方法&#xff0c;用于构建能够适应不断变化的数据需求的数据库结构。它强调在不频繁修改数据库表结构的前提下&#xff0c;有效管理和存储多样化的数据。以下是实现动态数据库设计的一些关键技术点和策略&#xff1a; 实体-属性-值&#xff08;EAV&a…

意得辑ABSJU202优惠15%啦,新用户注册直减哦

不得不说&#xff0c;还得是意得辑&#xff0c;钱不白花&#xff0c;润色的挺好~ 第一篇SCI终于成功见刊&#xff01;&#xff01;&#xff01; 都来接accept&#xff01;&#xff01;&#xff01;谢谢accept小狗&#xff0c;接accept 求求accept小狗&#xff0c;真的想要双证毕…

OpenLayers对要素进行新增绘制、选择、修改等交互操作

1、绘制-Draw 新建一个用来绘制要素的图层&#xff1a; const vector new VectorLayer({source: new VectorSource(),style: {"fill-color": "rgba(255, 255, 255, 0.2)","stroke-color": "#ffcc33","stroke-width": 2,&q…

如何提升美国Facebook直播的整体体验?

Facebook作为全球最大的社交媒体平台之一&#xff0c;提供了直播功能&#xff0c;用户可以实时分享生活、见解和创意。许多商家通过美国Facebook直播来获取更多客户&#xff0c;但直播时可能会遇到网络卡顿的问题&#xff0c;导致观看体验不佳。本文将探讨如何解决这个问题&…

Ubuntu开源软件LibreOffice将Excel多表转PDF多目录示例

一、实现的起因&#xff1a; Windows平台下&#xff0c;常见的WPS办公自动化套件中电子表格软件&#xff0c;其中具备将Excel工作表中数据转为PDF文档表格的功能。现在进一步的需求是&#xff1a;像PDF标准的电子书那样&#xff0c;具备一本书的目录结构或章节结构&#xff0c…

[C++]入门基础(1)

Hello大家好&#xff0c;今天通过本篇文章&#xff0c;我们来初步学习C&#xff0c;C可以说是对C语言的一个升级&#xff0c;我们会一步一步的由浅入深的学习C。 目录 1.第一个C程序 2.命名空间 2.1 命名空间出现的意义 2.2 namespace的定义 2.3 命名空间的使用 3.C输入…

Spring Cloud - 代码生成器

1、代码生成器概述 Spring Cloud 并没有提供类似于 Spring Data 中的“代码生成器”&#xff0c;因为它主要提供的是分布式系统中服务发现和配置管理的一套解决方案。如果你想要为你的微服务应用生成样板代码&#xff0c;你可能需要考虑使用其他工具或者方案&#xff0c;例如 S…

基于SSM的志愿者服务平台

基于SSM的志愿者服务平台系统主要其系统包括不同的端组成&#xff0c;前端主要包括系统用户管理、新闻数据管理、变幻图管理、志愿者管理、培训视频管理、志愿者项目管理、服务时长管理、交流分享管理、志愿者表彰管理。前台主要包括网站首页、培训视频、志愿者项目、交流分享、…

【python中级】图像从笛卡尔坐标系转换为极坐标系

【python中级】图像从笛卡尔坐标系转换为极坐标系 1.背景2.生成二维图3.极坐标转换1.背景 笛卡尔坐标系就是我们常说的直角坐标系。 笛卡尔坐标系,也称为直角坐标系,是由法国数学家和哲学家勒内笛卡尔(Ren Descartes)发明的一种二维或三维坐标系统。它使用两个或三个相互垂…

李彦宏: 开源模型是智商税|马斯克: OpenAI 闭源不如叫 CloseAI

在 2024 年世界人工智能大会&#xff08;WAIC 2024&#xff09;上&#xff0c;百度创始人、董事长兼首席执行官李彦宏发表对开源模型的评价。 李彦宏认为&#xff1a;开源模型实际上是一种智商税&#xff0c;而闭源模型才是人工智能&#xff08;AI&#xff09;行业的未来。 马…

基于LangChain的RAG开发教程(二)

v1.0官方文档&#xff1a;https://python.langchain.com/v0.1/docs/get_started/introduction/ 最新文档&#xff1a;https://python.langchain.com/v0.2/docs/introduction/ LangChain是一个能够利用大语言模型&#xff08;LLM&#xff0c;Large Language Model&#xff09;能…

git恢复到之前提交的记录

项目搞崩了&#xff0c;还提交上去了怎么办&#xff1f; 那当然是恢复到之前的提交记录了&#xff0c;那怎么操作呢&#xff1f; 首先&#xff0c;到代码托管平台找到你想恢复的提交记录(在此以github为例) 获取 commit id 首先&#xff0c;通过如下图操作获取到commit id {% a…

Spring Cloud: OpenFeign 超时重试机制

超时重试是一种用于网络通信的常用策略&#xff0c;目的是在请求未能在规定时间内获得响应或响应超时的情况下&#xff0c;重新发送请求。具体来说&#xff0c;当发起请求后&#xff0c;如果在设定的时间内未能收到预期的响应&#xff0c;就会启动超时重试机制&#xff0c;重新…

徒手绘制 Android 通用进度条

拖动条&#xff08;FlexSeekBar&#xff09;&#xff0c;在Android的各个地方都非常常用&#xff0c;本文旨在自研一套通用的进度条&#xff0c;非常适合车载App使用 样式如下&#xff1a; 使用示例 <!--默认用法--> <com.max.android.ui.seekbar.FlexSeekBarandroi…

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序

python获取文件列表按照文件修改时间进行排序,默认按照文件名时间戳排序 1、流程 1、获取文件绝对路径下的所有文件 2、通过os.path.getmtime获取每个文件的修改时间,并与文件组成元组,方便后续排序 3、默认按照时间戳降序,否则按照按修改时间排序文件列表(从最晚到最早)…

Linux忘记密码重置root密码、重置普通用户密码

重启看到选项按e reboot 或 init 62、移动到Linux开头的行在末尾添加 rw init/bin/bash3、按下Ctrlx引导启动 mount -o remount,rw /输入命令回车更改密码,输入新密码&#xff0c;别用小键盘&#xff0c;容易出错 passwd输入两次校验&#xff0c;出现updated successfully就…

几何建模基础-样条曲线和样条曲面介绍

1.概念介绍 1.1 样条曲线的来源 样条的英语单词spline来源于可变形的样条工具&#xff0c;那是一种在造船和工程制图时用来画出光滑形状的工具&#xff1a;富有弹性的均匀细木条/金属条/有机玻璃条&#xff0c;它围绕着按指定位置放置的重物或者压铁做弹性弯曲&#xff0c;以…

SAPUI5基础知识12 - 应用程序描述符(manifest.json)

1. 背景 在SAPUI5中&#xff0c;manifest.json是一个配置文件&#xff0c;它包含了应用程序的所有配置信息。这个文件是SAPUI5应用程序的核心&#xff0c;它定义了应用程序的元数据&#xff0c;包括应用程序的名称、描述、版本、模型、路由等信息。 manifest.json的主要功能和…

如何使用Vue3创建在线三维模型展示?

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 代码相关的技术博客 代码应用场景介绍 本段代码使用 RoughJS 库在 HTML5 Canvas 上创建了手绘风格的图像&#xff0c;展示了 RoughJS 库的强大功能&#xff0c;可用于创建具有有机手绘外观的图形。 代码基本…