理解Transformer
Transformer架构在各种应用中展示了其多才多艺的特性。最初的网络被提出作为一个用于翻译任务的编码器-解码器架构。Transformer架构的下一次演进是引入了仅编码器模型,如BERT,随后是仅解码器网络,即GPT模型的首次迭代。
这些区别不仅体现在网络设计上,还包括学习目标。这些不同的学习目标在塑造模型的行为和结果方面起着至关重要的作用。理解这些差异对于选择适合特定任务的架构以及在各种应用中实现最佳性能至关重要。
在本章中,我们将更深入地探讨Transformer,提供对其各个组件及网络内部机制的全面理解。我们还将研究开创性论文《Attention is All You Need》。
我们还将加载预训练模型,以突出Transformer和GPT架构之间的区别,并检查该领域最新的创新,如大型多模态模型(LMMs)。
《Attention is All You Need》
这是自然语言处理(NLP)领域一个极具记忆性的标题。论文《Attention is All You Need》标志着在NLP神经网络架构开发中的一个重要里程碑。这项由Google Brain和多伦多大学的合作研究介绍了Transformer,这是一种利用注意力机制进行自动翻译任务的编码器-解码器网络。Transformer模型在(WMT 2014数据集) 英语到法语翻译任务上达到了41.8的最新最高分。值得注意的是,这一性能水平是在仅用8个GPU训练了3.5天后取得的,显示出相比于以前的模型,训练成本大幅降低。
Transformer极大地改变了这一领域,并在翻译之外的任务中展示了卓越的有效性,包括分类、摘要和语言生成。Transformer的一个关键创新是其高度并行化的网络结构,这增强了训练的效率和效果。
架构
现在,让我们更详细地审视Transformer模型的基本组件。如下面的图示所示,最初的架构设计用于序列到序列的任务(即输入一个序列并基于它生成输出),例如翻译。在这个过程中,编码器创建输入短语的表示,解码器则使用这一表示作为参考生成输出。
进一步研究Transformer架构,发现其可以分为三种独特的类别,这些类别以其多样性和在处理不同任务中的专业能力而有所区别。
- 仅编码器类别 专注于从输入数据中提取上下文感知的表示。这个类别中的代表性模型是BERT,它在分类任务中非常有用。
- 编码器-解码器类别 适用于序列到序列的任务,如翻译、摘要生成和训练多模态模型(如标题生成器)。该分类下的模型示例是BART。
- 仅解码器类别 专门设计用于根据提供的指令生成输出,这在LLM中得到了体现。这个类别的代表性模型是GPT家族。
接下来,我们将探讨这些设计选择之间的对比及其对不同任务的影响。然而,如图所示,多个构建块,如嵌入层和注意力机制,在编码器和解码器组件中是共享的。理解这些元素将有助于提高对模型内部运作的理解。本节概述了关键组件,然后演示如何加载开源模型以追踪每一步。
输入嵌入
在Transformer架构中,初始步骤是将输入标记(单词或子词)转化为嵌入。这些嵌入是高维向量,捕捉了输入标记的语义特征。可以将它们视为一个大型特征列表,代表被嵌入的单词。这个列表包含成千上万的数字,模型通过自我学习来表示我们的世界。与其处理句子、单词和同义词以进行比较并理解语言,不如用这些数字列表进行数值比较,通过基本计算(如向量的加法和减法)来看它们是否相似。这比理解单词本身要复杂得多。因此,这些嵌入向量的大小非常大。当你无法理解意义和单词时,需要成千上万的值来表示它们。这个大小因模型架构而异。例如,OpenAI的GPT-3使用的是12,000维的嵌入向量,而较小的模型,如BERT,使用768维的嵌入。这一层使模型能够有效理解和处理输入,作为所有后续层的基础。
位置信息编码
早期模型,如递归神经网络(RNNs),以顺序的方式处理输入,一次一个标记,自然地保留了文本的顺序。与这些模型不同,Transformer没有内建的顺序处理能力。相反,它们使用位置信息编码来保持短语中单词的顺序,以供后续层使用。这些编码是填充了唯一值的向量,每个索引处的值不同,这些编码与输入嵌入结合,为模型提供有关标记在序列中的相对或绝对位置的数据。这些向量编码了每个单词的位置,确保模型能够识别单词的顺序,这对于理解句子的上下文和含义至关重要。
自注意力机制
自注意力机制是Transformer模型的核心,计算短语中所有单词嵌入的加权总和。这些权重是通过学习的“注意力”分数计算的。更高的“注意力”权重会分配给彼此更相关的术语。根据输入,这一机制通过查询(Query)、键(Key)和值(Value)向量来实现。下面是每个向量的简要描述:
- 查询向量(Query Vector) :这是计算注意力权重的单词或标记。查询向量指定应优先考虑输入序列的哪些部分。当你将单词嵌入与查询向量相乘时,你在询问,“我应该关注什么?”
- 键向量(Key Vector) :输入序列中与查询相比较的一组单词或标记。键向量有助于识别输入序列中的重要或相关信息。当你将单词嵌入与键向量相乘时,你在问自己,“什么是重要的?”
- 值向量(Value Vector) :存储与输入序列中每个单词或标记相关的信息或特征。值向量包含实际数据,这些数据将根据查询和键之间计算的注意力权重进行加权和混合。值向量回答查询,“我们有什么信息?”
在Transformer设计出现之前,注意力机制主要用于比较文本的两个部分。例如,模型可以在生成总结任务时,关注输入文章的不同区域。
自注意力机制使模型能够突出文本中最重要的部分。它可以用于仅编码器或仅解码器模型,以构建强大的输入表示。文本可以在仅编码器的情况下被翻译成嵌入,而仅解码器模型则实现文本生成。
多头注意力机制的实现大大提高了准确性。在这种设置中,多个注意力组件处理相同的信息,每个头在训练和生成过程中学习专注于文本的独特特征,如动词、名词、数字等。
架构实际操作
在此部分,您可以在[Notebooks找到相关的代码示例。
通过实际操作架构,您可以了解上述组件如何在预训练的大型语言模型中工作,使用Transformers库(Hugging Face)提供的工具来深入了解其内部机制。您将学习如何加载预训练的分词器,将文本转换为标记ID,随后将输入数据传递到每个网络层,并调查输出结果。
首先,使用 AutoModelForCausalLM
和 AutoTokenizer
来加载模型和分词器。然后,将一个示例句子进行标记化,该句子将作为接下来步骤中的输入。
from transformers import AutoModelForCausalLM, AutoTokenizer
OPT = AutoModelForCausalLM.from_pretrained("facebook/opt-1.3b", load_in_8bit=True)
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-1.3b")
inp = "The quick brown fox jumps over the lazy dog"
inp_tokenized = tokenizer(inp, return_tensors="pt")
print(inp_tokenized['input_ids'].size())
print(inp_tokenized)
输出:
torch.Size([1, 10])
{'input_ids': tensor([[ 2, 133, 2119, 6219, 23602, 13855, 81,
5, 22414, 2335]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]])}
我们加载了Facebook的预训练Transformer模型(facebook/opt-1.3b),并以8位格式存储,这是一种节省内存的策略,用于有效利用GPU资源。分词器对象加载了与模型交互所需的词汇,并用于将示例输入(inp
变量)转换为标记ID和注意力掩码。注意力掩码是一个向量,旨在帮助忽略特定标记。在给定的示例中,注意力掩码向量的所有索引都设置为1,表示每个标记都会被正常处理。然而,通过将注意力掩码向量中的某个索引设置为0,您可以指示模型忽略输入中的特定标记。同时,注意到文本输入是如何使用模型的预训练字典转换为标记ID的。
接下来,我们通过 .model
方法来检查模型的架构。
print(OPT.model)
输出:
OPTModel(
(decoder): OPTDecoder(
(embed_tokens): Embedding(50272, 2048, padding_idx=1)
(embed_positions): OPTLearnedPositionalEmbedding(2050, 2048)
(final_layer_norm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
(layers): ModuleList(
(0-23): 24 x OPTDecoderLayer(
(self_attn): OPTAttention(
(k_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
(v_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
(q_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
(out_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
)
(activation_fn): ReLU()
(self_attn_layer_norm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
(fc1): Linear8bitLt(in_features=2048, out_features=8192, bias=True)
(fc2): Linear8bitLt(in_features=8192, out_features=2048, bias=True)
(final_layer_norm): LayerNorm((2048,), eps=1e-05, elementwise_affine=True)
)
)
)
)
解码器模型是基于Transformer的语言模型中常见的选择。因此,我们必须使用解码器键来访问其内部工作机制。layers
键还显示解码器组件由24个堆叠层组成,每个层的设计相同。首先,考虑嵌入层。
embedded_input = OPT.model.decoder.embed_tokens(inp_tokenized['input_ids'])
print("Layer:\t", OPT.model.decoder.embed_tokens)
print("Size:\t", embedded_input.size())
print("Output:\t", embedded_input)
输出:
Layer: Embedding(50272, 2048, padding_idx=1)
Size: torch.Size([1, 10, 2048])
Output: tensor([[[-0.0407, 0.0519, 0.0574, ..., -0.0263, -0.0355, -0.0260],
[-0.0371, 0.0220, -0.0096, ..., 0.0265, -0.0166, -0.0030],
[-0.0455, -0.0236, -0.0121, ..., 0.0043, -0.0166, 0.0193],
...,
[ 0.0007, 0.0267, 0.0257, ..., 0.0622, 0.0421, 0.0279],
[-0.0126, 0.0347, -0.0352, ..., -0.0393, -0.0396, -0.0102],
[-0.0115, 0.0319, 0.0274, ..., -0.0472, -0.0059, 0.0341]]],
device='cuda:0', dtype=torch.float16, grad_fn=<EmbeddingBackward0>)
嵌入层通过解码器对象的 .embed_tokens
方法访问,它将标记化的输入传递给该层。正如所见,嵌入层将一个大小为 [1, 10] 的ID列表转换为 [1, 10, 2048]。该表示将被使用并通过解码器层进行传递。
如前所述,位置信息编码组件使用注意力掩码构建一个向量,传达模型中的位置信号。位置信息嵌入是使用解码器的 .embed_positions
方法生成的。如所示,这一层为每个位置生成一个独特的向量,然后将其添加到嵌入层的输出中。这一层将位置信息添加到模型中。
embed_pos_input = OPT.model.decoder.embed_positions(
inp_tokenized['attention_mask']
)
print("Layer:\t", OPT.model.decoder.embed_positions)
print("Size:\t", embed_pos_input.size())
print("Output:\t", embed_pos_input)
输出:
Layer: OPTLearnedPositionalEmbedding(2050, 2048)
Size: torch.Size([1, 10, 2048])
Output: tensor([[[-8.1406e-03, -2.6221e-01, 6.0768e-03, ..., 1.7273e-02,
-5.0621e-03, -1.6220e-02],
[-8.0585e-05, 2.5000e-01, -1.6632e-02, ..., -1.5419e-02,
-1.7838e-02, 2.4948e-02],
[-9.9411e-03, -1.4978e-01, 1.7557e-03, ..., 3.7117e-03,
-1.6434e-02, -9.9087e-04],
...,
[ 3.6979e-04, -7.7454e-02, 1.2955e-02, ..., 3.9330e-03,
-1.1642e-02, 7.8506e-03],
[-2.6779e-03, -2.2446e-02, -1.6754e-02, ..., -1.3142e-03,
-7.8583e-03, 2.0096e-02],
[-8.6288e-03, 1.4233e-01, -1.9012e-02, ..., -1.8463e-02,
-9.8572e-03, 8.7662e-03]]], device='cuda:0', dtype=torch.float16, grad_fn=<EmbeddingBackward0>)
最后,查看自注意力组件!我们可以通过索引访问第一个层的自注意力组件,并使用 .self_attn
方法。同时,检查架构图显示,自注意力的输入是通过将嵌入向量与位置信息编码向量相加来创建的。
embed_position_input = embedded_input + embed_pos_input
hidden_states, _, _ = OPT.model.decoder.layers[0].self_attn(embed_position_input)
print("Layer:\t", OPT.model.decoder.layers[0].self_attn)
print("Size:\t", hidden_states.size())
print("Output:\t", hidden_states)
输出:
Layer: OPTAttention(
(k_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
(v_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
(q_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
(out_proj): Linear8bitLt(in_features=2048, out_features=2048, bias=True)
)
Size: torch.Size([1, 10, 2048])
Output: tensor([[[-0.0119, -0.0110, 0.0056, ..., 0.0094, 0.0013, 0.0093],
[-0.0119, -0.0110, 0.0056, ..., 0.0095, 0.0013, 0.0093],
[-0.0119, -0.0110, 0.0056, ..., 0.0095, 0.0013, 0.0093],
...,
[-0.0119, -0.0110, 0.0056, ..., 0.0095, 0.0013, 0.0093],
[-0.0119, -0.0110, 0.0056, ..., 0.0095, 0.0013, 0.0093],
[-0.0119, -0.0110, 0.0056, ..., 0.0095, 0.0013, 0.0093]]],
device='cuda:0', dtype=torch.float16, grad_fn=<MatMul8bitLtBackward>)
自注意力组件包括前述的查询、键、值层以及最终的输出投影。它接受嵌入输入与位置信息编码向量的和作为输入。在实际应用中,模型还会为该组件提供注意力掩码,使其能够确定应忽略或忽视输入的哪些部分。(为了清晰起见,这部分在示例代码中省略)
架构的其余部分使用非线性函数(例如RELU)、前馈层和批量归一化。
Transformer模型的设计选择
在[Notebooks]中可以找到此部分的相关笔记。
Transformer架构已经证明了它在多种应用中的适应性。最初的模型是为翻译任务中的编码器-解码器任务提出的。随着仅编码器模型(如BERT)的出现,Transformer设计的演变继续进行,第一代GPT模型引入了仅解码器网络。
这些变体不仅限于网络架构,还包括学习目标的不同。这些不同的学习目标对模型的行为和结果有显著影响。理解这些差异对于选择适合特定任务的最佳设计并在各种应用中获得最佳性能至关重要。
编码器-解码器架构
完整的Transformer架构,通常称为编码器-解码器模型,由多个编码器层堆叠而成,并通过交叉注意力机制连接到多个解码器层。这个架构与我们在前面部分看到的完全一致。
这些模型特别适合将一个序列转换为另一个序列的任务,如文本翻译或总结,其中输入和输出都是基于文本的。它在多模态应用中也非常有用,例如图像描述,其中输入是图像,而期望的输出是相应的描述。在这些场景中,交叉注意力发挥了关键作用,帮助解码器在生成过程中专注于内容的最相关部分。
一个典型的例子是BART预训练模型,它具有双向编码器,负责形成输入的详细表示。同时,自回归解码器逐步生成输出,一个标记一个标记地输出。该模型处理一些部分被随机掩盖的输入以及通过一个标记移动的输入。它努力重构原始输入,将此任务设定为学习目标。下面的代码加载了BART模型,以检查其架构。
from transformers import AutoModel, AutoTokenizer
BART = AutoModel.from_pretrained("facebook/bart-large")
print(BART)
输出:
BartModel(
(shared): Embedding(50265, 1024, padding_idx=1)
(encoder): BartEncoder(
(embed_tokens): Embedding(50265, 1024, padding_idx=1)
(embed_positions): BartLearnedPositionalEmbedding(1026, 1024)
(layers): ModuleList(
(0-11): 12 x BartEncoderLayer(
(self_attn): BartAttention(
(k_proj): Linear(in_features=1024, out_features=1024, bias=True)
(v_proj): Linear(in_features=1024, out_features=1024, bias=True)
(q_proj): Linear(in_features=1024, out_features=1024, bias=True)
(out_proj): Linear(in_features=1024, out_features=1024, bias=True)
)
(self_attn_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
(activation_fn): GELUActivation()
(fc1): Linear(in_features=1024, out_features=4096, bias=True)
(fc2): Linear(in_features=4096, out_features=1024, bias=True)
(final_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
)
)
(layernorm_embedding): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
)
(decoder): BartDecoder(
(embed_tokens): Embedding(50265, 1024, padding_idx=1)
(embed_positions): BartLearnedPositionalEmbedding(1026, 1024)
(layers): ModuleList(
(0-11): 12 x BartDecoderLayer(
(self_attn): BartAttention(
(k_proj): Linear(in_features=1024, out_features=1024, bias=True)
(v_proj): Linear(in_features=1024, out_features=1024, bias=True)
(q_proj): Linear(in_features=1024, out_features=1024, bias=True)
(out_proj): Linear(in_features=1024, out_features=1024, bias=True)
)
(activation_fn): GELUActivation()
(self_attn_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
(encoder_attn): BartAttention(
(k_proj): Linear(in_features=1024, out_features=1024, bias=True)
(v_proj): Linear(in_features=1024, out_features=1024, bias=True)
(q_proj): Linear(in_features=1024, out_features=1024, bias=True)
(out_proj): Linear(in_features=1024, out_features=1024, bias=True)
)
(encoder_attn_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
(fc1): Linear(in_features=1024, out_features=4096, bias=True)
(fc2): Linear(in_features=4096, out_features=1024, bias=True)
(final_layer_norm): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
)
)
(layernorm_embedding): LayerNorm((1024,), eps=1e-05, elementwise_affine=True)
)
)
我们已经熟悉BART模型中的大多数层。该模型由编码器和解码器组件组成,每个组件有12层。此外,特别是解码器组件,包含一个额外的encoder_attn层,称为交叉注意力。交叉注意力组件将基于编码器表示来调整解码器的输出。我们可以使用transformers的pipeline功能和微调后的模型进行总结。
from transformers import pipeline
summarizer = pipeline("summarization", model="facebook/bart-large-cnn")
sum = summarizer("""Gaga was best known in the 2010s for pop hits like “Poker Face” and avant-garde experimentation on albums like “Artpop,” and Bennett, a singer who mostly stuck to standards, was in his 80s when the pair met. And yet Bennett and Gaga became fast friends and close collaborators, which they remained until Bennett’s death at 96 on Friday. They recorded two albums together, 2014’s “Cheek to Cheek” and 2021’s “Love for Sale,” which both won Grammys for best traditional pop vocal album.""", min_length=20, max_length=50)
print(sum[0]['summary_text'])
输出:
Bennett and Gaga became fast friends and close collaborators.
They recorded two albums together, 2014's "Cheek to Cheek" and 2021's
"Love for Sale"
仅编码器架构
仅编码器模型是通过堆叠多个编码器组件创建的。由于编码器的输出不能与其他解码器耦合,它只能用作文本到向量的方法来度量相似性。它也可以与顶部的分类头(前馈层)配合使用,帮助进行标签预测(在像Hugging Face这样的库中也称为Pooler层)。
在仅编码器架构中,基本的区别是缺少掩蔽自注意力层。因此,编码器可以同时处理完整的输入。(与解码器不同,在训练期间,未来的标记必须被掩蔽,以避免在生成新标记时“作弊”。)这一特性使得仅编码器模型非常适合从文档中生成向量表示,确保保留所有信息。
BERT文章(或更高质量的变体,如RoBERTa)引入了一个著名的预训练模型,该模型大大提高了各种NLP任务的最先进评分。该模型预训练时考虑了两个学习目标:
- 掩蔽语言建模:遮蔽输入中的随机标记,并尝试预测这些掩蔽的标记。
- 下一个句子预测:呈现句子对,并确定第二个句子是否在文本序列中逻辑上跟随第一个句子。
from transformers import AutoModel
BERT = AutoModel.from_pretrained("bert-base-uncased")
print(BERT)
输出:
BertModel(
(embeddings): BertEmbeddings(
(word_embeddings): Embedding(30522, 768, padding_idx=0)
(position_embeddings): Embedding(512, 768)
(token_type_embeddings): Embedding(2, 768)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(encoder): BertEncoder(
(layer): ModuleList(
(0-11): 12 x BertLayer(
(attention): BertAttention(
(self): BertSelfAttention(
(query): Linear(in_features=768, out_features=768, bias=True)
(key): Linear(in_features=768, out_features=768, bias=True)
(value): Linear(in_features=768, out_features=768, bias=True)
(dropout): Dropout(p=0.1, inplace=False)
)
(output): BertSelfOutput(
(dense): Linear(in_features=768, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
(intermediate): BertIntermediate(
(dense): Linear(in_features=768, out_features=3072, bias=True)
(intermediate_act_fn): GELUActivation()
)
(output): BertOutput(
(dense): Linear(in_features=3072, out_features=768, bias=True)
(LayerNorm): LayerNorm((768,), eps=1e-12, elementwise_affine=True)
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
)
(pooler): BertPooler(
(dense): Linear(in_features=768, out_features=768, bias=True)
(activation): Tanh()
)
)
BERT模型采用传统的Transformer架构,具有12个堆叠的编码器块。然而,网络的输出将传递到一个pooler层,这是一种前馈线性层,随后是非线性激活函数,用于构建最终的表示。该表示将用于其他任务,如分类和相似性评估。下面的代码使用微调后的BERT模型进行情感分析:
from transformers import pipeline
classifier = pipeline("text-classification", model="nlptown/bert-base-multilingual-uncased-sentiment")
lbl = classifier("""This restaurant is awesome.""")
print(lbl)
输出:
[{'label': '5 stars', 'score': 0.8550480604171753}]
仅解码器架构
今日的大型语言模型主要使用仅解码器网络作为基础,并偶尔进行小的修改。由于集成了掩蔽自注意力机制,这些模型主要集中于预测下一个标记,这也催生了提示(prompting)的概念。
根据研究,扩大仅解码器模型的规模可以显著提升网络的语言理解和泛化能力。因此,人们可以通过使用不同的提示来在各种任务中表现出色。大型预训练模型,如GPT-4和LLaMA 2,可以通过利用相关指令来执行分类、总结、翻译等任务。
大型语言模型,如GPT系列,使用了因果语言建模目标进行预训练。这意味着模型试图预测下一个单词,而注意力机制只能关注左侧的先前标记。这意味着模型只能基于之前的上下文预测下一个标记,而不能窥探未来的标记,从而避免了作弊。
from transformers import AutoModel
gpt2 = AutoModel.from_pretrained("gpt2")
print(gpt2)
输出:
GPT2Model(
(wte): Embedding(50257, 768)
(wpe): Embedding(1024, 768)
(drop): Dropout(p=0.1, inplace=False)
(h): ModuleList(
(0-11): 12 x GPT2Block(
(ln_1): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(attn): GPT2Attention(
(c_attn): Conv1D()
(c_proj): Conv1D()
(attn_dropout): Dropout(p=0.1, inplace=False)
(resid_dropout): Dropout(p=0.1, inplace=False)
)
(ln_2): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
(mlp): GPT2MLP(
(c_fc): Conv1D()
(c_proj): Conv1D()
(act): NewGELUActivation()
(dropout): Dropout(p=0.1, inplace=False)
)
)
)
(ln_f): LayerNorm((768,), eps=1e-05, elementwise_affine=True)
)
通过查看架构,您会发现标准的变换器解码器块,没有交叉注意力层。GPT系列还使用了独特的线性层(Conv1D)来转置权重。(请注意,这与PyTorch的卷积层不同!)这种设计选择是OpenAI特有的,其他大型开源语言模型使用的是传统的线性层。以下代码展示了如何将GPT-2模型用于文本生成。它生成了四种可能的方式来完成句子:“这部电影非常”。
from transformers import pipeline
generator = pipeline(model="gpt2")
output = generator("This movie was a very", do_sample=True,
top_p=0.95, num_return_sequences=4, max_new_tokens=50, return_full_text=False)
for item in output:
print(">", item['generated_text'])
输出示例:
> hard thing to make, but this movie is still one of the most amazing shows I've seen in years. You know, it's sort of fun for a couple of decades to watch, and all that stuff, but one thing's for sure —
> special thing and that's what really really made this movie special," said Kiefer Sutherland, who co-wrote and directed the film's cinematography. "A lot of times things in our lives get passed on from one generation to another, whether
> good, good effort and I have no doubt that if it has been released, I will be very pleased with it."
> enjoyable one for the many reasons that I would like to talk about here. First off, I'm not just talking about the original cast, I'm talking about the cast members that we've seen before and it would be fair to say that none of
💡 请注意,由于生成过程中的随机性,上述代码运行的输出会有所不同。
生成预训练变换器(GPT)架构
OpenAI的生成预训练变换器(GPT)是一种基于变换器的语言模型。其名称中的“变换器”部分指的是其变换器设计,该设计在Vaswani等人的研究论文《Attention is All You Need》中首次提出。
与传统的递归神经网络(RNN)不同,RNN由于梯度消失问题在处理长期依赖时存在困难。长短期记忆(LSTM)网络引入了具有记忆单元的更复杂架构,可以在较长的序列中维持信息。然而,RNN和LSTM仍然依赖于顺序处理。相反,变换器架构放弃了递归,转而使用自注意力机制,这通过允许序列数据的并行处理显著提高了速度和可扩展性。
GPT架构
GPT系列包含仅解码器模型,每一层都配备了自注意力机制和逐位置全连接的前馈网络。
缩放点积注意力是一种自注意力技术,使模型在生成后续单词时能够为输入序列中的每个单词分配重要性分数。此外,“掩蔽”是这一架构中的一个突出元素。这种掩蔽在自注意力过程中缩小了模型的关注范围,禁止模型检查序列中的某些位置或单词。
以下代码实现了“掩蔽自注意力”机制:
import numpy as np
def self_attention(query, key, value, mask=None):
# 计算注意力分数
scores = np.dot(query, key.T)
if mask is not None:
# 通过将掩蔽位置设置为一个大负值来应用掩蔽
scores = scores + mask * -1e9
# 应用Softmax以获得注意力权重
attention_weights = np.exp(scores) / np.sum(np.exp(scores), axis=-1, keepdims=True)
# 计算值向量的加权和
output = np.dot(attention_weights, value)
return output
初步步骤包括为输入序列中的每个词创建一个查询、键和值向量。这是通过对输入向量应用不同的线性变换实现的。本质上,这是一种简单的前馈线性层,模型在训练过程中获得这种层。
接下来,模型通过计算每个词的查询向量与所有其他词的键向量之间的点积来计算注意力分数。为了确保模型在注意力过程中忽略某些短语,通过为特定位置的分数分配显著负值来应用掩蔽。SoftMax函数随后将这些注意力分数转换为概率,从而消除显著负值的影响。随后,每个值向量乘以其对应的权重并相加,生成掩蔽自注意力机制的输出。
虽然这个描述说明了单个自注意力头的功能,但需要注意的是,每一层通常包含多个头,数量从16到32不等,具体取决于模型架构。这些多个头同时工作,显著增强了模型的数据分析和解读能力。
因果语言建模
大型语言模型(LLMs)使用自监督学习来在具有软真实标签的数据上进行预训练,这样在训练过程中不需要显式标签。这些数据可以是我们已经知道下一个单词的文本,或者例如,来自Instagram的带有标题的图像。这允许LLMs自行学习。例如,使用监督学习来训练一个摘要模型需要使用文章及其摘要作为训练参考。另一方面,LLMs使用因果语言建模目标来从文本数据中学习,而无需人工提供的标签。为什么称之为“因果”?因为每一步的预测完全基于序列中的先前步骤,而不是未来的步骤。
💡 过程包括向模型提供一部分文本,并指示其预测下一个单词。
在模型预测一个单词后,它与原始输入串联,并呈现给模型以预测下一个标记。这一迭代过程持续进行,每个新生成的标记都被输入到网络中。在预训练过程中,模型逐渐获得了对语言和语法的广泛理解。随后,预训练模型可以通过监督方法针对各种任务或特定领域进行微调。
这种方法相较于其他方法的优点是更接近人类的自然书写和说话方式。与掩蔽语言建模不同,掩蔽语言建模在输入中引入掩蔽标记,而因果语言建模则是逐字生成句子。这种区别确保了模型在处理没有掩蔽标记的真实世界文本时仍然有效。
此外,这种技术允许使用来自书籍、维基百科和新闻网站等来源的广泛优质人类生成内容。知名数据集可以从像Hugging Face Hub这样的平台上轻松获取。
MinGPT
GPT架构有多种实现,每种实现都针对特定的目的进行调整。虽然我们将在接下来的章节中讨论更适合生产环境的替代库,但值得强调的是由Andrej Karpathy开发的OpenAI GPT-2模型的轻量级版本,称为minGPT。
Karpathy将minGPT描述为一个教育工具,旨在简化GPT结构。值得注意的是,它被浓缩为大约300行代码,并使用了PyTorch库。其简单性使其成为深入理解此类模型内部工作原理的绝佳资源。代码经过详细描述,提供了过程的清晰解释。
minGPT库中有三个主要的文件至关重要。模型的架构在model.py文件中详细描述。分词通过bpe.py文件处理,该文件采用了字节对编码(BPE)技术。trainer.py文件包含一个通用的训练循环,可以用于任何神经网络,包括GPT模型。此外,demo.ipynb笔记本展示了代码的整个应用,包括推理过程。这个代码足够轻量化,可以在MacBook Air上运行,允许在本地PC上进行简单实验。那些更喜欢基于云的解决方案的人可以克隆这个库,并在像Colab这样的平台上使用它。
大规模多模态模型简介
多模态模型旨在处理和解释各种数据类型或模态,如文本、图像、音频和视频。这种综合方法使得分析更加全面,而不仅仅是像传统LLM那样限制于单一数据类型(如文本)。例如,通过将文本提示与音频或视觉输入结合,这些模型能够理解信息的更复杂表现,考虑到诸如语音细微差别或视觉背景等因素。
最近对LLM的兴趣自然延伸到探索LMM(大规模多模态模型)的潜力,目标是创建能够处理广泛任务的通用助手。
常见架构与训练目标
根据定义,多模态模型旨在处理多个输入模态,如文本、图像和视频,并生成多种模态的输出。然而,目前流行的LMM的一个显著子集主要接受图像输入,并只能生成文本输出。这些专门化的LMM通常以预训练的大规模视觉或语言模型为基础,被称为“图像到文本生成模型”或视觉语言模型(VLMs)。它们通常进行图像理解任务,如问答和图像描述。例如,包括微软的GIT、SalesForce的BLIP2和DeepMind的Flamingo。
模型架构
在这些模型的架构中,使用图像编码器来提取视觉特征,随后使用标准语言模型生成文本序列。图像编码器可能基于卷积神经网络(CNN),例如ResNet,或者使用基于变换器的架构,如视觉变换器(ViT)。
训练有两种主要方法:从头开始构建模型或利用预训练模型。后者在高级模型中通常更受青睐。一个显著的例子是OpenAI的CLIP模型中的预训练图像编码器。在语言模型方面,有多种预训练选项可用,包括Meta的OPT、LLaMA 2或Google的FlanT5,这些都是经过指令训练的。
一些模型,如BLIP2,融入了一个新颖的元素:一个可训练的轻量级连接模块,用于连接视觉和语言模态。这种方法通过仅训练连接模块实现了成本效益和时间效率。此外,它在图像理解任务中展示了强大的零样本性能。
训练目标
LMM使用自回归损失函数应用于输出标记。当采用视觉变换器架构时,引入了类似于文本标记的“图像标记”概念。这样,文本可以被拆分成更小的单元,如句子、单词或子词,以加快处理速度,而图像可以被分割成较小的、不重叠的补丁,称为“图像标记”。
在LMM使用的变换器架构中,特定的注意力机制至关重要。在这里,图像标记可以“关注”彼此,影响模型中每个标记的表示。此外,每个文本标记的生成受到了所有先前生成的图像和文本标记的影响。
训练方案的差异
尽管具有相同的训练目标,不同的语言多模态模型(LMM)在训练策略上存在显著差异。大多数模型,如GIT和BLIP2,仅使用图像-文本对进行训练。这种方法有效地建立了文本和图像表示之间的联系,但需要大量精心策划的图像-文本对数据集。
另一方面,Flamingo设计为接受多模态提示,这些提示可以包括图像、视频和文本的组合,并生成开放式文本响应。这种能力使其能够有效地执行图像描述和视觉问答等任务。Flamingo模型包括架构上的改进,使其能够用未标记的网页数据进行训练。它处理从4300万网页的HTML中提取的文本和图像。此外,模型评估图像相对于文本的位置,使用文档对象模型(DOM)中文本和图像元素的相对位置。
不同模态的集成通过一系列步骤实现。最初,Perceiver Resampler模块处理来自视觉数据(如图像或视频)的时空特征,这些特征由预训练的视觉编码器处理。Perceiver随后生成固定数量的视觉标记。
这些视觉标记对一个冻结的语言模型进行条件处理,这个预训练的语言模型在此过程中不会更新。条件处理是通过添加新初始化的交叉注意力层到语言模型的现有层中实现的。与其他组件不同,这些层在训练期间不是静态的,而是会被更新。虽然这种架构由于参数数量的增加相比BLIP2可能效率较低,但它为语言模型整合和解释视觉信息提供了更复杂的手段。
少样本上下文学习
Flamingo的灵活架构允许使用多模态提示进行训练,这些提示将文本与视觉标记交替排列。这使得模型能够展示出新兴能力,例如类似于GPT-3的少样本上下文学习。
Flamingo的开源
正如其研究论文中报告的那样,Flamingo模型所展示的进展标志着语言-多模态模型(LMMs)的重要进展。尽管取得了这些成就,DeepMind尚未将Flamingo模型公开发布。
为此,Hugging Face团队启动了一个开源版本的Flamingo,名为IDEFICS。该版本完全基于公开可用的资源,包含了LLaMA v1和OpenCLIP模型等元素。IDEFICS有两个版本:'base’和’instructed’变体,每个版本有两个大小,分别为90亿和800亿参数。IDEFICS的性能与Flamingo模型相当。
Hugging Face团队在训练这些模型时,利用了包括维基百科、公共多模态数据集和LAION在内的公开数据集。此外,他们编制了一个名为OBELICS的新数据集,这是一个1150亿标记的数据集,包含了141百万个图像-文本文档和353百万张图像。该数据集与DeepMind为Flamingo模型描述的数据集类似。
除了IDEFICS之外,另一个开源Flamingo副本,称为Open Flamingo,也已公开。9亿参数的模型展示了与Flamingo相似的性能。IDEFICS的演示链接可以在towardsai.net/book上访问。
指令调优的LMMs
正如GPT-3在少样本提示中的新兴能力所展示的那样,模型能够处理训练期间未见过的任务,对指令调优的LMMs兴趣日益增加。通过允许模型进行指令调优,我们可以期望这些模型能够执行更广泛的任务,并更好地对齐人类意图。这与OpenAI的InstructGPT和最近的GPT-4的工作一致。它们突出了最新迭代“GPT-4 with vision”模型的能力,该模型可以处理视觉输入的指令。这一进展在其GPT-4技术报告和GPT-4V(视觉)系统卡中进行了详细描述。
OpenAI多模态GPT-4发布后的进展
在OpenAI发布了多模态GPT-4之后,对指令调优的语言-多模态模型(LMMs)的研究和开发显著增加。多个研究实验室在这一不断增长的领域作出了贡献,推出了如LLaVA、MiniGPT-4和InstructBlip等模型。这些模型与早期的LMMs在架构上有相似之处,但专门在为遵循指令设计的数据集上进行训练。
探索LLaVA——一种指令调优的LMM
LLaVA是一种指令调优的语言-多模态模型(LMM),其网络架构类似于前述模型。它将预训练的CLIP视觉编码器与Vicuna语言模型结合。一个简单的线性层,作为投影矩阵,促进了视觉和语言组件之间的连接。这个矩阵,称为W,旨在将图像特征转换为语言嵌入标记。这些标记的维度与语言模型的词嵌入空间匹配,确保了无缝集成。
在设计LLaVA时,研究人员选择了这些新的线性投影层,它们比BLIP2中使用的Q-Former连接模块和Flamingo的Perceiver Resampler及交叉注意力层更轻便。这一选择体现了在模型架构中的高效性和简洁性。
该模型使用两阶段指令调优过程进行训练。首先,投影矩阵在由图像-标题对组成的CC3M数据集子集上进行预训练。接下来,模型进行端到端的微调。在这一阶段,投影矩阵和语言模型在为日常用户应用特别构建的多模态指令遵循数据集上进行训练。
此外,作者使用GPT-4创建了一个带有多模态指令的合成数据集。这通过利用广泛可用的图像对数据来实现。在数据集构建过程中,GPT-4接收到图像的符号表示,包括标题和边界框的坐标。这些COCO数据集的表示作为GPT-4生成训练样本的提示。
这种技术生成了三种类型的训练样本:问答对话、详细描述以及复杂的推理问题和答案。通过这种技术生成的训练样本总数为158,000个。
LLaVA模型展示了使用仅有语言功能的GPT-4进行视觉指令调优的高效性。研究人员通过使用与GPT-4报告中的相同查询和图像来展示其能力。他们还描述了通过微调ScienceQA(一种拥有21k多模态多选题的基准测试,涉及三个学科、26个主题、127个类别和379种能力)而达到的新SOTA(最先进技术)。
超越视觉和语言
最近几个月,图像到文本生成模型在大规模多模态模型(LMM)领域占据了主导地位。然而,还有其他模型包含了视觉和语言以外的模态。例如,PandaGPT被设计为处理任何输入数据类型,这得益于其与ImageBind编码器的集成。还有SpeechGPT,这是一种将文本和语音数据整合在一起并生成语音和文本的模型。此外,NExT-GPT是一个多功能模型,能够接收和生成任何模态的输出。
HuggingGPT是一个创新的解决方案,它与Hugging Face平台合作。其中央控制器是一个大型语言模型(LLM)。这个LLM确定哪个Hugging Face模型最适合某个任务,选择该模型,然后返回模型的输出。
无论我们考虑LLMs、LMMs还是刚才提到的所有模型类型,仍然有一个问题:我们应该使用专有模型、开放模型还是开源模型?
要回答这个问题,我们首先需要了解这三种类型的模型。
专有模型 vs. 开放模型 vs. 开源语言模型
语言模型可以分为三种类型:专有模型、开放模型和开源模型。专有模型,如OpenAI的GPT-4和Anthropic的Claude 3 Opus,仅通过付费API或网络接口访问。开放模型,如Meta的LLaMA 2或Mistral的Mixtral 8x7B,其模型架构和权重在互联网上公开。最后,开源模型如AI2的OLMo提供了完整的预训练数据、训练代码、评估代码和模型权重,使学术界和研究人员能够深入重建和分析模型。
专有模型
专有模型通常在性能上优于开放替代品,因为公司希望保持其竞争优势。这些模型往往规模较大,并经历广泛的微调过程。截至2024年4月,专有模型在LYMSYS Chatbot Arena排行榜上持续领先。该排行榜通过Elo排名系统不断收集人类偏好投票来排名LLMs(大型语言模型)。
一些提供专有模型的公司,如OpenAI,允许对其LLMs进行微调,使用户能够优化特定用例和定义的使用政策中的任务性能。这些政策明确规定用户必须遵守保护措施,不得从事非法活动。开放权重和开源模型允许完全自定义,但需要大量的实施和计算资源来运行。在检查可靠性时,专有模型的服务停机时间必须考虑,因为这可能会中断用户访问。
在选择专有和开放AI模型时,需要考虑用户或组织的需求、可用资源和成本等因素。对于开发者,建议在初始开发阶段从可靠的专有模型开始,只有在产品在市场上获得认可后才考虑开源替代品,因为实现开源模型所需的资源较高。
以下是截至2024年4月的一些值得注意的专有和开放模型。文档链接可以访问 towardsai.net/book。
Cohere LLMs
Cohere是一个使开发者和企业能够创建由语言模型(LLMs)驱动的应用程序的平台。Cohere提供的LLM模型分为三个主要类别——“Command”、“Rerank”和“Embed”。“Command”类别用于聊天和长上下文任务,“Rerank”用于按语义相关性排序文本输入,“Embed”用于创建文本嵌入。
Cohere最新的Command R模型类似于OpenAI的LLMs,并使用来自互联网的大量数据进行训练。它优化了检索增强生成(RAG)系统和工具使用任务。Command R模型具有128,000个标记的上下文长度,并在十种主要语言中表现出色。
这些模型的开发正在进行中,定期发布新的更新和改进。
有兴趣探索Cohere模型的用户可以 注册Cohere账户 并获取免费的试用API密钥。此试用密钥没有信用或时间限制,但API调用限制为每分钟100次,这通常足够用于实验项目。
为了安全存储API密钥,建议将其保存在 .env 文件中,如下所示。
COHERE_API_KEY="<YOUR-COHERE-API-KEY>"
然后,使用以下命令安装cohere Python SDK。
pip install cohere
现在可以使用Cohere生成文本,代码如下。
import cohere
co = cohere.Client('<<apiKey>>')
response = co.chat(
chat_history=[
{"role": "USER", "message": "谁发现了重力?"},
{"role": "CHATBOT", "message": "被广泛认为发现重力的人是艾萨克·牛顿爵士"}
],
message="他是哪一年出生的?", # 在回答问题之前进行网页搜索。你也可以使用你自己的自定义连接器。
connectors=[{"id": "web-search"}]
)
print(response)
OpenAI的GPT-3.5和GPT-4
OpenAI目前提供两种先进的大型语言模型,GPT-3.5和GPT-4,每种模型都有其更快的“Turbo”版本。
GPT-3.5以其成本效益和生成类人文本的能力而闻名,适用于基本的聊天应用程序和其他生成语言任务。Turbo变体更快且更便宜,是寻求廉价但高性能LLMs的开发者的理想选择。虽然主要优化了英语,但它在各种语言中的表现也相当出色。
OpenAI通过付费API提供其语言模型。Azure聊天解决方案加速器还利用Azure Open AI服务在企业环境中集成这些模型,重点关注GPT-3.5。该平台增强了管理和安全性,使组织能够在其Azure订阅中建立一个安全和私密的聊天环境,提供个性化的用户体验,优先考虑隐私和控制。
OpenAI还提供GPT-4和GPT-4 Turbo,代表了OpenAI在LLMs和模型多模态性的顶峰。与其前身不同,GPT-4 Turbo可以处理文本和图像输入,尽管它仅生成文本输出。GPT-4变体家族目前是大型模型性能的最先进技术。
像所有当前的OpenAI模型一样,GPT-4的训练细节和参数仍然保密。然而,其多模态性代表了AI开发的重大突破,为理解和生成各种格式的内容提供了无与伦比的能力。
Anthropic的Claude 3模型
Claude 3是Anthropic最新的一系列大型语言模型(LLMs),在广泛的认知任务中设立了新的行业标准。该系列包括三个最先进的模型:Claude 3 Haiku、Claude 3 Sonnet和Claude 3 Opus。每个后续模型在性能上都更为强大,使用户可以根据其特定应用选择最佳的性能、速度和成本平衡。
截至2024年4月,Claude 3 Opus在LMSYS Chatbot Arena排行榜上名列前茅。
所有Claude 3模型都有一个200K标记的上下文窗口,能够处理多达100万个标记的输入。100万标记窗口将在短期内提供给选定客户。这些模型在分析、预测、细致内容创作、代码生成和非英语语言对话方面展示了更高的能力。
Claude 3模型采用了Anthropic的技术,如宪法AI(Constitutional AI),通过使用具有明确指令(宪法)的语言模型来指导自己的模型训练,而不是依赖人类反馈,从而降低品牌风险并力求有用、诚实和无害。Anthropic的预发布过程包括显著的“红队”测试,以评估模型接近AI安全水平3(ASL-3)门槛的程度。Claude 3模型比上一代更易于使用,更擅长遵循复杂指令,并且能够更好地遵循品牌声音和响应指南。
Anthropic计划频繁更新Claude 3模型系列,并引入新功能,以增强其在企业用例和大规模部署中的能力。
Google DeepMind的Gemini
Google最新的LLM,Gemini,是由Google DeepMind开发的先进且多功能的AI模型。Gemini是一个多模态模型,能够处理多种格式,如文本、图像、音频、视频和代码。这使它能够执行多项任务并理解复杂输入。
该模型有三个版本:Gemini Ultra,适用于复杂任务,其性能可与GPT-4媲美;Gemini Pro,适用于各种任务;以及Gemini Nano,一种小型LLM,适用于设备上的高效性。你可以通过Google AI Studio或Google Vertex AI获取API密钥以使用和构建Gemini应用程序。他们还最近宣布了Gemini Pro 1.5,具有多达100万标记的上下文窗口,使其成为目前大型基础模型中具有最长上下文窗口的模型。
Meta的LLaMA 2
LLaMA 2是Meta AI开发的最先进的LLM,于2023年7月18日以开放许可发布,供研究和商业用途。
Meta的详细77页出版物概述了LLaMA 2的架构,方便其重建和定制以适应特定应用。LLaMA 2在一个包含2万亿标记的大型数据集上进行训练,根据人类评估指标,其性能与GPT-3.5相当,设立了开源基准的新标准。
LLaMA 2有三种参数大小——7B、13B和70B,并且还包括被称为LLaMA-Chat的指令调优版本。
其微调采用了监督微调(SFT)和人类反馈强化学习(RLHF),采用了一种基于提示进行数据分段的创新方法,以保证安全性和有用性。即使这听起来令人畏惧,我们将在下一章中深入讨论SFT和RLHF。
奖励模型对其性能至关重要。LLaMA 2使用不同的安全性和有用性奖励模型来评估响应质量,达到两者之间的平衡。
LLaMA 2对生成AI领域做出了重要贡献,超越了其他开源创新模型,如Falcon或Vicuna,在性能方面表现更佳。
Mistral的Mixtral
Mistral的Mixtral是一款开源LLM,代表了最新的开源模型家族的技术进步。Mixtral有两个重要特性:它在大规模数据集上进行了训练,包括大量来自Web和其他多样化来源的数据;以及它是一个混合模型,在开发中将不同模型的优点结合起来。
Mixtral在多种任务上表现优异,特别是在分析、生成和预测任务中,显示出与领先专有模型相媲美的能力。
LLMs的应用和用例
医疗和医学研究
生成式人工智能显著提升了医疗领域的患者护理、药物发现和运营效率。在诊断方面,生成式人工智能在患者监测和资源优化方面取得了显著进展。大型语言模型(LLM)在数字病理学中的应用显著提高了疾病检测的准确性,包括癌症。此外,这些模型还帮助自动化行政任务,简化工作流程,使临床人员能够专注于患者护理的关键方面。
制药行业因生成式人工智能而经历了变革。这项技术加快了药物发现过程,提高了药物治疗的精确性,缩短了药物开发时间,并降低了成本。这一进展为个性化治疗和靶向疗法打开了大门,对患者护理前景广阔。
医疗科技公司也在利用生成式人工智能开发针对患者的个性化设备。通过将生成式人工智能融入设计过程,医疗设备可以针对个体患者的需求进行优化,提高治疗效果和患者满意度。
例如,Google开发的Med-PaLM是一个旨在提供准确医学咨询答案的LLM。它是一个多模态生成模型,能够处理各种生物医学数据,包括临床文本、医学图像和基因组数据,使用统一的模型参数。另一个值得注意的例子是BioMedLM,它是由斯坦福大学基础模型研究中心(CRFM)和MosaicML创建的生物医学文本领域专用LLM。
金融
像GPT这样的LLM在金融领域变得越来越有影响力,为金融机构提供了新的客户互动和风险管理方式。这些模型在金融领域的主要应用之一是增强数字平台上的客户互动。模型被用于通过聊天机器人或基于人工智能的应用程序改善用户体验,提供高效、无缝的客户支持,对询问和问题做出实时响应。
LLM还在金融时间序列数据分析中做出了重大贡献。这些模型利用来自股票交易所的大量数据集,为宏观经济分析和股票市场预测提供了关键洞察。它们预测市场趋势和识别潜在投资机会的能力对于做出明智的金融决策非常有用。
金融领域中LLM应用的一个例子是Bloomberg开发的BloombergGPT。这个模型在综合使用一般文档和领域专用文档的训练中表现出色,能够在金融自然语言处理任务中提供优越的性能,同时不影响其在其他任务上的表现。
文案写作
语言模型和生成式人工智能对文案写作领域产生了深远影响,提供了强大的内容创作工具。生成式人工智能在文案写作中的应用非常广泛。它可以加速写作过程,克服写作障碍,提高生产力,从而降低成本。此外,它通过学习和复制公司语言模式和风格,有助于保持一致的品牌声音,促进市场营销工作的统一性。
主要用例包括生成网站和博客文章内容、撰写社交媒体更新、撰写产品描述以及优化搜索引擎可见性内容。此外,生成式人工智能在为移动应用程序创建定制内容方面发挥了重要作用,将内容适应不同平台和用户体验。
Jasper是一个利用LLM简化生成各种营销内容的工具。用户可以从一组预定义的风格中进行选择,或捕捉公司的独特语调。
教育
LLM在在线学习和个性化辅导中变得越来越有价值。通过评估个人学习进度,这些模型提供量身定制的反馈、适应性测试和定制学习干预措施。
为了应对教师短缺,LLM提供了可扩展的解决方案,如虚拟教师或通过先进工具增强助教能力。这使教育工作者能够转变为导师和指导者角色,提供个性化支持和互动学习体验。
人工智能分析学生表现数据的能力使得学习体验个性化,适应每个学生的独特需求和学习节奏。
教育领域中LLM的一个例子是Khan Academy的Khanmigo。在这个应用中,LLM充当虚拟导师,提供详细的解释和示例,增强对各种学科的理解。此外,它们通过生成语法和词汇练习的句子,支持语言学习,对语言能力的提升贡献显著。
编程
在编程中,LLM和生成式人工智能正成为不可或缺的工具,为开发者提供了重要的帮助。像GPT-4及其前身的模型擅长从自然语言提示中生成代码片段,从而提高程序员的效率。这些模型经过大量代码样本的训练,能够理解上下文,逐步提高生成相关且准确代码的能力。
LLM在编码中的应用多种多样且有价值。它们通过在开发者输入时提供代码片段建议,促进代码补全,从而节省时间并减少错误。LLM还用于生成单元测试和自动创建测试用例,从而提高代码质量,并有助于软件维护。
然而,生成式人工智能在编码中的使用也存在挑战。尽管这些工具可以提高生产力,但开发者必须彻底审查生成的代码,以确保其无错误或安全漏洞。此外,还需仔细监控和验证模型的准确性。
一个利用LLM进行编程的显著产品是GitHub Copilot。该工具在数十亿行代码的基础上进行训练,能够将自然语言提示转化为各种编程语言的编码建议。
法律行业
在法律领域,LLM和生成式人工智能被证明是有用的资源,提供了多种应用,满足了该领域的独特需求。这些模型擅长处理法律语言的复杂性、解释和不断发展的法律环境。它们可以显著协助法律专业人员完成各种任务,如提供法律建议、理解复杂的法律文件和分析法庭案件中的文本。
所有法律领域中的LLM应用的一个关键目标是减少不准确性,通常称为“幻觉”,这是这些模型的一个显著问题。通过结合领域特定的知识,无论是通过参考模块还是从可靠的知识库中提取,都可以使这些模型产生更准确和可靠的结果。
此外,它们可以在用户输入中识别关键法律术语,迅速评估法律情景,从而增强其在法律环境中的实际效用。
使用LLM的风险和伦理考虑
将大型语言模型(LLM)用于现实世界应用时,涉及各种风险和伦理考虑。
一个显著的风险是“幻觉”,即模型生成看似合理但实际上错误的信息。这在医疗、金融和法律等对准确性至关重要的敏感领域中可能产生深远影响。
另一个关注点是“偏见”。LLM可能无意中反映和传播其训练数据中固有的社会偏见。这可能在医疗和金融等关键领域导致不公平的结果。解决这一问题需要专注于彻底的数据评估,推动包容性,并持续提升公平性。
数据隐私和安全也是至关重要的。LLM有可能无意中记忆和披露敏感信息,带来隐私泄露的风险。模型的创建者必须实施数据匿名化和严格的访问控制等措施,以减轻这一风险。
此外,LLM对就业的影响也不能忽视。尽管它们提供了自动化的好处,但必须在保持和重视人类专业知识的同时保持平衡。过度依赖LLM而缺乏足够的人类判断可能是危险的。采用一种将人工智能的优势与人类监督相结合的负责任的方法,对于有效和伦理的使用至关重要。
回顾
Transformer架构在各种应用中展示了其多功能性。最初的架构是为序列到序列任务(即输入一个序列并根据它生成输出)设计的,如翻译。Transformer架构的下一次演变始于引入仅编码器模型,如BERT,随后是仅解码器网络的引入,这在第一代GPT模型中得到了体现。然而,一些构建模块,如嵌入层和注意力机制,在编码器和解码器组件中都是共享的。
我们通过加载预训练模型并提取其重要组件来介绍了模型的结构。我们还观察了LLM背后的工作原理,特别是模型的核心组件:注意力机制。自注意力机制是Transformer模型的核心,它计算短语中所有单词嵌入的加权总和。
尽管Transformer论文提出了一种高效的架构,但通过对代码进行小的修改,如改变嵌入的大小和隐藏层的维度,已经探索了各种架构。实验还表明,将批量归一化层移到注意力机制之前可以提升模型的能力。需要记住的是,设计上可能会有细微的差别,特别是对于像GPT-3这样的专有模型,它们尚未公开源代码。
尽管LLM可能看起来是任何工作的终极解决方案,但重要的是要记住,更小、更专注的模型可能会在运行效果上提供类似的结果。对于某些特定应用,使用像DistilBERT这样的简单模型在本地服务器上进行相似度测量可能更合适,同时也为专有模型和API提供了一种经济实惠的替代方案。
GPT系列模型是解码器仅架构的一个例子。GPT系列对近期大型语言模型的进展至关重要,理解Transformer架构并认识到仅解码器模型的独特特征是关键。这些模型在处理语言处理任务方面表现出色。在这次讨论中,我们分析了它们共享的组件和构成它们架构的因素。最初,GPT模型被设计为逐个标记地完成输入文本。一个有趣的问题是这些自动补全模型如何演变成强大的“超级模型”,能够跟随指令并执行各种任务。
对LLM的兴趣激增自然扩展到探索LMM的潜力,旨在创建通用的多功能助手。在这些模型的架构中,使用图像编码器提取视觉特征,随后是标准语言模型生成文本序列。一些混合视觉和语言的最受欢迎的模型包括OpenAI的多模态GPT-4、LLaVA、MiniGPT-4和InstructBlip。先进的LMM可以包含更广泛的模态。这些模型在未见过的问题上进行更广泛的泛化,通过指令调优提高能力。
语言模型可以分为三种类型:专有模型、开放模型和开源模型。专有模型,如OpenAI的GPT-4和Anthropic的Claude 3 Opus,仅通过付费API或网络接口访问。开放模型,如Meta的LLaMA 2或Mistral的Mistral 7B,其模型架构和权重在互联网上公开可用。最后,开源模型如AI2的OLMo提供完整的预训练数据、训练代码、评估代码和模型权重,使学术界和研究人员能够深入重建和分析模型。其他一些例子包括,TII的Falcon模型表现出色且具有独特的训练数据,Databricks的Dolly 2.0具有高质量的指令数据集和开放许可,以及通过社区驱动开发实现LLM普及的Open Assistant倡议。
尽管LLM对各个行业产生了变革性影响,但在现实世界部署中仍存在幻觉、偏见、数据隐私和人工智能对就业的影响等问题。
如何学习AI大模型?
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;
第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;
第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;
第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;
第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;
第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;
第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。
👉学会后的收获:👈
• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;
• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;
• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;
• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。
1.AI大模型学习路线图
2.100套AI大模型商业化落地方案
3.100集大模型视频教程
4.200本大模型PDF书籍
5.LLM面试题合集
6.AI产品经理资源合集
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓