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