Как рассчитываются векторы токенов в spacy-pytorch-трансформаторах - PullRequest
1 голос
/ 24 сентября 2019

В настоящее время я работаю с пакетом spacy-pytorch-transformer, чтобы поэкспериментировать с соответствующими вложениями.Когда я читал вводную статью (по сути, GitHub README), я понимал, что вложения уровня токена являются средним значением вложения всех соответствующих частей слова, то есть embed(complex) будет таким же, как 1/2 * embed(comp#) * embed(#lex).

Согласно статье BERT, это должно просто использовать свойство last_hidden_state сети, но мой MCVE ниже показывает, что это не то же самое для Spacy 2.1.8 и spacy-pytorch-transformers 0.4.0, по крайней мере, дляBERT и RoBERTa (не проверяли его для других моделей):

import spacy
import numpy as np
nlp = spacy.load("en_pytt_robertabase_lg")  # either this or the BERT model
test = "This is a test"  # Note that all tokens are directly aligned, so no mean has to be calculated.
doc = nlp(test)
# doc[0].vector and doc.tensor[0] are equal, so the results are equivalent.
print(np.allclose(doc[0].vector, doc._.pytt_last_hidden_state[1, :]))
# returns False

Смещение 1 для скрытых состояний связано с токеном <CLS> в качестве первого ввода, что соответствует задаче классификации предложений;Я даже проверил с любым другим доступным токеном мое предложение (которое не имеет проблем с выравниванием токенов в соответствии с doc._.pytt_alignment), поэтому я ни в коем случае не пропустил что-то здесь.

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

...