🤗 Transformers 能做什么
原文链接:
huggingface.co/docs/transformers/v4.37.2/en/task_summary
🤗 Transformers 是一个预训练的最先进模型库,用于自然语言处理(NLP)、计算机视觉以及音频和语音处理任务。这个库不仅包含了 Transformer 模型,还有像现代卷积网络这样的非 Transformer 模型,用于计算机视觉任务。如果你看一下今天最流行的消费产品,比如智能手机、应用和电视,很可能背后都有某种深度学习技术。想要从智能手机拍摄的照片中移除背景物体?这就是一个全景分割任务的例子(如果你还不知道这是什么,不用担心,我们将在接下来的部分中描述!)。
这个页面提供了关于🤗 Transformers 库中可以用三行代码解决的不同语音和音频、计算机视觉和 NLP 任务的概述!
音频
音频和语音处理任务与其他模态有些不同,主要是因为音频作为输入是一个连续信号。与文本不同,原始音频波形不能像句子可以被分成单词那样整齐地分割。为了解决这个问题,原始音频信号通常以固定间隔进行采样。如果在一个间隔内取更多样本,采样率就更高,音频更接近原始音频源。
以前的方法是对音频进行预处理,从中提取有用的特征。现在更常见的做法是直接将原始音频波形输入特征编码器,以提取音频表示,开始音频和语音处理任务。这简化了预处理步骤,并允许模型学习最关键的特征。
音频分类
音频分类是一个从预定义类别集中为音频数据贴上标签的任务。这是一个广泛的类别,有许多具体应用,其中一些包括:
- 声学场景分类:为音频贴上场景标签(“办公室”,“海滩”,“体育场”)
- 声学事件检测:为音频贴上声音事件标签(“汽车喇叭”,“鲸鱼呼叫”,“玻璃破碎”)
- 标记:为包含多个声音的音频贴上标签(鸟鸣声,会议中的发言人识别)
- 音乐分类:为音乐贴上流派标签(“金属”,“嘻哈”,“乡村”)
>>> from transformers import pipeline >>> classifier = pipeline(task="audio-classification", model="superb/hubert-base-superb-er") >>> preds = classifier("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac") >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> preds [{'score': 0.4532, 'label': 'hap'}, {'score': 0.3622, 'label': 'sad'}, {'score': 0.0943, 'label': 'neu'}, {'score': 0.0903, 'label': 'ang'}]
自动语音识别
自动语音识别(ASR)将语音转录为文本。由于语音是一种自然的人类交流形式,它是最常见的音频任务之一。今天,ASR 系统嵌入在“智能”技术产品中,如扬声器、手机和汽车。我们可以要求虚拟助手播放音乐,设置提醒,并告诉我们天气。
但 Transformer 架构帮助解决的关键挑战之一是低资源语言。通过在大量语音数据上进行预训练,然后在低资源语言中仅对一个小时的标记语音数据进行微调,仍然可以产生与之前在 100 倍更多标记数据上训练的 ASR 系统相比的高质量结果。
>>> from transformers import pipeline >>> transcriber = pipeline(task="automatic-speech-recognition", model="openai/whisper-small") >>> transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac") {'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}
计算机视觉
最早成功的计算机视觉任务之一是使用卷积神经网络(CNN)识别邮政编码数字的图像。一幅图像由像素组成,每个像素都有一个数值。这使得将图像表示为像素值矩阵变得容易。每个像素值组合描述了图像的颜色。
计算机视觉任务可以通过两种一般方式解决:
- 使用卷积来学习图像的层次特征,从低级特征到高级抽象事物。
- 将图像分割成补丁,并使用 Transformer 逐渐学习每个图像补丁如何相互关联以形成图像。与 CNN 所青睐的自下而上方法不同,这有点像从模糊的图像开始,然后逐渐使其聚焦。
图像分类
图像分类从预定义类别集合中为整个图像标记。与大多数分类任务一样,图像分类有许多实际用例,其中一些包括:
- 医疗保健:标记医学图像以检测疾病或监测患者健康
- 环境:标记卫星图像以监测森林砍伐,通知野地管理或检测野火
- 农业:标记作物图像以监测植物健康或卫星图像用于土地利用监测
- 生态学:标记动物或植物物种的图像以监测野生动物种群或跟踪濒危物种
>>> from transformers import pipeline >>> classifier = pipeline(task="image-classification") >>> preds = classifier( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... ) >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> print(*preds, sep="\n") {'score': 0.4335, 'label': 'lynx, catamount'} {'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'} {'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'} {'score': 0.0239, 'label': 'Egyptian cat'} {'score': 0.0229, 'label': 'tiger cat'}
目标检测
与图像分类不同,目标检测识别图像中的多个对象以及对象在图像中的位置(由边界框定义)。目标检测的一些示例应用包括:
- 自动驾驶车辆:检测日常交通对象,如其他车辆,行人和交通灯
- 遥感:灾害监测,城市规划和天气预报
- 缺陷检测:检测建筑物中的裂缝或结构损坏,以及制造缺陷
>>> from transformers import pipeline >>> detector = pipeline(task="object-detection") >>> preds = detector( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... ) >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"], "box": pred["box"]} for pred in preds] >>> preds [{'score': 0.9865, 'label': 'cat', 'box': {'xmin': 178, 'ymin': 154, 'xmax': 882, 'ymax': 598}}]
图像分割
图像分割是一个像素级任务,将图像中的每个像素分配给一个类别。它与目标检测不同,后者使用边界框来标记和预测图像中的对象,因为分割更加细粒化。分割可以在像素级别检测对象。有几种类型的图像分割:
- 实例分割:除了标记对象的类别外,还标记对象的每个不同实例(“狗-1”,“狗-2”)
- 全景分割:语义和实例分割的结合;它使用语义类别标记每个像素和对象的每个不同实例
分割任务在自动驾驶车辆中非常有用,可以为它们创建周围世界的像素级地图,以便它们可以安全地绕过行人和其他车辆。在医学成像中也很有用,任务的更细粒度可以帮助识别异常细胞或器官特征。图像分割还可以用于电子商务,通过在真实世界中通过您的相机叠加对象来虚拟试穿衣服或创建增强现实体验。
>>> from transformers import pipeline >>> segmenter = pipeline(task="image-segmentation") >>> preds = segmenter( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... ) >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> print(*preds, sep="\n") {'score': 0.9879, 'label': 'LABEL_184'} {'score': 0.9973, 'label': 'snow'} {'score': 0.9972, 'label': 'cat'}
深度估计
深度估计预测图像中每个像素与相机之间的距离。这种计算机视觉任务对于场景理解和重建尤为重要。例如,在自动驾驶汽车中,车辆需要了解行人、交通标志和其他车辆等物体的距离,以避免障碍和碰撞。深度信息还有助于从 2D 图像构建 3D 表示,并可用于创建生物结构或建筑物的高质量 3D 表示。
深度估计有两种方法:
- 立体:通过比较略有不同角度拍摄的两幅图像来估计深度
- 单眼:从单个图像估计深度
>>> from transformers import pipeline >>> depth_estimator = pipeline(task="depth-estimation") >>> preds = depth_estimator( ... "https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg" ... )
自然语言处理
NLP 任务是最常见的任务类型之一,因为文本是我们进行交流的一种自然方式。要将文本转换为模型识别的格式,需要对其进行标记化。这意味着将文本序列分割为单独的单词或子词(标记),然后将这些标记转换为数字。因此,您可以将文本序列表示为数字序列,一旦您有了数字序列,就可以将其输入到模型中以解决各种 NLP 任务!
文本分类
与任何模态中的分类任务一样,文本分类将文本序列(可以是句子级、段落或文档)从预定义类别集中标记。文本分类有许多实际应用,其中一些包括:
- 情感分析:根据
积极
或消极
等极性为文本标记,可以在政治、金融和营销等领域支持决策 - 内容分类:根据某个主题为文本标记,以帮助组织和过滤新闻和社交媒体信息流中的信息(如
天气
、体育
、金融
等)
>>> from transformers import pipeline >>> classifier = pipeline(task="sentiment-analysis") >>> preds = classifier("Hugging Face is the best thing since sliced bread!") >>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds] >>> preds [{'score': 0.9991, 'label': 'POSITIVE'}]
标记分类
在任何自然语言处理任务中,文本都会被预处理,将文本序列分割成单个单词或子词。这些被称为标记。标记分类为每个标记分配一个来自预定义类别集的标签。
两种常见的标记分类类型是:
- 命名实体识别(NER):根据实体类别(如组织、个人、地点或日期)为标记分配标签。NER 在生物医学领域特别受欢迎,可以标记基因、蛋白质和药物名称。
- 词性标注(POS):根据其词性(名词、动词或形容词)为标记分配标签。POS 对于帮助翻译系统理解两个相同单词在语法上的不同之处(名词“银行”与动词“存款”)非常有用。
>>> from transformers import pipeline >>> classifier = pipeline(task="ner") >>> preds = classifier("Hugging Face is a French company based in New York City.") >>> preds = [ ... { ... "entity": pred["entity"], ... "score": round(pred["score"], 4), ... "index": pred["index"], ... "word": pred["word"], ... "start": pred["start"], ... "end": pred["end"], ... } ... for pred in preds ... ] >>> print(*preds, sep="\n") {'entity': 'I-ORG', 'score': 0.9968, 'index': 1, 'word': 'Hu', 'start': 0, 'end': 2} {'entity': 'I-ORG', 'score': 0.9293, 'index': 2, 'word': '##gging', 'start': 2, 'end': 7} {'entity': 'I-ORG', 'score': 0.9763, 'index': 3, 'word': 'Face', 'start': 8, 'end': 12} {'entity': 'I-MISC', 'score': 0.9983, 'index': 6, 'word': 'French', 'start': 18, 'end': 24} {'entity': 'I-LOC', 'score': 0.999, 'index': 10, 'word': 'New', 'start': 42, 'end': 45} {'entity': 'I-LOC', 'score': 0.9987, 'index': 11, 'word': 'York', 'start': 46, 'end': 50} {'entity': 'I-LOC', 'score': 0.9992, 'index': 12, 'word': 'City', 'start': 51, 'end': 55}
问答
问答是另一个标记级任务,它返回一个问题的答案,有时包含上下文(开放域),有时不包含上下文(封闭域)。每当我们询问虚拟助手像餐厅是否营业这样的问题时,这个任务就会发生。它还可以提供客户或技术支持,并帮助搜索引擎检索您所询问的相关信息。
问答有两种常见类型:
- 抽取式:给定一个问题和一些上下文,答案是模型必须从上下文中提取的文本片段
- 抽象式:给定一个问题和一些上下文,从上下文生成答案;这种方法由 Text2TextGenerationPipeline 处理,而不是下面显示的 QuestionAnsweringPipeline
>>> from transformers import pipeline >>> question_answerer = pipeline(task="question-answering") >>> preds = question_answerer( ... question="What is the name of the repository?", ... context="The name of the repository is huggingface/transformers", ... ) >>> print( ... f"score: {round(preds['score'], 4)}, start: {preds['start']}, end: {preds['end']}, answer: {preds['answer']}" ... ) score: 0.9327, start: 30, end: 54, answer: huggingface/transformers
摘要
摘要创建一个较短的文本版本,从较长的文本中提取,同时尽量保留原始文档的大部分含义。摘要是一个序列到序列的任务;它输出比输入更短的文本序列。有很多长篇文档可以被摘要,以帮助读者快速理解主要观点。法案、法律和财务文件、专利和科学论文是一些可以被摘要以节省读者时间并作为阅读辅助的文档示例。
与问答类似,摘要有两种类型:
- 抽取式:识别并提取原始文本中最重要的句子
- 抽象式:从原始文本生成目标摘要(可能包含输入文档中没有的新单词);SummarizationPipeline 使用抽象式方法
>>> from transformers import pipeline >>> summarizer = pipeline(task="summarization") >>> summarizer( ... "In this work, we presented the Transformer, the first sequence transduction model based entirely on attention, replacing the recurrent layers most commonly used in encoder-decoder architectures with multi-headed self-attention. For translation tasks, the Transformer can be trained significantly faster than architectures based on recurrent or convolutional layers. On both WMT 2014 English-to-German and WMT 2014 English-to-French translation tasks, we achieve a new state of the art. In the former task our best model outperforms even all previously reported ensembles." ... ) [{'summary_text': ' The Transformer is the first sequence transduction model based entirely on attention . It replaces the recurrent layers most commonly used in encoder-decoder architectures with multi-headed self-attention . For translation tasks, the Transformer can be trained significantly faster than architectures based on recurrent or convolutional layers .'}]
翻译
翻译将一种语言中的文本序列转换为另一种语言。它对帮助来自不同背景的人们相互沟通、帮助翻译内容以扩大受众、甚至作为帮助人们学习新语言的工具都非常重要。翻译与摘要一样,是一个序列到序列的任务,意味着模型接收一个输入序列并返回一个目标输出序列。
在早期,翻译模型主要是单语的,但最近,对于能够在许多语言对之间进行翻译的多语言模型越来越感兴趣。
>>> from transformers import pipeline >>> text = "translate English to French: Hugging Face is a community-based open-source platform for machine learning." >>> translator = pipeline(task="translation", model="t5-small") >>> translator(text) [{'translation_text': "Hugging Face est une tribune communautaire de l'apprentissage des machines."}]
语言建模
语言建模是一种预测文本序列中单词的任务。它已经成为非常流行的自然语言处理任务,因为预训练的语言模型可以为许多其他下游任务进行微调。最近,对大型语言模型(LLMs)产生了很大兴趣,这些模型展示了零或少量样本学习。这意味着模型可以解决它没有明确训练的任务!语言模型可用于生成流畅且令人信服的文本,尽管您需要小心,因为文本可能并不总是准确的。
有两种类型的语言建模:
- 因果:模型的目标是预测序列中的下一个标记,未来的标记被掩盖。
>>> from transformers import pipeline >>> prompt = "Hugging Face is a community-based open-source platform for machine learning." >>> generator = pipeline(task="text-generation") >>> generator(prompt) # doctest: +SKIP
- 掩码:模型的目标是在完全访问序列中的标记的情况下预测序列中的掩码标记
>>> text = "Hugging Face is a community-based open-source <mask> for machine learning." >>> fill_mask = pipeline(task="fill-mask") >>> preds = fill_mask(text, top_k=1) >>> preds = [ ... { ... "score": round(pred["score"], 4), ... "token": pred["token"], ... "token_str": pred["token_str"], ... "sequence": pred["sequence"], ... } ... for pred in preds ... ] >>> preds [{'score': 0.2236, 'token': 1761, 'token_str': ' platform', 'sequence': 'Hugging Face is a community-based open-source platform for machine learning.'}]
多模态
多模态任务需要模型处理多种数据模态(文本、图像、音频、视频)来解决特定问题。图像字幕是一个多模态任务的例子,模型以图像作为输入,并输出描述图像或图像某些属性的文本序列。
尽管多模态模型处理不同的数据类型或模态,但在内部,预处理步骤帮助模型将所有数据类型转换为嵌入(包含有关数据的有意义信息的向量或数字列表)。对于像图像字幕这样的任务,模型学习图像嵌入和文本嵌入之间的关系。
文档问答
文档问答是一个从文档中回答自然语言问题的任务。与以文本作为输入的标记级别问答任务不同,文档问答以文档的图像作为输入,同时提出关于文档的问题,并返回一个答案。文档问答可用于解析结构化文档并从中提取关键信息。在下面的示例中,可以从收据中提取总金额和找零金额。
>>> from transformers import pipeline >>> from PIL import Image >>> import requests >>> url = "https://datasets-server.huggingface.co/assets/hf-internal-testing/example-documents/--/hf-internal-testing--example-documents/test/2/image/image.jpg" >>> image = Image.open(requests.get(url, stream=True).raw) >>> doc_question_answerer = pipeline("document-question-answering", model="magorshunov/layoutlm-invoices") >>> preds = doc_question_answerer( ... question="What is the total amount?", ... image=image, ... ) >>> preds [{'score': 0.8531, 'answer': '17,000', 'start': 4, 'end': 4}]
希望本页为您提供了有关每种模态中所有任务类型及其实际重要性的更多背景信息。在下一节中,您将了解🤗变压器是如何解决这些任务的。
🤗 Transformers 如何解决任务
原文链接:
huggingface.co/docs/transformers/v4.37.2/en/tasks_explained
在🤗 Transformers 能做什么中,您了解了自然语言处理(NLP)、语音和音频、计算机视觉任务以及它们的一些重要应用。本页将仔细研究模型如何解决这些任务,并解释发生在幕后的情况。解决给定任务的方法有很多种,一些模型可能会实现特定的技术,甚至从新的角度来处理任务,但对于 Transformer 模型来说,总体思路是相同的。由于其灵活的架构,大多数模型都是编码器、解码器或编码器-解码器结构的变体。除了 Transformer 模型,我们的库还有几个卷积神经网络(CNNs),这些网络在今天仍然用于计算机视觉任务。我们还将解释现代 CNN 的工作原理。
为了解释任务是如何解决的,我们将详细介绍模型内部的运作方式,以输出有用的预测。
- Wav2Vec2 用于音频分类和自动语音识别(ASR)
- Vision Transformer (ViT) 和 ConvNeXT 用于图像分类
- DETR 用于目标检测
- Mask2Former 用于图像分割
- GLPN 用于深度估计
- BERT 用于像文本分类、标记分类和问答这样使用编码器的 NLP 任务
- GPT2 用于像文本生成这样使用解码器的 NLP 任务
- BART 用于像总结和翻译这样使用编码器-解码器的 NLP 任务
在继续之前,最好对原始 Transformer 架构有一些基本了解。了解编码器、解码器和注意力的工作原理将有助于您理解不同的 Transformer 模型是如何工作的。如果您刚开始或需要温习,请查看我们的课程获取更多信息!
语音和音频
Wav2Vec2 是一个自监督模型,它在未标记的语音数据上进行了预训练,并在标记数据上进行了微调,用于音频分类和自动语音识别。
这个模型有四个主要组件:
- 一个特征编码器接收原始音频波形,将其归一化为零均值和单位方差,并将其转换为每个长度为 20ms 的特征向量序列。
- 波形本质上是连续的,因此无法像文本序列那样分割成单独的单元。这就是为什么特征向量会传递给一个量化模块,该模块旨在学习离散的语音单元。语音单元是从一个称为码书的编码词集合中选择的(您可以将其视为词汇表)。从码书中选择最能代表连续音频输入的向量或语音单元,并将其传递到模型中。
- 大约一半的特征向量是随机屏蔽的,并且被屏蔽的特征向量被馈送到一个上下文网络,这是一个 Transformer 编码器,还添加了相对位置嵌入。
- 上下文网络的预训练目标是一个对比任务。模型必须从一组错误的预测中预测出被屏蔽的真实量化语音表示,从而鼓励模型找到最相似的上下文向量和量化语音单元(目标标签)。
现在 wav2vec2 已经预训练完成,您可以在您的数据上对其进行微调,用于音频分类或自动语音识别!
音频分类
要将预训练模型用于音频分类,在基础 Wav2Vec2 模型顶部添加一个序列分类头。分类头是一个线性层,接受编码器的隐藏状态。隐藏状态代表每个音频帧的学习特征,可以具有不同的长度。为了创建一个固定长度的向量,首先对隐藏状态进行汇总,然后将其转换为类标签上的 logits。在 logits 和目标之间计算交叉熵损失,以找到最可能的类别。
准备好尝试音频分类了吗?查看我们完整的音频分类指南,了解如何微调 Wav2Vec2 并将其用于推断!
自动语音识别
要将预训练模型用于自动语音识别,在基础 Wav2Vec2 模型顶部添加一个语言建模头,用于连接主义时间分类(CTC)。语言建模头是一个线性层,接受编码器的隐藏状态并将其转换为 logits。每个 logit 代表一个标记类别(标记数量来自任务词汇表)。在 logits 和目标之间计算 CTC 损失,以找到最可能的标记序列,然后将其解码为转录。
准备好尝试自动语音识别了吗?查看我们完整的自动语音识别指南,了解如何微调 Wav2Vec2 并将其用于推断!
Transformers 4.37 中文文档(十二)(2)https://developer.aliyun.com/article/1564913