【问题标题】:Multilingual Bert sentence vector captures language used more than meaning - working as interned?多语言 Bert 句子向量捕捉到的语言不仅仅是意义——作为实习生工作?
【发布时间】:2020-01-06 22:19:23
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: python deep-learning pytorch multilingual bert-language-model


    【解决方案1】:

    [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 模型,我想到这些方法来完成上述任务。如果您尝试这些方法,我很想知道它们的表现如何?。

    【讨论】:

    • 有趣。在您看来,对于这两种方法,多少数据就足够了?
    • 正如 Jindřich 所提到的,每种语言一千对句子可能就足够了,但你真的需要测试它,如果它真的有效。
    【解决方案2】:

    目前还没有完全理解多语言 BERT 的作用以及它为何起作用。最近有两篇论文(第一篇from June,第二篇from November)对此进行了一些研究。

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

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

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

    【讨论】:

    • 非常有趣!语言手段是否已公布?
    • 我不这么认为,但自己做应该不会太难。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多