一、核心概念区分

1. 具体模型(Concrete Models)

  • 是为特定架构实现的类,如 BertModel, GPT2LMHeadModel, T5ForConditionalGeneration
  • 命名规则:<Architecture><TaskHead><Architecture>Model
  • 优点:明确、可控;缺点:需手动指定,不通用。

2. 自动模型(AutoModels)

  • 是通用接口,根据模型配置(config.json 中的 model_type)自动选择对应的具体模型。
  • 命名规则:AutoModelFor<Task>AutoModel
  • 优点:代码解耦、支持任意兼容模型;推荐在生产/实验中优先使用

最佳实践:除非有特殊需求,否则始终使用 AutoModel... 系列。


二、常用 AutoModel 类型与对应任务

AutoModel 类 适用任务 输出头说明 典型输入 典型输出
AutoModel 获取隐藏状态(无下游任务) 无任务头,仅返回 last_hidden_state input_ids, attention_mask hidden_states: [batch, seq_len, hidden_dim]
AutoModelForSequenceClassification 文本分类(情感、主题等) [CLS] 或平均池化上加线性分类层 同上 logits: [batch, num_labels]
AutoModelForTokenClassification 序列标注(NER、POS) 对每个 token 加分类头 同上 logits: [batch, seq_len, num_labels]
AutoModelForQuestionAnswering 抽取式问答(SQuAD) 预测答案起始/结束位置 input_ids(含 question + context) start_logits, end_logits: [batch, seq_len]
AutoModelForMaskedLM 掩码语言建模(BERT-style) 预测被 [MASK] 替换的词 [MASK] 的输入 logits: [batch, seq_len, vocab_size]
AutoModelForCausalLM 自回归语言建模(GPT-style) 预测下一个 token token 序列 logits: [batch, seq_len, vocab_size]
AutoModelForSeq2SeqLM 文本生成(翻译、摘要) 编码器-解码器结构,解码器带 LM 头 input_ids(源文本) + decoder_input_ids(可选) logits: [batch, dec_seq_len, vocab_size]
AutoModelForMultipleChoice 多选题(如 RACE) 对每个选项单独编码后分类 [batch, num_choices, seq_len] logits: [batch, num_choices]
AutoModelForNextSentencePrediction 下一句预测(NSP,仅 BERT) 判断两句话是否连续 [CLS] sentA [SEP] sentB [SEP] logits: [batch, 2](是否相邻)

⚠️ 注意:

  • 并非所有模型都支持所有任务头(见下文“兼容性”)。
  • 输出中的 logits 需配合损失函数(如 CrossEntropyLoss)使用,或用 argmax 得到预测。

三、如何加载模型?

1. 从 Hugging Face Hub 加载(最常见)

from transformers import AutoTokenizer, AutoModelForSequenceClassification

model_name = "bert-base-uncased"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(
    model_name,
    num_labels=2  # 可选:微调时指定类别数
)

2. 从本地路径加载

model = AutoModelForTokenClassification.from_pretrained("./my_finetuned_ner_model")

3. 仅加载配置(不加载权重)

from transformers import AutoConfig

config = AutoConfig.from_pretrained("roberta-base", num_labels=5)
model = AutoModelForSequenceClassification.from_config(config)  # 随机初始化

四、模型与任务头的兼容性

关键原则:

  • 模型架构决定支持哪些任务头
  • transformers 库只为部分架构实现了特定任务头。

常见模型支持情况速查表

模型家族 支持的任务头(AutoModelFor…)
BERT / RoBERTa / DeBERTa SequenceClassification, TokenClassification, QuestionAnswering, MaskedLM, MultipleChoice(BERT 还支持 NextSentencePrediction
GPT-2 / GPT-J / LLaMA / Mistral CausalLM, SequenceClassification(通过添加分类头), TokenClassification(较新版本)
T5 / BART / mT5 / UL2 Seq2SeqLM, SequenceClassification(通过额外分类头), QuestionAnswering(通过生成式方式,但通常用 Seq2SeqLM
DistilBERT / ALBERT 同 BERT,但 不支持 NSP
Electra SequenceClassification, TokenClassification, QuestionAnswering, MaskedLM(实际是 replaced token detection)
Vision Transformer (ViT) ImageClassification(属于多模态,输入为图像)

🔍 完整支持列表请查阅官方文档:Model Summary


五、输入格式说明

所有模型都期望经过 tokenizer 处理后的字典作为输入:

inputs = tokenizer(
    "Hello, how are you?",
    return_tensors="pt",      # 返回 PyTorch 张量(也可为 "tf" 或 "np")
    padding=True,
    truncation=True,
    max_length=512
)
# inputs = {'input_ids': ..., 'attention_mask': ..., 'token_type_ids' (if applicable)}

然后直接传入模型:

outputs = model(**inputs)

💡 提示:token_type_ids 仅在需要区分句子对的模型中使用(如 BERT),GPT 等 decoder-only 模型不需要。


六、输出格式说明

所有 AutoModelForXXX 返回一个 ModelOutput 子类(如 SequenceClassifierOutput),可通过属性访问:

# 分类任务
outputs = model(**inputs)
logits = outputs.logits        # [batch, num_labels]
loss = outputs.loss            # 如果传入 labels,则自动计算 loss

# 语言建模
outputs = model(input_ids=input_ids, labels=input_ids)  # labels 用于计算 loss
logits = outputs.logits        # [batch, seq_len, vocab_size]
loss = outputs.loss

✅ 始终检查 outputs 的属性(用 dir(outputs) 或查看文档),不同任务输出字段不同。


七、如何选择合适模型?

步骤 1:确定你的任务类型

任务 推荐 AutoModel 推荐基础模型
文本分类 AutoModelForSequenceClassification BERT, RoBERTa, DeBERTa
命名实体识别 AutoModelForTokenClassification BERT, RoBERTa
阅读理解 AutoModelForQuestionAnswering BERT, RoBERTa, Electra
文本生成(摘要/翻译) AutoModelForSeq2SeqLM T5, BART, mT5
续写/对话生成 AutoModelForCausalLM GPT-2, LLaMA, Mistral
掩码填空 AutoModelForMaskedLM BERT, RoBERTa
多选题 AutoModelForMultipleChoice BERT, RoBERTa

步骤 2:考虑资源与性能

  • 小数据集/快速原型 → distilbert-base-uncased, google/electra-small
  • 高精度 → roberta-large, microsoft/deberta-v3-large
  • 生成任务 → t5-base, facebook/bart-large, mistralai/Mistral-7B-v0.1

步骤 3:验证兼容性(代码测试)

from transformers import AutoModelForTokenClassification

try:
    model = AutoModelForTokenClassification.from_pretrained("mistralai/Mistral-7B-v0.1")
    print("✅ 支持 TokenClassification")
except Exception as e:
    print("❌ 不支持:", str(e))

截至 2026 年,Mistral 等 decoder-only 模型已支持 TokenClassificationSequenceClassification,但需注意其输入无 token_type_ids


八、常见错误与解决方案

错误 原因 解决方案
ValueError: Unrecognized configuration class ... 模型未注册到 AutoModel 映射 升级 transformers 或改用具体模型类
KeyError: 'logits' 用了 AutoModel 而非 AutoModelForXXX 改用带任务头的 AutoModel
Expected input_ids to have shape [batch, seq_len], got [...] 输入未正确 batch 化或 padding 使用 tokenizer(..., return_tensors="pt", padding=True)
Some weights not initialized 微调时 num_labels 与预训练不一致 正常现象,新分类头会随机初始化

九、附录:快速参考代码模板

文本分类

from transformers import pipeline
classifier = pipeline("text-classification", model="distilbert-base-uncased-finetuned-sst-2-english")
result = classifier("I love this movie!")  # [{'label': 'POSITIVE', 'score': 0.999}]

手动加载(训练/推理)

tokenizer = AutoTokenizer.from_pretrained("bert-base-cased")
model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=3)

inputs = tokenizer("This is great!", return_tensors="pt")
outputs = model(**inputs)
predictions = outputs.logits.argmax(dim=-1)

十、参考资料


记住先选任务 → 再选 AutoModel → 最后选具体预训练模型
使用 AutoModelForXXX 是安全、灵活、可维护的最佳实践。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐