J'étudie l'intégration pour les représentations de mots. Dans de nombreuses bibliothèques dnn, ils prennent en charge la couche d'intégration. Et c'est vraiment un joli tutoriel.Quelle est la valeur initiale de Embedding layer?
Word Embeddings: Encoding Lexical Semantics
Mais comment calculer la valeur embed Je ne sais pas encore. Dans l'exemple ci-dessous, il produit de la valeur même avant toute formation. Utilise-t-il des poids aléatoires? Je réalise un but de Embedding(2, 5)
, mais je ne suis pas sûr de son calcul initial. Et je ne suis pas sûr de la façon d'apprendre les poids de son intégration aussi.
word_to_ix = {"hello": 0, "world": 1}
embeds = nn.Embedding(2, 5) # 2 words in vocab, 5 dimensional embeddings
lookup_tensor = torch.LongTensor([word_to_ix["hello"]])
hello_embed = embeds(autograd.Variable(lookup_tensor))
print(hello_embed)
--------
Variable containing:
-2.9718 1.7070 -0.4305 -2.2820 0.5237
[torch.FloatTensor of size 1x5]
Je décompose ma pensée pour être sûr. Tout d'abord, supérieur Embedding(2, 5)
est une matrice de forme (2, 5)
.
Embedding(2, 5) =
[[0.1,-0.2,0.3,0.4,0.1],
[-0.2,0.1,0.8,0.2,0.3]] # initiated by some function, like random normal distribution
Ensuite, hello
est [1, 0]
. La représentation hello
est ensuite calculée par [1, 0].dot(Embedding(2, 5)) = [0.1,-0.2,0.3,0.4,0.1]
. C'est en fait la première rangée de l'incorporation. Est-ce que je comprends bien?
Mises à jour
Je trouve un code d'intégration qui est exactement utilise la distribution normale pour sa valeur. Oui, mais ce n'est qu'une valeur par défaut, et nous pouvons définir des poids arbitraires pour l'intégration de couches. https://github.com/chainer/chainer/blob/adba7b846d018b9dc7d19d52147ef53f5e555dc8/chainer/links/connection/embed_id.py#L58
La distribution uniforme est également commun. – Mehdi