BERT的vocabulary字典

在pytorch-pretrained-BERT/pytorch_pretrained_bert/tokenization.py文件中可以看到BERT使用的vocabulary链接,但是不用特殊的上网方式打不开。

PRETRAINED_VOCAB_ARCHIVE_MAP = {
    'bert-base-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-uncased-vocab.txt",
    'bert-large-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-uncased-vocab.txt",
    'bert-base-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-cased-vocab.txt",
    'bert-large-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-large-cased-vocab.txt",
    'bert-base-multilingual-uncased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-uncased-vocab.txt",
    'bert-base-multilingual-cased': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-multilingual-cased-vocab.txt",
    'bert-base-chinese': "https://s3.amazonaws.com/models.huggingface.co/bert/bert-base-chinese-vocab.txt",
}

打开后是这样的:

在这里插入图片描述
然后我通过审查元素,把他们都存了下来(除了两个multilingual)。

百度网盘
链接:https://pan.baidu.com/s/18l53W7UcFA1Amk8MbSnchg
提取码:7gjy

### PyTorch 中加载模型权重时出现 `RuntimeError` 的原因分析 在 PyTorch 中,当尝试通过 `load_state_dict()` 方法加载预训练模型的参数时,如果遇到类似于 `RuntimeError: Error(s) in loading state_dict for Model missing keys...` 或者 `size mismatch` 错误,则通常是由以下几个原因之一引起的: 1. **模型定义与保存的检查点不匹配** 如果当前模型结构与保存的检查点文件中的模型结构不同,就会导致键名或张量形状不匹配。例如,在 BERT 模型中,错误提示显示缺少某些层(如 `bert.embeddings.LayerNorm.weight` 和 `bias`),这可能是因为当前模型未初始化这些层或者它们被意外删除。 2. **数据并行 (`nn.DataParallel`) 导致的键名差异** 使用 `nn.DataParallel` 进行分布式训练时,模型的状态字典会在每个键前加上 `"module."` 前缀。因此,如果不适当地处理这个前缀,可能会引发键名不匹配的问题[^2]。 3. **词表大小 (Vocabulary Size) 不一致** 对于像 BERT 这样的自然语言处理模型,嵌入矩阵的维度由词汇表大小决定。如果保存的检查点使用的词汇表大小为 `[21128, 768]`,而当前模型设置的是 `[119547, 768]`,则会出现尺寸不匹配的情况[^1]。 --- ### 解决方案 #### 方案一:调整模型定义以匹配检查点 确保当前模型的架构完全与保存的检查点一致。可以通过打印状态字典来验证两者之间的差异: ```python print("Checkpoint Keys:", set(torch.load(checkpoint_path)['state_dict'].keys())) print("Model State Dict Keys:", set(model.state_dict().keys())) ``` 对于缺失的关键字(如 `bert.embeddings.LayerNorm.weight` 和 `bias`),可以手动初始化这些层或将它们添加到模型中。例如: ```python import torch.nn as nn if 'bert.embeddings.LayerNorm.weight' not in model.state_dict(): model.bert.embeddings.LayerNorm = nn.LayerNorm(normalized_shape=model.config.hidden_size) ``` #### 方案二:移除多余的 `"module."` 前缀 如果使用了 `nn.DataParallel` 训练模型,而在加载时不希望保留该前缀,可以通过以下方法去除它: ```python checkpoint = torch.load(checkpoint_path) new_checkpoint = {k.replace('module.', ''): v for k, v in checkpoint['state_dict'].items()} model.load_state_dict(new_checkpoint) ``` 这种方法适用于解决因数据并行引入的键名冲突问题[^4]。 #### 方案三:忽略部分键值对 有时我们并不关心所有的权重是否都成功加载,而是允许存在一些额外或缺失的键。此时可将 `strict=False` 参数传递给 `load_state_dict()` 函数: ```python model.load_state_dict(torch.load(checkpoint_path), strict=False) ``` 需要注意的是,这种做法可能导致最终模型的行为不符合预期,尤其是在丢失重要层的情况下。 #### 方案四:重新配置嵌入矩阵大小 针对词汇表大小不同的情况,可以选择截断或扩展嵌入矩阵。以下是两种实现方式之一——扩展法: ```python pretrained_embeddings = checkpoint['state_dict']['bert.embeddings.word_embeddings.weight'] current_embeddings = model.state_dict()['bert.embeddings.word_embeddings.weight'] # 扩展至目标大小 expanded_embeddings = pretrained_embeddings.new_zeros(current_embeddings.shape) expanded_embeddings[:pretrained_embeddings.size(0)] = pretrained_embeddings model.state_dict()['bert.embeddings.word_embeddings.weight'][:] = expanded_embeddings ``` --- ### 示例代码 综合以上解决方案,下面提供一段完整的加载脚本作为参考: ```python import torch from transformers import BertForTokenClassification def load_model_with_checkpoints(model_class, checkpoint_path): # 初始化模型实例 model = model_class.from_pretrained(None) # 加载检查点 checkpoint = torch.load(checkpoint_path) # 移除多余前缀 ("module.") new_checkpoint = {k.replace('module.', ''): v for k, v in checkpoint['state_dict'].items()} # 处理嵌入矩阵大小不一致 if 'bert.embeddings.word_embeddings.weight' in new_checkpoint: pretrained_embeddings = new_checkpoint.pop('bert.embeddings.word_embeddings.weight') current_embeddings = model.state_dict()['bert.embeddings.word_embeddings.weight'] # 创建新的嵌入矩阵 expanded_embeddings = pretrained_embeddings.new_zeros(current_embeddings.shape) expanded_embeddings[:pretrained_embeddings.size(0)] = pretrained_embeddings # 更新模型状态字典 new_checkpoint['bert.embeddings.word_embeddings.weight'] = expanded_embeddings # 加载更新后的状态字典 model.load_state_dict(new_checkpoint, strict=False) return model ``` --- ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值