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

文本解码原理-以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.mfbz.cn/a/784895.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端跨域问题--解析与实战

引言 在现代网络应用中,跨域问题是一个常见的挑战。由于浏览器的同源策略,限制了从不同源(域名、协议或端口)进行资源共享,这就造成了跨域访问的限制。跨域资源共享(CORS)是一种技术&#xff0…

视频融合共享平台视频共享融合赋能平台数字化升级医疗体系

在当前,医疗健康直接关系到国计民生,然而,由于医疗水平和资源分布不均,以及信息系统老化等问题,整体医疗服务能力和水平的提升受到了限制。视频融合云平台作为数字医疗发展的关键推动力量,在医疗领域的广泛…

大话C语言:第29篇 指针

1 指针概念 指针:地址的变量化形式,其存储的是内存中某个存储单元的地址。它是地址的数值表示。 指针变量:一种特殊的变量,它专门用于存放变量的地址(即指针)。 注意,指针和指针变量的区别&am…

【后端开发】docker安装MySQL并做端口映射

1.拉取MySQL镜像 docker pull mysql但是中途可能出现连接超时的情况 可以使用; docker pull do.nark.eu.org/library/mysql用国内镜像去拉取可能会快很多 2.启动容器并做端口映射 因为MySQL是在docker里面的所以要从docker外面连接MySQL需要做端口映射 以下是端口映射的的命…

python爬虫加入进度条

安装tqdm和requests库 pip install tqdm -i https://pypi.tuna.tsinghua.edu.cn/simplepip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple带进度条下载 import time # 引入time模块,用于处理时间相关的功能 from tqdm import * # 从tqdm包中…

【Java】搜索引擎设计:信息搜索怎么避免大海捞针?

一、内容分析 我们准备开发一个针对全网内容的搜索引擎,产品名称为“Bingoo”。 Bingoo的主要技术挑战包括: 针对爬虫获取的海量数据,如何高效地进行数据管理;当用户输入搜索词的时候,如何快速查找包含搜索词的网页…

YOLOv10改进 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv10的重大改进,特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体,如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU,还融合了“Focus”思想,创造了一系列新的损失函数。这些组合形式的…

深度解密Spark性能优化之道课程

课程通过实战案例解析和性能调优技巧的讲解,帮助学员提升大数据处理系统的性能和效率。课程内容涵盖了Spark性能调优的各个方面,包括内存管理、并行度设置、数据倾斜处理、Shuffle调优、资源配置等关键技术和策略。学员将通过实际案例的演示和分析&#…

Caterpillar on a Tree

首先一个很显然的地方就是使用传送门肯定是在叶子节点使用,我们来考虑一下整个过程是怎么样的 为了方便,我们不妨假设可以传送回根节点\(k1\)次,然后要求最后回到根节点 我们先从根节点走到某一个叶子结点,然后再从这个叶子节点走…

Open3D 计算点云的平均密度

目录 一、概述 1.1基于领域密度计算原理 1.2应用 二、代码实现 三、实现效果 2.1点云显示 2.2密度计算结果 一、概述 在点云处理中,点的密度通常表示为某个点周围一定区域内的点的数量。高密度区域表示点云较密集,低密度区域表示点云较稀疏。计算…

Kubernetes基于helm部署jenkins

Kubernetes基于helm安装jenkins jenkins支持war包、docker镜像、系统安装包、helm安装等。在Kubernetes上使用Helm安装Jenkins可以简化安装和管理Jenkins的过程。同时借助Kubernetes,jenkins可以实现工作节点的动态调用伸缩,更好的提高资源利用率。通过…

拆分pdf文件最简单的方法,pdf怎么拆成一页一张

在数字化的时代,pdf文件已经成为我们日常办公、学习不可或缺的文档格式。然而,有时候我们可能需要对一个大的pdf文件进行拆分,以方便管理和分享。那么,如何将一个pdf文件拆分成多个pdf呢?本文将为你推荐一种好用的拆分…

HNTs-g-PEG-CDs-Biotin NPs;碳量子点修饰接枝生物素化的羟基磷灰石纳米管

HNTs-g-PEG-CDs-Biotin NPs,即碳量子点修饰接枝生物素化的羟基磷灰石纳米管,是一种结合了多种先进材料特性的纳米复合材料。以下是对该材料的详细分析: 一、组成成分及特性 羟基磷灰石纳米管(HNTs): 羟基磷…

多用户挂售转卖竞拍闪拍商城系统/NFT数藏系统/后端PHP+前端UNIAPP源码带教程(亲测源码)

挂售转卖竞拍商城系统源码/竞拍系统/转拍闪拍系统/后端PHP前端UNiapp源码 亲测可用 1、后台管理:系统管理员通过后台可以轻松添加商品进行挂单。这包括商品的详细信息,如名称、描述、价格、库存等。 商品展示:挂单后的商品会在商城前端进行…

22.状态机设计--可乐机设计(投币三元出一瓶可乐)

理论知识: (1)状态机简写为FSM(Finite State Machine),也称为同步有限状态机。同步是指状态的变化都是在时钟的边沿发送变化,有限值得是状态的个数是可数的。 (2)分类&…

Xilinx FPGA DDR4 接口的 PCB 准则

目录 1. 简介 1.1 FPGA-MIG 与 DDR4 介绍 1.2 DDR4 信号介绍 1.2.1 Clock Signals 1.2.2 Address and Command Signals 1.2.3 Address and Command Signals 1.2.4 Data Signals 1.2.5 Other Signals 2. 通用存储器布线准则 3. Xilinx FPGA-MIG 的 PCB 准则 3.1 引脚…

ElasticSearch第一天

学习目标: 能够理解ElasticSearch的作用能够安装ElasticSearch服务能够理解ElasticSearch的相关概念能够使用Postman发送Restful请求操作ElasticSearch能够理解分词器的作用能够使用ElasticSearch集成IK分词器能够完成es集群搭建 第一章 ElasticSearch简介 1.1 什么…

【Unity2D 2022:】制作NPC

一、创建NPC角色 1. 创建JambiNPC并同时创建Jambi站立动画 (1)点击第一张图片,按住shift不松,再选中后两张图片,拖到层级面板中 (2)将动画资源文件保存到Animation Clips文件夹中 (…

YOLOv10改进 | 损失函数篇 | InnerIoU、InnerSIoU、InnerWIoU、FocusIoU等损失函数

一、本文介绍 本文给大家带来的是YOLOv10最新改进,为大家带来最近新提出的InnerIoU的内容同时用Inner的思想结合SIoU、WIoU、GIoU、DIoU、EIOU、CIoU等损失函数,形成 InnerIoU、InnerSIoU、InnerWIoU、等新版本损失函数,同时还结合了Focus和…

PHP源码:线上书店系统(附管理后台+前台)

一. 前言 今天小编给大家带来了一款可学习,可商用的,线上书店 源码,支持二开,无加密。项目的内容是销售书籍,可以扩展成pdf,文档等一些虚拟产品的销售。 详细界面和功能见下面视频演示。 二. 视频演示 线…