外观
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_states | 13 层元组 | 需设置 output_hidden_states=True,索引 0 为 Embedding 输出,1-12 为每层输出 |
attentions | 12 层元组 | 需设置 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 层