首页
Preview

开始使用 Bloom

图片由 Patrick TomassoUnsplash 上提供。

目录

Bloom 是什么,我们为什么应该谨慎对待

Bloom 是来自 BigScience 的一个新的 176B 参数的多语言 LLM(Large Language Model)。BigScience 是一个由全球数百名研究人员和机构参与的开放合作项目,Bloom 除了贡献者的多样性之外,最显著的是它完全开源,Huggingface 通过他们的 transformers API 向公众提供了他们的全部(以及一些较小的)预训练模型。包括 OpenAI、Meta 和 Google 在内的其他研究 LLM 的组织,选择将他们的 LLM 大部分保留在内部,或者仅限于受到严格控制的封闭测试组的访问。

一段代码及其输出块。输出读作:“爱丽丝穿过小门走进了房间。她穿着一件白色的连衣裙,她的头发扎成了马尾。她的脸色苍白,但她仍然很漂亮。房间很暗,只有几个…”。

图片由作者提供,文本由 Bloom 提供。提示:“爱丽丝穿过小门走进了房间。”

我们需要讨论的是,在现实世界中使用这些模型的危险,更不用说将它们公开访问了。担忧范围从强化不公平和系统性偏见到加速网络上的虚假信息传播。比我更有能力的声音已经,而且继续倡导更加人性化、透明和公平的开发和使用这项技术。如果你还不熟悉,请在这里停下来,花些时间了解像 Timnit GebruDAIR Institute)、Margaret MitchellPartnership on AI 团队等人的工作。

因此,我鼓励每个人都坚持 预期用途,并注意 Bloom 模型卡片 上列出的 风险和限制,在进行本篇“Hello World”风格的介绍性教程之外,谨慎对待。

设置环境

我们将使用 PyTorch 中的一般 Bloom 模型的 1.3B 参数版本,仅使用 CPU 运行推理。虽然我使用的是 Google Cloud 的 Vertex 服务上的 Python 3 Jupyter Lab VM,但你几乎可以在任何本地或托管的 *nix Jupyter 环境中跟随操作。

首先,我们需要设置一个虚拟环境作为安装所有依赖项的干净空间。我们将创建一个名为 .venv 的环境(这也会产生一个同名的隐藏目录),然后激活它开始工作:

pip install venv
python -m venv .venv
source .venv/bin/activate

接下来,我们将在 .venv 环境中安装我们需要的软件包:

pip install transformers
pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu

最后,我们需要退出我们的 venv,将我们的新环境注册到 Jupyter Lab 作为一个内核,然后重新启动它:

deactivate
ipython kernel install --user --name=venv
source .venv/bin/activate

当你去选择 Jupyter Lab 中的“选择内核”选项时,你应该会看到 venv 作为一个选项。让我们选择并连接它。

下载预训练的分词器和模型

在启动我们的示例笔记本(也可在 GitHub 上获取)时,我们首先从我们之前安装到 venv 的软件包中导入一些模块:

import transformers
from transformers import BloomForCausalLM
from transformers import BloomTokenizerFast
import torch

现在,进入主题,我们下载预训练的 Bloom 1.3B 参数通用 LLM。虽然我没有准确测量它的大小,但这个版本的模型的权重和偏差似乎占用了约 1.5GB 的空间。至关重要的是,我们还需要获取 Bloom 的分词器。这将使我们能够将我们的输入文本(“提示”)转换为 Bloom 可以理解的嵌入式:

model = BloomForCausalLM.from_pretrained("bigscience/bloom-1b3")
tokenizer = BloomTokenizerFast.from_pretrained("bigscience/bloom-1b3")

顺便说一句,让我们设置一些全局变量,包括我们的提示文本:

prompt = "It was a dark and stormy night"
result_length = 50
inputs = tokenizer(prompt, return_tensors="pt")

一些注释:

  • result_length 调整我们从模型中获取的提示响应的大小(以令牌为单位)。
  • inputs 包含 prompt 的嵌入式表示,专门编码为 PyTorch 使用。如果我们使用 TensorFlow,我们会传递 return_tensors="tf"。## 运行推理:更好响应的策略

在我们向模型发送提示之前,我们需要考虑哪些解码/搜索策略可能最适合我们的用例。使用自回归变压器(用于下一个令牌预测)时,我们有多种选项来搜索“合理”的输出答案空间。这篇很棒的文章HuggingfacePatrick von Platen撰写,详细解释了我们将尝试的三种技术的细节和数学,因此我不会在这里重复造轮子。但我会给你每种技术的 TL;DR 版本:

  • 贪心搜索:简单地选择在每个时间步 t+1 中具有跟随 t 词的最高预测概率的下一个词。其中一个主要问题是,如果 t 前面的词的概率很低,那么贪心搜索将错过 t+1 的高概率词。
  • 束搜索:跟踪前 n 个(num_beams)最有可能的单词序列,并输出最有可能的序列。听起来很好,但是当输出长度可以高度变化时(例如,生成开放式文本时),这种方法会崩溃。贪心搜索和束搜索也会产生分布与人类执行相同任务的方式不太吻合的输出(即两者都可能产生相当重复、乏味的文本)。
  • 采样 Top-k + Top-p:是三种方法的组合。通过采样,我们的意思是下一个词是根据其条件概率分布(von Platen,2020)随机选择的。在Top-k中,我们选择最有可能的 k 个单词,然后在下一次抽取之前重新分配它们之间的概率质量。Top-p添加了一个附加限制,即我们从累积概率超过 p 的最小单词集中进行选择。

现在我们将尝试所有 3 种策略,以便我们可以比较输出。

Greedy Search

print(tokenizer.decode(model.generate(inputs["input_ids"], max_length=result_length )[0]))


> <p data-selectable-paragraph="">It was a dark and stormy night, and the wind was blowing hard. The<br/>snow was falling fast, and the ground was covered with it. The<br/>horses were all frozen to the ground, and the men were huddled</p>

Beam Search

print(tokenizer.decode(model.generate(inputs["input_ids"], max_length=result_length, num_beams=2, no_repeat_ngram_size=2, early_stopping=True )[0]))


> <p data-selectable-paragraph="">It was a dark and stormy night, and the wind was blowing hard. I was in the<br/>middle of the road, when I heard a loud crash. It came from the house<br/>at the other side of my road. A man was</p>

Sampling Top-k + Top-p

print(tokenizer.decode(model.generate(inputs["input_ids"], max_length=result_length, do_sample=True, top_k=50, top_p=0.9 )[0]))


> <p data-selectable-paragraph="">It was a dark and stormy night. It was almost noon. As I got out of the car and took off my shoes, a man walked over to me and sat down. He had a mustache, thick hair and brown eyes. He</p>

结论和下一步

就个人而言,所有这些结果都似乎大多合理。你会发现,随着你迭代和调整参数和提示,某些策略可能会为你的特定用例产生更优化的输出。实际上,构建提示来诱导语言模型做出有用的事情正在成为一种艺术和科学。

作为奖励,采样 Top-k + Top-p输出中“夜晚”和“几乎中午”的术语不一致说明了一个有价值的观点,即我们可能会错误地将语言模型误认为是具有内部世界模型的推理机器(如人类)来构造其响应。事实上,我们不需要深度学习、大数据或语言模型来证明人类会将任何事物拟人化。相反,我们应该看到语言模型的本质:句法可信的句子生成器,应该在我们的眼皮下(并具有足够的缓解工程和包容性设计)部署,以了解它们的局限性。

在此基础上,我自己使用 Bloom 的旅程将继续几个方面的探索:主要集中在适应文本生成和分类头到现代审计问题上。具体而言:

  • 代码摘要。Bloom 是否能够用简单的英语概括代码块的逻辑?
  • 令牌分类的转移学习。Bloom 是否可以被训练用于识别过程文档中的风险和/或控制?
  • 可靠性。我们可以建立哪些保证,以便在生成的摘要和分类的事实准确性方面?

祝你生成愉快!

参考资料

译自:https://towardsdatascience.com/getting-started-with-bloom-9e3295459b65

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
alivne
复杂的问题简单化

评论(0)

添加评论