AI 工具 101

Hugging Face LLM 工具的完整初学者指南

mm
HUGGING FACE - COMPLETE GUIDE

Hugging Face 是一个 AI 研究实验室和中心,已经建立了一个由学者、研究人员和爱好者组成的社区。在短时间内,Hugging Face 已在 AI 领域获得了显著的存在感。包括谷歌、亚马逊和英伟达在内的科技巨头已经向 AI 初创公司 Hugging Face 投资了大量资金,使其估值达到 45 亿美元。

在本指南中,我们将介绍变压器、LLM 和 Hugging Face 库在促进开源 AI 社区方面的重要作用。我们还将介绍 Hugging Face 的基本功能,包括管道、数据集、模型等,并提供 Python 示例。

自然语言处理中的变压器

2017 年,康奈尔大学发表了一篇有影响力的论文,介绍了变压器。这是一种用于自然语言处理的深度学习模型。这种发现促进了大型语言模型的开发,如 ChatGPT。

大型语言模型或 LLM 是使用变压器来理解和生成类似人类的文本的 AI 系统。然而,创建这些模型的成本很高,通常需要数百万美元,这限制了它们对大公司的可访问性。

Hugging Face 于 2016 年成立,旨在使自然语言处理模型对所有人都可访问。尽管它是一家商业公司,但它提供了一系列开源资源,帮助个人和组织以负担得起的价格构建和使用变压器模型。机器学习是关于教计算机通过识别模式来执行任务,而深度学习是机器学习的一个子集,创建一个可以独立学习的网络。变压器是一种深度学习架构,能够有效和灵活地使用输入数据,因此它是构建大型语言模型的热门选择,因为它需要较少的训练时间。

Hugging Face 如何促进 NLP 和 LLM 项目

Hugging Face 使得使用 LLM 变得更容易,提供:

  1. 一系列预训练模型可供选择。
  2. 工具和示例来微调这些模型以满足您的特定需求。
  3. 易于部署到各种环境的选项。

一个很好的资源是 Hugging Face 的开源 LLM 排行榜。它是一个全面平台,系统地监测、排名和评估一系列大型语言模型和聊天机器人的效率,提供对开源领域进步的细致分析。

LLM 基准测试通过四个指标来衡量模型:

  • AI2 推理挑战(25 次尝试)- 一系列关于小学科学课程的问题。
  • HellaSwag(10 次尝试)- 一个常识推理测试,虽然对人类来说很简单,但对于尖端模型来说却是一个重大挑战。
  • MMLU(5 次尝试)- 一个多面评估,涉及 57 个不同的领域,包括基本数学、法律和计算机科学等。
  • TruthfulQA(0 次尝试)- 一个工具,用于确定模型倾向于回显在线常见的虚假信息的程度。

基准测试使用诸如“25 次尝试”、“10 次尝试”、“5 次尝试”和“0 次尝试”等术语,指的是模型在评估过程中收到的提示示例数量,以衡量其在各个领域的性能和推理能力。在“少次尝试”范式中,模型会收到少量示例来指导其响应,而在“0 次尝试”设置中,模型不会收到任何示例,必须仅依靠其预先存在的知识来响应。

Hugging Face 的组件

管道

“管道”是 Hugging Face 变压器库的一项功能,帮助轻松利用 Hugging Face 存储库中的预训练模型。它为一系列任务(包括情感分析、问答、掩码语言建模、命名实体识别和摘要)提供了直观的 API。

管道集成了三个核心 Hugging Face 组件:

  1. 标记器:通过将文本转换为模型可以理解的格式来准备文本。
  2. 模型:管道的核心,根据预处理的输入进行实际预测。
  3. 后处理器:将模型的原始预测转换为人类可读的形式。

这些管道不仅减少了大量的编码工作,还提供了一个用户友好的界面来执行各种 NLP 任务。

使用 Hugging Face 库的变压器应用

Hugging Face 库的亮点是变压器库,它通过连接模型和必要的预处理和后处理阶段来简化 NLP 任务,简化了分析过程。要安装和导入库,请使用以下命令:

pip install -q transformers
from transformers import pipeline

完成后,您可以执行 NLP 任务,例如情感分析,它将文本分类为积极或消极情绪。库功能强大的 pipeline() 函数作为其他管道的中心枢纽,促进了音频、视觉和多模态领域的任务特定应用。

实用应用

文本分类

使用 Hugging Face 的 pipeline() 函数,文本分类变得轻而易举。以下是如何启动文本分类管道:

classifier = pipeline("text-classification")

要亲身体验,请将字符串或字符串列表输入管道以获取预测,这些预测可以使用 Python 的 Pandas 库进行整齐的可视化。以下是 Python 代码片段,演示了这一点:

sentences = ["我很高兴向您介绍人工智能的奇妙世界。", "希望它不会让您失望。"]

# 获取每个句子的分类结果
results = classifier(sentences)

# 循环遍历每个结果并打印标签和分数
for i, result in enumerate(results):
print(f"结果 {i + 1}:")
print(f" 标签:{result['label']}")
print(f" 分数:{round(result['score'], 3)}\n")

输出

结果 1:
标签:正面
分数:1.0

结果 2:
标签:正面
分数:0.996

命名实体识别(NER)

NER 在从文本中提取现实世界对象(称为命名实体)方面至关重要。使用 NER 管道可以有效地识别这些实体:

ner_tagger = pipeline("ner", aggregation_strategy="simple")
text = "埃隆·马斯克是 SpaceX 的 CEO。"
outputs = ner_tagger(text)
print(outputs)

输出

埃隆·马斯克:人,SpaceX:组织

问答

问答涉及从给定的上下文中提取对特定问题的精确答案。初始化问答管道并输入您的问题和上下文以获取所需的答案:

reader = pipeline("question-answering")
text = "Hugging Face 是一家创建 NLP 工具的公司。它总部位于纽约,成立于 2016 年。"
question = "Hugging Face 总部位于哪里?"
outputs = reader(question=question, context=text)
print(outputs)

输出

{‘score’:0.998,‘start’:51,‘end’:60,‘answer’:‘纽约’}

Hugging Face 的 pipeline 函数提供了预建管道的阵容,用于各种任务,包括文本分类、NER 和问答。以下是可用任务的详细信息:

表:Hugging Face 管道任务

任务 描述 管道标识符
文本生成 根据给定的提示生成文本 pipeline(task=”text-generation”)
摘要 总结长文本或文档 pipeline(task=”summarization”)
图像分类 标记输入图像 pipeline(task=”image-classification”)
音频分类 对音频数据进行分类 pipeline(task=”audio-classification”)
视觉问答 使用图像和问题回答问题 pipeline(task=”vqa”)

有关详细描述和更多任务,请参阅 Hugging Face 网站上的管道文档

为什么 Hugging Face 正在将重点转向 Rust

Hugging Face 生态系统已经开始在其库中使用 Rust,例如 safetensors 和 tokenizers。

Hugging Face 最近发布了一个名为 Candle 的新机器学习框架。与传统使用 Python 的框架不同,Candle 是用 Rust 构建的。使用 Rust 的目标是提高性能,简化用户体验,并支持 GPU 操作。

Candle 的主要目标是实现无服务器推理,使部署轻量级二进制文件成为可能,并从生产工作负载中删除 Python,这有时会由于其开销而减慢速度。该框架是为了解决与 PyTorch 等全功能机器学习框架相关的问题而创建的,这些框架很大,慢,并且在集群上创建实例时会消耗大量资源。

让我们探讨为什么 Rust 正成为比 Python 更受青睐的选择。

  1. 速度和性能 – Rust 以其令人难以置信的速度而闻名,超过了传统上用于机器学习框架的 Python。Python 的性能有时会由于其全局解释器锁(GIL)而减慢,但 Rust 不会遇到此问题,保证了任务的更快执行和项目中更好的性能。
  2. 安全性 – Rust 提供了内存安全保证,而无需垃圾回收,这对于确保并发系统的安全至关重要。这种安全性在处理数据结构时至关重要,例如 safetensors 中的安全性。

Safetensors

Safetensors 受益于 Rust 的速度和安全功能。Safetensors 涉及操纵张量,Rust 确保这些操作不仅快捷,还安全,避免了由于内存处理不当可能出现的常见错误和安全问题。

标记器

标记器 负责将句子或短语分解为较小的单位,例如单词或术语。Rust 通过加速执行时间来帮助此过程,确保标记化过程不仅准确,还快速,提高了自然语言处理任务的效率。

Hugging Face 标记器的核心概念是子词标记化,在词级和字符级标记化之间取得平衡,以优化信息保留和词汇量。它通过创建子标记(如“##ing”和“##ed”)来实现这一点,同时保留语义丰富性并避免词汇量过大。

子词标记化涉及一个训练阶段,以确定字符级和词级标记化之间最有效的平衡。它超越了简单的前缀和后缀规则,需要对大量文本语料库中的语言模式进行全面分析,以设计高效的子词标记器。生成的标记器能够处理新词,将其分解为已知的子词,同时保持高水平的语义理解。

标记化组件

标记器库将标记化过程划分为几个步骤,每个步骤都处理标记化的一个不同方面。让我们深入了解这些组件:

  • 正常化器:对输入字符串进行初始转换,应用必要的调整,例如小写转换、Unicode 正则化和剥离。
  • 预标记器:负责将输入字符串分成预分段,根据预定义的规则(如空格分隔)确定分隔点。
  • 模型:负责发现和创建子标记,适应输入数据的具体情况,并提供训练功能。
  • 后处理器:增强构造功能,以实现与许多基于变压器的模型(如 BERT)的兼容性,通过添加标记(如 [CLS] 和 [SEP])来实现这一点。

要开始使用 Hugging Face 标记器,请使用命令 pip install tokenizers 安装库,并将其导入 Python 环境。该库可以在非常短的时间内标记化大量文本,从而节省了宝贵的计算资源用于更密集的任务,如模型训练。

标记器库使用 Rust,它继承了 C++ 的语法相似性,同时引入了编程语言设计中的新概念。结合 Python 绑定,它确保您在 Python 环境中享受低级语言的性能。

数据集

数据集是 AI 项目的基础。Hugging Face 提供了多种数据集,适用于各种 NLP 任务。要有效地使用它们,了解如何加载和分析它们至关重要。以下是加载和分析 Hugging Face 上可用数据集的 Python 脚本:

from datasets import load_dataset
# 加载数据集
dataset = load_dataset('squad')
# 显示第一个条目
print(dataset[0])

该脚本使用 load_dataset 函数加载 SQuAD 数据集,这是问答任务的热门选择。

利用预训练模型并将所有内容整合在一起

预训练模型是许多深度学习项目的骨干,允许研究人员和开发人员在不从头开始的情况下启动他们的项目。Hugging Face 促进了对多种预训练模型的探索,如下面的代码所示:

from transformers import AutoModelForQuestionAnswering, AutoTokenizer

# 加载预训练模型和标记器
model = AutoModelForQuestionAnswering.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')
tokenizer = AutoTokenizer.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')

# 显示模型架构
print(model)

加载模型和标记器后,我们现在可以创建一个函数,该函数接受文本和问题作为输入,并从文本中返回答案。我们将使用标记器来处理输入文本和问题,将其转换为与模型兼容的格式,然后将处理后的输入输入到模型中以获取答案:

def get_answer(text, question):
# 标记化输入文本和问题
inputs = tokenizer(question, text, return_tensors='pt', max_length=512, truncation=True)
outputs = model(**inputs)

# 获取答案的开始和结束分数
answer_start = torch.argmax(outputs.start_logits)
answer_end = torch.argmax(outputs.end_logits) + 1

answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(inputs['input_ids'][0][answer_start:answer_end]))
return answer

在代码片段中,我们导入来自 transformers 包的必要模块,然后使用 from_pretrained 方法加载预训练模型和其对应的标记器。我们选择了在 SQuAD 数据集上微调的 BERT 模型。

让我们看一个使用此函数的示例,其中我们有一个段落和一个问题,我们想从中提取特定的答案:

text = """
埃菲尔铁塔位于法国巴黎,是世界上最具标志性的地标之一。它由古斯塔夫·埃菲尔设计,于 1889 年完成。塔高 324 米,当时是世界上最高的建筑。
"""

question = "谁设计了埃菲尔铁塔?"

# 获取问题的答案
answer = get_answer(text, question)
print(f"问题的答案是:{answer}")
# 输出:问题的答案是:古斯塔夫·埃菲尔

在这个脚本中,我们构建了一个 get_answer 函数,它接受文本和问题,标记化它们,并利用预训练的 BERT 模型从文本中提取答案。它展示了使用 Hugging Face 的 transformers 库构建简单而强大的问答系统的实用应用。为了更好地理解这些概念,建议使用 Google Colab 笔记本 进行实践实验。

结论

通过其广泛的开源工具、预训练模型和用户友好的管道,Hugging Face 使专业人士和新手都能够轻松地进入人工智能的广阔世界。另外,Hugging Face 将 Rust 集成到其生态系统中,凸显了其致力于在人工智能应用中促进创新、确保效率和安全性的决心。Hugging Face 的变革性工作不仅使高级人工智能工具民主化,还为人工智能领域的学习和发展创造了一个协作环境,促进了人工智能的普及,使其对所有人都可用,促进了人工智能在各个领域的发展和应用。因此,Hugging Face 致力于推动人工智能技术的发展和普及,促进人工智能在各个领域的应用和发展,推动人类社会的进步和发展。

我已经沉浸在了令人着迷的机器学习和深度学习世界中五年了。我的热情和专业知识让我为超过50个不同的软件工程项目做出了贡献,特别关注AI/ML。我的持续的好奇心也让我对自然语言处理产生了兴趣,这是一个我渴望进一步探索的领域。