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.mfbz.cn/a/788115.html

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

相关文章

【QML之·基础语法概述】

系列文章目录 文章目录 前言一、QML基础语法二、属性三、脚本四、核心元素类型4.1 元素可以分为视觉元素和非视觉元素。4.2 Item4.2.1 几何属性(Geometry):4.2.2 布局处理:4.2.3 键处理:4.2.4 变换4.2.5 视觉4.2.6 状态定义 4.3 Rectangle4.3.1 颜色 4.4…

系统化学习 H264视频编码(01)基础概念

说明:我们参考黄金圈学习法(什么是黄金圈法则?->模型 黄金圈法则,本文使用:why-what)来学习音H264视频编码。本系列文章侧重于理解视频编码的知识体系和实践方法,理论方面会更多地讲清楚 音视频中概念的…

基于java+springboot+vue实现的校园二手书交易平台(文末源码+Lw)287

摘 要 信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自…

【hive】数据采样

参考https://hadoopsters.com/how-random-sampling-in-hive-works-and-how-to-use-it-7cdb975aa8e2,可以直接查看原文,下面只是对原文进行概括和实际性能测试。 1.distribute by sort by2.测试3.map端数据过滤优化采样 在说数据采样之前,需要…

03_Shell变量

【Shell】03_Shell变量 一、环境变量 Linux系统配置文件(全局配置文件和用户个人配置文件)中定义的变量,提供给所有Shell程序使用 1.1、全局环境变量 1.1.1、配置文件位置 /etc/environment /etc/bashrc(或者/etc/bash.bashrc…

PTA - sdut-使用函数求a+aa+aaa++⋯+aa.....aaa(n个a)之和

题目描述: 给定两个均不超过9的正整数a和n,要求:编写函数fn(a,n), 求aaaaaa⋯aa⋯aa(n个a)之和,fn须返回的是数列之和。 函数接口定义: def fn(a,n):其中, a 和 n 都是传入的参数…

IEC62056标准体系简介-2.IEC62056标准体系及对象标识系统(OBIS)

1. IEC 62056标准体系 IEC 62056标准体系目前共包括六部分,见图1: 第61部分:对象标识系统第62部分:接口类第53部分:COSEM应用层第46部分:使用HDLC(High Level Data Link Control)协…

39 线程库

目录 thread类的简单介绍线程函数参数锁线程交替打印原子性操作库无锁CAS智能指针的线程安全单例模式的线程安全 1. thread类的简单介绍 在c11之前,涉及到多线程问题,都是和平台相关的,如windows和linux下各有自己的接口,这使得…

【STM32/HAL】嵌入式课程设计:简单的温室环境监测系统|DS18B20 、DHT11

前言 板子上的外设有限,加上想法也很局限,就用几个传感器实现了非常简单的监测,显示和效应也没用太复杂的效果。虽说很简单,但传感器驱动还是琢磨了不久,加上串口线坏了,调试了半天才发现不是代码错了而是…

多标签问题

一、多标签问题与单标签问题的区别: 多标签问题是单标签问题的推广。 举个例子,同时识别图片中的小汽车,公交车,行人时,标签值有三个:小汽车,公交车,行人。 单标签问题仅对一个标签…

网络安全——防御实验

防御实验一 拓扑结构展示: 一、 根据题目,先为办公区做安全策略主要策略有以下几点: 1、书写名称和描述,名称和描述要明确,让除本人以外的人也能理解 2、确定源地址为办公区,目标地址为DMZ区 3、确定时间…

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

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

2024前端面试真题【JS篇】

DOM DOM:文本对象模型,是HTML和XML文档的编程接口。提供了对文档的结构化的表述,并定义可一种方式可以使从程序中对该结构进行访问,从而改变文档的结构、样式和内容。 DOM操作 创建节点:document.createElement()、do…

ER模型理论和三范式

ER模型理论和三范式 各种关系多对一一对一一对多多对多 三范式理论函数依赖完全函数依赖部分函数依赖传递(间接)函数依赖 第一范式:属性(表字段)不可切割第二范式:不能存在 部分函数依赖(都存在完全函数依赖…

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

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

充电宝哪个牌子公认质量好?哪家充电宝好用?4款口碑好充电宝

在如今这个电子设备不离手的时代,充电宝成为了我们生活中的必备品。然而,面对市场上琳琅满目的充电宝品牌和型号,选择一款质量可靠、性能出色的充电宝并非易事。大家都在问:充电宝哪个牌子公认质量好?哪家充电宝好用&a…

【鸿蒙学习笔记】UIAbility组件概述

官方文档:UIAbility组件 目录标题 UIAbility组件概述 [Q&A] 什么是UIAbility?声明周期UIAbility组件-启动模式UIAbility组件-与UI的数据同步 UIAbility组件概述 [Q&A] 什么是UIAbility? UIAbility组件是一种包含UI界面的应用组件&a…

红酒知识百科:从入门到精通

红酒,这个深邃而迷人的世界,充满了无尽的知识与奥秘。从葡萄的选择、酿造工艺,到品鉴技巧,每一步都蕴藏着深厚的文化底蕴和精细的技艺。今天,就让我们一起踏上这场红酒知识之旅,从入门开始,逐步…

量产工具一一UI系统(四)

目录 前言 一、按钮数据结构抽象 1.ui.h 二、按键处理 1.button.c 2.disp_manager.c 3.disp_manager.h 三、单元测试 1.ui_test.c 2.上机测试 前言 前面我们实现了显示系统框架,输入系统框架和文字系统框架,链接: 量产工具一一显…

docker笔记1

docker笔记1 一、为什么要学docker?二、docker是什么三、docker安装 一、为什么要学docker? 在过去,开发人员编写的代码在不同的环境中运行时常常面临一些问题,例如“在我的机器上可以运行,但在你的机器上却不行”的情况。这种问题部分原因…