【问题标题】:sentence transformer using huggingface/transformers pre-trained model vs SentenceTransformer使用 huggingface/transformers 预训练模型与 SentenceTransformer 的句子转换器
【发布时间】:2022-10-20 22:51:03
【问题描述】:

This 页面有两个脚本

什么时候应该使用下面显示的第一种方法和第二种方法?正如nli-distilroberta-base-v2 专门为查找句子嵌入而训练的那样,这不会总是比第一种方法更好吗?

training_stsbenchmark.py1 -

from sentence_transformers import SentenceTransformer,  LoggingHandler, losses, models, util
#You can specify any huggingface/transformers pre-trained model here, for example, bert-base-uncased, roberta-base, xlm-roberta-base
model_name = sys.argv[1] if len(sys.argv) > 1 else 'distilbert-base-uncased'

# Use Huggingface/transformers model (like BERT, RoBERTa, XLNet, XLM-R) for mapping tokens to embeddings
word_embedding_model = models.Transformer(model_name)

# Apply mean pooling to get one fixed sized sentence vector
pooling_model = models.Pooling(word_embedding_model.get_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])

training_stsbenchmark_continue_training.py -

from sentence_transformers import SentenceTransformer, LoggingHandler, losses, util, InputExample
model_name = 'nli-distilroberta-base-v2'
model = SentenceTransformer(model_name)

【问题讨论】:

    标签: python nlp bert-language-model sentence-transformers


    【解决方案1】:

    您正在比较 2 个不同的事物:

    training_stsbenchmark.py - 这个例子展示了如何创建一个 SentenceTransformer模型从头开始通过使用预训练的变压器模型和池化层。

    换句话说,您正在创建自己的模型SentenceTransformer 使用你自己的数据,因此微调。

    training_stsbenchmark_continue_training.py - 此示例显示如何继续对 STS 数据进行训练以前创建和训练的SentenceTransformer 模型。

    在该示例中,他们加载了在 NLI 数据上训练的模型。

    那么,回答“这不会总是比第一种方法更好吗?”

    这取决于你的最终结果。尝试这两种方法并自行检查,这将提供更好的交叉验证结果。

    【讨论】:

      【解决方案2】:

      S-BERT 和 BERT 是有区别的。 BERT 模型将每个 WORD 编码为 X 维数组。 所以例如。

      line= "The dog is running"
      

      当您使用 Transformer (Not SentenceTransformer) 对这 4 个单词的句子进行编码时,它将输出一个形状列表 (4, 768),因为在您的情况下,nli-distilroberta-base-v2 会生成 768 维的嵌入。这是 BERT。

      其中,S-BERT (Sentence Bert) 为整个 SENTENCE (1, 768) 输出单个 768 维嵌入。它通常通过取 BERT 列表中所有嵌入的平均值来做到这一点。

      例如。假设句子是二维而不是 768,

      "The"=     (3,4)
      "dog"=     (0,2)
      "is"=      (4,1)
      "running"= (6,7)
      

      因此,BERT 创建的输出将是:

      [[3,4],[0,2],[4,1],[6,7]]
      

      S-BERT 采用 BERT 的值,并池化为 2 维的单个值:

      [(3+0+4+6)/4, (4+2+1+7)/4)]
      = [3.25, 3.5]
      

      这种池化操作在不同情况下可能会有所不同(对此不太确定),但通常它取所有值的平均值。

      【讨论】:

        猜你喜欢
        • 2021-01-08
        • 2021-03-31
        • 2021-01-02
        • 2021-04-01
        • 2020-08-12
        • 2023-03-10
        • 1970-01-01
        • 2022-01-27
        • 2020-08-11
        相关资源
        最近更新 更多