3

玩弄 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。对于英语等价物也观察到了这种情况,但情况较少。

4

2 回答 2

3

[CLS] Token 以某种方式表示输入序列,但具体如何很难说。语言当然是句子的一个重要特征,可能比意义更重要。BERT 是一个预训练模型,它试图对意义、结构和语言等特征进行建模。如果你想要一个模型来帮助你识别两个不同语言的句子是否意味着相同的东西,我可以想到两种不同的方法:

  1. 方法:您可以在该任务上训练分类器(SVM、逻辑回归甚至一些神经网络,例如 CNN)。 Inputs: two [CLS]-Token, Output: Same meaning, or not same meaning. 作为训练数据,您可以选择[CLS]-Token-pairs of different language of sentences,它们的含义要么相同,要么不同。为了得到有意义的结果,你需要很多这样的句子对。幸运的是,您可以通过谷歌翻译生成它们,或者使用平行文本(例如存在于多种语言中的圣经),并从中提取句子对。

  2. 方法:针对该任务微调 bert 模型:与之前的方法一样,您需要大量训练数据。BERT 模型的示例输入如下所示: A cat jumped from the trees and startled the tourists [SEP] חתול קפץ מהעץ והבהיל את התיירים

    要对这些句子是否具有相同的含义进行分类,您将在 [CLS]-Token 之上添加一个分类层,并在该任务上微调整个模型。

注意:我从未使用过多语言 BERT 模型,我想到这些方法来完成上述任务。如果您尝试这些方法,我很想知道它们的表现如何。

于 2020-01-07T15:52:32.657 回答
2

目前还没有完全理解多语言 BERT 的作用以及它为什么起作用。最近有两篇论文(第一篇来自 6 月,第二篇来自 11 月)对此进行了讨论。

从论文来看,向量似乎倾向于根据语言(甚至语言族)进行聚类,因此对语言进行分类非常容易。这是论文中显示的聚类

在此处输入图像描述

因此,您可以从表示中减去语言的平均值,并最终得到一个跨语言向量,两篇论文都显示该向量可用于跨语言句子检索。

此外,似乎一千个平行句子(例如,两种语言)足以学习语言之间的投影。请注意,他们没有使用[CLS]向量,但他们平均池化了各个子词的向量。

于 2020-01-08T10:03:09.140 回答