标签: bert-language-model

Huggingface TFBertForSequenceClassification 始终预测相同的标签

TL;DR:\n我的模型总是预测相同的标签,但我不知道为什么。下面是我的微调代码,希望有人能指出我哪里出错了。

\n

我使用 Huggingface 的 TFBertForSequenceClassification 进行序列分类任务来预测德语文本中句子的 4 个标签。

\n

我使用 bert-base-german-cased 模型,因为我不只使用小写文本(因为德语比英语更区分大小写)。

\n

我从一个 csv 文件中获取输入,该文件是根据收到的带注释的语料库构建的。这是其中的一个示例:

\n
0       Hier kommen wir ins Spiel Die App Cognitive At...\n1       Doch wenn Athlet Lebron James jede einzelne Mu...\n2       Wie kann ein Gehirn auf Hochleistung getrimmt ...\n3       Wie schafft es Warren Buffett knapp 1000 W\xc3\xb6rte...\n4       Entfalte dein mentales Potenzial und werde ein...\nName: sentence_clean, Length: 3094, dtype: object\n
Run Code Online (Sandbox Code Playgroud)\n

这些是我的标签,来自同一个 csv 文件:

\n
0       e_1\n1       e_4\n2       e_4\n3       e_4\n4       e_4\n
Run Code Online (Sandbox Code Playgroud)\n

不同的标签是:e_1、e_2、e_3 和 e_4

\n …

python tensorflow bert-language-model huggingface-transformers

4
推荐指数
1
解决办法
3615
查看次数

BertModel 或 BertForPreTraining

我只想使用 Bert 进行嵌入,并使用 Bert 输出作为我将从头开始构建的分类网络的输入。

我不确定是否要对模型进行微调。

我认为相关的类是 BertModel 或 BertForPreTraining。

BertForPreTraining head 包含两个“动作”:self.predictions 是 MLM(Masked Language Modeling)head,赋予 BERT 修复语法错误的能力,self.seq_relationship 是 NSP(Next Sentence Prediction);通常称为分类头。

class BertPreTrainingHeads(nn.Module):
    def __init__(self, config):
        super().__init__()
        self.predictions = BertLMPredictionHead(config)
        self.seq_relationship = nn.Linear(config.hidden_size, 2)
Run Code Online (Sandbox Code Playgroud)

我认为 NSP 与我的任务无关,所以我可以“覆盖”它。MLM 是做什么的?它与我的目标相关吗?还是我应该使用 BertModel?

nlp transformer-model deep-learning bert-language-model huggingface-transformers

4
推荐指数
1
解决办法
4709
查看次数

如何为 BERT 准备文本 - 出现错误

我正在尝试学习 BERT 进行文本分类。我在准备使用 BERT 的数据时发现一些问题。

从我的数据集中,我将情绪和评论分为:

X = df['sentiments']
y = df['reviews'] #it contains four different class of reviews
Run Code Online (Sandbox Code Playgroud)

下一个,

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
train_encodings = tokenizer(X_train, truncation=True, padding=True, max_length=512) 
Run Code Online (Sandbox Code Playgroud)

这是我收到错误的地方:

X = df['sentiments']
y = df['reviews'] #it contains four different class of reviews
Run Code Online (Sandbox Code Playgroud)

当我尝试将 X 转换为列表并使用它时,出现另一个错误:

TypeError: TextEncodeInput must be Union[TextInputSequence, Tuple[InputSequence, InputSequence]]
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下问题出在哪里吗?之前我遵循了 20 个新闻数据集的教程,结果很有效。但现在当我在另一个项目中使用它时,它不起作用,我感到很难过。

谢谢。

nlp python-3.x transfer-learning bert-language-model

4
推荐指数
1
解决办法
6770
查看次数

如何增加 BERT 句子转换器嵌入的维度向量大小

我使用句子转换器进行语义搜索,但有时它不理解上下文含义并返回错误的结果,例如。意大利语上下文/语义搜索的 BERT 问题

默认情况下,句子嵌入的向量边是 78 列,那么如何增加该维度,以便它能够深入理解上下文含义。

代码:

# Load the BERT Model
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')

# Setup a Corpus
# A corpus is a list with documents split by sentences.

sentences = ['Absence of sanity', 
             'Lack of saneness',
             'A man is eating food.',
             'A man is eating a piece of bread.',
             'The girl is carrying a baby.',
             'A man is riding a horse.',
             'A woman is playing violin.',
             'Two men pushed carts through the woods.', …
Run Code Online (Sandbox Code Playgroud)

nlp artificial-intelligence machine-learning bert-language-model

4
推荐指数
1
解决办法
5753
查看次数

部署在 kubernetes 上时,pytorch 模型评估速度很慢

我想通过部署在 Kubernetes 上的端点提供文本分类模型(finBERT pytorch 模型)的结果。

整个管道正在运行,但部署后处理速度非常慢(一句话需要 30 秒)。如果我在本地对同一端点进行计时,我将在 1 或 2 秒内得到结果。在本地运行docker镜像,端点也需要2秒才能返回结果。

当我在请求运行时检查 kubernetes 实例的 CPU 使用率时,它没有超过 35%,所以我不确定这是否与计算能力不足有关?

在向 pytorch 模型进行前向传递时,有人目睹过此类性能问题吗?关于我应该调查什么的任何线索?

非常感谢任何帮助,谢谢!

我目前正在使用

限制:CPU:“2”请求:CPU:“1”

Python:3.7 Pytorch:1.8.1

python kubernetes pytorch bert-language-model

4
推荐指数
1
解决办法
702
查看次数

Huggingface 模型的 OSError

我正在尝试使用拥抱模型(CamelBERT),但在加载分词器时出现错误:代码:

from transformers import AutoTokenizer, AutoModelForMaskedLM
tokenizer = AutoTokenizer.from_pretrained("CAMeL-Lab/bert-base-arabic-camelbert-ca")
model = AutoModelForMaskedLM.from_pretrained("CAMeL-Lab/bert-base-arabic-camelbert-ca")
Run Code Online (Sandbox Code Playgroud)

错误:

OSError: Can't load config for 'CAMeL-Lab/bert-base-arabic-camelbert-ca'. Make sure that:

- 'CAMeL-Lab/bert-base-arabic-camelbert-ca' is a correct model identifier listed on 'https://huggingface.co/models'

- or 'CAMeL-Lab/bert-base-arabic-camelbert-ca' is the correct path to a directory containing a config.json file
Run Code Online (Sandbox Code Playgroud)

由于此错误,我无法运行该模型。

python nlp deep-learning bert-language-model huggingface-transformers

4
推荐指数
1
解决办法
2万
查看次数

快速和慢速分词器产生不同的结果

使用 HuggingFace 的管道工具,我惊讶地发现使用快速和慢速分词器时输出存在显着差异。

具体来说,当我运行填充掩码管道时,分配给填充掩码的单词的概率对于快速和慢速分词器是不同的。此外,尽管无论输入的句子的数量和长度如何,快速分词器的预测都保持不变,但慢分词器的情况并非如此。

这是一个最小的例子:

from transformers import pipeline

slow = pipeline('fill-mask', model='bert-base-cased', \
                tokenizer=('bert-base-cased', {"use_fast": False}))

fast = pipeline('fill-mask', model='bert-base-cased', \
                tokenizer=('bert-base-cased', {"use_fast": True}))

s1 = "This is a short and sweet [MASK]."  # "example"
s2 = "This is [MASK]."  # "shorter"

slow([s1, s2])
fast([s1, s2])
slow([s2])
fast([s2])
Run Code Online (Sandbox Code Playgroud)

每个管道调用都会产生可以填充 for 的前 5 个标记[MASK],以及它们的概率。为简洁起见,我省略了实际输出,但分配给填充[MASK]for 的每个单词的概率s2在所有示例中都不相同。最后 3 个示例给出相同的概率,但第一个示例产生不同的概率。差异如此之大,以至于两组的前 5 名并不一致。

据我所知,这背后的原因是快速和慢速分词器返回不同的输出。快速分词器通过填充 0 将序列长度标准化为 512,然后创建一个注意力掩码来阻止填充。相比之下,慢速分词器仅填充到最长序列的长度,并且不会创建这样的注意力掩码。相反,它将填充的标记类型 id 设置为 1(而不是 0,这是非填充标记的类型)。根据我对 HuggingFace 的实现(在这里找到)的理解,这些是不等价的。

有谁知道这是否是故意的?

python nlp bert-language-model huggingface-transformers huggingface-tokenizers

3
推荐指数
1
解决办法
1510
查看次数

BERT 的无监督微调仅用于嵌入?

我想针对未标记数据的特定域微调 BERT,并让输出层检查它们之间的相似性。我该怎么做?我是否需要先微调分类器任务(或问题答案等)并获得嵌入?或者我可以只使用预先训练好的 Bert 模型而无需执行任务并使用我自己的数据进行微调?

nlp similarity bert-language-model

3
推荐指数
1
解决办法
1878
查看次数

Huggingface 的 BERT 标记器未添加填充标记

从文档中并不完全清楚,但我可以看到它BertTokenizer是用 初始化的pad_token='[PAD]',所以我假设当你用 编码时add_special_tokens=True它会自动填充它。鉴于此pad_token_id=0,我0在以下内容token_ids中看不到任何s :

tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', do_lower_case=True)
tokens = tokenizer.tokenize(text)
token_ids = tokenizer.encode(text, add_special_tokens=True, max_length=2048)

# Print the original sentence.
print('Original: ', text)

# Print the sentence split into tokens.
print('\nTokenized: ', tokens)

# Print the sentence mapped to token ids.
print('\nToken IDs: ', token_ids)
Run Code Online (Sandbox Code Playgroud)

输出:

Original:  Toronto's key stock index ended higher in brisk trading on Thursday, extending Wednesday's rally despite being weighed down by losses …
Run Code Online (Sandbox Code Playgroud)

tokenize bert-language-model huggingface-transformers

3
推荐指数
1
解决办法
4153
查看次数

Bert 预训练模型每次给出随机输出

我试图在 Huggingface bert 变压器之后添加一个额外的层,所以我BertForSequenceClassification在我的nn.Module网络中使用。但是,与直接加载模型相比,我看到模型给了我随机输出。

模型 1:

from transformers import BertForSequenceClassification

model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels = 5) # as we have 5 classes

import torch
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')

input_ids = torch.tensor(tokenizer.encode(texts[0], add_special_tokens=True, max_length = 512)).unsqueeze(0)  # Batch size 1

print(model(input_ids))

Run Code Online (Sandbox Code Playgroud)

出去:

(tensor([[ 0.3610, -0.0193, -0.1881, -0.1375, -0.3208]],
        grad_fn=<AddmmBackward>),)
Run Code Online (Sandbox Code Playgroud)

模型 2:

import torch
from torch import nn

class BertClassifier(nn.Module):
    def __init__(self):
        super(BertClassifier, self).__init__()
        self.bert = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels = 5)
        # as we have 5 …
Run Code Online (Sandbox Code Playgroud)

python-3.x pytorch bert-language-model huggingface-transformers

3
推荐指数
1
解决办法
783
查看次数