文章目录
预训练模型与Transformer
大语言模型里的预训练模型是什么
大语言模型中的预训练模型是指经过大规模无标注文本数据训练得到的一种深度学习模型,主要用于提升模型对自然语言的理解和生成能力。
在预训练阶段,模型通过自我监督学习(如遮蔽语言模型或下一句预测任务)等方式,从海量文本数据中学习语言的通用特征、语法结构、词汇关系和潜在语义等信息。
预训练模型通常基于Transformer架构(如BERT、GPT系列等),在训练时并不关注特定的任务目标,而是旨在捕捉普遍的语言规律。当预训练完成后,这样的模型可以作为基础模型,针对具体的下游自然语言处理任务进行微调(Fine-tuning),即在预训练模型的基础上附加一层或多层,并调整整个模型参数以适应新的任务数据,从而实现高效且准确的文本分类、问答系统、语义解析、机器翻译等各种NLP任务的解决方案。预训练模型由于具备丰富的语言先验知识,显著减少了针对新任务从零开始训练所需的数据量和时间成本。
Google Transformer
指的是2017年由Google团队在论文《Attention is All You Need》中首次提出的Transformer神经网络架构。这一架构彻底改变了自然语言处理(NLP)领域,尤其是对于序列建模任务,它引入了自注意力机制来替代传统的循环神经网络(RNNs)和卷积神经网络(CNNs),从而显著提高了处理长序列数据的能力和训练效率。
抱抱脸Hugging Face Transformer
Hugging Face Transformer是一个开源库,由Hugging Face公司开发并维护,专注于自然语言处理(NLP)领域的高级应用。此库封装了一系列基于Transformer架构的预训练模型,使得用户能够便捷地使用和扩展这些先进的模型,适用于各种NLP任务,如文本分类、文本生成、问答系统、语义解释、机器翻译等。
Transformer模型因其在解决序列到序列(Seq2Seq)和自回归/双向预测任务上的优越表现而闻名,比如知名的BERT(Bidirectional Encoder Representations from Transformers)、GPT(Generative Pretrained Transformer)系列、RoBERTa、ELECTRA等模型均属于Transformer家族。
Hugging Face Transformer库的特点包括:提供简单易用的API,开发者可通过几行Python代码加载预训练模型,并对其进行微调以适应特定任务。支持多种深度学习框架,如PyTorch和TensorFlow,同时也支持两者之间的模型转换。包含大量预训练模型的模型库,这些模型已经在大型文本语料库上进行训练,并且覆盖了多种语言。社区活跃,拥有众多贡献者和使用者,持续增加新的模型和功能。此外,该库还包括对模型量化、分布式训练以及模型部署的支持,使得在不同的硬件平台上部署和运行NLP模型变得更加容易。通过Hugging Face Transformers,研究人员和工程师可以更高效地利用预训练模型技术来解决实际的NLP问题。
抱抱脸hugging face transformer与pytorch里的transform
Hugging Face Transformers 和 PyTorch Transforms(指 torchvision.transforms
或用户自定义的 PyTorch 数据预处理模块)是不同的概念,在自然语言处理(NLP)和计算机视觉(CV)领域有不同的用途。
抱抱脸Hugging Face Transformers:
- 目的: 是一个专门用于 NLP 的 Python 库,它实现了多种预训练的 Transformer 模型,如 BERT、GPT、RoBERTa、DistilBERT 等,以及这些模型在下游任务上的微调功能。
- 功能: 提供了一系列开箱即用的 API 来加载预训练模型、对文本进行编码、进行模型微调以及使用预训练模型进行文本生成、分类、问答等各种 NLP 任务。
- 关联框架: 支持 PyTorch 和 TensorFlow 2.x,可以方便地在两种框架之间切换使用。
PyTorch Transforms:
- 目的: 在 PyTorch 中通常指的是
torchvision.transforms
或类似的用于数据预处理的模块,它们主要用于计算机视觉任务的数据增强和标准化。 - 功能: 提供一系列方法用于图像数据的变换,比如裁剪、旋转、缩放、归一化颜色空间、翻转等,目的是在训练模型之前对原始图像数据进行必要的预处理。
- 应用场景: 主要与图像相关的深度学习项目有关,而非直接用于 NLP。
总结起来,两者之间的异同在于:
- 异:Hugging Face Transformers 关注的是 NLP 领域的预训练模型及应用,而 PyTorch Transforms 更关注 CV 领域的数据预处理。
- 同:虽然它们在具体应用上有显著区别,但都属于深度学习框架 PyTorch 生态的一部分,并且都是为了提高最终模型性能而对输入数据进行合理转换的工具。
如果你指的是 PyTorch 中用于 NLP 数据预处理的部分,那么两者依然不同,因为 Hugging Face Transformers 提供的是整个模型结构和预训练权重,而 PyTorch 中可能涉及的 NLP 预处理步骤更多是指将文本转化为模型所需形式(例如词嵌入、分词、填充等)的过程。
基于Transformer架构的LLM可以分为3类
- Causal Decoder:从左到右的单向注意力。自回归语言模型,预训练和下游应用一致,生成类任务效果好。训练效率高。Zero-Shot能力强,涌现能力。如GPT系列、LLaMA、BLOOM、OPT
- Encoder-Decoder:输入双向注意力,输出单向注意力。对问题的编码理解更充分,在偏理解的NLP任务上表现相对较好,缺点是在长文本生成任务上效果较差,训练效率低。如T5、Flan-T5、BART
- Prefix Decoder:输入双向注意力,输出单向注意力。前两者的折中。训练效率也低。如GLM、ChatGLM、U-PaLM
Prefix Decoder是一种结合了双向注意力机制和自回归生成特点的语言模型架构。相比于Causal Decoder(仅使用过去的上下文进行预测)和Encoder-Decoder(分别处理编码和解码两个阶段,解码部分依然具有自回归性)架构,Prefix Decoder做了如下改进:
- 双向输入注意力:
- 在编码阶段,Prefix Decoder允许模型对输入序列进行双向注意力处理,这意味着模型能够全面地理解输入文本的所有上下文信息,而不受自回归约束。
- 带条件的自回归输出:
- 虽然在输出阶段,Prefix Decoder同样采用自回归方式生成下一个词,但它会在生成过程中利用已经“预先”生成的部分作为额外的输入上下文。这种设计允许模型在生成后续文本时参考已生成的部分,从而实现某种程度上的双向信息流动。
- 训练与推理策略:
- 在训练过程中,Prefix Decoder通常会先用完整的输入和输出序列进行学习,然后在推理时逐步生成输出,每次生成新词时都将其添加到输入中作为额外的上下文提示。这样既保持了解码过程的因果性,又在一定程度上克服了Causal Decoder无法回看生成历史的问题。
例如,GLM (Generative Pretrained Transformer) 和 ChatGLM 等模型采用了Prefix Decoder的设计思路,它们能在生成式任务中更好地利用上下文信息,尤其适用于那些需要综合考虑前后语境的复杂文本生成场景,如聊天机器人对话或者续写文本等任务。然而,由于增加了对已生成部分的依赖和计算,Prefix Decoder在训练和推理速度上可能不如纯粹的Causal Decoder架构高效。但是,它作为一种折中方案,旨在提高生成质量的同时尽可能保留模型的实用性。
ChatGLM3-6B与国内其他主流大语言模型架构之间的异同
- 注意:以下内容仅为推测。
ChatGLM系列是清华大学团队研发的大规模语言模型。
关于ChatGLM3-6B与国内其他主流大语言模型架构之间的异同,没有直接提及ChatGLM3-6B这个特定版本的详细信息,但从公开资料推测,其中ChatGLM2-6B是一个具有60多亿参数的对话模型,它采用了不同于GPT系列的架构——GLM(Generalized Language Model)。
ChatGLM的主要创新点可能包括但不限于:
-
架构异同:
- GLM架构:ChatGLM系列可能采用了一种新颖的模型结构,不同于GPT系列的纯自回归架构,它可能在自注意力机制上有独特的改进,比如局部敏感哈希(LSH)引导的自注意力机制,以提高模型训练和推理的效率。
-
训练方法:
- 虽然同样基于Transformer,但ChatGLM在训练过程中可能采用了不同的技术和策略,比如在训练算法或者优化目标上的创新,以增强模型在处理中英文混合场景下的表现力和效率。
-
性能特点:
- ChatGLM系列特别强调了在中文场景下的优异性能,尤其是对于中英文混合和长文本的理解与生成能力。
-
部署和应用:
- ChatGLM2-6B支持本地部署,这为用户提供了更加灵活便捷的应用方式,尤其是在隐私保护和自主可控的环境下使用大语言模型。
相较于其他国内主流大语言模型,例如阿里云、百度等公司的产品,ChatGLM系列在保证模型性能的同时,可能更注重于降低模型部署门槛和实际应用中的优化。不过,每个模型的具体异同还需参考每款模型的官方文档和技术论文,以便准确分析其在模型结构、训练方法、优化目标等方面的细节差异。
抱抱脸 Hugging Face Transformers
集成的模型
Hugging Face Transformer库整合了极为广泛的预训练模型,涵盖了自然语言处理(NLP)领域的众多知名模型,以下是一些代表性模型举例(并非详尽列表):
-
BERT(Bidirectional Encoder Representations from Transformers)系列:包括BERT-base、BERT-large、BERT-wwm、BERT-wwm-ext等多种版本和变种。
-
GPT(Generative Pretrained Transformer)系列:GPT、GPT-2、GPT-3以及GPT-4(截至我的知识截止日期尚未正式发布)。
-
GPT-NeoX(由EleutherAI开发的GPT-3兼容模型)。
-
RoBERTa(Robustly Optimized BERT Pretraining Approach)。
-
DistilBERT:BERT的轻量级版本。
-
ALBERT(A Lite BERT):进一步压缩BERT的参数量。
-
XLNet:来自Google Brain和CMU的自回归预训练模型。
-
Electra:Efficiently Learning an Encoder that Classifies Token Replacements Accurately。
-
T5(Text-to-Text Transfer Transformer):统一的文本到文本转换框架。
-
MT5(Multilingual T5):多语言版T5。
-
DeBERTa(Decoding-enhanced BERT with Disentangled Attention):增强了解码能力和分离注意力机制的BERT变种。
-
Q&A Models 如 SQuAD 模型(BERT-based QA models)。
-
Seq2Seq Models 如 T5、BART、mBART、 MarianMT 等翻译和摘要模型。
-
Multilingual Models 如 XLM-RoBERTa、mBERT 等多语言预训练模型。
除此之外,Hugging Face Transformers库还支持众多社区贡献的模型和不断更新的前沿模型,使得用户可以方便快捷地在各种NLP任务中使用最新的预训练模型。
提供的主要API
Hugging Face Transformers库提供的主要方法和接口十分丰富,以下是部分关键API和功能概述:
模型加载与保存
AutoModel.from_pretrained(model_name_or_path)
:加载预训练模型。model.save_pretrained(path)
:保存模型和配置文件到指定路径。
分词器(Tokenizer)
AutoTokenizer.from_pretrained(model_name_or_path)
:加载与模型配套的分词器。tokenizer.tokenize(text)
:将文本转换为token列表。tokenizer.encode_plus(text, add_special_tokens=True, return_tensors='pt'/'tf')
:对文本进行编码,返回模型所需的输入格式,包括tokens、segment ids、attention masks等。
模型预测
model(input_ids, attention_mask, token_type_ids, ...)
:对模型进行前向传播计算。pipeline(task, model=model, tokenizer=tokenizer)
:提供高层次的API,用于直接进行文本分类、命名实体识别、问答等任务。
微调与训练
Trainer
类:用于模型微调和训练的高级API,支持多种训练设置和评估指标。TrainingArguments
类:用于设定训练参数,如学习率、批次大小、训练周期等。Trainer.train()
方法:启动模型的训练过程。
推理与部署
pipeline(...)
可以用来快速搭建服务,无需直接调用模型和分词器。model.generate(input_ids, max_length, do_sample=True/False, ...)
:用于文本生成任务的接口。
其他实用功能
datasets
子模块:集成多个常用数据集,并提供数据加载、预处理和分割功能。accelerate
子模块:简化模型在多个GPU、TPU等硬件上的训练和推理部署。
总之,Hugging Face Transformers库通过这些API提供了一个完整的工作流程,涵盖了从加载预训练模型、数据预处理、模型训练、微调、评估到最终部署的一系列操作。
抱抱脸 Hugging Face Transformers与PyTorch如何结合使用
Hugging Face Transformers 与 PyTorch 结合使用非常直观和无缝,因为 Transformers 库本身就是支持 PyTorch 的。以下是结合使用的几个关键步骤:
安装依赖
首先确保已经安装了 PyTorch 和 Hugging Face Transformers 库:
pip install torch
pip install transformers
加载预训练模型和分词器
Hugging Face Transformers 提供了 AutoTokenizer
和 AutoModel
类来自动加载预训练模型及其对应的分词器。例如,加载 BERT 模型:
from transformers import AutoTokenizer, AutoModelForSequenceClassification
# 加载预训练的 BERT 模型和分词器
model_name = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
预处理数据
使用加载的分词器对文本数据进行预处理,包括分词、添加特殊令牌(如 [CLS]
和 [SEP]
)、创建注意力掩码等:
text = ["This is an example sentence."]
inputs = tokenizer(text, padding=True, truncation=True, return_tensors="pt")
模型预测或训练
将预处理后的数据送入模型进行预测或进一步训练:
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits # 获取模型最后的输出层
微调模型
如果要在特定任务上微调模型,你需要准备带有标签的数据,并使用 PyTorch 的 Dataset
和 DataLoader
来组织数据。之后可以使用 Hugging Face 的 Trainer
或 TrainingArguments
以及 Trainer
类进行训练,或者手动编写训练循环:
from transformers import TrainingArguments, Trainer
# 假设你已经有了一个Dataset实例 dataset 和对应的标签 labels
training_args = TrainingArguments(
output_dir='./results', # 输出目录
num_train_epochs=3, # 训练轮数
per_device_train_batch_size=16, # 每个设备上的训练批次大小
logging_dir='./logs', # 日志目录
)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=dataset, # 你的训练数据集
)
trainer.train()
这样就完成了从数据预处理到模型训练与预测的整个流程,将 Hugging Face Transformers 和 PyTorch 结合在一起使用。在整个过程中,Hugging Face Transformers 负责提供预训练模型结构、分词器以及高级训练接口,而 PyTorch 则负责计算图构建、自动梯度计算、优化器实现等功能。
为什么需要Checkpoint
Checkpoint是用于描述在每次训练后保存模型参数(权重)的惯例或术语。这就像在游戏中保存关卡时你可以随时通过加载保存文件回复游戏。你可以加载保存的模型权重重新开启训练甚至可以之后进行一个推理。
复杂模型的训练阶段通常很长(数小时到数天到数周)。在nushpc系统上,用于深度学习的GPU队列的默认时间限制为24小时,作业执行的最大时间限制为48小时。针对复杂模型和大型数据集的深度学习训练作业需要的训练时间可能比队列默认的限定时间要长很多。
因此,为了不丢失训练进度,建议在每个epoch或每个epoch中当它在当前这个point中是这个时间下的最好权重时执行模型参数(权重)的checkpoint。
在非易失性内存中保存最新或最佳权重是一种良好的做法,因为它允许您在给定的epoch保存进度副本,以防您想在任何给定的epoch调整超参数。它还允许您从任何有checkpoint的epoch恢复训练。如果作业或进程提前终止,可以通过从上次保存的checkpoint或任何其他checkpoint加载权重来恢复训练。
# 保存
torch.save({
'epoch': epoch,
'model_state_dict': model.state_dict(),
...
}, PATH)
# 加载
checkpoint = torch.load(PATH)
start_epoch=checkpoint['epoch']
model.load_state_dict(checkpoint['model_state_dict'])
# 测试时
model.eval()
# 或者训练时
model.train()
-
General checkpoint,用它保存模型的参数、优化器的参数,以及 Epoch, loss 等任何你想要保存的东西。我们可以利用它进行断点续训,以及后续的模型推理。长时间训练大模型时,在代码中定期保存 checkpoint 也是一个好习惯。
-
Gradient checkpoint,这是一种以时间换空间的技术:用更长的计算时间,换取显卡内存。