<p>作为对注释线程的响应</p>
<p>目标或管道似乎是:</p>
<ol>
<li>接收两个嵌入向量(例如,A和B)</李>
<li>检查这两个向量是否“相似”(使用余弦相似性)</李>
<li>如果它们相似,则标签为1,否则为-1(我建议将其更改为0或1,而不是-1和1)</李>
</ol>
<p>我能想到的是以下几点。如果我误解了什么,请纠正我。免责声明是,我几乎是根据我的直觉编写的,不知道任何细节,所以如果你尝试运行,它可能会充满错误。让我们仍然尝试获得高层次的理解</p>
<h3>型号</h3>
<pre><code>import torch
import torch.nn as nn
class Model(nn.Module):
def __init__(self, num_emb, emb_dim): # I'm assuming the embedding matrices are same sizes.
self.embedding1 = nn.Embedding(num_embeddings=num_emb, embedding_dim=emb_dim)
self.embedding2 = nn.Embedding(num_embeddings=num_emb, embedding_dim=emb_dim)
self.cosine = nn.CosineSimilarity()
self.sigmoid = nn.Sigmoid()
def forward(self, a, b):
output1 = self.embedding1(a)
output2 = self.embedding2(b)
similarity = self.cosine(output1, output2)
output = self.sigmoid(similarity)
return output
</code></pre>
<h3>培训/评估</h3>
<pre><code>model = Model(num_emb, emb_dim)
if torch.cuda.is_available():
model = model.to('cuda')
model.train()
criterion = loss_function()
optimizer = some_optimizer()
for epoch in range(num_epochs):
epoch_loss = 0
for batch in train_loader:
optimizer.zero_grad()
a, b, label = batch
if torch.cuda.is_available():
a = a.to('cuda')
b = b.to('cuda')
label = label.to('cuda')
output = model(a, b)
loss = criterion(output, label)
loss.backward()
optimizer.step()
epoch_loss += loss.cpu().item()
print("Epoch %d \t Loss %.6f" % epoch, epoch_loss)
</code></pre>
<p>我省略了一些细节(例如,超参数值、损失函数和优化器等)。这整个过程和你想要的类似吗</p>