我不想把预训练嵌入添加到模型中。但是,似乎没有词汇外(OOV)标记的重新定义。不存在看不见的文字的矢量。
那么我该怎么处理我遇到的OOV-令牌呢?我有一些想法,但似乎没有一个很好:
(一个通用的解决方案是值得赞赏的,但我想补充一下,我正在使用PyTorch --以防PyTorch已经为这个问题提供了一个方便的解决方案。)
,那么,创建这样一个向量的好的 easy 策略是什么?
发布于 2018-11-16 00:44:48
有多种方法可以处理它。我想我不能引用关于哪个更好的参考资料。
不可训练选项
可训练选项
您可以为OOV声明一个单独的嵌入向量,并使其可训练,使其他嵌入保持固定。您可能必须重写嵌入查找的前向方法。您可以声明一个新的可训练的Variable,在前面的传递中,使用这个向量作为OOV的嵌入,而不是进行查找。
关于执行部分的评论:
我不知道三种不可训练的方法中哪一种可能更好,我也不确定是否有一些工作要做。但是方法4)应该工作得更好。
对于可训练选项,您可以创建一个新的嵌入层如下所示。
class Embeddings_new(torch.nn.Module):
def __init__(self, dim, vocab):
super().__init__()
self.embedding = torch.nn.Embedding(vocab, dim)
self.embedding.weight.requires_grad = False
# vector for oov
self.oov = torch.nn.Parameter(data=torch.rand(1,dim))
self.oov_index = -1
self.dim = dim
def forward(self, arr):
N = arr.shape[0]
mask = (arr==self.oov_index).long()
mask_ = mask.unsqueeze(dim=1).float()
embed =(1-mask_)*self.embedding((1-mask)*arr) + mask_*(self.oov.expand((N,self.dim)))
return embed 用法:
model = Embeddings_new(10,20000)
out = model.forward(torch.tensor([-1,-1, 100, 1, 0]))
# dummy loss
loss = torch.sum(a**2)
loss.backward()https://stackoverflow.com/questions/53316174
复制相似问题