我觉得我漏掉了一些显而易见的东西,因为我找不到任何关于这个的讨论。我想做很多反向查找(最近邻居距离搜索)在GloVe嵌入一个字生成网络。我目前只是迭代cpu上的词汇表。我使用一个进程池加快了速度,如下面的片段所示,但是对于大型语音来说,它仍然非常慢。
有没有办法用库达把它移到GPU上?我也读过有一种方法可以把这种东西变成一个大矩阵运算.如有任何参考资料,将不胜感激。谢谢!
glove = torchtext.vocab.GloVe(name='6B', dim=wordDim)
def closest(vec):
dists = [(w, torch.dist(vec, glove.vectors[glove.stoi[w]] for w in glove.itos]
return sorted(dists, key=lambda t: t[1])[0]
output = # word vectors…
# using a process pool to parallelize the lookup
pool=ProcessPoolExecutor(max_workers=8)
predictedWords = [w for w in list(pool.map(closestWord, output)]发布于 2018-12-07 04:15:40
通常,用通情达理的方法来处理这些类型的问题并不是很有效。整个过程可以用一些矩阵数学来完成,这将大大加快速度(并且能够使用PyTorch在GPU上计算)。使用默认的torch.dist,p=2将计算两个张量之间的欧氏距离,定义为
通过在整个单词向量矩阵上广播查询词,您可以在PyTorch中有效地对语音中的每个单词执行此操作:
def closest(vec):
dists = torch.sqrt(((glove.vectors - vec) ** 2).sum(dim=1))
return dists.argmin() # or glove.itos[dists.argmin()] if you want a string output然而,人们通常使用余弦相似度来寻找最接近的词向量,而不是欧几里德距离。这是向量之间夹角的余弦,可以计算为
类似地,可以在PyTorch中按以下方式实现:
glove_lengths = torch.sqrt((glove.vectors ** 2).sum(dim=1))
def closest_cosine(vec):
numerator = (glove.vectors * vec).sum(dim=1)
denominator = glove_lengths * torch.sqrt((vec ** 2).sum())
similarities = numerator / denominator
return glove.itos[similarities.argmax()]请注意,我们将方程的\|\mathbf{v}\|部分移出了这里的函数,所以我们不必每次运行它时都重新计算每个手套向量的长度。
https://datascience.stackexchange.com/questions/42247
复制相似问题