这张照片由 Erda Estremera 在 Unsplash 网站分享。
最近我在日常工作中玩得特别开心,特别是在尝试Hugging Face平台上的模型时。我觉得现在是分享我的一些学习心得并向大家提供一些使用这些模型的小贴士,让读者可以更轻松地应用的好时机。
最近我的具体任务是处理一堆未结构化的文本数据(想想备忘录、邮件、自由文本评论字段等),并将其归类到与业务场景相关的类别中。对此有许多方法,我尝试了各种可能的方法,包括简单的模式匹配和词汇搜索,同时也开始使用预构建的神经网络模型来处理多种功能,对这些结果还算满意。
我认为最好的策略是结合多种技术,以某种形式的集成,来获得最佳效果。我不能完全信任这些模型总是能正确解决问题,更不用说一贯正确。但当与更基本的方法结合使用时,它们可以提供更多的有用信息。
选择使用场景对我来说,正如我之前提到的,任务就是处理一些通常由人类写的、格式和模式不一致的文本块,尝试找出适用这些文本的类别。除了我之前提到的分析方法之外,我也尝试了几种不同的方法来做到这一点,这些方法从非常简单的到稍微多花些功夫的都有。这是到目前为止我测试过的三种策略。
- 让模型选择分类类别(零样本识别——我将在本文后面用此作为示例)
- 使用命名实体识别模型找出文本中提到的关键对象,然后根据找到的关键对象进行分类
- 让模型来总结文本,再根据摘要用其他方法分类
这真是太好玩了——在Hugging Face的模型目录中,你可以看到用户上传的各种模型。在https://huggingface.co/models,你可以看到用户上传的各种模型。我有一些选模小技巧,希望能帮到你。
- 查看下载和喜欢的数量,不要选择那些没有被足够数量的其他用户验证的内容。你也可以查看每个模型页面上的“社区”选项卡,看看用户是否在讨论遇到的挑战或报告的bug。
- 尽可能调查上传该模型的人,并判断他们是否值得信任。训练或调整该模型的人可能并不真正了解自己在做什么,而你的结果质量将取决于他们!
- 仔细阅读文档,跳过那些几乎没有或完全没有文档的模型。你将很难有效利用它们。
- 使用页面侧面的筛选器来缩小适合你任务的模型范围。众多的选择可能会让人感到不知所措,但它们被很好地分类,可以帮助你找到你需要的内容。
- 大多数模型卡片都提供了一个快速测试,你可以运行它来查看模型的行为,但请记住这只是其中一个示例,可能是因为模型在这方面表现很好,且该模型在这个测试上相对容易。
一旦你找到想要尝试的模型,开始使用就很容易——点击页面右上角的“使用此模型”按钮,你就会看到各种实现该模型的选择。如果你选择的是Transformers选项,你会看到一些类似这样的说明。
作者的截图
如果你选择的模型不被Transformers库支持,可能会列出其他的一些技术,例如TF-Keras、scikit-learn等工具,但所有这些在你点击该按钮时都应该显示使用说明和示例代码,以方便使用。
在我的实验中,所有的模型都使用了Transformer架构,所以我很容易通过这些步骤运行了这些模型。如果你有任何疑问,也可以查阅更深入的文档,查看Transformers库及其提供各类别的完整API文档。我在优化过程中确实花了不少时间研究这些文档中的特定类,但要运行基本功能,你其实不需要深入了解这些文档。
准备推断用的数据好的,所以你已经选好了想要尝试的模型。你已经有数据了吗?如果没有,我在做实验时使用了一些公开的数据集,主要是来自Kaggle的数据集,你也可以在那里找到许多有用的资料集。此外,Hugging Face也有一个数据集目录你可以查看,但根据我的经验,那边的数据集搜索起来并不容易,理解起来也较困难(只是相关文档较少)。
一旦你选择了未结构化的文本数据集,将其加载到这些模型中并不会太复杂。加载你的模型和分词器(如Hugging Face文档中所述),并将它们传递给transformers库中的pipeline
函数。你需要遍历列表或pandas Series中的文本片段,并将它们传递给模型的函数。对于任何类型的任务,这基本上是相同的,不过对于零样本分类,你还需要提供候选标签或标签列表,如下面所述。
所以,让我们来仔细看看零样本分类任务。如前所述,这涉及使用预训练的模型根据它没有专门训练的类别中来对文本进行分类,希望它能利用学到的语义嵌入来衡量文本与标签术语之间的相似度。
from transformers import AutoModelForSequenceClassification
from transformers import AutoTokenizer
from transformers import pipeline
nli_model = AutoModelForSequenceClassification.from_pretrained("facebook/bart-large-mnli", model_max_length=512)
tokenizer = AutoTokenizer.from_pretrained("facebook/bart-large-mnli")
classifier = pipeline("zero-shot-classification", device="cpu", model=nli_model, tokenizer=tokenizer)
label_list = ['新闻', '科学', '艺术']
all_results = []
for text in list_of_texts:
prob = classifier(text, label_list, multi_label=True, use_fast=True)
results = {x: y for x, y in zip(prob["labels"], prob["scores"])}
all_results.append(results)
这将返回一个包含字典的列表,每个字典包含可能标签作为键,每个标签对应的值是其概率。你不必像我这里这样做,但使用管道可以大大简化多标签零样本分类任务,从而省去了手动编写代码的步骤,并且返回的结果易于理解和操作。
如果你不想使用这个管道,你可以这样做替代,但你需要为每个标签单独运行一次。请注意,需要指定模型运行后生成的logits的处理方法,以便得到对人类来说可读的输出。此外,你仍然需要像之前描述的那样加载分词器和模型。
def run_zero_shot_classifier(text, label):
hypothesis = f"这个例子和{label}有关。"
x = tokenizer.encode(
text,
hypothesis,
return_tensors="pt",
truncation_strategy="only_first"
)
logits = nli_model(x.to("cpu"))[0]
entail_contradiction_logits = logits[:, [0, 2]]
probs = entail_contradiction_logits.softmax(dim=1)
prob_label_is_true = probs[:, 1]
return prob_label_is_true.item()
label_list = ['新闻文章', '科学(Science)', '艺术(Art)']
all_results = []
for text in 文本列表:
for label in label_list:
result = run_zero_shot_classifier(text, label)
all_results.append(result)
调还是不调?
你可能已经注意到,我在这个项目中并没有亲自微调模型——这确实是真的。由于目前我几乎没有标注的训练数据,我可能会在未来这么做。我可以使用半监督技术或自动生成一些标注的数据集,然而,整个实验的重点是看仅使用现成的模型能取得怎样的成绩。我确实有一些小的标注数据样本,用于测试模型的表现,但这远远不够用来微调模型。
如果你有好的训练数据,并且想要微调预训练模型,Hugging Face 提供了一些文档可以帮到你。阅读更多关于训练的文档
计算和速度性能问题一直很有趣,因为我迄今为止所有的实验都是在我的本地笔记本电脑上运行的。显然,使用来自Hugging Face的这些模型将会比使用正则表达式和词典搜索等基本策略更加耗费计算资源且速度更慢,但这些模型提供的信号是其他方式难以实现的,因此找到优化的方法可能是值得的。所有这些模型都支持GPU加速,并且将它们推送到GPU上运行非常简单。(如果你想快速地在GPU上尝试,请查看我上面展示的代码,在看到“cpu”时,如果你的编程环境中配有GPU,则将其替换为“cuda”。)记住,云服务提供商的GPU成本不菲,因此请根据情况优先考虑,并决定更快的速度是否值得这个代价。
大多数情况下,使用GPU对于训练来说更重要(不过如果你想微调模型,那就得记住这一点),但对于推断来说则没那么关键。这里我就不细说优化细节了,但如果你对这一点很看重,你还需要考虑并行性——包括数据并行和实际的训练或计算并行。
测试并理解输出来模型已经跑好了!结果已经出来了。我有一些最后的建议,关于如何审查输出结果,并实际应用于解决商业问题。
- 不要盲目信任模型的输出,而应该进行严格的测试并评估性能。仅仅因为一个Transformer模型在某些文本块上表现出色,或者能够定期正确地将文本与某个标签匹配,并不意味着这就是一个可以泛化的结果。使用大量不同的例子和不同类型的文本来证明性能会足够。
- 如果你对模型有信心,并希望将其部署到生产环境中,那么应该跟踪和记录模型的行为。这是任何模型在生产环境中的良好实践,你应该保留它产生的结果以及你给它的输入,以便可以持续监控它,确保性能不会下降。这对于这些类型的深度学习模型来说尤为重要,因为我们对模型如何得出其推断的内部工作原理没有太多的可解释性。对模型内部工作原理做出太多假设是很危险的。
如我之前所说,我喜欢将这些模型输出作为工具,将其视为更大技术组合的一部分,通过组合它们形成集成策略——这样我不再仅限于依赖单一方法,而是可以从中获得有用的信息。
我希望这份概览对刚开始使用预训练模型进行文本(或其他形式)分析的新手们有所帮助——祝好运!
在我的网站上阅读更多我的作品,或访问www.stephaniekirmer.com阅读更多。
更多阅读 模型 - Hugging Face我们正在踏上一段旅程,通过开源和开放科学来发展和普及人工智能。 并行我们正在通过我们的开源和开放科学项目致力于推进和普及人工智能技术。了解更多关于模型并行的信息。 查找开放数据集和机器学习项目 | Kaggle在数千个项目中下载开放数据集 + 在一个平台上分享项目。探索热门话题,如政府数据……www.kaggle.com共同学习,写下你的评论
评论加载中...
作者其他优质文章