多语言 Bert 句子向量捕捉到的语言不仅仅是意义——作为实习生工作?

数据挖掘 深度学习 nlp 火炬 伯特
2022-01-21 12:07:27

在玩 BERT 时,我下载了 Huggingface Multilingual Bert 并输入了三个句子,保存了它们的句子向量(嵌入[CLS]),然后通过谷歌翻译翻译它们,将它们传递给模型并保存它们的句子向量。

然后我使用余弦相似度比较了结果。

我惊讶地发现每个句子向量都与从它翻译的句子生成的向量相距甚远(0.15-0.27 余弦距离),而来自同一语言的不同句子确实非常接近(0.02-0.04 余弦距离)。

因此,与其将具有相似含义(但不同语言)的句子组合在一起(在 768 维空间中;)),相同语言的不同句子更接近。

据我了解,多语言 Bert 的全部意义在于跨语言迁移学习——例如,在一种语言的表示上训练模型(例如,FC 网络),并让该模型很容易在其他语言中使用。

如果(不同语言的)具有确切含义的句子被映射为比同一种语言的不同句子之间的距离更远,这怎么能起作用?

我的代码:

import torch

import transformers
from transformers import AutoModel,AutoTokenizer

bert_name="bert-base-multilingual-cased"
tokenizer = AutoTokenizer.from_pretrained(bert_name)
MBERT = AutoModel.from_pretrained(bert_name)

#Some silly sentences
eng1='A cat jumped from the trees and startled the tourists'
e=tokenizer.encode(eng1, add_special_tokens=True)
ans_eng1=MBERT(torch.tensor([e]))

eng2='A small snake whispered secrets to large cats'
t=tokenizer.tokenize(eng2)
e=tokenizer.encode(eng2, add_special_tokens=True)
ans_eng2=MBERT(torch.tensor([e]))

eng3='A tiger sprinted from the bushes and frightened the guests'
e=tokenizer.encode(eng3, add_special_tokens=True)
ans_eng3=MBERT(torch.tensor([e]))

# Translated to Hebrew with Google Translate
heb1='חתול קפץ מהעץ והבהיל את התיירים'
e=tokenizer.encode(heb1, add_special_tokens=True)
ans_heb1=MBERT(torch.tensor([e]))

heb2='נחש קטן לחש סודות לחתולים גדולים'
e=tokenizer.encode(heb2, add_special_tokens=True)
ans_heb2=MBERT(torch.tensor([e]))

heb3='נמר רץ מהשיחים והפחיד את האורחים'
e=tokenizer.encode(heb3, add_special_tokens=True)
ans_heb3=MBERT(torch.tensor([e]))


from scipy import spatial
import numpy as np

# Compare Sentence Embeddings

result = spatial.distance.cosine(ans_eng1[1].data.numpy(), ans_heb1[1].data.numpy())

print ('Eng1-Heb1 - Translated sentences',result)


result = spatial.distance.cosine(ans_eng2[1].data.numpy(), ans_heb2[1].data.numpy())

print ('Eng2-Heb2 - Translated sentences',result)

result = spatial.distance.cosine(ans_eng3[1].data.numpy(), ans_heb3[1].data.numpy())

print ('Eng3-Heb3 - Translated sentences',result)

print ("\n---\n")

result = spatial.distance.cosine(ans_heb1[1].data.numpy(), ans_heb2[1].data.numpy())

print ('Heb1-Heb2 - Different sentences',result)

result = spatial.distance.cosine(ans_eng1[1].data.numpy(), ans_eng2[1].data.numpy())

print ('Heb1-Heb3 - Similiar sentences',result)

print ("\n---\n")

result = spatial.distance.cosine(ans_eng1[1].data.numpy(), ans_eng2[1].data.numpy())

print ('Eng1-Eng2 - Different sentences',result)

result = spatial.distance.cosine(ans_eng1[1].data.numpy(), ans_eng3[1].data.numpy())

print ('Eng1-Eng3 - Similiar sentences',result)

#Output:
"""
Eng1-Heb1 - Translated sentences 0.2074061632156372
Eng2-Heb2 - Translated sentences 0.15557605028152466
Eng3-Heb3 - Translated sentences 0.275478720664978

---

Heb1-Heb2 - Different sentences 0.044616520404815674
Heb1-Heb3 - Similar sentences 0.027982771396636963

---

Eng1-Eng2 - Different sentences 0.027982771396636963
Eng1-Eng3 - Similar sentences 0.024596810340881348
"""

附言

至少 Heb1 比 Heb2 更接近 Heb3。对于英语等价物也观察到了这种情况,但情况较少。

NB 最初是在 Stack Overflow 上问的,这里

1个回答

可悲的是,我不认为多语言 BERT 是你所希望的灵丹妙药。正如您在Beto, Bentz, Becas: The Surprising Cross-Lingual Effectiveness of BERT (Wu and Dredze, 2019)中看到的那样,mBERT 没有接受任何明确的跨语言任务训练(例如,从给定的一种语言预测一个句子)另一种语言的句子)。

相反,它使用来自维基百科的多种语言的句子进行训练,迫使网络考虑多种语言,但不建立它们之间的联系。

换句话说,该模型被训练为在给定(未屏蔽)句子的其余部分的情况下将“cat”的屏蔽实例预测为“cat”,并在给定该语言的句子的屏蔽空间中预测表示“cat”的外来词. 此设置不会推动模型建立连接。

您可能想看看 Facebook 的LASER,它经过明确训练可以匹配来自不同语言的句子。

附言

句子没有相同表示的事实并不意味着 mBERT 不能用于跨语言的零样本迁移学习。再次请看Wu and Dredze