240709_昇思学习打卡-Day21-文本解码原理--以MindNLP为例

240709_昇思学习打卡-Day21-文本解码原理–以MindNLP为例

今天做根据前文预测下一个单词,仅作简单记录及注释。
在这里插入图片描述

一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积
在这里插入图片描述

  • 𝑊_0:初始上下文单词序列
  • 𝑇: 时间步
  • 当生成EOS标签时,停止生成。

MindNLP/huggingface Transformers提供的文本生成方法

在这里插入图片描述

Greedy search

在每个时间步𝑡都简单地选择概率最高的词作为当前输出词:

𝑤𝑡=𝑎𝑟𝑔𝑚𝑎𝑥_𝑤 𝑃(𝑤|𝑤(1:𝑡−1))

按照贪心搜索输出序列(“The”,“nice”,“woman”) 的条件概率为:0.5 x 0.4 = 0.2

缺点: 错过了隐藏在低概率词后面的高概率词,如:dog=0.5, has=0.9

环境准备

%%capture captured_output
# 实验环境已经预装了mindspore==2.2.14,如需更换mindspore版本,可更改下面mindspore的版本号
!pip uninstall mindspore -y
!pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore==2.2.14
!pip uninstall mindvision -y
!pip uninstall mindinsight -y
# 该案例在 mindnlp 0.3.1 版本完成适配,如果发现案例跑不通,可以指定mindnlp版本,执行`!pip install mindnlp==0.3.1`
!pip install mindnlp
# 贪婪搜索生成文本示例# 导入所需的GPT2模型和分词器
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 初始化分词器,从预训练模型加载
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将EOS标记作为PAD标记以避免警告
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')# 生成文本,直到输出长度(包括上下文长度)达到50
greedy_output = model.generate(input_ids, max_length=50)# 打印生成的文本
print("Output:\n" + 100 * '-')
print(tokenizer.decode(greedy_output[0], skip_special_tokens=True))

Beam search

Beam search通过在每个时间步保留最可能的 num_beams 个词,并从中最终选择出概率最高的序列来降低丢失潜在的高概率序列的风险。如图以 num_beams=2 为例:

(“The”,“dog”,“has”) : 0.4 * 0.9 = 0.36

(“The”,“nice”,“woman”) : 0.5 * 0.4 = 0.20

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

缺点:1. 无法解决重复问题;2. 开放域生成效果差

在这里插入图片描述

# 导入GPT2模型的分词器和语言模型头
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 从预训练模型加载分词器
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将EOS标记作为PAD标记以避免警告信息
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')# 使用束搜索(beam search)生成文本,并设置提前停止条件
beam_output = model.generate(input_ids, max_length=50, num_beams=5, early_stopping=True
)# 输出束搜索的结果
print("Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))
print(100 * '-')# 设置不重复的n-gram大小为2,避免生成的文本中出现重复的短语
beam_output = model.generate(input_ids, max_length=50, num_beams=5, no_repeat_ngram_size=2, early_stopping=True
)# 输出避免重复n-gram的束搜索结果
print("Beam search with ngram, Output:\n" + 100 * '-')
print(tokenizer.decode(beam_output[0], skip_special_tokens=True))
print(100 * '-')# 设置返回的序列数量大于1,生成多个候选文本
beam_outputs = model.generate(input_ids, max_length=50, num_beams=5, no_repeat_ngram_size=2, num_return_sequences=5, early_stopping=True
)# 输出所有生成的候选文本
print("return_num_sequences, Output:\n" + 100 * '-')
for i, beam_output in enumerate(beam_outputs):print("{}: {}".format(i, tokenizer.decode(beam_output, skip_special_tokens=True)))
print(100 * '-')

Beam search issues

在这里插入图片描述

在这里插入图片描述

缺点:1. 无法解决重复问题;2. 开放域生成效果差

Repeat problem
在这里插入图片描述

在这里插入图片描述

n-gram 惩罚:

将出现过的候选词的概率设置为 0

设置no_repeat_ngram_size=2 ,任意 2-gram 不会出现两次

Notice: 实际文本生成需要重复出现

Sample

根据当前条件概率分布随机选择输出词𝑤_𝑡
在这里插入图片描述

(“car”) ~P(w∣"The") (“drives”) ~P(w∣"The",“car”)
在这里插入图片描述

优点:文本生成多样性高

缺点:生成文本不连续

# 导入MindSpore库以及GPT2模型相关的分词器和语言模型头
import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载预训练的GPT2分词器
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将EOS标记设为PAD标记,以避免运行中的警告信息
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')# 设置随机种子以确保实验可复现
mindspore.set_seed(0)# 启用随机采样模式,并禁用top_k采样策略(通过将top_k设置为0)
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0
)# 输出随机采样生成的文本
print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

Temperature

降低softmax 的temperature使 P(w∣w1:t−1)分布更陡峭

在这里插入图片描述

增加高概率单词的似然并降低低概率单词的似然

# 导入MindSpore库及GPT2模型相关的分词器与语言模型头
import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 从预训练模型加载GPT2分词器
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将结束标记(EOS)作为填充标记(PAD),避免警告信息
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')# 设置随机种子,保证结果的可复现性
mindspore.set_seed(1234)# 启用随机采样,关闭top_k采样,设置温度参数调整生成文本的多样性
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=0,temperature=0.7
)# 输出采样生成的文本内容
print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

TopK sample

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

在这里插入图片描述

TopK sample problems

在这里插入图片描述

将采样池限制为固定大小 K :

  • 在分布比较尖锐的时候产生胡言乱语
  • 在分布比较平坦的时候限制模型的创造力
# 导入MindSpore库及GPT2模型相关的分词器和语言模型头
import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载预训练的GPT2分词器
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将EOS标记设为PAD标记,以避免运行过程中的警告
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')# 设置随机种子,确保实验的可复现性
mindspore.set_seed(0)# 启用随机采样,并设置top_k采样,限制在前50个词汇中选择下一个词汇
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_k=50
)# 输出采样生成的文本
print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

Top-P sample

在累积概率超过概率 p 的最小单词集中进行采样,重新归一化

在这里插入图片描述

采样池可以根据下一个词的概率分布动态增加和减少

# 导入MindSpore库及GPT2模型相关的分词器和语言模型头
import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载预训练的GPT2分词器
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将EOS标记设为PAD标记,避免警告信息
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')# 设置随机种子以确保结果的可复现性
mindspore.set_seed(0)# 禁用top_k采样,仅从最有可能的92%词汇中进行采样
sample_output = model.generate(input_ids, do_sample=True, max_length=50, top_p=0.92, top_k=0
)# 输出基于top_p采样生成的文本
print("Output:\n" + 100 * '-')
print(tokenizer.decode(sample_output[0], skip_special_tokens=True))

top_k_top_p

# 导入MindSpore库及GPT2模型相关的分词器和语言模型头
import mindspore
from mindnlp.transformers import GPT2Tokenizer, GPT2LMHeadModel# 加载预训练的GPT2分词器
tokenizer = GPT2Tokenizer.from_pretrained("iiBcai/gpt2", mirror='modelscope')# 将EOS标记设为PAD标记,避免警告信息
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')# 设置随机种子以确保结果的可复现性
mindspore.set_seed(0)# 设置top_k为50,top_p为0.95,并要求返回3个不同的序列
sample_outputs = model.generate(input_ids,do_sample=True,max_length=50,top_k=5,top_p=0.95,num_return_sequences=3
)# 输出基于top_k和top_p采样生成的多条文本
print("Output:\n" + 100 * '-')
for i, sample_output in enumerate(sample_outputs):print("{}: {}".format(i, tokenizer.decode(sample_output, skip_special_tokens=True)))

打卡图片:
在这里插入图片描述

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

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

相关文章

企业级网关设计

tips:本文完全来源于卢泽龙!!! 一、Gateway概述 1.1设计目标 1.2gateway基本功能 中文文档参考:https://cloud.tencent.com/developer/article/1403887?from15425 三大核心: 二、引入依赖和yaml配置…

如何在 PostgreSQL 中确保数据的异地备份安全性?

文章目录 一、备份策略1. 全量备份与增量备份相结合2. 定义合理的备份周期3. 选择合适的备份时间 二、加密备份数据1. 使用 PostgreSQL 的内置加密功能2. 使用第三方加密工具 三、安全的传输方式1. SSH 隧道2. SFTP3. VPN 连接 四、异地存储的安全性1. 云存储服务2. 内部存储设…

人话学Python-基础篇-字符串

一:字符串的定义 在Python中使用引号来定义。不论是单引号还是双引号。 str1 Hello World str2 "Hello World" 二:字符串的访问 如果我们要取出字符串中单独的字符,需要使用方括号来表示取得的位置。如果要取出字符串的子串&…

原创作品—数据可视化大屏

设计数据可视化大屏时,用户体验方面需注重以下几点:首先,确保大屏信息层次分明,主要数据突出显示,次要信息适当弱化,帮助用户快速捕捉关键信息。其次,设计应直观易懂,避免复杂难懂的…

前端javascript中的排序算法之冒泡排序

冒泡排序(Bubble Sort)基本思想: 经过多次迭代,通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素从前面移到后面。 大数据往上冒泡,小数据往下沉,也就是…

大语言模型垂直化训练技术与应用

在人工智能领域,大语言模型(Large Language Models, LLMs)已经成为推动技术进步的关键力量,垂直化训练技术逐渐成为研究的热点,它使得大模型能够更精准地服务于特定行业和应用场景。本文结合达观数据的分享&#xff0c…

tomcat 项目迁移,无法将项目作为服务service启动

背景 测试服务器需要迁移到正式服务器上,为了方便省事,将测试服务器上的一些文件直接复制到正式服务器 问题 使用startup启动项目之后,可以直接使用使用tomcat9w启动,或者作为服务service启动的时候,显示无法访问到资源…

AGE Cypher 查询格式

使用 ag_catalog 中的名为 cypher 的函数构建 Cypher 查询,该函数返回 Postgres 的记录集合。 Cypher() Cypher() 函数执行作为参数传递的 Cypher 查询。 语法:cypher(graph_name, query_string, parameters) 返回: A SETOF records 参…

自动驾驶事故频发,安全痛点在哪里?

大数据产业创新服务媒体 ——聚焦数据 改变商业 近日,武汉城市留言板上出现了多条关于萝卜快跑的投诉,多名市民反映萝卜快跑出现无故停在马路中间、高架上占最左道低速行驶、转弯卡着不动等情况,导致早晚高峰时段出现拥堵。萝卜快跑是百度 A…

YOLOv5、v7、v8如何修改检测框文字颜色和大小

YOLOv5和YOLOv8默认的标签文字颜色为白色,但是在亮度较大的图片中文字不明显,就需要对标签文字的颜色进行修改 一、YOLOv5 打开X:\Anaconda\envs\your-env\Lib\site-packages\ultralytics\utils\plotting.py X代表你的anaconda安装的盘,yo…

随笔(一)

1.即时通信软件原理(发展) 即时通信软件实现原理_即时通讯原理-CSDN博客 笔记: 2.泛洪算法: 算法介绍 | 泛洪算法(Flood fill Algorithm)-CSDN博客 漫水填充算法实现最常见有四邻域像素填充法&#xf…

最全windows提权总结(建议收藏)

当以低权用户进去一个陌生的windows机器后,无论是提权还是后续做什么,第一步肯定要尽可能的搜集信息。知己知彼,才百战不殆。 常规信息搜集 systeminfo 查询系统信息hostname 主机名net user 查看用户信息netstat -ano|find "3389&quo…

论文 | Chain-of-Thought Prompting Elicits Reasoningin Large Language Models 思维链

这篇论文研究了如何通过生成一系列中间推理步骤(即思维链)来显著提高大型语言模型进行复杂推理的能力。论文展示了一种简单的方法,称为思维链提示,通过在提示中提供几个思维链示例来自然地激发这种推理能力。 主要发现&#xff1…

SDIO CMD 数据部分 CRC 计算规则

使用的在线 crc 计算工具网址:http://www.ip33.com/crc.html CMD CRC7 计算 如下图为使用逻辑分析仪获取的SDIO读写SD卡时,CMD16指令发送的格式,通过逻辑分析仪总线分析,可以看到,该部分的CRC7校验值得0x05,大多数情况…

MySQL之基本查询(上)-表的增删查改

目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…

昇腾APN最佳伙伴—英码科技AI算力计算产品亮相WAIC 2024

2024年7月4日-7日, “以共商促共享,以善治促善智”为主题的2024世界人工智能大会暨人工智能全球治理高级别会议(WAIC)在上海世博展览中心隆重举行。国务院总理李强出席开幕式并致辞。来自50多个国家和地区的1300位全球领军人物、展…

分享:Motionity-开源的Web端动画编辑器

Motionity是一个免费且开源的Web端动画编辑器,它结合了After Effects和Canva的优点,为用户提供了强大的动画编辑功能。支持视频剪切、图像搜索过滤、文本动画库、图层蒙版等功能。 一、项目背景与特点 开源项目:Motionity是一个开源项目&…

utf8mb4和utf8的不同、若依框架,代码生成器,gitee,前端vue的下载、修复和启动(寻求大佬帮助若依框架三、2.3)

2024.7.9 一、数据库的排序和统一问题。utf8mb4和utf8的不同1.1 发现问题1.2 解决问题-在idea中用sql生成器,生成sql语句,然后在里面修改1.3 utf8和utf8mb4的区别 二、若依前后端框架。代码生成器(还没研究懂,但有三个方案&#x…

重塑智慧生活想象 Yeelight易来举行2024年战略及新品发布会圆满成功

7月9日,智能照明品牌Yeelight易来在广州举行“光为境和无界”——2024年Yeelight易来战略&新品发布会,此次发布会不仅展示了易来在新的一年中取得的显著业绩增长,还发布了多款引领行业潮流的智能新品。同时,发布会还邀请了权威…

如何学好C++?

首先,对于零基础的想学习C的同学,我想要你们先明白一件事:C是一门极为复杂且难以掌握的编程语言。因此推荐在学习C之前可以先去学习C语言,在拥有了一定的知识储备和编程能力后再学习C会更加的高效和相对轻松。 下面推荐从三个方面…