如何使用XLNet进行句子相似?

我想执行句子相似性任务并尝试以下操作:

from transformers import XLNetTokenizer,XLNetModel
import torch
import scipy
import torch.nn as nn
import torch.nn.functional as F

tokenizer = XLNetTokenizer.from_pretrained('xlnet-large-cased')
model = XLNetModel.from_pretrained('xlnet-large-cased')

input_ids = torch.tensor(tokenizer.encode("Hello,my animal is cute",add_special_tokens=False)).unsqueeze(0)
outputs = model(input_ids)
last_hidden_states = outputs[0]

input_ids = torch.tensor(tokenizer.encode("I like your cat",add_special_tokens=False)).unsqueeze(0) 

outputs1 = model(input_ids)
last_hidden_states1 = outputs1[0]

cos = nn.Cosinesimilarity(dim=1,eps=1e-6)
output = cos(last_hidden_states,last_hidden_states1)

但是,出现以下错误:

RuntimeError: The size of tensor a (7) must match the size of tensor b (4) at non-singleton dimension 1

有人可以告诉我,我做错了吗?有更好的方法吗?

yujian1314 回答:如何使用XLNet进行句子相似?

您做错了几件事。

  1. add_special_tokens应该设置为True。使用<sep>令牌来分离句子,使用<cls>令牌来对模型进行训练来训练模型。由于训练测试数据不匹配,未使用引线导致奇怪的行为。

  2. outputs[0]为您提供了单成员Python元组的第一个元素。 Transformer软件包中的所有模型都返回元组,因此返回此单成员元组。每个输入令牌包含一个矢量,包括特殊令牌。

  3. 与BERT [CLS]令牌是第一个令牌的BERT不同,这里<cls>令牌是最后一个令牌(请参见Transformers documentation)。如果要比较分类向量,则应从序列中获取最后一个向量,即outputs[0][:,-1]

或者,您可能想比较嵌入的平均值(平均池),而不是<cls>令牌嵌入。在这种情况下,您只需执行output[0].mean(1)

本文链接:https://www.f2er.com/2601314.html

大家都在问