如何在句子转换器之上应用线性层

问题描述 投票:0回答:1

嘿,我正在尝试为少量镜头学习创建一个基本的 Sentence Transformer 模型,但是在拟合时,我观察到对模型所做的更改很小,因为该模型已经在 1B+ 对上进行了训练,而我在每对大约 40 对上进行了训练epochs,为了解决这个问题,我决定在句子转换器的顶部应用一个线性层,以学习与特定数据集相对应的嵌入。 然而,句子转换器似乎没有前向功能。它们是 model.encode() 方法的替代方法,但它不会更改模型参数。 总结一下,我想创建一个网络,在句子转换器上进行前向传递,然后在线性层上进行前向传递,最后得到可在整个模型中使用的损失。 任何帮助都会有用的。 谢谢你。

python pytorch nlp bert-language-model
1个回答
0
投票

这是一个简单的代码片段,它在句子转换器的顶部添加一个简单的线性层:

import torch
from sentence_transformers import SentenceTransformer

class SentenceTransformerWithLinearLayer(torch.nn.Module):
    def __init__(self, transformer_model_name):
        super(SentenceTransformerWithLinearLayer, self).__init__()
        
        # Load the sentence transformer model
        self.sentence_transformer = SentenceTransformer(transformer_model_name)
        last_layer_dimension = self.sentence_transformer.get_sentence_embedding_dimension()
        
        # New linear layer with 16 output dimensions
        self.linear = torch.nn.Linear(last_layer_dimension, 16)

    def forward(self, x):
        # Pass the input through the sentence transformer
        x = self.sentence_transformer.encode(x, convert_to_numpy=False).unsqueeze(0)
        
        # Pass through the linear layer
        x = self.linear(x)
        return x

这可以与简单的句子转换器类似地使用。在此示例中,我加载了

all-mpnet-base-v2
模型作为基本句子转换器。
"Hello world"
的输入经过句子转换器,然后经过线性层,得到一个16维向量。

model = SentenceTransformerWithLinearLayer("all-mpnet-base-v2")
output = model.forward("Hello world")

该向量可以用于损失函数,例如MSEL 损失

loss_function = torch.nn.MSELoss()

...
expected = ...
loss = loss_function(output, expected)
loss.backward()
...
© www.soinside.com 2019 - 2024. All rights reserved.