【问题标题】:ALBERT: first word associationsALBERT:第一个单词联想
【发布时间】:2022-07-01 18:41:32
【问题描述】:

我有一个单词列表(例如,“apple”、“banana”、“mango”),并且想使用 ALBERT (https://huggingface.co/albert-base-v2) 来识别与我的每个单词最密切相关的 10 个单词列表。简单来说:“Hey ALBERT,听到苹果/香蕉/芒果时,你想到的第一个词是什么?”

我的第一个想法是使用“apple is related to [MASK]”之类的提示。但一些*预测非常奇怪或不恰当的词,例如“evalle”。

我的第二个想法是使用 k-最近邻方法。但是,我不知道如何在 Hugginface 转换器中实现它。是否可以在没有微调的情况下做到这一点?你有别的想法吗?

【问题讨论】:

  • 您是否有一个可能的关联列表,可以从中选择最相关的关联?否则,我觉得这很快就会成为一个棘手的问题,或者至少会导致推理性能非常差。
  • 一开始就不是这样的。但是,您认为列出 5,000 个最常用的英语单词的列表是否可行?
  • 也许这有助于说明我想要实现的目标:aclanthology.org/2020.conll-1.30.pdf

标签: nlp huggingface-transformers nearest-neighbor


【解决方案1】:

您只需要使用 AlBERT 的嵌入和解码层即可。 Transformers 将轻松为您提供这些:

import torch
from transformers import pipeline
from transformers import AlbertTokenizer, AlbertModel

unmasker = pipeline('fill-mask', model='albert-base-v2')
model = unmasker.model
tokenizer = AlbertTokenizer.from_pretrained('albert-base-v2')

您可以使用model 查看构成模型的层列表。我们希望model.albert.embeddings.word_embeddings 将一个单词(实际上是一个单词标记)转换为一个向量,这里是一个 128 个值的向量。我们还需要 model.predictions.decoder,它会通过为嵌入词汇表中的 30000 个标记中的每一个输出一个概率来执行相反的操作。

inputs = tokenizer("apple", return_tensors='pt')["input_ids"]
# The tokenizer adds a start and end token, but we only want the middle one:
apple_embed = model.albert.embeddings.word_embeddings(inputs)[0,1,:]
# Taken the ten top probabilities for this encoding:
topk = torch.topk(model.predictions.decoder(apple_embed), k=10)

# Output the result:
for prob, ind in zip(topk.values, topk.indices):
    print(prob.item(), tokenizer.decode(ind))

您可以批判性地了解与商标相比,我们对天然产品的重视程度:

0.11230556666851044 apple
0.07886222004890442 apple
0.05940583348274231 atari
0.05769592523574829 macintosh
0.057240456342697144 blackberry
0.054983582347631454 amazon
0.05450776219367981 iphone
0.05447978526353836 mango
0.05426642298698425 itunes
0.05226457118988037 raspberry

【讨论】:

    最近更新 更多