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

news2024/10/2 16:24:20

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.coloradmin.cn/o/1912560.html

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

相关文章

使用OpenCV的absdiff函数报错

1.absdiff用法 absdiff函数用于计算两个输入图像之间每个像素的差异,并返回结果图像。 void cv::absdiff ( InputArray src1,InputArray src2,OutputArray dst ) //eg:比较两图像的差异 /*cv::Mat diff;cv::absdiff(depLeft32, imDepth, diff…

Spring MVC深入理解之源码实现

1、SpringMVC的理解 1)谈谈对Spring MVC的了解 MVC 是模型(Model)、视图(View)、控制器(Controller)的简写,其核心思想是通过将业务逻辑、数据、显示分离来组织代码。 Model:数据模型,JavaBean的类,用来进行数据封装…

CLion学习笔记-cmake编译和多main函数编译

这里就不讲怎么配置clion了 项目名字 pcl_kdtree_search 1.新建一个工程名字自己取,我这里用自己学习pcl的,加一个main函数,这个时候Cmake里边就是这样的。 #声明要求的cmake最低版本 cmake_minimum_required(VERSION 3.19) #声明一个工程…

【每日一练】python基础入门实例

""" 幼儿园加法练习题 题数不限 每满100分奖励10个棒棒糖 要求: 1.使用三目运算符与基础运算的对比 2.随机数字相加 3.调用函数 4.循环执行练习题 5.有计算分数 6.有时间停止休眠 """ #导入随机模块 import random #导入时间模块 imp…

华为乾崑智驾加持:深蓝S07首次亮相

最近,特斯拉FSD即将入华的消息,让智能驾驶成为了汽车行业热议的焦点,而当新能源汽车的代表企业深蓝汽车,与全球领先的华为乾崑智驾强强联手,一场颠覆性的智能出行变革也已蓄势待发。 7月8日,深蓝汽车携其最…

uniapp自动升级

一、创建云服务空间(https://unicloud.dcloud.net.cn) 云空间用于关联需要版本控制升级的项目,如果已拥有云空间则省略此步骤。 二、搭建 uni升级中心 - 后台管理系统(升级中心 uni-upgrade-center - Admin) uni-adm…

DDR3 SO-DIMM 内存条硬件总结(一)

最近在使用fpga读写DDR3,板子上的DDR3有两种形式与fpga相连,一种是直接用ddr3内存颗粒,另一种是通过内存条的形式与fpga相连。这里我们正好记录下和ddr3相关的知识,先从DDR3 SO-DIMM 内存条开始。 1.先看内存条的版本 从JEDEC下载…

Elasticsearch:深度学习与机器学习:了解差异

作者:来自 Elastic Elastic Platform Team 近年来,两项突破性技术一直站在创新的最前沿 —— 机器学习 (machine learning - ML) 和深度学习 (deep learning - DL)。人工智能 (AI) 的这些子集远不止是流行语。它们是推动医疗保健、金融等各行业进步的关键…

vue3 antdv Modal通过设置内容里的容器的最小高度,让Modal能够适当的变高一些

1、当收款信息Collapse也折叠的时候,我们会发现Modal的高度也变成了很小。 2、我们希望高度稍微要高一些,这样感觉上面显示的Modal高度太小了,显示下面的效果。 3、初始的时候,想通过class或者style或者wrapClassName来实现&#…

理解局域网技术:从基础到进阶

局域网(LAN)是在20世纪70年代末发展起来的,起初主要用于连接单位内部的计算机,使它们能够方便地共享各种硬件、软件和数据资源。局域网的主要特点是网络为一个单位所拥有,地理范围和站点数目均有限。 局域网技术在计算…

【排序算法】快速排序(详解+各版本实现)

目录 一.交换排序 1.基本思想 2.冒泡排序 二.快速排序 1.hoare版本 2.挖坑法 3.前后指针版本 4.优化 优化①:三数取中 优化②:小区间优化 5.非递归版本 6.特性总结 ①效率 ②时间复杂度:O(N*logN) ③空间复杂度:O(l…

拓展神经网络八股(入门级)

自制数据集 minst等数据集是别人打包好的,如果是本领域的数据集。自制数据集。 替换 把图片路径和标签文件输入到函数里,并返回输入特征和标签 只需要把图片灰度值数据拼接到特征列表,标签添加到标签列表,提取操作函数如下: def…

STM32快速搭建项目框架

注:编写本博客的原因,学习期间基于复习之前知识点的需要,故撰写本教程,即是复习前面的知识点也是作为博客的补充 1.0 文件夹的创建 创建一个STM32项目为模版工程,问价夹下分别包含4个子文件夹,一个是Librar…

【初阶数据结构】1.算法复杂度

文章目录 1.数据结构前言1.1 数据结构1.2 算法1.3 如何学好数据结构和算法 2.算法效率2.1 复杂度的概念2.2 复杂度的重要性 3.时间复杂度3.1 大O的渐进表示法3.2 时间复杂度计算示例3.2.1 示例13.2.2 示例23.2.3 示例33.2.4 示例43.2.5 示例53.2.6 示例63.2.7 示例7 4.空间复杂…

阻尼振动的可视化 包括源码和推导

阻尼振动的可视化 包括源码和推导 flyfish 牛顿第二定律(加速度定律) 胡克定律(Hooke‘s Law) 阻尼振动是指在振动系统中,由于阻力或能量损耗导致振动幅度随时间减小的现象。 左边为无阻尼,右边为有阻尼…

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第57-agent机器人助理自动获取喵星人资讯

【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第57-agent机器人助理自动获取喵星人资讯 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript…

FastReport 指定sql 和修改 数据库连接地址的 工具类 :FastReportHelper

FastReport 指定sql 和修改 数据库连接地址的 工具类 :FastReportHelper 介绍核心代码:完整代码: 介绍 在FastReport中,经常会遇到需要给 sql 加条件的情况,或者给数据库地址做更换。 (废话不多说&#x…

Elasticsearch基础(四):Elasticsearch语法与案例介绍

文章目录 Elasticsearch语法与案例介绍 一、Restful API 二、查询语法 1、ES分词器 2、ES查询 2.1、match 2.2、match_phrase 2.3、multi_match 2.4、term 2.5、terms 2.6、fuzzy 2.7、range 2.8、bool Elasticsearch语法与案例介绍 一、Restful API Elastics…

Echarts实现github提交记录图

最近改个人博客&#xff0c;看了github的提交记录&#xff0c;是真觉得好看。可以移植到自己的博客上做文章统计 效果如下 代码如下 <!DOCTYPE html> <html lang"en" style"height: 100%"><head><meta charset"utf-8"> …

需求分析|泳道图 ProcessOn教学

文章目录 1.为什么使用泳道图2.具体例子一、如何绘制确定好泳道中枢的角色在中央基于事实来绘制过程不要纠结美观先画主干处理流程再画分支处理流程一个图表达不完&#xff0c;切分子流程过程数不超25 &#xff0c;A4纸的幅面处理过程过程用动词短语最后美化并加上序号酌情加上…