Skip to content

Transformers 库操作面试题

内容整理自学习笔记,仅供面试备考参考;不构成录用、培训或考试承诺。

1. 如何使用 Transformers 加载 BERT 模型?

python
import torch
from transformers import BertModel, BertTokenizer

model_name = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(model_name)
model = BertModel.from_pretrained(model_name)

input_text = "Here is some text to encode"
input_ids = tokenizer.encode(input_text, add_special_tokens=True)
input_ids = torch.tensor([input_ids])

with torch.no_grad():
    last_hidden_states = model(input_ids)[0]
# 输出维度: (1, seq_len, 768)

不到十行代码即可加载预训练 BERT 模型,将文本编码为每个 token 的 768 维向量。对于分类任务,可取出 [CLS] token 的向量接一个线性层进行预测。

2. 如何输出 BERT 指定层的 Hidden State?

BERT 默认 12 层。若只需前几层,可修改配置文件 config.json 中的参数:

json
{
  "architectures": ["BertForMaskedLM"],
  "attention_probs_dropout_prob": 0.1,
  "hidden_act": "gelu",
  "hidden_dropout_prob": 0.1,
  "hidden_size": 768,
  "initializer_range": 0.02,
  "intermediate_size": 3072,
  "max_position_embeddings": 512,
  "num_attention_heads": 12,
  "num_hidden_layers": 12,
  "type_vocab_size": 2,
  "vocab_size": 30522
}

设置 "num_hidden_layers" 或使用 output_hidden_states 参数控制输出层级。

3. 获取 BERT 各层输出

输出的四种类型

输出形状说明
last_hidden_state(batch, seq_len, 768)最后一层的隐藏状态,通常用于下游任务
pooler_output(batch, 768)[CLS] token 经线性层 + Tanh 处理后的输出,不推荐直接使用,序列平均或池化效果更好
hidden_states13 层元组需设置 output_hidden_states=True,索引 0 为 Embedding 输出,1-12 为每层输出
attentions12 层元组需设置 output_attentions=True,每层的注意力权重矩阵

示例代码

python
from transformers import BertModel, BertTokenizer, BertConfig

config = BertConfig.from_pretrained('bert-base-uncased', output_hidden_states=True)
model = BertModel.from_pretrained('bert-base-uncased', config=config)

outputs = model(input_ids)

# 最后一层的所有 token 向量
last_hidden = outputs.last_hidden_state

# CLS 向量
cls_vector = outputs.pooler_output

# 各层隐藏状态
hidden_states = outputs.hidden_states       # 13 层
embedding_output = hidden_states[0]         # 第 0 层: Embedding
layer_outputs = hidden_states[1:]           # 第 1-12 层