Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重

Posted

技术标签:

【中文标题】Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重【英文标题】:Python: BERT Error - Some weights of the model checkpoint at were not used when initializing BertModel 【发布时间】:2021-08-05 08:54:14 【问题描述】:

我正在使用 bert-base-uncased 在 PyTorch 中创建一个实体提取模型,但是当我尝试运行该模型时出现此错误:

错误:

Some weights of the model checkpoint at D:\Transformers\bert-entity-extraction\input\bert-base-uncased_L-12_H-768_A-12 were not used when initializing BertModel:    
['cls.predictions.transform.dense.bias', 'cls.predictions.decoder.weight', 'cls.seq_relationship.weight',   'cls.predictions.transform.LayerNorm.bias', 'cls.seq_relationship.bias',  
 'cls.predictions.transform.LayerNorm.weight', 'cls.predictions.transform.dense.weight',  
 'cls.predictions.bias']  
    - This IS expected if you are initializing BertModel from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).
    - This IS NOT expected if you are initializing BertModel from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).

我从here下载了bert模型,从here下载了附加文件

代码

以下是我的模型的代码:

import config
import torch
import transformers
import torch.nn as nn

def loss_fn(output, target, mask, num_labels):

    lfn = nn.CrossEntropyLoss()
    active_loss = mask.view(-1) == 1
    active_logits = output.view(-1, num_labels)
    active_labels = torch.where(
        active_loss,
        target.view(-1),
        torch.tensor(lfn.ignore_index).type_as(target)
    )
    loss = lfn(active_logits, active_labels)
    return loss

class EntityModel(nn.Module):
    def __init__(self, num_tag, num_pos):
        super(EntityModel, self).__init__()

        self.num_tag = num_tag
        self.num_pos = num_pos
        self.bert = transformers.BertModel.from_pretrained(config.BASE_MODEL_PATH)
        self.bert_drop_1 = nn.Dropout(p = 0.3)
        self.bert_drop_2 = nn.Dropout(p = 0.3)
        self.out_tag = nn.Linear(768, self.num_tag)
        self.out_pos = nn.Linear(768, self.num_pos)

    def forward(self, ids, mask, token_type_ids, target_pos, target_tag):
        o1, _ = self.bert(ids, 
                          attention_mask = mask,
                          token_type_ids = token_type_ids)

        bo_tag = self.bert_drop_1(o1)
        bo_pos = self.bert_drop_2(o1)

        tag = self.out_tag(bo_tag)
        pos = self.out_pos(bo_pos)

        loss_tag = loss_fn(tag, target_tag, mask, self.num_tag)
        loss_pos = loss_fn(pos, target_pos, mask, self.num_pos)

        loss = (loss_tag + loss_pos) / 2

        return tag, pos, loss 

print("model.py run success!")

【问题讨论】:

这不是错误。 但是在这个警告之后模型训练没有发生? 您需要训练模型,因为这个模型没有经过训练的输出标头。如果您不想训练它,您可以寻找适合您任务的带有预训练头部的 bert 模型。 我有一个名为 train.py 的培训文件,但是当我运行它时,我收到了这个警告 这是应该发生的。当您在训练后加载模型时,您不会看到此错误消息。 【参考方案1】:

正如@cronoik 和提到的here 一样,这不是错误,但此警告意味着在您的训练期间,您没有使用池化器来计算损失。因此,如果是这种情况,则无需担心。

您可以通过以下方式设置此警告:

from transformers import logging

logging.set_verbosity_warning()

【讨论】:

【参考方案2】:

正如 R. Marolahy 建议的那样,如果您不想每次都看到这个,我知道我不想,添加以下内容:

from transformers import logging
logging.set_verbosity_error()

【讨论】:

以上是关于Python:BERT 错误 - 初始化 BertModel 时未使用模型检查点的某些权重的主要内容,如果未能解决你的问题,请参考以下文章

删除并重新初始化相关的 BERT 权重/参数

[Python人工智能] 三十三.Bert模型 keras-bert库构建Bert模型实现文本分类

Bert加bilstm和crf做ner的意义

[Python人工智能] 三十四.Bert模型 keras-bert库构建Bert模型实现微博情感分析

[Python人工智能] 三十二.Bert模型 Keras-bert基本用法及预训练模型

您能否从头开始训练具有特定任务架构的BERT模型?