【MindSpore学习打卡】应用实践-LLM原理和实践-文本解码原理 —— 以MindNLP为例

news2024/9/24 18:26:53

在自然语言处理(NLP)领域,文本生成是一项重要且具有挑战性的任务。从对话系统到自动文本补全,文本生成技术无处不在。本文将深入探讨自回归语言模型的文本解码原理,使用MindNLP工具进行示例演示,并详细分析不同解码方法的优缺点。通过这些内容,您将了解如何选择合适的解码策略来提升生成文本的质量和多样性。

概述

文本生成在自然语言处理(NLP)中具有重要地位,广泛应用于对话系统、文本补全等任务。本文将探讨自回归语言模型的文本解码原理,使用MindNLP工具进行示例演示,重点分析不同解码方法的优缺点及其实现。

自回归语言模型回顾

自回归语言模型通过逐步预测下一个单词来生成文本。假设给定一个初始上下文单词序列 (W_0),模型通过计算条件概率 (P(w_t | w_{1:t-1})) 来生成下一个单词,直到生成EOS(结束)标签。

公式

一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积:
P ( w 1 , w 2 , … , w T ) = ∏ t = 1 T P ( w t ∣ w 1 : t − 1 ) P(w_1, w_2, \dots, w_T) = \prod_{t=1}^{T} P(w_t | w_{1:t-1}) P(w1,w2,,wT)=t=1TP(wtw1:t1)

常见的文本生成方法

MindNLP和huggingface Transformers提供了多种文本生成方法,包括贪心搜索、束搜索、随机采样、Top-K采样和Top-P采样。下面将逐一介绍这些方法及其优缺点。

贪心搜索 (Greedy Search)

贪心搜索在每个时间步 (t) 都选择条件概率最高的词作为当前输出词。

贪心搜索通过在每个时间步选择条件概率最高的词,快速生成文本。虽然这种方法简单高效,但容易错过全局最优解,生成的文本质量可能不高。这种方法适合在对效率要求较高且文本生成质量要求不高的场景中使用。

公式:
w t = arg ⁡ max ⁡ w P ( w ∣ w 1 : t − 1 ) w_t = \arg\max_w P(w | w_{1:t-1}) wt=argwmaxP(ww1:t1)

优点:简单高效。

缺点:容易错过全局最优解,可能导致生成的文本质量不高。

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("Greedy Search Output:\n" + tokenizer.decode(greedy_output[0], skip_special_tokens=True))

束搜索 (Beam Search)

束搜索通过在每个时间步保留最可能的num_beams个词,并从中最终选择出概率最高的序列。

束搜索通过保留多个可能的词路径来提高生成文本的质量。虽然它在一定程度上保留了最优路径,但仍然可能面临重复问题,且在开放域生成效果较差。束搜索适用于需要在多个候选路径中选择最优解的场景,如机器翻译。
以num_beams=2为例:

("The","dog","has") : 0.4 × 0.9 = 0.36 \text{("The","dog","has")} : 0.4 \times 0.9 = 0.36 ("The","dog","has"):0.4×0.9=0.36

("The","nice","woman") : 0.5 × 0.4 = 0.20 \text{("The","nice","woman")} : 0.5 \times 0.4 = 0.20 ("The","nice","woman"):0.5×0.4=0.20

优点:一定程度上保留最优路径。

缺点:无法解决重复问题,在开放域生成效果差。

beam_output = model.generate(input_ids, max_length=50, num_beams=5, early_stopping=True)
print("Beam Search Output:\n" + tokenizer.decode(beam_output[0], skip_special_tokens=True))

随机采样 (Sample)

根据当前条件概率分布随机选择输出词 ( w t w_t wt)。
随机采样根据条件概率分布随机选择输出词,极大地提高了生成文本的多样性。然而,生成的文本可能不连续、不合理。随机采样适用于需要生成多样化文本的场景,如创意写作。

优点:文本生成多样性高。

缺点:生成文本不连续。

sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0)
print("Random Sample Output:\n" + tokenizer.decode(sample_output[0], skip_special_tokens=True))

Top-K采样

选出概率最大的K个词,重新归一化,最后在归一化后的K个词中采样。

优点:在固定采样池中采样,生成文本更加多样化。

缺点:在分布比较尖锐的时候可能产生胡言乱语,在分布比较平坦的时候限制模型的创造力。

sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=50)
print("Top-K Sample Output:\n" + tokenizer.decode(sample_output[0], skip_special_tokens=True))

Top-P采样 (Nucleus Sampling)

在累积概率超过概率p的最小单词集中进行采样,重新归一化。采样池根据下一个词的概率分布动态调整。

优点:动态调整采样池大小,提高生成文本的质量和多样性。

sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_p=0.92, top_k=0)
print("Top-P Sample Output:\n" + tokenizer.decode(sample_output[0], skip_special_tokens=True))

结合Top-K和Top-P采样

将Top-K和Top-P结合,进一步提升文本生成质量和多样性。

Top-K采样选出概率最大的K个词进行采样,而Top-P采样则在累积概率超过某个阈值的词中进行采样。两者结合使用可以平衡生成文本的多样性和合理性,适用于需要生成高质量且具有创意的文本场景。

sample_outputs = model.generate(input_ids, do_sample=True, max_length=50, top_k=5, top_p=0.95, num_return_sequences=3)
for i, sample_output in enumerate(sample_outputs):
    print(f"{i}: {tokenizer.decode(sample_output, skip_special_tokens=True)}")

在这里插入图片描述

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

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

相关文章

240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1]

240719_图像二分类任务中图像像素值的转换-[0,255]-[0,1] 在做语义分割二分类任务时,有时下载到的数据集或者我们自己制作的数据集,标签像素值会是[0,255](或者含有一些杂乱像素),但在该类任务中,往往0代表…

androidkiller重编译apk失败的问题

androidkiller重编译apk失败 参考: https://blog.csdn.net/qq_38393271/article/details/127057187 https://blog.csdn.net/hkz0704/article/details/132855098 已解决:“apktool” W: invalid resource directory name:XXX\res navigation 关键是编译…

脑肿瘤有哪些分类? 哪些人会得脑肿瘤?

脑肿瘤,作为一类严重的脑部疾病,其分类复杂多样,主要分为原发性脑肿瘤和脑转移瘤两大类。原发性脑肿瘤起源于颅内组织,常见的有胶质瘤、脑膜瘤、生殖细胞瘤、颅内表皮样囊肿及鞍区肿瘤等。其中,胶质瘤作为最常见的脑神…

# Redis 入门到精通(九)-- 主从复制

Redis 入门到精通(九)-- 主从复制(1) 一、redis 主从复制 – 主从复制简介 1、互联网“三高”架构 高并发高性能高可用 2、你的“Redis”是否高可用? 1)单机 redis 的风险与问题 问题1.机器故障  现…

WeTest 海外本地化测试的全生命周期服务 第一期

伴随全球化和数字化的加速推进,越来越多的国内企业希望将其产品服务推向国际,以便在全球数字市场中占有一席之地。除去传统的欧美市场,国内企业也积极开拓东南亚、南亚、拉美、中东和非洲等新兴市场。这些地区的互联网普及率和数字化需求正在…

vue+watermark-dom实现页面水印效果

前言 页面水印大家应该都不陌生,它可以用于验证数字媒体的来源和完整性,还可以用于版权保护和信息识别,这些信息可以在不影响媒体质量的情况下嵌入,‌并在需要时进行提取。‌本文将通过 vue 结合 watermark-dom 库,教大…

《AIGC 实战宝典》(2024版) 正式发布!

2024 新年伊始,OpenAI 推出文生视频 Sora,风靡整个科技圈。 最近又发布了 ChatGPT-4o,这是一个全新模型,不仅能处理文本,还能实时理解和生成音频和图像。OpenAI 用实际行动给全世界的科技公司又上了一课。 如何从0到1…

零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码

文章目录 一.概要二.DHT11主要性能参数三.DHT11温度传感器内部框图四.DTH11模块原理图五.DHT11模块跟单片机板子接线和通讯时序1.单片机跟DHT11模块连接示意图2.单片机跟DHT11模块通讯流程与时序 六.STM32单片机DHT11温度传感器实验七.CubeMX工程源代码下载八.小结 一.概要 DH…

offer题目51:数组中的逆序对

题目描述:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7…

[Vulnhub] TORMENT IRC+FTP+CUPS+SMTP+apache配置文件权限提升+pkexec权限提升

信息收集 IP AddressOpening Ports192.168.101.152TCP:21,22,25,80,111,139,143,445,631 $ nmap -p- 192.168.101.152 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 2.0.8 or later | ftp-anon: Anonymous FTP login a…

新建一个git仓库并且把已有项目推送到git远程仓库

总贴 1. 创建一个空项目,不会看新建仓库 2. 克隆这个项目到某个文件夹去,比如我想克隆到我的E盘的code下面 3. 我的这个文件夹下面是有东西的,一点都不影响 . 4. 用命令行进入这个文件夹 命令行已经显示了已经在E盘下面code文件夹, 不会…

【linux】报错解决:配置RAIDA1之后系统识别不到

【linux】报错解决:配置RAIDA1之后系统识别不到 一、问题描述: 我的主板是华南金牌X99-F8D PLUS,安装了ubuntu20.04,通过BIOS创建了RAID1数组,进入系统之后识别不到我创建的RAID1数组。 二、原因分析: 可…

【算法】算法模板

算法模板 文章目录 算法模板简介数组字符串列表数学树图动态规划 简介 博主在LeetCode网站中学习算法的过程中使用到并总结的算法模板,在算法方面算是刚过初学者阶段,竞赛分数仅2000。 为了节省读者的宝贵时间,部分基础的算法与模板未列出。…

IMU提升相机清晰度

近期,一项来自北京理工大学和北京师范大学的团队公布了一项创新性的研究成果,他们将惯性测量单元(IMU)和图像处理算法相结合,显著提升了非均匀相机抖动下图像去模糊的准确性。 研究团队利用IMU捕捉相机的运动数据&…

用程序画出三角形图案

创建各类三角形图案 直角三角形&#xff08;左下角&#xff09; #include <iostream> using namespace std;int main() {int rows;cout << "输入行数: ";cin >> rows;for(int i 1; i < rows; i){for(int j 1; j < i; j){cout << &…

阿里巴巴1688商品详情API返回值全面解析-商品基本信息

阿里巴巴1688商品详情API的返回值是一个包含了商品详细信息的JSON对象&#xff0c;这些信息对于开发者在电商平台上展示商品、进行数据分析等场景非常重要。以下是对阿里巴巴1688商品详情API返回值的全面解析&#xff1a; 一、商品基本信息 商品ID&#xff1a;商品的唯一标识…

gds-linkstack:泛型链式栈

类似于C的stack的泛型容器&#xff0c;初始化、销毁、清空、入栈、出栈、取栈顶、栈空。

java项目-刷题项目实现细节及思路

设计数据表&#xff1a;&#xff1a; 分类表 id主键 分类类型 分类名称 父级id 图标链接 题目标签表 主键 标签名称 分类id&#xff08;标签会和分类进行连接 直接将分类表写进来 减少另一个关联表&#xff09; 排序 题目的信息表 id name 难度 出题人姓名 题目的类别&#…

pyspark使用 graphframes创建和查询图的方法

1、安装graphframes的步骤 1.1 查看 spark 和 scala版本 在终端输入&#xff1a; spark-shell --version 查看spark 和scala版本 1.2 在maven库中下载对应版本的graphframes https://mvnrepository.com/artifact/graphframes/graphframes 我这里需要的是spark 2.4 scala 2.…

CTF-Web习题:[BJDCTF2020]Mark Loves cat

题目链接&#xff1a;Mark Loves cat 解题思路 访问靶机网站后得到如下页面&#xff1a; 先浏览网页&#xff0c;发现最下面有一个"dog"字样&#xff0c;此时翻看源码并没有什么发现 那就例行进行目录扫描&#xff0c;源码泄露扫描&#xff0c;用dirsearch目录扫…