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
wp o s ∈ [ 0 , L - 1 ]w = ( w0, ⋯ , wL - 1)ewrém o de l= 4e′w= ew+ [ s i n ( p o s100000) ,cos ( p o s100000) ,sin ( p o s100002 / 4) ,cos ( p o s100002 / 4) ]= ew+ [ s i n ( p o s ) , c o s ( p o s ) , s i n ( p o s100) ,cos ( p o s100) ]
où la formule pour l'encodage positionnel est la suivante
avec (donc ) dans le papier d'origine.PE ( p o s , 2 i ) = s i n ( p o s100002 i / dm o de l) ,
PE ( p o s , 2 i + 1 ) = c o s ( p o s100002 i / dm o de l) .
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
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)
la source
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:
la source