Transformer 模型简介
在使用 Hugging Face Transformers 时,加载模型 是完成各种 NLP 或生成任务的第一步。无论是文本分类、翻译、问答,还是大语言模型推理,正确加载模型都是整个流程的基础。
1. 为什么要加载模型
Transformer 模型经过大量数据的预训练,掌握了丰富的语言规律。我们可以直接下载并加载这些预训练模型,避免从零开始训练,大幅节省时间和计算资源。
加载后的模型包含两部分核心内容:
配置(configuration):描述模型结构,如层数、隐藏维度、注意力头数等。
权重(weights):模型学习到的参数,用于实际推理和微调。
2. 基本加载方式
Hugging Face 提供了统一的接口,只需一行代码即可加载公开的预训练模型。例如,加载一个 BERT 模型:
from transformers import BertModelmodel = BertModel.from_pretrained("bert-base-cased", # 模型名称(或本地路径)dtype="auto", # 自动选择合适的数据类型(如 float16),节省显存。device_map="auto" # 自动分配设备(如 GPU、CPU、多卡),方便加载大模型。
)
from_pretrained()
会自动下载并加载模型的配置与权重。
3. 保存模型
模型加载后,可以保存到本地,以便下次快速使用或部署。保存模型非常简单:
示例
model.save_pretrained("directory_on_my_computer")
执行后,会在目标目录下生成以下文件:
config.json — 模型配置文件
该文件包含了构建模型所需的全部超参数。例如 BERT 的配置如下:
{ "architectures": ["BertModel" ], "attention_probs_dropout_prob": 0.1, "classifier_dropout": null, "dtype": "float32", "gradient_checkpointing": false, "hidden_act": "gelu", "hidden_dropout_prob": 0.1, "hidden_size": 768, "initializer_range": 0.02, "intermediate_size": 3072, "layer_norm_eps": 1e-12, "max_position_embeddings": 512, "model_type": "bert", "num_attention_heads": 12, "num_hidden_layers": 12, "pad_token_id": 0, "position_embedding_type": "absolute", "transformers_version": "4.56.0", "type_vocab_size": 2, "use_cache": true, "vocab_size": 28996 }
model.safetensors — 模型权重文件
这是模型真正的“记忆”,包含了所有参数矩阵。在推理和微调时,模型会将这些权重加载到内存(或显存)中进行计算。
4. 模型的类型
在 Transformers 中,模型大致可以分为两类:
- 基础模型(Barebones Model)
- 带任务头的模型(Task-specific Model)
这两类模型的区别主要在于输出内容和使用场景。
4.1 基础模型(Barebones Model)
定义: 基础模型就是只包含 Transformer 编码器或解码器主体的模型,不附加任何任务专用层。它只负责生成隐藏状态(hidden states),也就是模型内部对输入文本理解的向量表示。这些向量不是最终输出,但可以用于下游任务,如文本分类、相似度计算等。
常见类:
- AutoModel
- BertModel
- LlamaModel
示例:
from transformers import AutoModel, AutoTokenizertokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
model = AutoModel.from_pretrained("bert-base-cased")inputs = tokenizer("Hello world!", return_tensors="pt")
outputs = model(**inputs)# 获取最后一层隐藏状态
hidden_states = outputs.last_hidden_state
在这个例子中,模型输出的只是隐藏状态,你可以用它做文本分类、相似度计算或其他自定义任务。
4.2 带任务头的模型(Task-specific Model)
定义: 在基础模型之上附加特定任务的输出层(Head),模型可以直接用于任务推理,无需额外修改结构。
常见类:
- AutoModelForCausalLM → 文本生成(语言建模)
- AutoModelForSequenceClassification → 文本分类
- AutoModelForQuestionAnswering → 问答任务
- AutoModelForTokenClassification → 命名实体识别
示例(文本生成):
from transformers import AutoModelForCausalLM, AutoTokenizertokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")input_ids = tokenizer("Once upon a time", return_tensors="pt").input_ids
generated = model.generate(input_ids, max_length=50)
print(tokenizer.decode(generated[0]))
可以看到,带任务头的模型可以直接完成任务,非常方便,但如果需要自定义任务或修改输出结构,则可能需要使用基础模型。