likes
comments
collection
share

生成式AI第二章 深度解析Transformer Part 2

作者站长头像
站长
· 阅读数 36

Transformer解构

在简单实践语言模型之后,我们准备介绍基于transformer的语言生成模型的架构图。涉及到的高阶组件有:

  • 分词:输入文本被分解为单个token(可以是单词和子词)。每个词元都有一个对应的ID,用于索引词嵌入。

  • 输入词嵌入:token以称为嵌入的向量进行表示。这些嵌入为数值形式,捕获每个token的语义。可以将向量视为数字列表,每个数字对应token含义的特定方面。在训练过程中,模型学习如何将每个token映射到对应的嵌入。无论token在输入序列中的位置如何,嵌入总是相同的。

  • 位置编码:transformer模型没有顺序的概念,因此我们需要用位置信息丰富词嵌入。通过将位置编码添加到词嵌入中来实现。位置编码是一组向量,编码了输入序列中每个token的位置。使得模型能够根据序列中的位置区分标记,这很有用,因为同一个token出现在不同位置可以有不同的含义。

  • Transformer块:transformer模型的核心是transformer块。transformer的强大之处在于堆叠多个块,使模型能够学习输入token之间越来越复杂和抽象的关系。它由两个主要组件组成:

    • 自注意义力机制:这种机制允许模型在整个序列的上下文中权衡每个token的重要性。它帮助模型理解输入中不同token之间的关系。自注意力机制是transformer处理长程依赖和复杂词语关系的关键,可生成连贯且语境恰当的文本。
    • 前馈神经网络:自注意力输出通过前馈神经网络进一步细化输入序列的表示。
  • 上下文嵌入:transformer块的输出是一组上下文嵌入,捕获输入序列中token之间的关系。与每个token固定的输入嵌入不同,上下文嵌入在transformer模型的每一层中根据token之间的关系进行更新。

  • 预测:一个额外的层将最终表示处理为任务相关的最终输出。对于文本生成,这涉及一个线性层将上下文嵌入映射到词空间,随后进行softmax运算以预测序列中的下一个token。

生成式AI第二章 深度解析Transformer Part 2

图2-1: 基于transformer的模型的架构

当然,这只是对transformer架构的简化描述。深入研究自注意力机制的工作原理或transformer块的内部机制暂不在我们的讨论范围。但理解transformer模型的顶层架构有助于掌握这些模型的工作原理以及将其应用于各种任务。这种架构使transformer在各种任务和领域中取得了前所未有的表现,你会发现它们不断出现——不仅是在本系列文章,而是在整个学科中。

Transformer模型家族

序列到序列的任务

在本章的开头,我们使用GPT-2进行了自回归文本生成实验。GPT-2是基于解码器的transformer示例,它具有一组transformer块,用于处理输入序列。这是当今流行的方式,但原始的transformer论文《Attention Is All You Need》中使用了一种更复杂的架构,称为编码器-解码器架构,这种架构至今仍在广泛使用。

生成式AI第二章 深度解析Transformer Part 2

transformer论文专注于机器翻译这一序列到序列的任务。当时,机器翻译的最佳结果是通过循环神经网络(RNN)实现的,例如LSTM和GRU(读者如果不熟悉,不必担心)。该论文通过专注于注意力方法展示了更好的结果,并表达了其可扩展性和训练更容易。这些因素——出色的表现、稳定的训练和易于扩展——是transformer取得成功并被应用于多种任务的原因,下一节将更深入地探讨这些方面。

在编码器-解码器模型中,就像论文中描述的原始transformer模型,一组transformer块(称为编码器)将输入序列处理成一组丰富的表示,然后将其传递给另一组transformer块(称为解码器),解码它们为输出序列。这种将一个序列转换为另一个序列的方法称为序列到序列或seq2seq,适用于翻译、摘要或问答等任务。

例如,将一段英文句子喂给翻译模型的编码器,生成一个捕获输入含义的嵌入。然后,解码器使用这个嵌入生成对应的法语句子。生成过程在解码器中按token逐一进行,在本章早些时候生成序列时有演示。然而,对每个后续token的预测不仅受到正在生成的序列中前一个token的影响,还受到来自编码器的输出的影响。

将编码器端的输出合并到解码器堆栈中的机制称为交叉注意力。它类似于自注意力,不同之处在于输入中的每个token(解码器正在处理的序列)关注的是来自编码器的上下文,而不是其序列中的其他token。交叉注意力层与自注意力交错,让解码器能够使用其序列中的上下文和来自编码器的信息。

在transformer论文发表后,现有的序列到序列模型,如Marian NMT,将这些技术作为其架构的核心部分进行了整合。使用这些思想开发了新的模型。其中一个值得关注的是BART(“Bidirectional and Auto-Regressive Transformers”的缩写)。在预训练期间,BART会破坏输入序列,并尝试在解码器输出中重建。之后,BART会针对其他生成任务(如翻译或摘要)进行微调,利用预训练期间获得的丰富序列表示。顺便说一下,输入破坏是扩散模型背后的关键思想之一,我们将在第三章中讲到。

另一个值得注意的序列到序列模型是T5。T5以通用的方式处理多种NLP任务,通过将60种任务表述为文本到文本的转换。不同任务不需要自定义层或代码,训练使用相同的超参数,模型从多样化的数据集中学习。

我们刚刚讨论了编码器-解码器和单解码器架构。常见的问题是,为什么像翻译这样的任务需要编码器-解码器模型,而诸如GPT-2的单解码器模型也能表现良好的结果。编码器-解码器模型旨在将整个输入序列翻译为输出序列,使其极其适合翻译任务。而单解码器模型专注于预测序列中的下一个token。最初,像GPT-2这样的单解码器模型在零样本学习场景中的能力不如更先进的模型如GPT-3,但这不仅仅是因为缺少编码器。像GPT-3这样的高级模型在零样本能力上的提升源自更大的训练数据、改进的训练技术和更大的模型规模。尽管seq2seq模型中的编码器在理解输入序列的完整上下文中发挥着关键作用,但单解码器模型的进步使它们更加有效和多样化,即使对于传统上依赖seq2seq模型的任务也是如此。

编码器模型

可以看到,原始的transformer模型基于编码器-解码器架构,这种架构在BART或T5等模型中得到了进一步探索。此外,编码器或解码器可以单独训练和使用,从而产生不同的transformer家族。本章的前几节探讨了单解码器或自回归模型。这些模型专门用于使用我们描述的技术生成文本,并且表现令人印象深刻,如ChatGPT、Claude、Llama或Falcon。

另一方面,编码器模型专门用于从文本序列中获得丰富的表示,可用于分类等任务,或为检索系统准备大量文档的语义嵌入(通常是几百个数字的向量)。最著名的transformer编码器模型可能是BERT,它引入了掩码语言模型目标,后来由BART进一步探索。

因果语言模型预测给定前一个标记的下一个token——如GPT-2。模型只能关注给定标记左侧的上下文。在编码器模型中使用的不同方法称为掩码语言模型(MLM)。掩码语言模型在著名的BERT论文中提出,它对模型进行预训练以学习“完形填空”。给定一个输入文本,我们随机掩盖一些标记,模型必须预测隐藏的token。与因果语言模型不同,MLM使用掩码标记左右两侧的序列,这就是BERT名称中表示“双向”的B。它有助于创建给定文本的表现。这些模型在底层使用transformer架构的编码器部分。

from transformers import pipeline

fill_masker = pipeline(model="bert-base-uncased")
fill_masker("The [MASK] is made of milk.")
[{'score': 0.19546717405319214,  'token': 9841,  'token_str': 'dish',  'sequence': 'the dish is made of milk.'}, {'score': 0.1290748566389084,  'token': 8808,  'token_str': 'cheese',  'sequence': 'the cheese is made of milk.'}, {'score': 0.10590700060129166,  'token': 6501,  'token_str': 'milk',  'sequence': 'the milk is made of milk.'}, {'score': 0.041120897978544235,  'token': 4392,  'token_str': 'drink',  'sequence': 'the drink is made of milk.'}, {'score': 0.03712378069758415,  'token': 7852,  'token_str': 'bread',  'sequence': 'the bread is made of milk.'}]

底层发生了什么?编码器接收输入序列并为每个标记生成上下文表示。这种表示是一个数值向量,捕获了标记在整个序列中的含义。编码器通常后接一个特定任务层,该层使用这些表示来执行分类、问答或掩码语言建模等任务。编码器被训练生成重度理解所需的表示。

在单编码器、单解码器和编码器-解码器模型之中,已出现大量新的开源和闭源语言模型,如GPT-4、Mistral、Falcon、Llama 2、Qwen、Yi、Claude、Bloom、PaLM等。杨立昆(LeCun)在Twitter上发布了一张有趣的族谱图,摘自一篇研究论文,展示了截至2024年transformer在NLP领域中的丰富且富有成果的影响。

生成式AI第二章 深度解析Transformer Part 2

预训练的强大

Transformer的核心洞察

现有模型都非常强大。在前几节中,我们探讨了使用GPT-2和GPT-NeoX生成文本并进行零样本分类。transformer模型在许多其他语言任务中也表现出最佳性能,如文本分类、机器翻译和基于输入文本的问答。为什么transformer能这么好?

第一点是注意力机制的使用,正如本章引文中所提到的。以前的NLP方法,如循环神经网络,难以处理长句子。注意力机制使得transformer模型能关注长序列并学习长程关系。也就是说,transformer可以估计某些标记对其他标记的相关性。

第二个关键点是其可扩展性。transformer架构具有优化的并行化实现,研究表明这些模型可以扩展以处理高复杂度和大规模数据集。虽然最初是为文本数据设计的,但transformer架构足够灵活,可支持不同的数据类型并处理不规则的输入。

第三个关键点是预训练和微调的能力。传统的任务方法,如电影评论分类,受到标注数据可用性的限制。模型将从头开始在大量标注示例上训练,尝试直接从输入文本预测标签。这种方法通常称为监督学习。然而,它有一个显著的缺点:需要大量标注数据才能有效训练。这是一个问题,因为标注数据昂贵且耗时。在许多领域甚至没有可用的数据。

为解决这个问题,研究人员开始寻找一种方法,在现有数据上预训练模型,然后为特定任务进行微调(或调整)。这种方法称为迁移学习,是许多领域(如自然语言处理和计算机视觉)现代机器学习的基础。NLP的初期工作集中在寻找特定领域的语料库进行语言模型预训练,但ULMFiT等论文表明,即使在维基百科等通用文本上进行预训练,也能在微调下游任务(如情感分析或问答)时取得令人非常好的结果。这为transformer的崛起奠定了基础,事实证明transformer非常适合学习丰富的语言表示。

预训练的理念是,在一个大型未标注数据集上训练模型,然后针对新目标任务进行微调,这样所需的标注数据就少得多。在转向NLP之前,迁移学习已经在构成现代计算机视觉骨干的卷积神经网络中取得了巨大成功。在这种情况下,首先在一个包含大量标注图像的分类任务上训练一个大型模型。通过这个过程,模型学习到可以在不同但相关的问题上利用通用特征。例如,我们可以在成千上万个类别上预训练一个模型,然后微调它来分类图片是否为热狗。

对于transformer,更进一步地采用了自监督预训练。我们可以在大型未标注文本数据上预训练一个模型。怎么做呢?思考一下因果模型如GPT。模型预测下一个词是什么。那么,我们不需要任何标签来获取训练数据。给定一个文本语料库,我们可以在序列后屏蔽标记,并训练模型学习预测它们。就像在计算机视觉案例中一样,预训练为模型提供了文本的有意义表示。然后我们可以微调模型来执行其他任务,如生成自己推文风格的文本或特定领域的文本(例如,公司对话)。由于模型已经学习了语言表示,微调所需的数据比从头开始训练少得多。

对于许多任务,输入的丰富表示比能够预测下一个标记更重要。例如,如果你想微调一个模型来预测电影评论的情感,掩码语言模型会更强大。像GPT-2这样的模型旨在优化文本生成,而不是构建强大的文本表示。另一方面,像BERT这样的模型非常适合这个任务。如前所述,编码器模型的最后一层输出的是输入序列的稠密表示,称为嵌入。然后可以通过在编码器上添加一个小型简单的网络并微调模型来完成特定任务。例如,我们可以在BERT编码器输出的基础上添加一个简单的线性层,以预测文档的情感。可以采用这种方法来处理各种任务:

  • 标记分类:识别句子中的每个实体,如人、地点或组织。
  • 抽取式问答:给定一个段落,回答一个具体问题并从输入中提取答案。
  • 语义搜索:编码器生成的特征可以用于构建搜索系统。给定一个包含百篇文档的数据库,我们可以计算每个文档的嵌入。然后,可以在推理时将输入嵌入与文档的嵌入进行比较,从而识别数据库中最相似的文档。 注: 此处过度简化了语义搜索的原理,但在后面的挑战小节会有机会使用语义搜索构建一个简单的搜索系统。
  • 以及许多其他任务,包括文本相似性、异常检测、命名实体链接、推荐系统和文档分类。
from transformers import pipeline

classifier = pipeline(model="distilbert-base-uncased-finetuned-sst-2-english")
classifier("This movie is disgustingly good !")
[{'label': 'POSITIVE', 'score': 0.9998536109924316}]

这个分类模型可以分析评论,并执行零样本分类一节中的相同操作。本章的挑战小节展示了如何评估分类模型并比较零样本设置与微调模型之间的差异。

Transformer回顾

我们讨论了三种架构类型:

  • 基于编码器的架构,如BERT、DistilBERT和RoBERTa,适合需要理解整个输入的任务。这些模型输出捕获输入序列含义的上下文嵌入。我们可以在这些嵌入的基础上添加一个小型网络,进行训练完成依赖语义信息的新特定任务(如识别文本中的实体或对序列进行分类)。 :DistilBERT是一个较小的模型,保留了原BERT 95%的功能,但参数量要少40%。RoBERTa是一个基于BERT的强大模型,采用了不同的超参数进行训练,规模更大。
  • 基于解码器的架构,如GPT-2、Falcon和Llama,适合生成新文本。
  • 编码器-解码器架构,或seq2seq,如BART和T5,适合基于给定输入生成新句子的任务,如摘要或翻译。

你可能会说:“等等,我可以用ChatGPT或Llama完成所有这些任务。”确实如此——鉴于庞大(且不断增长)的训练数据、运算和训练优化,生成式模型的质量显著提升,并且与几年前相比,零样本能力大幅提升。虽然单解码器模型提供了很好的结果,但目前的共识是,如果有资源,针对特定任务和领域微调模型比使用开箱即用的预训练模型效果更好。例如,如果你想在游戏中实时使用GPT模型生成角色对话,通常情况下,先用类似数据进行微调效果会更好。如果想使用模型从化学论文数据集中提取不同的实体,首先用化学论文微调基于编码器的模型可能更合理。

seq2seq模型的成功在于它们能够将可变长度的输入序列编码为总结输入信息的嵌入。然后模型的解码器部分可以利用这些上下文来进行生成。解码器模型近年来因其简单性、可扩展性、效率和并行化而受到关注。三种类型的模型在业界按照任务广泛使用——没有单一的黄金模型可用于所有任务。

有超过五十万种开源模型,读者可能会想该使用哪一个。第五章将为你拨云见雾,讲解如何为自己的任务和需求选择合适的模型,并介绍如何微调模型以满足自有的特定需求。

局限性

至此,你可能会想知道transformer存在哪些问题。下面简要讨论它的一些局限性:

  • transformer非常庞大。研究一致表明,更大的模型表现更好。尽管这很令人兴奋,但也带来了担忧。首先,一些最强大的模型仅训练算力就花费数千万美元——这意味着只有少数机构能够训练非常大的底座模型,限制了没有这些资源的机构的研究。其次,使用如此大量的计算能力也可能带来生态影响——这数百万GPU小时需要耗费大量的电力。第三,即便一些模型是开源的,运行它们可能需要很多GPU(比如马斯克开源的Grok据计算需要8张H100才能运行起来)。第五章将探讨一些在没有多GPU的情况下使用这些大语言模型的技术。即便如此,在资源受限的环境中部署它们仍然是一个常见的挑战。
  • 顺序处理:在解码器小节讲到,我们必须为每个新标记处理所有先前的标记。这意味着在一个序列中生成第10000个token将比生成初始标记花费更长的时间。在计算机科学术语中,transformer的时间复杂度与输入长度成二次方关系。即随着输入长度的增加,处理所需的时间成平方增长,使得在非常长的文档中扩展或在某些实时场景中使用这些模型变得具有挑战性。虽然transformer在许多任务中表现出色,但其算力需求在生产中使用时需要仔细考虑和优化。话虽如此,已经有很多研究致力于使transformer在处理超长序列时更高效。
  • 固定输入大小:transformer模型可以处理的最大标记数量取决于基础模型。一些模型只能处理512个token,而新技术可以扩展到数十万个标记。模型可以处理的标记数量称为上下文窗口。在选择预训练模型时,这是一个需要注意的重要事项。不能简单地将整本书传递给transformer,就期待其能够总结整书。
  • 有限的可解释性:transformer经常因缺乏可解释性而受到批评。

以上都是非常活跃的研究领域——人们一直在探索如何用更少的算力训练和运行模型(例如,第五章将探讨的QLoRA),如何加快生成速度(例如闪存注意力和辅助生成),如何实现不受限制的输入大小(例如RoPE和注意力下沉),以及如何解释注意力机制。

一个需要深入探讨的重要问题是模型中的偏见。如果用于预训练transformer的训练数据包含偏见,模型可能会学习并延续这些偏见。这是机器学习中的广泛存在的问题,但也与transformer有关。我们再来看fill-mask管道。假设想预测最可能的职业。可以看到,使用“man”和“woman”的结果会非常不同。

unmasker = pipeline("fill-mask", model="bert-base-uncased")
result = unmasker("This man works as a [MASK] during summer.")
print([r["token_str"] for r in result])

result = unmasker("This woman works as a [MASK] during summer.")
print([r["token_str"] for r in result])
['farmer', 'carpenter', 'gardener', 'fisherman', 'miner']
['maid', 'nurse', 'servant', 'waitress', 'cook']

为什么会这样呢?为了进行预训练,研究人员通常需要大量的数据,这导致他们会爬取所有能找到的内容。这些内容可能质量参差不齐,包括一些不良内容(这些内容在一定程度上可以被过滤掉)。基础模型在微调时可能会保留并延续这些偏见。对话模型中也存在类似的担忧,最终模型可能会生成从预训练数据集中学到的不良内容。

文本之外

Transformer已经被用于许多将数据表示为文本的任务。一个明显的例子是代码生成——我们可以使用大量代码数据来训练语言模型,而不是用通用数据,根据刚刚学到的原理,它将学会如何自动补全代码。另一个例子是使用transformer回答表格中的问题,例如电子表格。

由于transformer模型在文本领域取得了巨大成功,其他领域的社区对将这一技术应用于其他模态产生了浓厚的兴趣。这使得transformer模型被用于图像识别、图像切割、目标检测、视频理解等任务。

卷积神经网络(CNN)一直被广泛用作大多数计算机视觉技术的最新标准模型。随着视觉Transformer(ViT)的引入,近年来人们开始探索如何用注意力和基于transformer的技术处理视觉任务。ViT并没有完全弃用CNN:在图像处理管道中,CNN提取图像的特征图,以检测上层的边缘、纹理和其他模式。然后将从CNN获得的特征图分割成固定大小、不重叠的区块。这些区块可类似于标记序列进行处理,因此注意力机制可以学习不同位置区块之间的关系。

可惜,ViT需要比CNN更多的数据(3亿张图像!)和算力才能取得好的结果。近年来在这方面进行了更多研究,例如DeiT能够利用中型数据集(120万张图像)使用transformer模型,这要归功于使用了CNN中常见的增强和正则化技术。DeiT还使用了一种蒸馏方法,涉及一个“teacher”模型(这里为CNN)。其他模型如DETR、SegFormer和Swin Transformer推动了该领域的发展,支持了许多任务,如图像分类、目标检测、图像切割、视频分类、文档理解、图像修复、超分辨率等。

我们在第9章会学到,transformer模型也可以用于音频任务,如转录音频或生成合成语音或音乐。在底层,预训练和注意力机制的基本原理仍然一致,但每种模态有不同的数据类型,需要不同的方式和调整。

transformer正在探索的其他模态包括:

  • 图像:很好的入门读物是Fourrier在2023年出版的《图像机器学习入门》。使用transformer处理图像数据仍然处于非常探索性的阶段,但已有一些令人兴奋的早期结果。涉及图像数据的任务有预测分子的毒性、预测系统的演变或生成新的分子。
  • 3D数据:例如,对可以用3D表示的数据进行分割,如自动驾驶中的激光雷达点云或CT扫描中的器官识别。另一个例子是预估物体的六自由度位置,这在机器人应用中非常有用。
  • 时间序列:分析股票价格或进行天气预报。
  • 多模态:一些transformer模型设计用于同时处理或输出多种类型的数据(如文本、图像和音频)。这打开了新的可能性,例如多模态系统,你可以说话、写作或提供图片,并由一个模型来处理它们。还有视觉问答,其中模型可以回答关于提供图像的问题。

动手时间:使用语言模型生成文本

我们在生成一节使用了generate()方法来执行不同的解码技术。为更好地理解它的内部工作原理,下面我们来自己实现。我们将以generate()方法为参考,但从头开始实现它。我们还将探讨使用generate()方法执行不同的解码技术。

目标是填充以下函数中的代码。我们不使用gpt2.generate(),而是迭代调用gpt2(),传递前面的标记作为输入。你需要实现do_sample=True时的贪心搜索,do_sample=True的采样,以及当do_sample=Truetop_k不为None时的Top-K采样。

def generate(
    model, tokenizer, input_ids, max_length=50, do_sample=False, top_k=None
):
    """Generate a sequence without using model.generate()

    Args:
        model: The model to use for generation.
        tokenizer: The tokenizer to use for generation.
        input_ids: The input IDs
        max_length: The maximum length of the sequence. Defaults to 50.
        do_sample: Whether to use sampling. Defaults to False.
        top_k: The number of tokens to sample from. Defaults to 0.
    """
    # Write your code here
    # Begin by the simplest approach, greedy decoding.
    # Then add sampling and finally top-k sampling.

小结

恭喜!现在你已经学会了加载和使用transformer来完成各种任务!还了解了transformer如何对序列数据(如文本)进行建模,以及这种特性如何让它们“学习”到有用的表示,从而可以用来生成或分类新序列。随着这些模型规模的增加,它们的能力也随之增强——目前拥有数千亿参数的超大模型可以执行许多以前被认为计算机无法完成的任务。

通过微调,我们可以选择现有的强大预训练模型,并修改它们以适应特定领域和用例。向着更大、更强模型的发展趋势已经改变了人们使用这些模型的方式。特定任务的模型经常被通用的LLM超越,大多数人现在通过API和托管解决方案或直接通过流畅的聊天界面与这些模型进行交互。同时,得益于大规模的强大开放访问模型的发布,如Llama,研究人员和从业者的生态系统中涌现出一种浪潮,旨在在用户的计算机上直接运行高质量模型,从而实现隐私优先的解决方案。这一趋势不仅限于推理:近年来,新的训练方法使个人可以在没有大量计算资源的情况下微调这些模型。第五章将深入探讨传统和新式的微调技术。

尽管我们讨论了transformer的工作原理,并且还将深入探讨它们的训练过程,但深入了解这些模型的内部机制(例如注意力机制背后的数学原理)或从头开始预训练模型不在本系列文章的讨论范围内。所幸有许多优秀的资源可以学习这些内容:

如果读者希望更深入了解GPT家族的模型,建议你阅读以下论文:

  • Improving Language Understanding by Generative Pre-Training:这是2018年由Alec Radford、Karthik Narasimhan、Tim Salimans和Ilya Sutskever发表的原始GPT论文。它提出了使用基于Transformer的模型在大量文本语料库上进行预训练以学习通用语言表示,然后在特定下游任务上进行微调的理念。该论文还显示,GPT模型在当时的几个自然语言理解基准测试中取得了最先进的成果。
  •  Language Models are Unsupervised Multitask Learners:这篇论文于2019年由Alec Radford、Jeffrey Wu、Rewon Child、David Luan、Dario Amodei和Ilya Sutskever发表。它介绍了GPT-2,一个拥有15亿参数、在一个名为WebText的大型网络文本语料库上预训练的基于Transformer的模型。该论文还展示了GPT-2无需微调即可在各种自然语言任务上表现出色,如文本生成、摘要、翻译、阅读理解和常识推理。最后,它讨论了大规模语言模型的潜在伦理和社会影响。
  • Language Models are Few-Shot Learners:这篇论文于2020年由Tom B. Brown等人发表。该论文表明,大幅扩展语言模型可以显著提高它们从少量示例或简单指令中执行新语言任务的能力,无需微调或梯度更新。该论文还介绍了GPT-3,一个拥有1750亿参数的自回归语言模型,在许多NLP数据集和任务上表现出色。

 

练习

  1. 注意力机制在文本生成中起什么作用?
  2. 在什么情况下字符级标记器会更好?
  3. 如果使用与模型不同的tokenizer会发生什么?
  4. 在生成时使用no_repeat_ngram_size有何风险?(提示:城市名称)
  5. 如果结合束集搜索和采样会发生什么?
  6. 想象你在一个代码编辑器中使用LLM通过采样生成代码。更方便的是低temperature还是高temperature?
  7. 微调的重要性是什么?为什么它不同于零样本生成?
  8. 解释编码器、解码器和编码器-解码器transformer的区别及应用。 挑战
  9. 使用摘要模型(可使用pipeline(“summarization))生成段落摘要。它与使用零样本生成的结果相比如何?提供少样本示例是否能超越它?
  10. 在零样本补充材料中,我们使用零样本分类计算了混淆矩阵。尝试使用distilbert-base-uncased-finetuned-sst-2-english编码器模型进行情感分析。得到的结果如何?
  11. 我们来构建一个FAQ系统!Sentence transformers是强大的模型,可以确定多个文本的相似程度。虽然transformer编码器通常为每个标记输出一个嵌入,但句子transformer为整个输入文本输出一个嵌入,使得我们可以根据相似度得分确定两个文本是否相似。我们来看使用sentence_transformers库的简单示例。
from sentence_transformers import SentenceTransformer, util

sentences = ["I'm happy", "I'm full of happiness"]
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")

# Compute embedding for both lists
embedding_1 = model.encode(sentences[0], convert_to_tensor=True)
embedding_2 = model.encode(sentences[1], convert_to_tensor=True)

util.pytorch_cos_sim(embedding_1, embedding_2)
tensor([[0.6003]], device='cuda:0')

写一个关于某个主题的五个问题和答案的列表。目标是建立一个系统,该系统可以根据新问题给出用户最可能的答案。我们如何使用句子transformer来解决这个问题?补充材料(TODO)中包含了解决方案,尽管具有挑战性,我们建议先尝试自己解决再查看!

转载自:https://juejin.cn/post/7377326783581700136
评论
请登录