В настоящее время я работаю с пакетом 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
), поэтому я ни в коем случае не пропустил что-то здесь.
Согласно исходному коду , соответствующий хук перезаписывается просто, чтобы вернуть соответствующую строку в тензоре, поэтому я не вижу здесь никакого преобразования.Есть ли что-то очевидное, чего мне здесь не хватает, или это отклоняется от ожидаемого поведения?