Quel est le codage positionnel dans le modèle de transformateur?

23

Je suis nouveau au ML et c'est ma première question ici, donc désolé si ma question est idiote.

J'essaie de lire et de comprendre le papier. Attention, c'est tout ce dont vous avez besoin et il y a une image:

entrez la description de l'image ici

Je ne sais pas ce qu'est l' encodage positionnel . en écoutant des vidéos sur youtube, j'ai découvert qu'il s'agit d'un encastrement ayant à la fois le sens et la position d'un mot et qu'il a quelque chose à voir avec ousin(x)cos(x)

mais je ne pouvais pas comprendre ce que c'était exactement et comment cela se faisait exactement. donc je suis ici pour de l'aide. Merci d'avance.

Peyman
la source

Réponses:

31

Par exemple, pour le mot à la position dans la séquence d'entrée , avec une intégration en 4 dimensions , et , l'opération serait wpos[0,L1]w=(w0,,wL1)ewdmodel=4

ew=ew+[sin(pos100000),cos(pos100000),sin(pos100002/4),cos(pos100002/4)]=ew+[sin(pos),cos(pos),sin(pos100),cos(pos100)]

où la formule pour l'encodage positionnel est la suivante avec (donc ) dans le papier d'origine.

PE(pos,2i)=sin(pos100002i/dmodel),
PE(pos,2i+1)=cos(pos100002i/dmodel).
dmodel=512i[0,255]

Cette technique est utilisée car il n'y a pas de notion d'ordre des mots (1er mot, 2ème mot, ..) dans l'architecture proposée. Tous les mots de la séquence d'entrée sont introduits dans le réseau sans ordre ni position spéciaux (contrairement aux architectures RNN ou ConvNet courantes), par conséquent, le modèle n'a aucune idée de la façon dont les mots sont ordonnés. Par conséquent, un signal dépendant de la position est ajouté à chaque intégration de mots pour aider le modèle à incorporer l'ordre des mots. Basé sur des expériences, cet ajout évite non seulement de détruire les informations d'intégration, mais ajoute également les informations vitales de position. Dans le cas de RNNs, nous alimentons les mots de manière séquentielle à RNN, ie mot est -ème fournie à l' étape , ce qui aide le modèle incorporer l'ordre des mots.nn

Cet article de Jay Alammar explique le papier avec d'excellentes visualisations. Malheureusement, son exemple pour le codage positionnel est incorrect pour le moment (il utilise pour la première moitié des dimensions d'intégration et pour la seconde moitié, au lieu d'utiliser pour les indices pairs et pour les indices impairs).sincossincos

Esmailian
la source
1
Vous avez également cet excellent article purement axé sur l'intégration positionnelle: kazemnejad.com/blog/…
Yohan Obadia
6

L'encodage positionnel est une re-représentation des valeurs d'un mot et de sa position dans une phrase (étant donné que ce n'est pas la même chose d'être au début qu'à la fin ou au milieu).

Mais vous devez tenir compte du fait que les phrases peuvent être de n'importe quelle longueur, donc dire "X" est le troisième de la phrase "n'a pas de sens s'il y a des phrases de longueur différente: le 3ème d'une phrase de 3 mots est complètement différent du 3e dans une phrase de 20 mots.

Ce qu'un encodeur de position fait est d'obtenir de l'aide de la nature cyclique des fonctions et pour renvoyer des informations sur la position d'un mot dans une phrase.sin(x)cos(x)

Juan Esteban de la Calle
la source
2
Merci. pourriez-vous expliquer comment cet encodeur de position fait cela avec et ? c o ssincos
Peyman
1

Pour ajouter à d'autres réponses, l'implémentation de ref d'OpenAI le calcule dans un espace de log naturel (pour améliorer la précision, je pense. Je ne sais pas s'ils auraient pu utiliser log en base 2). Ils ne sont pas venus avec l'encodage. Voici la génération de table de recherche PE réécrite en C comme une boucle for-for:

int d_model = 512, max_len = 5000;
double pe[max_len][d_model];

for (int i = 0; i < max_len; i++) {
   for (int k = 0; k < d_model; k = k + 2) {
      double div_term = exp(k * -log(10000.0) / d_model);
      pe[i][k] = sin(i * div_term);
      pe[i][k + 1] = cos(i * div_term);
   }
}
Eris
la source