Jak se dostat kosinové podobnosti slovo embedding od BERT model

0

Otázka

Já byl zajímavý v tom, jak se dostat podobnosti slovo vkládání v různých vět od BERT modelu (to znamená, že slova mají různé významy v různých situacích).

Například:

sent1 = 'I like living in New York.'
sent2 = 'New York is a prosperous city.'

Chci se dostat cos(New York, New York) je hodnota z sent1 a sent2, i když fráze "New York" je stejné, ale zdá se, že v jiný trest. Mám nějaké intuici od https://discuss.huggingface.co/t/generate-raw-word-embeddings-using-transformer-models-like-bert-for-downstream-process/2958/2

Ale já pořád nevím, která vrstva je vkládání potřebuju extrahovat a jak se vypočte cos podobnost pro můj výše uvedený příklad.

Díky předem za jakékoliv návrhy!

1

Nejlepší odpověď

2

Dobře, uděláme to takhle.

Nejprve musíte pochopit, že BERT má 13 vrstev. První vrstva je v podstatě jen vkládání vrstvu, která BERT dostane prošel během počátečního vzdělávání. Můžete ji použít, ale asi nechci, protože to je v podstatě statické vkládání a jste po dynamické vkládání. Pro jednoduchost budu používat pouze poslední skryté vrstvy BERT.

Tady používáte dvě slova: "Nové" a "York". Můžete to brát jako jeden během předzpracování a kombinovat je do "New-York", nebo tak něco, pokud jste opravdu chtěli. V tomto případě budu brát to jako dvě samostatná slova a průměrné zakotvení, že BERT produkuje.

To může být popsán v několika krocích:

  1. Tokenize vstupy
  2. Určit, kde tokenizer má word_ids pro New a York (suuuuper důležité)
  3. Projít BERT
  4. Průměrná
  5. Kosinová podobnost

První, co potřebujete k importu: from transformers import AutoTokenizer, AutoModel

Nyní můžeme vytvořit naše tokenizer a náš model:

tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')
model = model = AutoModel.from_pretrained('bert-base-cased', output_hidden_states=True).eval()

Ujistěte se, že používáte model v hodnocení režimu, pokud se snažíte doladit!

Dále musíme tokenize (krok 1):

tok1 = tokenizer(sent1, return_tensors='pt')
tok2 = tokenizer(sent2, return_tensors='pt')

Krok 2. Je třeba určit, kde index slov zápas

# This is where the "New" and "York" can be found in sent1
sent1_idxs = [4, 5]
sent2_idxs = [0, 1]

tok1_ids = [np.where(np.array(tok1.word_ids()) == idx) for idx in sent1_idxs]
tok2_ids = [np.where(np.array(tok2.word_ids()) == idx) for idx in sent2_idxs]

Výše uvedený kód kontroly, kde word_ids() vyrobené tokenizer překrývají slovo indexů z původní věty. To je nutné, protože tokenizer rozdělí vzácné slova. Takže pokud máte něco jako "aardvark", když jste tokenize to a podívat se na to, že jste skutečně dostat toto:

In [90]: tokenizer.convert_ids_to_tokens( tokenizer('aardvark').input_ids)
Out[90]: ['[CLS]', 'a', '##ard', '##var', '##k', '[SEP]']

In [91]: tokenizer('aardvark').word_ids()
Out[91]: [None, 0, 0, 0, 0, None]

Krok 3. Projít BERT

Teď jsme chytit embeddings, že BERT produkuje přes token id, které jsme vytvořili:

with torch.no_grad():
    out1 = model(**tok1)
    out2 = model(**tok2)

# Only grab the last hidden state
states1 = out1.hidden_states[-1].squeeze()
states2 = out2.hidden_states[-1].squeeze()

# Select the tokens that we're after corresponding to "New" and "York"
embs1 = states1[[tup[0][0] for tup in tok1_ids]]
embs2 = states2[[tup[0][0] for tup in tok2_ids]]

Nyní budete mít dvě vnoření. Každý tvar je (2, 768). První je velikost, protože máte dvě slova, jsme při pohledu na "Nové" a "York. Druhá velikost je vkládání velikost BERTE.

Krok 4. Průměrná

Dobře, takže to není nutně to, co chcete dělat, ale to bude záviset na tom, jak budete zacházet tyto embeddings. To, co máme, je dva (2, 768) tvarované embeddings. Můžete buď porovnat Nové do New Yorku a do Yorku nebo můžete kombinovat New Yorku do průměru. Budu prostě dělat to, ale můžete snadno udělat ten druhý, jestli to funguje lépe pro váš úkol.

avg1 = embs1.mean(axis=0)
avg2 = embs2.mean(axis=0)

Krok 5. Kosinus sim

Kosinová podobnost je docela snadné použití torch:

torch.cosine_similarity(avg1.reshape(1,-1), avg2.reshape(1,-1))

# tensor([0.6440])

To je dobrý! Poukazují stejným směrem. Že to není úplně 1, ale to může být zlepšena v několika způsoby.

  1. Můžete doladit na školení set
  2. Můžete experimentovat s v průměru různých vrstvách, spíše než jen poslední skryté vrstvy, jako jsem to udělal
  3. Můžete se pokusit být kreativní při kombinování New a York. Vzal jsem průměr, ale možná existuje lepší způsob, jak pro vaše přesné potřeby.
2021-11-21 20:52:13

Opravdu si toho vážím pro pacienta a podrobné vysvětlení! opravdu, opravdu užitečné!
Mark J.

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................