Python Spacy&x27;s-BERT模型不';我学不会

Python Spacy&x27;s-BERT模型不';我学不会,python,spacy,text-classification,multiclass-classification,bert-language-model,Python,Spacy,Text Classification,Multiclass Classification,Bert Language Model,我一直在尝试使用spaCy的预训练BERT模型来提高分类项目的准确性。我曾经用de_core\u news\u sm从头开始构建一个模型,一切都很好:我的准确率在70%左右。但现在我用伯特预训练模型代替,我得到了0%的准确率。我不认为它工作得很糟糕,所以我假设我的代码有问题。我可能错过了一些重要的事情,但我不知道是什么。我以中的代码为例 这是我的密码: import spacy from spacy.util import minibatch from random import shuffle

我一直在尝试使用spaCy的预训练BERT模型来提高分类项目的准确性。我曾经用
de_core\u news\u sm
从头开始构建一个模型,一切都很好:我的准确率在70%左右。但现在我用伯特预训练模型代替,我得到了0%的准确率。我不认为它工作得很糟糕,所以我假设我的代码有问题。我可能错过了一些重要的事情,但我不知道是什么。我以中的代码为例

这是我的密码:

import spacy
from spacy.util import minibatch
from random import shuffle

spacy.require_gpu()
nlp = spacy.load('de_trf_bertbasecased_lg')

data = get_data()  # get_data() function returns a list with train data (I'll explain later how it looks)

textcat = nlp.create_pipe("trf_textcat", config={"exclusive_classes": False})

for category in categories:  # categories - a list of 21 different categories used for classification
    textcat.add_label(category)
nlp.add_pipe(textcat)

num = 0  # number used for counting batches
optimizer = nlp.resume_training()
for i in range(2):
    shuffle(data)
    losses = {}
    for batch in minibatch(data):
        texts, cats = zip(*batch)
        nlp.update(texts, cats, sgd=optimizer, losses=losses)
        num += 1

        if num % 10000 == 0:  # test model's performance every 10000 batches
            acc = test(nlp)  # function test() will be explained later
            print(f'Accuracy: {acc}')

nlp.to_disk('model/')
函数
get_data()
打开不同类别的文件,创建一个类似这样的元组
(文本,{'cats':{'category1':0,'category2':1,…}})
,将所有这些元组收集到一个数组中,然后返回到主函数

函数
test(nlp)
打开包含测试数据的文件,预测文件中每一行的类别,并检查预测是否正确

同样,在
de_core\u news\u sm
中,一切都运行得很好,因此我非常确定函数
get_data()
test(nlp)
运行得很好。上面的代码看起来像示例中的代码,但仍然是0%的准确率。我不明白我做错了什么

提前感谢您的帮助

更新

为了理解上面的问题,我决定用几个例子来尝试这个模型(就像建议的那样)。代码如下:

import spacy
from spacy.util import minibatch
import random
import torch

train_data = [
    ("It is realy cool", {"cats": {"POSITIVE": 1.0, "NEGATIVE": 0.0}}),
    ("I hate it", {"cats": {"POSITIVE": 0.0, "NEGATIVE": 1.0}})
]

is_using_gpu = spacy.prefer_gpu()
if is_using_gpu:
    torch.set_default_tensor_type("torch.cuda.FloatTensor")

nlp = spacy.load("en_trf_bertbaseuncased_lg")
textcat = nlp.create_pipe("trf_textcat", config={"exclusive_classes": True})
for label in ("POSITIVE", "NEGATIVE"):
    textcat.add_label(label)
nlp.add_pipe(textcat)

optimizer = nlp.resume_training()
for i in range(10):
    random.shuffle(train_data)
    losses = {}
    for batch in minibatch(train_data):
        texts, cats = zip(*batch)
        nlp.update(texts, cats, sgd=optimizer, losses=losses)
    print(i, losses)
print()

test_data = [
    "It is really cool",
    "I hate it",
    "Great!",
    "I do not think this is cool"
]

for line in test_data:
    print(line)
    print(nlp(line).cats)
结果是:

0 {'trf_textcat': 0.125}
1 {'trf_textcat': 0.12423406541347504}
2 {'trf_textcat': 0.12188033014535904}
3 {'trf_textcat': 0.12363225221633911}
4 {'trf_textcat': 0.11996611207723618}
5 {'trf_textcat': 0.14696261286735535}
6 {'trf_textcat': 0.12320466339588165}
7 {'trf_textcat': 0.12096124142408371}
8 {'trf_textcat': 0.15916231274604797}
9 {'trf_textcat': 0.1238454058766365}

It is really cool
{'POSITIVE': 0.47827497124671936, 'NEGATIVE': 0.5217249989509583}
I hate it
{'POSITIVE': 0.47827598452568054, 'NEGATIVE': 0.5217240452766418}
Great!
{'POSITIVE': 0.4782750606536865, 'NEGATIVE': 0.5217249393463135}
I do not think this is cool
{'POSITIVE': 0.478275328874588, 'NEGATIVE': 0.5217246413230896}
不仅模型表现糟糕,损失也没有减少,所有测试句子的分数几乎相同。最重要的是:这些问题甚至都没有得到正确答案,这恰好是火车数据中的问题。所以我的问题是:这个模型能学习吗?我做错了什么


有什么想法吗?

在上收到了我的问题的答案,看起来必须指定一些优化器参数,如中所示