轻松玩转开源大语言模型bloom(二)
创始人
2025-05-28 14:11:24

前言

书接上文,我们已经可以通过简单的示例来使用bloom的文字生成功能,那文字生成的策略具体有哪些呢?我们该如何控制bloom来生成我们想要的效果呢?本文将从解码策略开始,介绍两种最基础的策略:greedy search(贪婪搜索)和beam search(粒子束搜索)。

贪婪搜索

贪婪搜索的策略很简单,由于词是一个接一个生成的,在每次生成词的后面都选择计算出的概率最高的那一个词连在一起就可以了,在这里我引用一下别人的图:
在这里插入图片描述
输入是The,第一个选择概率最高为0.5的nice,第二次选择该分支下概率最高为0.4的woman,总分支概率为0.5x0.4=0.2。

使用hugging face的model.generate示例如下:

from transformers import AutoModelForCausalLM, AutoTokenizer
import time
a1 = time.time()
checkpoint = "bigscience/bloom-1b1"tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint)inputs = tokenizer.encode("我和我的猫都很想你", return_tensors="pt") #prompt
outputs = model.generate(inputs,min_length=150,max_length=200)
print(tokenizer.decode(outputs[0])) #使用tokenizer对生成结果进行解码
a2 = time.time()
print(f'time cost is {a2 - a1} s')

注意看本例中只使用了min_length和max_length这两个参数,默认不设置其他影响策略的参数情况下会使用贪婪搜索。

生成效果如下所示:

在这里插入图片描述
可以发现一开始还正常,后面就变成了无意义的重复,这是使用这种策略最明显的缺点。

粒子束搜索

粒子束,顾名思义,即一整个句子的联合概率,在这里我们先假设num_beams=2,即有两条粒子束的情况:
在这里插入图片描述
可以看到概率最高的实线是0.4*0.9=0.36,比我们原来使用贪婪搜索得到的0.2的那条虚线概率要大,粒子束搜索的好处就在这里,可以考虑到后面概率高的词,比如这里0.9概率的has。当然,粒子束搜索从本质上说只是限定部分的广度优先搜索罢了,它是启发式的,没法得到全局最优解,所以该有的毛病它一样有。

使用hugging face的model.generate示例如下:

outputs = model.generate(inputs,min_length=150,max_length=200,
num_beams=5,early_stopping=True)

和贪婪搜索在使用上的区别仅仅是设定了num_beams的数量和早停机制。当早停设为True时,一旦num_beams找到了足够的候选粒子束,就会停止搜索,如果为False,那么会增加一个启发式的搜索,当不太可能找到候选时会停止搜索,如果设置为never,只有确定不会再有更好的候选时会停止搜索。

生成效果如下所示:
在这里插入图片描述

效果很差,不仅包含重复,时间还比刚刚慢上30S,增大num_beams可能使效果变好,但时间的增加也是成倍增加,比如当num_beams=10时的效果:

在这里插入图片描述

限制粒子束搜索

在这里我只介绍两个技巧,设定条件限制重复词汇和强制生成我们想要的词汇,更多的技巧请自行参阅huggingface的文档。

限制重复词汇:

outputs = model.generate(inputs,min_length=150,max_length=200,num_beams=5,
no_repeat_ngram_size=2,early_stopping=True)

即设置no_repeat_ngram_size参数,表示最多重复的词汇数。

生成效果如下:

我和我的猫都很想你,想你的时候,我就会想起你。 
猫咪,我爱你。 我爱你,我的小猫。 
你是我生命中不可缺少的一部分,你是我生命中的阳光,你的出现,让我的生活多了一抹亮丽的色彩,使我的生命更加丰富多彩。 
你的到来,给了我无尽的快乐和幸福,让我感到无比的幸福和快乐。 
在你的陪伴下,我不再孤单,不再寂寞,我在你的怀抱中,感受到了家的温暖,感受到家的亲切,感到家的温馨。 
我的生命因你而更加精彩,因为有了你的存在,使我的人生更加充实,更加有意义。 
因为有你在我身边,我才感到生活的意义,才感到生命的价值。因为有你的相伴,我对生活充满了信心,对未来充满了希望。
time cost is 97.57852363586426 s

强制生成想要的词汇:

from transformers import AutoModelForCausalLM, AutoTokenizer
import time
a1 = time.time()
checkpoint = "bigscience/bloom-1b1"
force_words = ["回家"] #强制词汇tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint)
force_words_ids = tokenizer(force_words, add_special_tokens=False).input_ids #装载
inputs = tokenizer.encode("我和我的猫都很想你", return_tensors="pt") 
outputs = model.generate(inputs,force_words_ids=force_words_ids,min_length=150,max_length=200,num_beams=5,no_repeat_ngram_size=2,early_stopping=True)
print(tokenizer.decode(outputs[0])) 
a2 = time.time()
print(f'time cost is {a2 - a1} s')

这里我们强制要求生成的故事里包含回家的词汇,然后用force_words_ids控制。

生成效果如下:

我和我的猫都很想你。 猫咪:你什么时候回来? 
狗狗:明天。 我:哦,好。 明天,明天,我一定回来。 
狗:好,再见。 小狗:再见,小猫。 你什么时候回家? 小猫:今天。 今天,今天,我今天一定回家。 
天黑了,狗和猫都睡着了。 一天过去了,猫和狗都睡得香甜。 
第二天一大早,天刚蒙蒙亮,就听见狗的叫声,原来是猫回来了。
狗对猫说:"猫,你今天怎么这么晚才回家呢?"
猫对狗说:"我昨天晚上没睡好觉,所以今天才迟到。" 
狗说:"那你为什么不早一点回来呢?""我明天还要上班呢!"
猫回答道。 "上班?"
狗又问道,"你明天要上班吗?" "是的,我要上班。""那为什么还迟迟不回来?" "我怕
time cost is 115.72432279586792 s

可以看到整个故事确实按照我们的要求生成了。

后记

下期我们将介绍更多的解码策略。隔了这么久才更新是因为上周得了甲流,真比新冠还难受,我推荐各位如果得了尽早尽快的吃奥司他韦,有和我一样有基础病(咽炎)的这种就同时吃阿莫西林抑菌。

引用

https://huggingface.co/blog/how-to-generate
https://huggingface.co/docs/transformers/generation_strategies
https://huggingface.co/blog/constrained-beam-search

相关内容

热门资讯

基于bearpi的智能小车--... 基于bearpi的智能小车--Qt上位机设计 前言一、界面原型1.主界面2.网络配置子窗口模块 二、...
三、Java核心技术(进阶)-... 一、概念 国际化编程:通过一套软件适配多个语言包。 二、相关函数 java.util....
水声功率放大器与宽带匹配技术研...   作为声呐设备重要的一份子,水声信号发射机承担着非常重要的作用。水声信号发射机其实是...
【C++】12.继承 1.引入继承 学生管理系统 学生 老师 社管阿姨 保安大叔 4个类 4个类有很多重复的东西...
LINUX中atd和crond... 一、atd与crond的区别1、运行方式不同,at只运行一次,而cron...
C++数据结构 —— 哈希表、... 目录 1.哈希概念 1.1哈希函数 1.2哈希冲突 2.闭散列实现 3.开散列实现 4.容器的封装 ...
Streamlit 学习笔记1 Streamlit 学习笔记1 文章目录Streamlit 学习笔记1首先 安利下streamlit...
基层区域应用平台为目标开发的基... 系统特点:  JAVA语言开发,MYSQL数据库,B/S架构 基于云计算...
数智链接,新一代校园招聘解决方... 疫情3年市场巨变,00后新生代初登上求职舞台,中和作用下,...
面试官:rem和vw有什么区别 "rem" 和 "vw"的区别 "rem" 和 "vw" 都是用于网页设计的CSS单位。 "rem"...
Pytest自动化测试框架完美... 简介 Allure Framework是一种灵活的、轻量级、多语言测试报告工具。 不仅可以以简洁的网...
华为nat配置实验:内网能够访... 一 需求分析1.1 需求 公司A在北京,公司B在上海,本次实验仅仅模拟局...
事务日志与 两阶段提交 文章目录 Redo Logredo的优点redo的组成redo的整体流程不同刷盘策略演示 Undo ...
【目标跟踪算法】Strong ... 1. Strong SORT算法的背景和概述 Strong SORT算法基于经典的Deep SORT...
Lock接口——JUC随记2 1、synchronized 1.1、synchronized的三种应用方式 一. 修饰实例方法&#...
IO流之字符流 文章目录1. 字符流概述2. 编码表3. 编码和解码4. 写数据的方式5. 读数据的方式6. 转换流...
C语言的灵魂---指针(基础) C语言灵魂指针1.什么是指针?2.指针的大小3.指针的分类3.1比较常规的指针类型3....
【华为OD机试真题JAVA】最... 标题:最优策略组合下的总的系统消耗资源数问题 | 时间限制:1秒 | 内存限制:262144K | ...
MATLAB | 给热图整点花... 前段时间写的特殊热图绘制函数迎来大更新,基础使用教程可以看看这一篇: h...
小知识·BitTorrent ... BitTorrent 简介从 P2P 说起经常在网上飙车的老司机应该都知道 BT 下载,...
Redis和Memcached...         对于大多数的系统服务来说,缓存是提高性能和可伸缩性的关键。一般情况下我...
[牛客算法总结]:重建二叉树    标签: 二叉树、DFS、先序遍历、中序遍历、递归   题目: 给定...
VS Code 将推出更多 A... 大家好,欢迎来到我们的二月更新!我们将为您带来与 JUnit 5 并行测...
为什么要推荐使用pnpm 在谈起pnpm时先来聊一聊之前的npm和yarn有什么存在的问题  npm2 在npm3之前我们安装...
多线程开发 文章目录多线程开发1. Thread创建多线程2. ThreadPoolExecutor创建进程池a...
闪存系统性能优化方向?NAND... Hello 大家好, 我是元存储~ 目录 前言 1. 提升效果 2. Cache Re...
关于复杂链表的复制问题(力扣) 上面我们已经说了两个关于链表的实现了,其中一个是单链表,另外一个是双向带...
STM32学习(二) 常用开发工具简介 安装仿真器驱动 DAP仿真器免驱ST LINK仿真器驱动安装方法:...
K8s配置jenkins Ma... 1、k8s安装jenkins 以阿里云的ACK为例 A、在有状态点击镜像创建,配置自己...
2023年新一代设备管理系统—... 设备管理是指在企业或者工厂对设备的生命周期进行管理、维护和保养等工作。设备管理系统是企业内部的信息管...