基于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

使用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)

就这样了。我们现在有一个带有嵌入的numpy数组列表。

for sentence, embedding in zip(sentences, sentence_embeddings):
    print("Sentence:", sentence)
    print("Embedding:", embedding)
    print("")

培训

此框架允许您微调自己的句子嵌入方法,以便获得特定于任务的句子嵌入。您可以选择各种选项,以便为您的特定任务获得完美的句子嵌入。

数据集下载

首先,你应该下载一些数据集。为此,请运行示例/数据集/获取数据.py

python examples/datasets/get_data.py

它将下载一些数据集并将其存储在磁盘上。

从头开始的模特训练

示例/training\u nli\u bert.py根据谷歌提供的预先培训模型对bert进行微调。它调整了自然语言推理(nli)数据的模型。给定两个句子,如果这两个句子相互包含、矛盾或是中立的,模型应该进行分类。为此,将这两个句子传递到transformer模型以生成固定大小的句子嵌入。然后将这些句子嵌入传递给softmax分类器,以派生最终标签(包含、矛盾、中性)。这将生成句子嵌入,对于其他任务(如聚类或语义文本相似性)也很有用。

首先,我们定义了一个序列模型,如何将一个句子映射到一个固定大小的句子嵌入:

# 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])

首先,我们使用bert模型(从bert base uncased实例化)将句子中的标记映射到bert的输出嵌入。模型的下一层是池模型:在这种情况下,我们执行平均池。还可以执行最大池或使用cls令牌中的嵌入。您还可以将多个池组合在一起。

这两个模块(word_-embedding_模型和pooling_模型)构成了我们的sentencetransformer。现在,每个句子首先通过单词嵌入模型,然后通过池模型来给出固定大小的句子向量。

接下来,我们指定一个列车数据加载器:

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分类器。

接下来,我们还指定一个dev集。使用dev集,对某些不可见数据的语句嵌入模型进行评估。注意,dev集可以是任何数据,在本例中,我们在sts基准数据集的dev集上求值。计算器计算性能指标,在这种情况下,计算句子嵌入之间的余弦相似度,并计算与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)

然后,训练如下:

pip install -U sentence-transformers
0

继续培训其他数据

examples/training\u stsbenchmark.py显示了一个示例,其中继续进行微调模型的培训。在这个例子中,我们使用了一个句子转换模型,该模型首先在nli数据集上进行了微调,然后继续从sts基准测试中对训练数据进行训练。

首先,我们从服务器加载一个预先训练的模型:

pip install -U sentence-transformers
1

接下来的步骤和以前一样。我们指定培训和开发数据:

pip install -U sentence-transformers
2

在这个例子中,我们使用余弦相似性,它计算两个句子之间的余弦相似性,并将此分数与提供的黄金相似性分数进行比较。

然后我们可以像以前一样训练:

pip install -U sentence-transformers
3

加载模型

加载经过训练的模型很容易。您可以指定路径:

pip install -U sentence-transformers
4

注意:A/或\是路径很重要,否则,它不能被识别为路径。

您还可以将培训输出托管在服务器上并下载:

pip install -U sentence-transformers
5

第一次调用时,模型将被下载并存储在本地torch缓存文件夹中(~/.cache/torch/sentence_transformers)。为了工作,您必须压缩模型的所有文件和子文件夹。

我们还提供了一些经过预训练的模型,只需传递一个名称即可加载这些模型:

pip install -U sentence-transformers
1

这将从我们的服务器下载bert base nli mean tokens并将其存储在本地。

预训练模型

我们提供以下型号。您可以按以下方式使用它们:

pip install -U sentence-transformers
7

随着新车型的增加,列表也在增加。

使用bert嵌入句子

bert语句嵌入经过了广泛的测试和调整。我们为您的使用发布了以下预先培训的模型:

受过NLI数据方面的培训

这些模型在snli和multinli数据集上进行训练,以创建通用的句子嵌入。有关详细信息,请参见:nli models.md

  • bert base nli mean tokens:该模型基于allnli数据集对bert进行了微调。作为池策略,使用了平均令牌。性能:stsbenchmark:77.12
  • bert base nli max tokens:该模型基于allnli数据集对bert进行了微调。作为池策略,使用了max令牌。性能:stsbenchmark:77.18
  • bert base nli cls token:此模型基于allnli数据集对bert base进行了微调。作为池策略,使用了cls令牌。性能:stsbenchmark:76.30
  • bert large nli mean tokens:该模型对allnli数据集上的bert large进行了微调。作为池策略,使用了平均令牌。性能:stsbenchmark:79.19
  • bert large nli max令牌:该模型在allnli数据集上对bert large进行了微调。作为池策略,使用了max令牌。性能:stsbenchmark:78.32
  • bert large nli cls token:此模型微调了allnli数据集上的bert large。作为池策略,使用了cls令牌。性能:stsbenchmark:78.29

接受过STS数据培训

这些模型在sts基准的训练集上进行了微调。钍ey特别适合于语义文本相似性。有关详细信息,请参见:sts models.md

  • bert base nli stsb mean tokens:首先对allnli进行微调,然后对sts基准训练集进行微调。性能:stsbenchmark:85.14
  • bert large nli stsb mean tokens:首先微调allnli,然后微调sts基准训练集。性能:stsbenchmark:85.29

在维基百科部分培训三胞胎

这些模型是根据维基百科部分生成的三胞胎进行微调的。如果需要对类似主题的句子进行细粒度的聚类,那么这些模型可以很好地工作。有关详细信息,请参见:wikipedia sections models.md

  • Bert Base Wikipedia Sections表示标记:Wikipedia Sections测试集的准确率为80.42%。

使用roberta嵌入句子

roberta可以用来训练句子嵌入。有关如何训练roberta生成句子嵌入的示例,请参见training_nli_roberta.pytraining_stsbenchmark_roberta.py

预培训的模特目前正在接受培训,并将很快上传。

使用xlnet嵌入句子

目前,xlnet模型正在开发中。目前,它产生的结果比bert模型更差,因此,我们还没有发布xlnet的预训练模型。

一旦我们对xlnet的超参数进行了微调,以生成良好的工作语句嵌入,新的预训练模型就会发布。

性能

目前正在进行广泛的评估,但我们在此提供一些初步结果。

<表><广告>型号 STS基准SentEval< /广告><正文>手套平均嵌入量58.0281.52BERT-AS-A-SERVICE平均嵌入量46.3584.04bert-as-a-service cls向量16.5084.66推断-手套68.0385.59通用句子编码器74.9285.10句子转换模型 bert base nli是指代币77.1286.37伯特大nli表示代币79.1987.78bert base nli stsb mean令牌85.1486.07bert large nli stsb表示代币85.2986.66

损失函数

我们实现了各种损失函数,允许训练来自不同数据集的句子嵌入。这些损耗函数包含在包中

  • SoftMaxLoss:给定两个句子的句子嵌入,训练SoftMax分类器。可用于NLI等数据集的培训。
  • 余弦相似性:给定一个句子对和一个黄金相似性分数(介于-1和-1之间或介于0和1之间),计算句子嵌入之间的余弦相似性并最小化均方误差损失。
  • 三重态损耗:给定一个三重态(锚定,正数,负数),将三重态损耗最小化。
  • BatchHardTripleTruss:实现本文中的批量硬三重态丢失是为了保护三重态丢失,以便重新确认身份。每个批处理必须包含来自同一类的多个示例。然后,损耗优化了最远正对和最近负对之间的距离。
  • multipleenegativesrankingloss:每批都有一个正对,所有其他对都被视为负示例。论文中使用了这种损失,通过多任务双enc学习跨语言句子表示。订单型号

型号

这个框架实现了各种模块,这些模块可以顺序地用于将句子映射到句子嵌入。不同的模块可以在包sentence_transformers.models中找到。每个管道由以下模块组成。

字嵌入:这些模型将令牌映射到令牌嵌入。

嵌入转换:这些模型以某种方式转换令牌嵌入

句子嵌入模型:这些模型将句子直接映射到固定大小的句子嵌入:

  • 弓:计算输入文本的固定大小的单词包(弓)表示。可以使用idf值初始化以创建tf idf向量。注意,这个模型是不可训练的。例

句子嵌入转换:一旦我们有了固定大小的句子嵌入,就可以添加这些模型。

多任务训练

此代码允许使用来自不同数据集的训练数据和具有不同损失函数的多任务学习。稍后将提供更多文档。

应用示例

我们给出了一些例子,如何将生成的语句嵌入用于下游应用程序。

语义搜索

语义搜索是寻找与给定句子相似的句子的任务。请参见示例/应用程序语义搜索。

我们首先为语料库中的所有句子生成一个嵌入:

pip install -U sentence-transformers
8

然后,我们为不同的查询语句生成嵌入:

pip install -U sentence-transformers
9

然后,我们使用scipy查找语料库中查询的最相似嵌入:

pip install -e .
0

输出如下:

pip install -e .
1

群集

examples/application\u clustering.py描述了一个基于句子嵌入相似度对相似句子进行聚类的示例。

如前所述,我们首先计算每个句子的嵌入:

pip install -e .
2

然后,我们使用scipy:

pip install -e .
3

输出如下:

pip install -e .
4

引用作者的话

描述该框架的出版物将于2019年EMNLP上发布。

此存储库的主要贡献者是:

联系人:nils reimers,rnils@web.de

https://www.ukp.tu darmstadt.de/

如果有什么东西坏了(不应该坏了),或者您还有其他问题,请立即给我们发送电子邮件或报告问题。

< Buff行情>

此存储库包含实验软件,发布此软件的唯一目的是提供有关各自出版物的附加背景详细信息。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java JPA。Eclipselink没有为mySQL提供密码,但它应该提供   我的Servlet和@FormDataParam存在java问题   java将什么作为上下文参数传递到文件I/O方法中?   如果两个值相同,java无法找到其中一个单选按钮   java在变量和方法名中使用下划线   JavaSpringMVC单线程安全?   klazz类的java Arraylist(反射Api)   java如何在数字字符串中查找最频繁的数字?   JavaAPI设计:使数据更易于阅读与强制更多API调用   JavaHadoopMapReduceforGoogleWebGraph   java无法启动gauge API:Runner意外退出   java如何在bluemix上使用ibm工作负载调度器?   拉取一年中某一周特定日期的所有日期   java为什么是我的角节点。js应用程序将图像上传到S3� 邮递员正确上传时的符号?   在不使用任何第三方jar的情况下将文件从本地传输到linux系统(java代码)   java将现有文件夹复制到Eclipse工作区中新创建的项目中   Java中的regex RegExp帮助   当使用“系统”外观时,Java组合框setSelectedItem会出现故障   JavaASM:在类的方法中获取局部变量名和值