基于bert/xlnet的句子嵌入
sentence-transformers的Python项目详细描述
句子转换器:使用bert/roberta/xlnet和pytorch进行句子嵌入
bert/xlnet产生了开箱即用的相当糟糕的句子嵌入。这个存储库使用连体或三元组网络结构微调bert/xlnet,生成语义有意义的句子嵌入,可用于无监督的场景:通过余弦相似度实现语义文本相似度、聚类、语义搜索。
我们提供了越来越多的最先进的预训练模型,可用于派生句子嵌入。请参见预训练模型。
您可以使用此代码轻松地训练您自己的语句嵌入,这些嵌入是为您的特定任务而调整的。我们提供各种数据集读取器,您可以根据数据集的结构调整具有不同损失函数的句子嵌入。有关进一步的详细信息,请参见训练自己的句子嵌入 我们推荐Python3.6或更高版本。该模型使用pytorch transformers v1.1.0版的pytorch transformers(至少1.0.1)实现。
代码不适用于Python2.7。 使用PIP 使用 来自源代码 克隆此存储库并使用 此示例向您展示如何使用已培训过的句子转换模型为其他任务嵌入句子。 首先下载一个预先训练过的模型。 然后为模型提供一些句子。 就这样了。我们现在有一个带有嵌入的numpy数组列表。 此框架允许您微调自己的句子嵌入方法,以便获得特定于任务的句子嵌入。您可以选择各种选项,以便为您的特定任务获得完美的句子嵌入。 首先,你应该下载一些数据集。为此,请运行示例/数据集/获取数据.py
它将下载一些数据集并将其存储在磁盘上。 示例/training\u nli\u bert.py根据谷歌提供的预先培训模型对bert进行微调。它调整了自然语言推理(nli)数据的模型。给定两个句子,如果这两个句子相互包含、矛盾或是中立的,模型应该进行分类。为此,将这两个句子传递到transformer模型以生成固定大小的句子嵌入。然后将这些句子嵌入传递给softmax分类器,以派生最终标签(包含、矛盾、中性)。这将生成句子嵌入,对于其他任务(如聚类或语义文本相似性)也很有用。 首先,我们定义了一个序列模型,如何将一个句子映射到一个固定大小的句子嵌入: 首先,我们使用bert模型(从bert base uncased实例化)将句子中的标记映射到bert的输出嵌入。模型的下一层是池模型:在这种情况下,我们执行平均池。还可以执行最大池或使用cls令牌中的嵌入。您还可以将多个池组合在一起。 这两个模块(word_-embedding_模型和pooling_模型)构成了我们的sentencetransformer。现在,每个句子首先通过单词嵌入模型,然后通过池模型来给出固定大小的句子向量。 接下来,我们指定一个列车数据加载器: 接下来,我们还指定一个dev集。使用dev集,对某些不可见数据的语句嵌入模型进行评估。注意,dev集可以是任何数据,在本例中,我们在sts基准数据集的dev集上求值。 然后,训练如下: examples/training\u stsbenchmark.py显示了一个示例,其中继续进行微调模型的培训。在这个例子中,我们使用了一个句子转换模型,该模型首先在nli数据集上进行了微调,然后继续从sts基准测试中对训练数据进行训练。 首先,我们从服务器加载一个预先训练的模型: 接下来的步骤和以前一样。我们指定培训和开发数据: 在这个例子中,我们使用余弦相似性,它计算两个句子之间的余弦相似性,并将此分数与提供的黄金相似性分数进行比较。 然后我们可以像以前一样训练: 加载经过训练的模型很容易。您可以指定路径: 注意:A/或\是路径很重要,否则,它不能被识别为路径。 您还可以将培训输出托管在服务器上并下载: 第一次调用时,模型将被下载并存储在本地torch缓存文件夹中( 我们还提供了一些经过预训练的模型,只需传递一个名称即可加载这些模型: 这将从我们的服务器下载 我们提供以下型号。您可以按以下方式使用它们: 随着新车型的增加,列表也在增加。 bert语句嵌入经过了广泛的测试和调整。我们为您的使用发布了以下预先培训的模型: 受过NLI数据方面的培训
这些模型在snli和multinli数据集上进行训练,以创建通用的句子嵌入。有关详细信息,请参见:nli models.md 接受过STS数据培训
这些模型在sts基准的训练集上进行了微调。钍ey特别适合于语义文本相似性。有关详细信息,请参见:sts models.md 在维基百科部分培训三胞胎 这些模型是根据维基百科部分生成的三胞胎进行微调的。如果需要对类似主题的句子进行细粒度的聚类,那么这些模型可以很好地工作。有关详细信息,请参见:wikipedia sections models.md
roberta可以用来训练句子嵌入。有关如何训练roberta生成句子嵌入的示例,请参见training_nli_roberta.py和training_stsbenchmark_roberta.py。
预培训的模特目前正在接受培训,并将很快上传。 目前,xlnet模型正在开发中。目前,它产生的结果比bert模型更差,因此,我们还没有发布xlnet的预训练模型。 一旦我们对xlnet的超参数进行了微调,以生成良好的工作语句嵌入,新的预训练模型就会发布。 目前正在进行广泛的评估,但我们在此提供一些初步结果。 我们实现了各种损失函数,允许训练来自不同数据集的句子嵌入。这些损耗函数包含在包中
这个框架实现了各种模块,这些模块可以顺序地用于将句子映射到句子嵌入。不同的模块可以在包 字嵌入:这些模型将令牌映射到令牌嵌入。 嵌入转换:这些模型以某种方式转换令牌嵌入 句子嵌入模型:这些模型将句子直接映射到固定大小的句子嵌入: 句子嵌入转换:一旦我们有了固定大小的句子嵌入,就可以添加这些模型。 此代码允许使用来自不同数据集的训练数据和具有不同损失函数的多任务学习。稍后将提供更多文档。 我们给出了一些例子,如何将生成的语句嵌入用于下游应用程序。 语义搜索是寻找与给定句子相似的句子的任务。请参见示例/应用程序语义搜索。
我们首先为语料库中的所有句子生成一个嵌入: 然后,我们为不同的查询语句生成嵌入: 然后,我们使用scipy查找语料库中查询的最相似嵌入: 输出如下: examples/application\u clustering.py描述了一个基于句子嵌入相似度对相似句子进行聚类的示例。 如前所述,我们首先计算每个句子的嵌入: 然后,我们使用scipy: 输出如下: 描述该框架的出版物将于2019年EMNLP上发布。 此存储库的主要贡献者是: 联系人:nils reimers,rnils@web.de https://www.ukp.tu darmstadt.de/ 如果有什么东西坏了(不应该坏了),或者您还有其他问题,请立即给我们发送电子邮件或报告问题。 此存储库包含实验软件,发布此软件的唯一目的是提供有关各自出版物的附加背景详细信息。设置
pip
:pip install -U sentence-transformers
pip安装它
:pip install -e .
开始
嵌入预训练模型的句子
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('bert-base-nli-mean-tokens')
sentences = ['This framework generates embeddings for each input sentence',
'Sentences are passed as a list of string.',
'The quick brown fox jumps over the lazy dog.']
sentence_embeddings = model.encode(sentences)
for sentence, embedding in zip(sentences, sentence_embeddings):
print("Sentence:", sentence)
print("Embedding:", embedding)
print("")
培训
数据集下载
python examples/datasets/get_data.py
从头开始的模特训练
# Use BERT for mapping tokens to embeddings
word_embedding_model = models.BERT('bert-base-uncased')
# Apply mean pooling to get one fixed sized sentence vector
pooling_model = models.Pooling(word_embedding_model.word_embedding_dimension(),
pooling_mode_mean_tokens=True,
pooling_mode_cls_token=False,
pooling_mode_max_tokens=False)
model = SentenceTransformer(modules=[word_embedding_model, pooling_model])
nli_reader = NLIDataReader('datasets/AllNLI')
train_data = SentencesDataset(nli_reader.get_examples('train.gz'), model=model)
train_dataloader = DataLoader(train_data, shuffle=True, batch_size=batch_size)
train_loss = losses.SoftmaxLoss(model=model, sentence_embedding_dimension=model.get_sentence_embedding_dimension(), num_labels=train_num_labels)
nlidatareader
读取allnli数据集,并生成适合于训练句子转换模型的数据加载。作为训练损失,我们使用SoftMax分类器。计算器计算性能指标,在这种情况下,计算句子嵌入之间的余弦相似度,并计算与gold分数的spearman相关性。
sts_reader = STSDataReader('datasets/stsbenchmark')
dev_data = SentencesDataset(examples=sts_reader.get_examples('sts-dev.csv'), model=model)
dev_dataloader = DataLoader(dev_data, shuffle=False, batch_size=train_batch_size)
evaluator = EmbeddingSimilarityEvaluator(dev_dataloader)
0
pip install -U sentence-transformers
继续培训其他数据
1
pip install -U sentence-transformers
2
pip install -U sentence-transformers
3
pip install -U sentence-transformers
加载模型
4
pip install -U sentence-transformers
5
pip install -U sentence-transformers
~/.cache/torch/sentence_transformers
)。为了工作,您必须压缩模型的所有文件和子文件夹。
1
pip install -U sentence-transformers
bert base nli mean tokens
并将其存储在本地。预训练模型
7
pip install -U sentence-transformers
使用bert嵌入句子
使用roberta嵌入句子
使用xlnet嵌入句子
性能
< /广告><正文>型号
STS基准 SentEval 手套平均嵌入量 58.02 81.52 BERT-AS-A-SERVICE平均嵌入量 46.35 84.04 bert-as-a-service cls向量 16.50 84.66 推断-手套 68.03 85.59 通用句子编码器 74.92 85.10 句子转换模型
bert base nli是指代币 77.12 86.37 伯特大nli表示代币 79.19 87.78 bert base nli stsb mean令牌 85.14 86.07 bert large nli stsb表示代币 85.29 86.66 损失函数
型号
sentence_transformers.models
中找到。每个管道由以下模块组成。多任务训练
应用示例
语义搜索
8
pip install -U sentence-transformers
9
pip install -U sentence-transformers
0
pip install -e .
1
pip install -e .
群集
2
pip install -e .
3
pip install -e .
4
pip install -e .
引用作者的话
推荐PyPI第三方库