如何恢复 BERT/XLNet 嵌入?

问题描述 投票:0回答:2

我最近一直在尝试堆叠语言模型,并注意到一些有趣的事情:BERT 和 XLNet 的输出嵌入与输入嵌入不同。例如,这个代码片段:

bert = transformers.BertForMaskedLM.from_pretrained("bert-base-cased")
tok = transformers.BertTokenizer.from_pretrained("bert-base-cased")

sent = torch.tensor(tok.encode("I went to the store the other day, it was very rewarding."))
enc = bert.get_input_embeddings()(sent)
dec = bert.get_output_embeddings()(enc)

print(tok.decode(dec.softmax(-1).argmax(-1)))

为我输出这个:

,,,,,,,,,,,,,,,,,

我本来期望返回(格式化的)输入序列,因为我的印象是输入和输出令牌嵌入是捆绑在一起的。

有趣的是,大多数其他模型没有表现出这种行为。例如,如果您在 GPT2、Albert 或 Roberta 上运行相同的代码片段,它将输出输入序列。

这是一个错误吗?还是 BERT/XLNet 的预期?

python nlp pytorch huggingface-transformers transformer-model
2个回答
7
投票

不确定是否为时已晚,但我已经对您的代码进行了一些实验,并且可以将其恢复。 :)

bert = transformers.BertForMaskedLM.from_pretrained("bert-base-cased")
tok = transformers.BertTokenizer.from_pretrained("bert-base-cased")

sent = torch.tensor(tok.encode("I went to the store the other day, it was very rewarding."))
print("Initial sentence:", sent)
enc = bert.get_input_embeddings()(sent)
dec = bert.get_output_embeddings()(enc)

print("Decoded sentence:", tok.decode(dec.softmax(0).argmax(1)))

为此,您将得到以下输出:

Initial sentence: tensor([  101,   146,  1355,  1106,  1103,  2984,  1103,  1168,  1285,   117,
         1122,  1108,  1304, 10703,  1158,   119,   102])  
Decoded sentence: [CLS] I went to the store the other day, it was very rewarding. [SEP]

0
投票

2023 年有一篇论文专门讨论了这个问题。作者声称他们的

模型可以从临床记录数据集中恢复重要的个人信息(全名)。

如果您在使用敏感数据的领域中工作,那么结论中的警告尤其值得注意:

我们的研究结果表明嵌入和原始数据之间存在某种等价性,因为两者都泄漏了相似数量的敏感信息。这种等价性给密集嵌入的匿名化要求带来了沉重负担:嵌入应被视为高度敏感的私人数据,并在技术上甚至法律上受到保护,就像保护原始文本一样。

© www.soinside.com 2019 - 2024. All rights reserved.