标签: bert-language-model

如何将 Bert 嵌入提供给 LSTM

我正在研究用于文本分类问题的 Bert + MLP 模型。本质上,我试图用基本的 LSTM 模型替换 MLP 模型。

是否可以创建带有嵌入的 LSTM?或者,最好创建一个带有嵌入层的 LSTM?

更具体地说,我很难尝试创建嵌入矩阵,因此我可以使用 Bert 嵌入创建嵌入层。

def get_bert_embeddings(dataset='gap_corrected_train',
                        dataset_path=TRAIN_PATH,
                        bert_path=BERT_UNCASED_LARGE_PATH,
                        bert_layers=BERT_LAYERS):
    """Get BERT embeddings for all files in dataset_path and specified BERT layers and write them to file."""
    df = None
    for file in os.listdir(dataset_path):
        if df is None:
            df = pd.read_csv(dataset_path+'/'+file, sep='\t')
        else:
            next_df = pd.read_csv(dataset_path+'/'+file, sep='\t')
            df = pd.concat([df, next_df], axis=0)
            df.reset_index(inplace=True, drop=True)

    for i, layer in enumerate(bert_layers):
        embeddings_file = INTERIM_PATH + 'emb_bert' + str(layer) + '_' + dataset …
Run Code Online (Sandbox Code Playgroud)

lstm keras keras-layer mlp bert-language-model

6
推荐指数
1
解决办法
8410
查看次数

BERT 输出不确定

BERT 输出不是确定性的。当我输入相同的输入时,我希望输出值是确定性的,但是我的 bert 模型中的值正在发生变化。听起来很尴尬,相同的值被返回两次,一次。也就是说,一旦出现另一个值,就会出现相同的值并重复。如何使输出具有确定性?让我展示我的代码片段。我使用的模型如下。

对于 BERT 实现,我使用了 Huggingface 实现的 BERT pytorch 实现。这是 pytorch 领域非常有名的模型 ri 实现。[链接] https://github.com/huggingface/pytorch-pretrained-BERT/

        tokenizer = BertTokenizer.from_pretrained(self.bert_type, do_lower_case=self.do_lower_case, cache_dir=self.bert_cache_path)
        pretrain_bert = BertModel.from_pretrained(self.bert_type, cache_dir=self.bert_cache_path)
        bert_config = pretrain_bert.config
Run Code Online (Sandbox Code Playgroud)

得到这样的输出

        all_encoder_layer, pooled_output = self.model_bert(all_input_ids, all_segment_ids, all_input_mask)

        # all_encoder_layer: BERT outputs from all layers.
        # pooled_output: output of [CLS] vec.

Run Code Online (Sandbox Code Playgroud)

pooled_output

tensor([[-3.3997e-01,  2.6870e-01, -2.8109e-01, -2.0018e-01, -8.6849e-02,

tensor([[ 7.4340e-02, -3.4894e-03, -4.9583e-03,  6.0806e-02,  8.5685e-02,

tensor([[-3.3997e-01,  2.6870e-01, -2.8109e-01, -2.0018e-01, -8.6849e-02,

tensor([[ 7.4340e-02, -3.4894e-03, -4.9583e-03,  6.0806e-02,  8.5685e-02,
Run Code Online (Sandbox Code Playgroud)

对于所有编码器层,情况是相同的, - 一次两次相同。

我从bert中提取词嵌入特征,情况是一样的。

wemb_n
tensor([[[ 0.1623,  0.4293, …
Run Code Online (Sandbox Code Playgroud)

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

6
推荐指数
1
解决办法
1205
查看次数

Bert 嵌入层使用 BiLSTM 引发“类型错误:不支持的操作数类型”:“无类型”和“int”

我在将 Bert 嵌入层集成到 BiLSTM 模型中以进行词义消歧任务时遇到问题,

Windows 10
Python 3.6.4
TenorFlow 1.12
Keras 2.2.4
No virtual environments were used
PyCharm Professional 2019.2
Run Code Online (Sandbox Code Playgroud)

整个剧本

import os
import yaml
import numpy as np
from argparse import ArgumentParser

import tensorflow as tf
import tensorflow_hub as hub
from tensorflow.keras.layers import (LSTM, Add, Bidirectional, Dense, Input, TimeDistributed, Embedding)

from tensorflow.keras.preprocessing.sequence import pad_sequences

try:
    from bert.tokenization import FullTokenizer
except ModuleNotFoundError:
    os.system('pip install bert-tensorflow')

from tensorflow.keras.models import Model
from tensorflow.keras import backend as K
from tqdm import tqdm …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow recurrent-neural-network bert-language-model

6
推荐指数
1
解决办法
1644
查看次数

删除 Bert 中的 SEP 令牌以进行文本分类

给定一个情感分类数据集,我想微调 Bert。

如您所知,BERT 创建是为了在给定当前句子的情况下预测下一个句子。因此,为了让网络意识到这一点,他们[CLS]在第一个句子的开头插入了一个标记,然后他们添加[SEP]了一个标记以将第一个句子与第二个句子分开,最后在第二个句子[SEP]的末尾添加另一个标记(我不清楚为什么他们在末尾附加另一个标记)。

无论如何,对于文本分类,我在一些在线示例中注意到(参见Keras 中的 BERT with Tensorflow hub)是它们添加[CLS]标记,然后是句子,最后是另一个[SEP]标记。

在其他研究工作中(例如,使用实体信息为关系分类丰富预训练语言模型)他们删除了最后一个[SEP]标记。

[SEP]当我的任务仅使用单个句子时,为什么在输入文本的末尾添加标记会/无益?

python bert-language-model

6
推荐指数
1
解决办法
1322
查看次数

对于语言模型微调(BERT 通过 Huggingface Transformers),输入文件的格式究竟应该如何设置?

我想examples/run_lm_finetuning.py训练的 Bert 模型上使用Huggingface Transformers 存储库中的。然而,根据文档,语料库文件的结构并不明显(除了引用 Wiki-2 数据集)。我试过了

  • 每行一个文档(多个句子)
  • 每行一句。文档由一个空行分隔(我在一些较旧的 pytorch-transformers 文档中找到了这个)

通过查看examples/run_lm_finetuning.py它的代码并不能直接看出下一句预测目标的序列对是如何形成的。该--line-by-line选项在这里有帮助吗?如果有人能给我一些提示文本语料库文件应该是什么样子,我将不胜感激。

非常感谢和欢呼,

脑洞

python pytorch bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
4274
查看次数

难以理解 Roberta 模型中使用的分词器

from transformers import AutoModel, AutoTokenizer

tokenizer1 = AutoTokenizer.from_pretrained("roberta-base")
tokenizer2 = AutoTokenizer.from_pretrained("bert-base-cased")

sequence = "A Titan RTX has 24GB of VRAM"
print(tokenizer1.tokenize(sequence))
print(tokenizer2.tokenize(sequence))
Run Code Online (Sandbox Code Playgroud)

输出:

['A', '?Titan', '?RTX', '?has', '?24', 'GB', '?of', '?VR', 'AM']

['A', 'Titan', 'R', '##T', '##X', 'has', '24', '##GB', 'of', 'V', '##内存']

Bert 模型使用 WordPiece 分词器。WordPiece 词汇表中没有出现的任何单词都会被贪婪地分解为子单词。例如,“RTX”被分解为“R”、“##T”和“##X”,其中## 表示它是一个子标记。

Roberta 使用 BPE 标记器,但我无法理解

a) BPE 分词器是如何工作的?

b) G 在每个代币中代表什么?

nlp pytorch bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
3614
查看次数

使用encode_plus方法时令牌索引序列长度错误

在尝试使用encode_plusTransformers 库中提供的方法为 BERT 编码问答对时,我遇到了一个奇怪的错误。

我正在使用来自这个 Kaggle 比赛的数据。给定问题标题、问题正文和答案,模型必须预测 30 个值(回归问题)。我的目标是将以下编码作为 BERT 的输入:

[CLS] question_title question_body [SEP] 回答 [SEP]

但是,当我尝试使用

tokenizer = transformers.BertTokenizer.from_pretrained("bert-base-uncased")
Run Code Online (Sandbox Code Playgroud)

并仅对来自 train.csv 的第二个输入进行编码,如下所示:

inputs = tokenizer.encode_plus(
            df_train["question_title"].values[1] + " " + df_train["question_body"].values[1], # first sequence to be encoded
            df_train["answer"].values[1], # second sequence to be encoded
            add_special_tokens=True, # [CLS] and 2x [SEP] 
            max_len = 512,
            pad_to_max_length=True
            )
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

Token indices sequence length is longer than the specified maximum sequence length for this model (46 > 512). …
Run Code Online (Sandbox Code Playgroud)

nlp tokenize bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
3801
查看次数

Huggingface bert 的准确率/f1 分数 [pytorch] 较差

我正在尝试BertForSequenceClassification一个简单的文章分类任务。

无论我如何训练它(冻结除分类层之外的所有层,所有层均可训练,最后k一层可训练),我总是得到几乎随机的准确度分数。我的模型训练准确率不超过 24-26%(我的数据集中只有 5 个类)。

我不确定在设计/训练模型时我做错了什么。我用多个数据集尝试了该模型,每次它都给出相同的随机基线精度。

我使用的数据集:BBC 文章(5 类)

https://github.com/zabir-nabil/pytorch-nlp/tree/master/bbc

包含来自 BBC 新闻网站的 2225 份文档,对应 2004 年至 2005 年五个主题领域的故事。自然课程:5(商业、娱乐、政治、体育、科技)

我添加了模型部分和训练部分,这是最重要的部分(以避免任何不相关的细节)。如果这对再现性有用,我也添加了完整的源代码+数据。

我的猜测是我设计网络的方式或者我将注意力掩码/标签传递给模型的方式有问题。此外,令牌长度 512 应该不是问题,因为大多数文本的长度 < 512(平均长度 < 300)。

型号代码:

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 classes

        # we want our output as probability so, in the evaluation mode, we'll pass the logits to a softmax layer
        self.softmax = torch.nn.Softmax(dim = …
Run Code Online (Sandbox Code Playgroud)

pytorch bert-language-model huggingface-transformers

6
推荐指数
1
解决办法
8258
查看次数

BERT 文档嵌入

我正在尝试使用 BERT 进行文档嵌入。我使用的代码是两个来源的组合。我使用BERT Document Classification Tutorial with CodeBERT Word Embeddings Tutorial。下面是代码,我将每个文档的前 510 个令牌提供给 BERT 模型。最后,我将 K 均值聚类应用于这些嵌入,但每个聚类的成员完全无关。我想知道这怎么可能。也许我的代码有问题。如果您查看我的代码并判断它是否有问题,我将不胜感激。我使用 Google colab 来运行此代码。

# text_to_embedding function
import torch
from keras.preprocessing.sequence import pad_sequences

def text_to_embedding(tokenizer, model, in_text):
    '''
    Uses the provided BERT 'model' and 'tokenizer' to generate a vector
    representation of the input string, 'in_text'.

    Returns the vector stored as a numpy ndarray.
    '''

    # ===========================
    #   STEP 1: Tokenization
    # ===========================

    MAX_LEN = 510

    # 'encode' will:
    #  (1) …
Run Code Online (Sandbox Code Playgroud)

embedding python-3.x word-embedding bert-language-model

6
推荐指数
1
解决办法
3585
查看次数

是否有必要在使用 Spacy、Bert 时对文本分类进行停用词移除、词干提取/词形还原?

在使用 Spacy、Bert 或其他高级 NLP 模型来获取文本的向量嵌入时,文本分类是否需要去除停用词、词干提取和词形还原?

text="婚礼上的食物非常好吃"

1.自从 Spacy 以来,Bert 在巨大的原始数据集上进行了训练,在使用 bert/spacy 生成嵌入文本分类任务之前,对这些文本应用停用词去除、词干提取和词形还原有什么好处吗?

2.当我们使用countvectorizer,tfidf vectorizer来获得句子的嵌入时,我可以理解停用词去除,词干和词形还原会很好。

nlp text-classification spacy bert-language-model

6
推荐指数
2
解决办法
3123
查看次数