Многоязычный вектор предложений Берта отражает язык, который использовался не только в смысле интернирования? - PullRequest
2 голосов
/ 07 января 2020

Играя с BERT, я загрузил Huggingface Multilingual Bert и ввел три предложения, сохранив их векторы предложений (вложение [CLS]), затем перевел их через Google Translate, передал их через модель и сохранил их векторы предложений.

Затем я сравнил результаты, используя косинусное сходство.

Я был удивлен, увидев, что каждый вектор предложения был довольно далек от того, который был сгенерирован из переведенного предложения (расстояние от косинуса 0,15-0,27) в то время как разные предложения одного и того же языка действительно были довольно близки (косинусное расстояние 0,02–0,04).

Таким образом, вместо того, чтобы сгруппировать предложения одинакового значения (но разных языков) (в 768-мерном пространстве;)), разнородные предложения одного и того же языка ближе.

Насколько я понимаю, весь смысл многоязычного Берта заключается в межъязыковом переводном обучении - например, в обучении модели (скажем, F C net) представлений на одном языке и наличии этой модели с готовностью. используется на других языках.

Как это может работать, если предложения (разных языков) точного значения отображаются более отдельно, чем разнородные предложения одного и того же языка?

Мой код:

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
"""

PS

По крайней мере, Heb1 был ближе к Heb3, чем к Heb2. Это также наблюдалось для эквивалентов Engli sh, но в меньшей степени.

Ответы [ 2 ]

2 голосов
/ 08 января 2020

До сих пор не до конца понятно, что делает многоязычный BERT и почему он работает. Недавно появилось две статьи (первая от июня , вторая от ноября ), которые немного подтрунивают над этим.

Из статей кажется, что векторы имеют тенденцию кластеризоваться в соответствии с языками (и даже языковыми семействами), поэтому очень легко классифицировать язык. Это кластеризация, показанная в статье :

enter image description here

Из-за этого вы можете вычесть среднее значение языка из представление и в конечном итоге с каким-то кросс-языковым вектором, который показывают обе статьи, который может быть использован для кросс-языкового поиска предложения.

Кроме того, кажется, что тысячи параллельных предложений (например, на обоих языках) достаточно, чтобы выучить проекцию между языками. Обратите внимание, что они не использовали вектор [CLS], но они имели средние значения для векторов для отдельных подслов.

2 голосов
/ 07 января 2020

Токен [CLS] каким-то образом представляет входную последовательность, но как именно сложно сказать. Язык, конечно, важная характеристика предложения, вероятно, больше, чем значение. BERT - это модель с предварительной подготовкой, которая пытается моделировать такие характеристики, как значение, структура, а также язык. Если вы хотите иметь модель, которая поможет вам определить, означают ли два предложения на разных языках одно и то же, я могу подумать о двух разных подходах:

  1. подход: вы можете обучить классификатор (SVM, logisti c Регресс или даже некоторые нейронные сети, такие как CNN) при выполнении этой задачи. Inputs: two [CLS]-Token, Output: Same meaning, or not same meaning. В качестве обучающих данных вы можете выбрать [CLS] -Token-пары предложений разных языков, которые имеют одинаковое значение или нет. Чтобы получить значимые результаты, вам понадобится много таких пар предложений. К счастью, вы можете сгенерировать их с помощью Google Translate или использовать параллельные тексты, такие как Библия, которая существует на многих языках, и извлекать пары предложений оттуда.

  2. подход: Fine- Настройте модель Берта именно на эту задачу: Как и в предыдущем подходе, вам нужно много обучающих данных. Пример ввода в модель BERT будет выглядеть следующим образом: A cat jumped from the trees and startled the tourists [SEP] חתול קפץ מהעץ והבהיל את התיירים

    Чтобы классифицировать, если эти предложения имеют одинаковое значение, вы добавили бы слой классификации поверх [CLS] -Token и Fine tune вся модель для этой задачи.

Примечание: я никогда не работал с многоязычной BERT-моделью, эти подходы - вот что мне приходит в голову, чтобы выполнить sh упомянутую задачу. Если вы попробуете эти подходы, мне было бы интересно узнать, как они работают ?.

...