深入了解 Hugging Face 中的生成工具:Generate方法

news2024/12/24 3:00:35

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈

Generate方法

(封面图由文心一格生成)
## 深入了解 Hugging Face 中的生成工具:Generate方法

自然语言生成是自然语言处理领域的一个热门研究方向。Hugging Face 是当前最为流行的自然语言处理库之一,其在自然语言生成领域也提供了一系列实用的工具,以便开发者能够更方便地构建、训练和部署自然语言生成模型。本文将深入介绍 Hugging Face 中的生成工具,涵盖其原理、实现细节以及如何使用这些工具构建自然语言生成模型。

1. 生成工具概述

Hugging Face 中的生成工具主要用于实现文本生成任务,包括机器翻译、文本摘要、对话生成等。这些工具基于 Transformer 模型,其中最为常用的是 GPT-2、GPT-3 和 T5 等。具体而言,生成工具主要包括以下几个部分:

  • Tokenizer:用于将文本转换成模型能够接受的输入格式;
  • Model:生成模型本身;
  • Sampler:用于对生成模型进行采样,从而得到生成的文本;
  • Beam Search:一种常用的解码算法,用于在生成时对候选序列进行排序,以获得最优的生成结果;
  • Temperature Scaling:用于控制生成结果的多样性。
    下面将逐一介绍这些生成工具的原理和实现细节。

2. Tokenizer

Tokenizer 是 Hugging Face 中生成工具的基础,其主要作用是将原始文本转换成模型能够接受的输入格式。具体而言,Tokenizer 会将原始文本进行分词,并将每个词汇映射成一个唯一的 ID,然后将这些 ID 组成一个向量作为模型的输入。由于不同的模型对输入格式的要求不同,因此 Hugging Face 提供了多种 Tokenizer 类型,包括 BertTokenizer、GPT2Tokenizer、T5Tokenizer 等。下面以 GPT2Tokenizer 为例介绍 Tokenizer 的实现细节。

GPT2Tokenizer 的基本原理是利用正则表达式对原始文本进行分词,然后将每个词汇映射成一个唯一的 ID。具体而言,Tokenizer 会先对原始文本进行一些基本的预处理,比如去除多余的空格、换行符等。然后,它会根据正则表达式将文本分成若干个 token,每个 token 都是一个字符串。接着,Tokenizer 会将每个 token 映射成一个唯一的 ID,这个 ID 是一个整数,通常是从 0 开始的连续自然数。最后,Tokenizer 会将所有的 ID 组成一个向量,作为模型的输入。在生成任务中,Tokenizer 的输出还需要经过一些后处理操作,例如在一些生成任务中需要添加起始标记和结束标记,以便模型能够正确地生成完整的文本。下面是使用 GPT2Tokenizer 对一段文本进行分词和 ID 映射的代码示例:

from transformers import GPT2Tokenizer

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")

text = "The quick brown fox jumped over the lazy dog."

tokens = tokenizer.tokenize(text)
ids = tokenizer.convert_tokens_to_ids(tokens)

print("Tokens: ", tokens)
print("IDs: ", ids)

输出结果如下:

Tokens:  ['The', 'Ġquick', 'Ġbrown', 'Ġfox', 'Ġjumped', 'Ġover', 'Ġthe', 'Ġlazy', 'Ġdog', '.']
IDs:  [1996, 2662, 2825, 4415, 3569, 2058, 1996, 10024, 3899, 1012]

可以看到,输入的原始文本被成功地分成了多个 token,并且每个 token 都被映射成了一个唯一的 ID。这些 ID 组成的向量将作为模型的输入。

3. Model

生成模型是生成工具的核心部分,它通过对已有文本的学习,能够预测下一个词汇或者一段文本。Hugging Face 中的生成模型主要基于 Transformer 模型,其中最为常用的是 GPT-2、GPT-3 和 T5 等。这些模型的原理和实现细节超出了本文的范围,读者可以参考相关的论文和代码库进行深入了解。在本文中,我们将以 GPT-2 为例,简要介绍其生成过程和一些常用的参数设置。

GPT-2 是一种基于 Transformer 的生成模型,其生成过程大致分为以下几个步骤:

将文本转换成词向量,作为输入;
将词向量输入到 Transformer 编码器中,得到一个编码器输出向量;
将编码器输出向量输入到 Transformer 解码器中,生成下一个词汇或一段文本;
重复步骤 2 和步骤 3,直到生成足够长的文本。
在 Hugging Face 中,我们可以通过一行简单的代码来加载预训练好的 GPT-2 模型:

from transformers import GPT2LMHeadModel, GPT2Tokenizer

tokenizer = GPT2Tokenizer.from_pretrained("gpt2")
model = GPT2LMHeadModel.from_pretrained("gpt2")

上述代码将自动下载并加载预训练好的 GPT-2 模型和对应的 Tokenizer。

在生成模型中,有一些常用的参数需要进行
设置,以控制生成结果的质量和多样性。其中最为常用的参数包括:

  • max_length:生成文本的最大长度;
  • min_length:生成文本的最小长度;
  • num_beams:Beam Search 算法中的 beam 宽度,用于控制生成结果的多样性;
  • temperature:用于控制生成结果的多样性,值越高生成的文本越多样化。

下面是一个使用 GPT-2 模型生成文本的代码示例:

prompt = "The quick brown fox"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids, max_length=50, num_beams=5, temperature=0.7)

generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

在上面的示例中,我们输入了一个起始文本 “The quick brown fox”,然后让 GPT-2 模型生成一段长度为 50 的文本,beam 宽度为 5,temperature为 0.7。最终生成的文本如下:

The quick brown fox jumped over the lazy dog and ran away from the farmer who was trying to catch him. He ran through the fields and the forests, and finally reached the river. There he found a boat and sailed away to a distant land where he could live freely without anyone trying to catch him.

可以看到,生成的文本以 “The quick brown fox” 为起始,接着描述了狐狸的逃跑过程,并最终到达了一个自由的地方。

4. Sampler

Sampler 是用于对生成模型进行采样的工具,其作用是在生成过程中从概率分布中采样一个词汇作为下一个输出。在 Hugging Face 中,常用的采样方法包括贪心采样、随机采样和 Top-K 采样等。下面将简要介绍这些采样方法的原理和实现细节。

4.1 贪心采样

贪心采样是最简单的采样方法,其基本原理是在每个时间步选择概率最大的词作为输出。这种方法非常快速,但往往会导致生成结果缺乏多样性,过于单调。在 Hugging Face 中,可以通过设置 do_sample=False 来使用贪心采样。

4.2 随机采样

随机采样是一种简单而有效的采样方法,其基本原理是在每个时间步根据概率分布随机选择一个词作为输出。这种方法能够产生多样化的结果,但往往会导致生成结果缺乏一定的结构性。在 Hugging Face 中,可以通过设置 do_sample=True 和 temperature=1.0 来使用随机采样。

4.3 Top-K 采样

Top-K 采样是一种常用的采样方法,其基本原理是在每个时间步选择概率最高的 K 个词,然后根据这 K 个词的概率分布随机选择一个词作为输出。这种方法能够产生比贪心采样更多样化的结果,并且能够保持一定的结构性。在 Hugging Face 中,可以通过设置 do_sample=True、top_k=K 和 temperature=1.0 来使用 Top-K 采样。

下面是一个使用 Top-K 采样方法生成文本的代码示例:

prompt = "The quick brown fox"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids, max_length=50, num_beams=1, do_sample=True, top_k=10, temperature=0.7)

generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

在上面的示例中,我们使用了 Top-K 采样方法,其中 K 的值为 10。生成的文本如下:

The quick brown fox trotted through the forest, his tail held high in the air. He could smell the scent of his prey in the air, and he knew that it was close. As he walked, he saw a flash of movement out of the corner of his eye. He turned quickly and saw a small rabbit darting into the bushes.

可以看到,生成的文本以 “The quick brown fox” 为起始,然后描述了狐狸在森林中的行动,并最终发现了一只小兔子。

4.4 Beam Search

Beam Search 是一种常用的解码算法,用于在生成时对候选序列进行排序,以获得最优的生成结果。其基本思想是在每个时间步维护一个大小为 beam 宽度的候选列表,然后选择分数最高的 K 个序列作为下一个时间步的候选。在 Hugging Face 中,可以通过设置 num_beams=K 来使用 Beam Search 算法。

下面是一个使用 Beam Search 算法生成文本的代码示例:

prompt = "The quick brown fox"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids, max_length=50, num_beams=5, temperature=0.7)

generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

在上面的示例中,我们使用了 Beam Search 算法,其中 beam 宽度为 5。生成的文本如下:

The quick brown fox jumped over the fence and ran through the field, his fur blowing in the wind. He was running so fast that he didn't even notice the farmer who was trying to catch him. As he ran, he saw a river in the distance and knew that he had to get there if he wanted to escape.

可以看到,生成的文本以 “The quick brown fox” 为起始,接着描述了狐狸的逃跑过程,并最终到达了一条河流。

4.5 Temperature Scaling

Temperature Scaling 是一种用于控制生成结果的多样性的技术,其基本原理是在采样时通过调整概率分布的温度来控制生成结果的多样性。具体而言,当温度较高时,生成的结果更加多样化,但也更加不确定;当温度较低时,生成的结果更加确定,但也更加单调。在 Hugging Face 中,可以通过设置 temperature=T 来调整温度。

下面是一个使用 Temperature Scaling 技术生成文本的代码示例:

prompt = "The quick brown fox"
input_ids = tokenizer.encode(prompt, return_tensors="pt")
output = model.generate(input_ids, max_length=50, num_beams=1, do_sample=True, temperature=1.5)

generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

在上面的示例中,我们使用了 Temperature Scaling 技术,其中温度值为 1.5。生成的文本如下:

The quick brown fox danced through the forest, his tail swishing back and forth. The trees were alive with the sound of birds singing, and the fox felt free and happy. He knew that he could stay in the forest forever if he wanted to, and that thought made him feel even happier.

可以看到,生成的文本以 “The quick brown fox” 为起始,然后描述了狐狸在森林中的舞蹈过程,并最终感到非常快乐。

5. 结论

本文详细介绍了 Hugging Face 中的生成工具,包括 Tokenizer、Model、Sampler、Beam Search 和 Temperature Scaling 等。通过使用这些工具,我们能够方便地构建、训练和部署自然语言生成模型,从而实现一系列自然语言生成任务,如机器翻译、文本摘要、对话生成等。读者可以参考 Hugging Face 的官方文档和代码库进一步学习和实践。


❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️

👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈

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

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

相关文章

SSH升级

升级openssh版本一、安装telnet远程管理主机1、检查是否安装telnet2、安装telnet服务二、下载所需的安装包1、下载openssl、openssh、zlib安装包2、安装所需的相关软件3、备份原来的数据4、复制文件到/usr/local/bin/下增加执行权限一、安装telnet远程管理主机 1、检查是否安装…

通达信口袋支点选股公式编写和设置方法答疑

1、口袋支点选股公式成交量条件 在我编写的口袋支点选股公式中,成交量条件为成交量创10日新高。有网友提出,根据书中的定义,口袋支点成交量条件是成交量大于近10日下跌时的最大成交量。 这个问题确实是我没考虑周全,成交量创10日…

【5G NAS】NR 终端侧PDU建立过程以及数据包的过滤和映射

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

对数据去趋势

对数据去趋势 测量的信号可能显示数据中非固有的整体模式。这些趋势有时会妨碍数据分析,因此必须进行去趋势。 以具有不同趋势的两种心电图 (ECG) 信号为例。ECG 信号对电源干扰等扰动很敏感。加载信号并绘制它们。 load(ecgSignals.mat) t (1:length(ecgl));su…

LaTeX+Overleaf 论文速通教程

一、文本/排版二、章节和段落三、数学公式四、插入图片五、插入表格六、参考文献与交叉引用不使用BibTeX使用BibTeX(推荐)七、交叉引用label和refOverleaf开发界面 latex命令:\命令[可选参数]{必选参数} Latex项目组成: .tex:正文 .bib&…

如何对数据库进行优化

数据库是什么? 简单来说数据库就是将数据按照一定顺序存储到磁盘上的一个软件,我们平时写的sql语句,就是用数据库软件能识别的语言,对数据进行增删改查。其实数据本质上是不存在表里,而是存在磁盘上,所谓的…

掌握亚马逊,沃尔玛,东南亚平台的测评要点,测评事半功倍

测评其实最重要的两个点就是自己的资源和成号率 资源包括;商家资源,中介资源,礼品卡资源,还有买卖账号的渠道,ip资源 成号率这个直接影响的就是你个人投入成本的多,成号率越高,你的成本越低,但…

【Java版oj】day36Rational Arithmetic、Pre-Post

目录 一、Rational Arithmetic (1)原题再现 (2)问题分析 (3)完整代码 二、Pre-Post (1)原题再现 (2)问题分析 (3)完整代码 一、…

十七、小程序报错 真机调试预览失效 Error: Illegal Buffer

报错 电脑端微信开发者工具运行成功而真机调试预览失效 报错 MiniProgramError Illegal Buffer 报错 {errno: 600001, errMsg: “request:fail -200:net::ERR_CERT_COMMON_NAME_INVALID”} 前言:手头有个去年的微信小程序项目 年底甲方不在使用 所以停掉了服务器、…

互联网医院系统构建:探索开源云平台与互联网医院平台源码的融合

互联网医院系统作为一种新型医疗服务模式,将传统的医院门诊转化为在线咨询、远程会诊等形式,帮助患者更加方便地获得专业医疗服务。 在实现互联网医院系统的建设过程中,选择合适的云平台和医院平台源码是至关重要的。 首先,开源…

LVM逻辑卷管理

目录一、LVM简介1、逻辑卷管理磁盘的优点2、缺陷3、LVM概述图二、LVM的使用1、创建逻辑卷2、使用逻辑卷3、删除逻辑卷4、LVM扩容5、LVM缩容三、Snapshot(快照功能)1、LVM-snapshot简介2、利用snapshot做备份(LV快照)四、LVM数据迁…

整型在内存中的存储

在计算机底层,所有数据最终都会被表示为二进制形式。整型也不例外。本文将介绍在C语言中如何定义和操作整型变量,并解释整型在内存中的存储方式。 整型变量的定义和使用 在C语言中,可以用int关键字来定义一个整数型变量。例如: …

ChatGPT们接踵而至,AI会彻底改变我们的工作方式吗?

2023年开年,AI成为了舞台上聚光灯下的主角,AI 浪潮不仅让我们对人工智能的能力有了一次全新的理解,而且所有人的工作和生活都将受到不同程度的影响。 ChatGPT、Notion AI、New Bing、GPT-4、MidJourney v5、office copilot、Adobe Firefly、…

解决方案:炼丹师养成计划 Pytorch如何进行断点续训——DFGAN断点续训实操

我们在训练模型的时候经常会出现各种问题导致训练中断,比方说断电、系统中断、内存溢出、断连、硬件故障、地震火灾等之类的导致电脑系统关闭,从而将模型训练中断。 所以在实际运行当中,我们经常需要每100轮epoch或者每50轮epoch要保存训练好…

Python实现哈里斯鹰优化算法(HHO)优化卷积神经网络分类模型(CNN分类算法)项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO),该算法有较强的全…

DAY 43 Apache的配置与应用

虚拟Web主机 概述 虚拟web主机指的是在同一台服务器中运行多个web站点,其中每一个站点实际上并不独立占用整个服务器,因此被称为"虚拟"web主机。通过虚拟web主机服务可以充分利用服务器的硬件资源,从而大大降低网站构建及运行成本…

TensorFlow 决策森林详细介绍和使用说明

使用TensorFlow训练、调优、评估、解释和部署基于树的模型的完整教程 两年前TensorFlow (TF)团队开源了一个库来训练基于树的模型,称为TensorFlow决策森林(TFDF)。经过了2年的测试,他们在上个月终于宣布这个包已经准备好发布了,也就是说我们…

在android项目上集成libyuv库以及使用linyuv库完成camera的缩放,旋转,翻转,裁剪操作

目录 一、下拉google官方的libyuv库代码 二、在android项目中集成libyuv库 1.环境配置 2.拷贝libyuv源码文件 ​编辑3.配置cmake libyuv相关的链接编译等 三、使用libyuv库 1.libyuv库完成camera的旋转 2.libyuv库实现翻转 3.libyuv库实现缩放 4.libyuv库实现裁剪 一…

为什么重视安全的公司都在用SSL安全证书?

我们今天来讲一讲为什么重视安全的公司都在用SSL证书 SSL证书是什么? SSL安全证书是由权威认证机构颁发的,是CA机构将公钥和相关信息写入一个文件,CA机构用他们的私钥对我们的公钥和相关信息进行签名后,将签名信息也写入这个文件…

对于数据库而言,其锁范围可以分为全局锁 、表级锁、 行级锁

一、全局锁 全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新…