如何在HuggingFace中使用bert-large-uncased处理1024长度序列?
解决BERT-large处理1024长度序列的问题
错误原因
你只修改了model.config.max_position_embeddings,但模型的position_embeddings层参数仍是预训练时的512维度。当输入序列长度为1024时,生成的位置ID会到1023,而位置嵌入层只有前512个位置的权重,导致张量维度不匹配报错。
正确解决方案
需要同时扩展position_embeddings层的权重,使其适配1024的序列长度。以下是可行的代码实现:
from transformers import BertTokenizer, BertModel import torch # 加载tokenizer和预训练模型 tokenizer = BertTokenizer.from_pretrained('bert-large-uncased') model = BertModel.from_pretrained("bert-large-uncased") # 修改配置的最大位置嵌入长度 model.config.max_position_embeddings = 1024 # 扩展位置嵌入层的权重:复制原有权重(跳过第0位避免重复[CLS]位置) old_pos_emb = model.embeddings.position_embeddings.weight new_pos_emb = torch.cat([old_pos_emb, old_pos_emb[1:]], dim=0) # 替换位置嵌入层并赋值新权重 model.embeddings.position_embeddings = torch.nn.Embedding(1024, model.config.hidden_size) model.embeddings.position_embeddings.weight.data = new_pos_emb # 处理长文本 text = "Replace me by any text you'd like." * 1024 encoded_input = tokenizer(text, truncation=True, max_length=1024, return_tensors='pt') output = model(**encoded_input) print("输出形状:", output.last_hidden_state.shape) # 预期输出: torch.Size([1, 1024, 1024])
补充说明
- 扩展位置嵌入时,选择复制原有511个位置权重(跳过第0位的[CLS]位置),这种方式能最大程度保留预训练的位置编码信息,比随机初始化新增权重更稳妥。
- 如果后续需要重复使用修改后的模型,可执行
model.save_pretrained("./bert-large-uncased-1024")保存,之后直接从该路径加载即可。
内容的提问来源于stack exchange,提问作者Aaditya Ura
相关产品推荐
相关产品推荐

