跳至主要内容

什么是 Hugging Face?AI 社区的开源绿洲

探索 Hugging Face 的变革世界——这是 AI 社区中专注于机器学习与自然语言处理的开源枢纽。
· 15分钟 阅读

使用 AI 探索

在当今瞬息万变的科技世界中,人工智能脱颖而出,成为至关重要且无处不在的领域,正不知不觉地融入我们的日常体验。站在这股 AI 浪潮中心的是自然语言处理,这一复杂领域为 ChatGPT 和 Bard 等热门对话式工具提供了强大动力。

如果让这些工具成为可能的大多数模型都向所有人开放,而且集中在同一个地方,会怎样?

答案就是:Hugging Face。它是机器学习和自然语言处理领域的变革者,也是推动 AI 民主化的关键力量。得益于迁移学习,它在让 AI 更加易用方面发挥着关键作用。

截至目前,它拥有 Python 生态中最受欢迎的 NLP 库,在 GitHub 上获得超过 11.5 万颗星,并已成为 AI 爱好者与专业人士实验、部署与扩展自有模型的重要平台之一。

无论您是数据专业人士还是好奇的入门者,Hugging Face 都提供了让您的 AI 项目落地的工具与资源,不断推动机器学习的可能边界。

那么,让我们一同探索 Hugging Face 能带来什么!

您也可以通过我们的跟练课程,进一步了解如何在 Hugging Face 上使用开源 AI 模型。

什么是 Hugging Face?

对大多数人来说,Hugging Face 也许只是手机键盘上的另一个表情符号(🤗)。

然而在技术圈里,它是 ML 世界的 GitHub——一个协作平台,汇聚了各种工具,帮助任何人使用开源代码来创建、训练和部署 NLP 与 ML 模型。

它的革命性之处在于?

这些模型都已预训练,这让入门 NLP 的过程更加简单。通俗地说,开发者不再从零开始;他们只需从 Hugging Face Hub 加载一个预训练模型,针对特定任务进行微调,然后就可以上手了。

这种易用性极大简化了开发流程。

因此,Hugging Face 成为了数据科学家、研究人员和 ML 工程师汇聚的中心,在这里交流想法、寻求支持,并为开源项目做出贡献。

他们这样描述自己:

“为构建未来而生的 AI 社区。”

这种以社区为驱动的理念,正是 Hugging Face 成功的秘方之一。

其迅速增长的另一原因在于平台的直观易用。简洁的界面让新手与专家都能轻松上手。

以承载最大规模的 NLP 与 ML 资源为目标,Hugging Face 致力于推动 AI 民主化,让全球社区都能轻松访问。

从聊天机器人到开源平台:Hugging Face 的发展史

Hugging Face 成立于 2016 年,是一家美法背景的公司,最初致力于打造面向青少年的交互式 AI 聊天机器人。然而,在将支撑该机器人的模型开源后,它迅速转向更宏大的愿景:为 AI 行业提供强大且易用的工具。

Image by the author

图片由作者提供。

2018 年推出的 Transformers 库,是其对 AI 社区最重要、最广为人知的贡献之一,提供了如 BERT 和 GPT 等预训练模型,已成为各类 NLP 任务中的常备工具。

如今,Hugging Face 已彻底重塑 ML 生态。其对开源协作的坚持催化了 NLP 创新,推动了技术的共同成长与发展。

该平台已成为模型与数据集共享的枢纽,推动了 AI 研究与实际应用。

他们的口号?

“一次提交,普及优质机器学习。”

通过战略合作与对广泛普及高级 NLP 工具的承诺,Hugging Face 已成为社区不可或缺的一部分,不断突破 AI 的边界,推动前沿技术的普惠化。

Hugging Face 的核心组件与功能

凭借一系列面向不同语言处理需求的核心组件与功能,Hugging Face 已成为现代 NLP 的基石。

下面逐一拆解。

1. Transformers 库

Transformers 库是一套面向 NLP 的前沿机器学习模型集合。它包含了大量预训练模型,可用于文本分类、文本生成、翻译与摘要等任务。

Hugging Face 将常见 NLP 任务抽象为易用的 `pipeline()` 方法,这是一套简明的 API,可执行多种任务。这些 pipeline 让用户能轻松将复杂模型应用于现实问题。若想进一步了解该库背后的原理,强烈推荐阅读文章 An Introduction to Using Transformers and Hugging Face。

这些模型易于获取与定制,这对开发者与研究者而言具有革命性意义,并在让高级 NLP 模型更易用方面发挥了关键作用。

其重要性在于能够抽象训练与部署 NLP 模型的复杂性,使从业者用极少的代码即可实现高级 NLP 功能。

该库允许在不深入底层算法的情况下直接利用预训练模型。

Transformers 库通过以下关键方式简化了 NLP 模型的实现:

Image by the author.

  1. 复杂度抽象:屏蔽了模型初始化、预处理流水线管理与分词处理的复杂性。
  2. 预训练模型:提供规模最大的预训练模型集合,大幅减少从零构建复杂 NLP 应用所需的时间与资源。
  3. 灵活与模块化:以模块化为设计理念,允许按需插拔不同组件。
  4. 社区与支持:Hugging Face 围绕其工具构建了强大的社区,提供详尽的文档、教程与论坛。
  5. 持续更新与扩展:紧跟 NLP 最新突破,持续纳入新模型与新方法。

若想直观了解 transformers 库为我们省去了多少工作,请通过 Building a Transformer with PyTorch 学习如何部署一个 NLP 模型。

2. Model Hub

Model Hub 是社区的“门面”,在这里,成千上万的模型与数据集触手可及。它让用户能够分享与发现社区贡献的模型,推动了 NLP 开发的协作式进程。

您可以在其官网上直接查看。在导航中点击 Models 按钮即可进入 Model Hub,您会看到类似下图的界面:

Screenshot of Hugging Face Model Hub main view.

Hugging Face Model Hub 主视图截图。

如您所见,左侧边栏提供了多个与主要任务相关的筛选器。

借助 Hugging Face 的工具,贡献模型到 Model Hub 十分简单,工具会引导用户完成上传流程。上传后,这些模型即可供整个社区使用,既可直接通过 Hub 调用,也可与 Hugging Face Transformers 库集成使用。

这种易于访问与贡献的方式,孕育了一个充满活力的生态系统,使最前沿的模型得以持续打磨与扩展,为 NLP 的发展提供了丰富而协作的基础。

3. Tokenizers

分词器在 NLP 中至关重要,它们负责将文本转换为机器学习模型可理解的格式,这对于处理不同语言与文本结构至关重要。

分词器会将文本拆分为 token——如词、子词或字符等基本单元——从而为机器学习模型处理数据做准备。这些 token 是模型理解与生成自然语言的基石。

它们还会将 token 转换为供模型输入的向量表示,并处理填充与截断以统一序列长度。

Hugging Face 提供了多种易用的分词器,针对其 Transformers 库进行了优化,是流畅完成文本预处理的关键。您可以在另一篇文章中进一步了解分词。

4. Datasets

另一个关键组件是 Hugging Face 的 Datasets 库,这是一个庞大的 NLP 数据集仓库,用于支持 ML 模型的训练与基准评测。

该库是从业者的重要工具,提供了多样的数据集,可用于在各类任务上训练、测试并评估任何 NLP 模型。

其一大优势是简单友好的接口。您可以在 Hugging Face Hub 上浏览与探索所有数据集;若要在代码中使用,专门的数据集库可帮助您一键下载任意数据集。

Screenshot of Hugging Face Datasets main view.

Hugging Face Datasets 主视图截图。

其中既有文本分类、翻译、问答等常见任务的数据集,也有用于解决领域中特殊挑战的更细分数据集。

Hugging Face 入门

既然我们已经对 Hugging Face 的核心概念达成共识,接下来试着了解如何使用这颗小小的技术明珠。

本指南将简要带您完成入门步骤,包括安装、使用预训练模型、微调以及与社区分享您的模型。

安装

首先,您应将 transformers 库与您偏好的深度学习库结合使用,任选 TensorFlow 或 PyTorch。

Transformers 库可通过 Python 的包管理器 pip 轻松安装。

pip install transformers

要获得完整能力,您还应安装 datasets 与 tokenizers 库。

pip install tokenizers, datasets

使用预训练模型

Hugging Face 的模型仓库提供了海量预训练模型,适用于广泛的 NLP 任务。我们来看看如何使用第一个预训练模型。

1. 选择预训练模型:首先需要选择一个预训练模型。为此,我们前往 Model Hub。

假设我们想要判断一段文本的情感。我们可以在左侧边栏选择 Text Classification 按钮,仅浏览执行“文本分类”任务的模型。

Hugging Face 的模型通常按 Trending 排序。一般来说,靠前的结果是使用最广的。于是我们选择第二个结果——最常用的情感分析模型。

Screenshot of Hugging Face Model Hub main view. Selecting Text Classification models.

Hugging Face Model Hub 主视图截图:筛选文本分类模型。

要使用它,我们需要复制模型对应的名称。它可以在该模型页面顶部位置找到。

Screenshot of Hugging Face Model Hub-specific model view.

Hugging Face Model Hub 指定模型页面截图。

1. 加载预训练模型:既然已经确定要用的模型,我们在 Python 中使用它。首先从 transformers 导入 AutoTokenizer 和 AutoModelForSequenceClassification 类。

使用这些 AutoModel 类会自动根据模型名称推断其架构。

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "lxyuan/distilbert-base-multilingual-cased-sentiments-student"

# We call define a model object
model = AutoModelForSequenceClassification.from_pretrained(model_name)

2. 准备输入:为我们的模型加载一个分词器。在此情况下,transformers 库会根据我们选择的模型名称自动推断应使用的分词器。

#We call the tokenizer class
tokenizer = AutoTokenizer.from_pretrained(model_name)

3. 运行模型:使用所选模型、分词器与任务创建一个 pipeline 对象。在我们的案例中是情感分析。如果仅以任务来初始化分类器对象,pipeline 类会用默认值填充,尽管不建议在生产中这样做。

# Initializing a classifier with a model and a tokenizer
classifier = pipeline("sentiment-analysis", model = model, tokenizer = tokenizer)
# When passing only the task, the pipeline command inferes both the model and tokenizer.
classifier = pipeline("sentiment-analysis")

我们可以通过输入一些文本来执行该模型。

output = classifier("I've been waiting for this tutorial all my life!")

4. 解释输出:模型会返回一个对象,包含的元素取决于模型的类别。比如,在这个情感分析示例中,我们将得到如下结果:

Obtained output.

获得的输出。

微调模型

微调是指在预训练模型的基础上,使用与您任务相关的数据集继续训练、更新其参数。这样可以利用模型已学到的表示,并将其适配到您的用例中。

设想我们需要使用一个文本分类模型来推断一组推文的情感。一个自然的问题是:这个预训练模型能否很好地工作?

为确保效果,我们可以通过微调来提升性能——用包含推文及其对应情感的数据集对 Hugging Face 的预训练模型进行训练。

以下是一个用于序列分类的微调基础示例:

1. 选择预训练模型与数据集:选择适合任务的模型架构。本例中,我们继续使用相同的情感分析模型。不过现在我们需要一些数据来训练模型。

这正是 datasets 库大显身手之处。我们可以在 Model Hub 中查看所有数据集,并找到最合适的那个。

Screenshot of Hugging Face Datasets Hub main view. Selecting Sentiment analysis datasets.

Hugging Face Datasets Hub 主视图截图:筛选情感分析数据集。

既然已经确定要用的数据集,我们可以直接初始化模型与数据集。

model = AutoModelForSequenceClassification.from_pretrained(model_name)

# Loading the dataset to train our model
dataset = load_dataset("mteb/tweet_sentiment_extraction")

查看刚下载的数据集可知,它是一个字典,包含训练集与测试集两个子集。若将训练子集转为数据框,大致如下:

The data set to be used.

将要使用的数据集。

2. 准备数据集:既然已有数据集,我们需要一个分词器将其处理为模型可解析的格式。数据集中的文本变量需要分词,才能用于微调模型。

因此第二步是加载一个预训练分词器,并对数据集进行分词,以便进行微调。

tokenizer = AutoTokenizer.from_pretrained(model_name)

def tokenize_function(examples):
    return tokenizer(examples["text"], padding="max_length", truncation=True)

tokenized_datasets = dataset.map(tokenize_function, batched=True)

3. 用编码构建 PyTorch 数据集:第三步是生成训练集与测试集。训练集用于微调模型,测试集用于评估。

通常,微调过程较耗时。为便于演示,我们对两个数据集进行随机采样以降低计算开销。

from datasets import load_dataset

model = AutoModelForSequenceClassification.from_pretrained(model_name)

# Loading the dataset to train our model
dataset = load_dataset("mteb/tweet_sentiment_extraction")

small_train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(1000))
small_eval_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(1000))

4. 微调模型:最后一步是设置训练参数并启动训练过程。transformers 库提供了 trainer() 类,可一站式处理。

我们先定义训练参数与评估策略。一切就绪后,调用 train() 即可轻松训练模型。

from transformers import Trainer, TrainingArguments
import numpy as np

training_args = TrainingArguments(output_dir="trainer_output", evaluation_strategy="epoch")

metric = evaluate.load("accuracy")

def compute_metrics(eval_pred):
    logits, labels = eval_pred
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)


trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=small_train_dataset,
    eval_dataset=small_eval_dataset,
    compute_metrics=compute_metrics,
)
trainer.train()

5. 评估模型:训练完成后,在验证集或测试集上评估模型表现。同样,trainer 类自带 evaluate 方法可直接完成。

import evaluate

trainer.evaluate()

我们的微调模型达到了 70% 的准确率。

既然模型已经得到改进,如何与社区分享?这就进入最后一步。

分享模型

当我们完成微调后,您也许希望将模型分享给社区。

Hugging Face 让这一过程变得简单明了。首先,您需要安装 huggingface_hub 库。

此步骤需要一个有效的 token 以便连接到您的 Hugging Face 账户。您可以按照此指南轻松获取。 在 Jupyter Notebook 中,我们可以直接导入 notebook_login。

from huggingface_hub import notebook_login

notebook_login()

这会在我们的 Jupyter Notebook 中弹出登录界面。提交 token 后,Notebook 即与您的 Hugging Face 账户连接。

Hugging Face login dialogue

现在只需通过 push_to_hub 命令上传模型。

finetuned_model.push_to_hub("my-awesome-model")

完成后,模型就会出现在我们 Hugging Face 个人主页,供所有人使用。

Hugging Face 的用例与应用

若要标准化任意 NLP 流程,使用 Hugging Face 通常只需三步,少于五行代码即可完成:

1. 使用 pipeline 类(以及相应的模型与分词器)定义一个模型对象。

2. 定义输入文本或提示词。

3. 用我们的输入执行预训练模型,并查看输出。

1. 文本分类

文本分类是 NLP 的基础任务,即为每段输入文本分配一个或多个类别。它适用于垃圾邮件检测、情感分析、主题标注等多种应用。

请看下面的示例代码,只用上一节中的三步,即可实现一个文本分类模型。

# We import the pipeline module from the transformers library
from transformers import pipeline

# We load the pre-trained text classification model.
classifier = pipeline("text-classification",model='lxyuan/distilbert-base-multilingual-cased-sentiments-student')

# Input to be classified
input_ = "I absolutely love the transformers library!"

# Perform classification
output_ = classifier(input_)

# Observer the result
print(output_)

很简单,对吧?

那我们继续第二个用例——也是最常被使用的之一。

2. 文本生成

大多数人已经熟悉 ChatGPT 或 Google Bard,这些工具会根据输入提示生成文本。这个过程称为“文本生成”,是 NLP 中一个引人入胜的方向,模型会从初始输入生成类人文本。

它的应用范围很广,从构建聊天机器人的回复到创意写作生成皆可。

核心思路是用大规模语料训练模型,使其学习语言的模式、风格与结构。可以想见,最昂贵的部分就在于模型训练。

不过,Hugging Face 让我们像前例一样,仅用五行代码就能实现此类模型。

示例如下:

from transformers import pipeline

generator = pipeline('text-generation', model='gpt2')

prompt = "In a world dominated by AI,"

generated_text = generator(prompt, max_length=50)[0]['generated_text']

print(generated_text)

3. 问答

问答(QA)是 NLP 的一个方向,旨在构建能自动用自然语言回答人类问题的系统。

QA 系统广泛应用于虚拟助手、客户支持与信息检索等场景。

QA 系统大致分为两类:

  • 开放域 QA:基于广泛知识回答问题,通常来源于互联网或大型数据库。
  • 封闭域 QA:聚焦于特定领域,如医学或法律,并从有限数据集中回答问题。

这些系统通常结合自然语言理解来解释问题,并利用信息检索来找到相关答案。

同样,使用 Hugging Face 来实现这类模型既快速又简单。

from transformers import pipeline

qa_pipeline = pipeline('question-answering', model='distilbert-base-uncased-distilled-squad')

context = """Paris is the capital and most populous city of France. The city has an area of 105 square kilometers and a population of 2,140,526 residents."""
question = "What is the population of Paris?"

answer = qa_pipeline(question=question, context=context)
print(answer)

4. 翻译

最后一个用例是翻译。机器翻译是计算语言学的一个分支,利用软件将文本或语音从一种语言转换为另一种语言。随着深度学习的出现,机器翻译取得了长足进步,特别是使用大规模神经网络的神经机器翻译(NMT)。

与传统的基于规则或统计的翻译模型不同,现代 NMT 系统通过在大规模双语数据集上训练来学习翻译。它们采用序列到序列架构:一部分网络对源文本进行编码,另一部分网络将其解码为目标语言,通常具有相当出色的流畅度与准确性。

使用 Hugging Face 的一个简单示例如下:

from transformers import pipeline

# Load the translation pipeline for English to Spanish
translator = pipeline('translation_en_to_de')

# Text to translate from English to Spanish
text_to_translate = "This is a great day for science!"

# Perform the translation
translation = translator(text_to_translate, max_length=40)

# Print the translated text
print(translation[0]['translation_text'])

引领 AI 与 NLP 的民主化

Hugging Face 已成为人工智能与自然语言处理领域的变革力量。其完整的工具矩阵——包括革命性的 Transformers 库、协作式 Model Hub 与丰富的 Datasets 库——让高级 NLP 能力触手可及。

通过营造一个共享并共同构建创新的环境,Hugging Face 不仅推动了 AI 的进步,也在塑造一个更加易用、包容且强大的技术未来。

在我们持续见证并参与这场 AI 革命之际,Hugging Face 也提醒我们:最深刻的技术进步往往源于开放、共享与协作。

这不仅关乎打造更聪明的机器,更在于培育一个更聪明、更紧密相连的开发者、研究者与爱好者社区,携手推动可能性的边界。

后续步骤

  • 保持好奇与更新:NLP 领域发展迅速。通过保持好奇心与开放心态来持续更新知识。若您希望在 Python 中深化 NLP 理解,强烈推荐 The Natural Language Processing in Python 课程。
  • 理论与实践并重:理论固然重要,但实践是关键。通过项目与实验将所学落地。尝试上一些动手项目,提升您的 NLP 能力。
  • 建立人脉与协作:积极参与 NLP 社区。从同行与专家处学习,往往能获得宝贵洞见与机会。
Josep Ferrer

作者

Josep Ferrer

Josep 是一名专注于欧洲项目的自由职业数据科学家,擅长数据存储、处理、高级分析,以及具有影响力的数据叙事。 

作为一名教育者,他在纳瓦拉大学硕士项目教授大数据课程,并在 Medium、KDNuggets 和 DataCamp 等平台发表文章分享见解。Josep 还在其通讯 Databites(databites.tech)撰写有关数据与技术的内容。 

他拥有加泰罗尼亚理工大学工程物理学学士学位,以及庞培法布拉大学智能交互系统硕士学位。

主题