En utilisant la configuration vanille du modèle BERT de base dans l'implémentation huggingface, j'obtiens un tuple de longueur 2.

import torch

import transformers
from transformers import AutoModel,AutoTokenizer

bert_name="bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(bert_name)
BERT = AutoModel.from_pretrained(bert_name)

e=tokenizer.encode('I am hoping for the best', add_special_tokens=True)

q=BERT(torch.tensor([e]))

print (len(q)) #Output: 2

Le premier élément est ce que je m'attends à recevoir - l'intégration de 768 dimensions de chaque jeton d'entrée.

print (e) #Output : [101, 1045, 2572, 5327, 2005, 1996, 2190, 102] 
print (q[0].shape) #Output : torch.Size([1, 8, 768])

Mais quel est le deuxième élément du tuple ?

print (q[1].shape) # torch.Size([1, 768])

Il a la même taille que l'encodage de chaque jeton. Mais qu'est-ce que c'est?

Peut-être une copie du jeton [CLS], une représentation pour la classification de l'ensemble du texte encodé ?

Allons vérifier.

a= q[0][:,0,:]
b=q[1]

print (torch.eq(a,b)) #Output : Tensor([[False, False, False, .... False]])

Nan!

Qu'en est-il d'une copie de l'intégration du dernier jeton (pour une raison quelconque) ?

c= q[0][:,-1,:]
b=q[1]

print (torch.eq(a,c)) #Output : Tensor([[False, False, False, .... False]])

Donc pas ça non plus.

La documentation explique comment la modification du config peut entraîner davantage d'éléments de tuple (comme des états cachés), mais je n'ai trouvé aucune description de cet élément de tuple "mystérieux" généré par la configuration par défaut.

Des idées sur ce que c'est et quelle est son utilisation?

3
user2182857 16 févr. 2020 à 00:01

1 réponse

Meilleure réponse

La sortie dans ce cas est un tuple de (last_hidden_state, pooler_output). Vous pouvez trouver de la documentation sur ce que les retours pourraient être ici .

3
erip 16 févr. 2020 à 00:44