Was ist Positionskodierung?

Was ist Positionskodierung?

Die Positionskodierung ist eine Technik, die Informationen über die Position der Wörter in einer Sequenz in Transformer-Architekturen einspeist.

Die Reihenfolge der Wörter spielt eine grundlegende Rolle für das Verständnis der semantischen Bedeutung eines Satzes. Zum Beispiel haben „Allen füttert Hund“ und „Hund füttert Allen“ völlig unterschiedliche Bedeutungen, obwohl sie die gleichen Wörter oder Token haben. Bei der Implementierung von Anwendungen zur Verarbeitung natürlicher Sprache (NLP) mit Deep Learning und neuronalen Netzen müssen wir einen Mechanismus schaffen, mit dem Maschinen die Reihenfolge der Wörter in einem Satz behalten können, um eine logische Ausgabe zu erzeugen.  

Traditionell haben Modelle wie Recurrent Neural Networks (RNNs) oder lange Kurzzeitgedächtnisse (Long Short-Term Memory, LSTM) einen eingebauten Mechanismus, der die Reihenfolge der Wörter verarbeitet. RNN und LSTM verarbeiten Eingaben nacheinander, ein Token nach dem anderen, und merken sich alle Positionen der Wörter in einer Sequenz. Mit anderen Worten: Der n-dimensionale Vektor, auch „Eingabevektor“ genannt, wird nacheinander verarbeitet, wobei die Reihenfolge inhärent lernt. Im Gegensatz dazu behalten andere Architekturen, die von den Vorteilen von Convolutional Neural Networks (CNN) oder Transformern (Vaswani et al. 2017) profitieren, die Wortreihenfolge nicht bei und verarbeiten Token parallel. Daher müssen wir einen Mechanismus implementieren, der die Reihenfolge von Wörtern in einer Sequenz explizit darstellen kann – eine Technik, die als Positionskodierung bekannt ist. Die Positionskodierung ermöglicht es dem Transformer, Informationen über die Wortreihenfolge zu speichern, was eine Parallelisierung und ein effizientes Modelltraining ermöglicht. Implementierungen der Positionskodierung finden Sie häufig auf GitHub.  

Die neuesten KI-Trends, präsentiert von Experten

Erhalten Sie kuratierte Einblicke in die wichtigsten – und faszinierendsten – KI-Neuheiten. Abonnieren Sie unseren wöchentlichen Think-Newsletter. Weitere Informationen in der IBM Datenschutzerklärung.

Vielen Dank! Sie haben ein Abonnement abgeschlossen.

Ihr Abonnement wird auf Englisch geliefert. In jedem Newsletter finden Sie einen Abmeldelink. Hier können Sie Ihre Abonnements verwalten oder sich abmelden. Weitere Informationen finden Sie in unserer IBM Datenschutzerklärung.

Warum ist die Positionskodierung wichtig?

Die Reihenfolge der Wörter in einem Satz oder einer Sequenz bestimmt die inhärente Bedeutung des Satzes in natürlichen Sprachen. Darüber hinaus liefert die Kodierung der Wortreihenfolge für maschinelles Lernen ein „Wörterbuch“, das angibt, wo jedes Wort stehen soll. Diese Informationen werden beibehalten und können während des gesamten Trainings von Transformer-Modellen verallgemeinert werden, was eine Parallelisierung ermöglicht und RNN und LSTM in Bezug auf ihre Trainingseffizienz übertrifft.  

Schauen wir uns das Beispiel noch einmal an:

  • „Allen füttert Hund“
  • „Hund füttert Allen“

Diese beiden Sätze mit denselben drei Token haben je nach Wortreihenfolge völlig unterschiedliche Bedeutungen. Transformer, die auf Selbstaufmerksamkeit und Multihead-Aufmerksamkeitsmechanismus beruhen, haben keine inhärente Repräsentation von Wortstellungen und würden das einzelne Wort in einer Sequenz identisch behandeln, wenn wir keine expliziten Positionsinformationen bereitstellen würden. Wir möchten, dass das Modell versteht, wer das Füttern ausführt und wer gefüttert wird, was komplett von den Positionen abhängt.  

Wir erreichen dieses Ziel, indem wir jedes Wort zunächst als Vektor verarbeiten, der seine Bedeutung darstellt – zum Beispiel wird „Hund“ in einem hochdimensionalen Array kodiert, das sein Konzept kodiert. Technisch ausgedrückt wird jedes Wort oder Teilwort einer Eingabe-Einbettung unterschiedlicher Länge zugeordnet. Der Bedeutungsvektor allein sagt uns jedoch nicht, wo im Satz Hund vorkommt. Die Positionskodierung fügt einen zweiten Vektor hinzu – einen, der den Positionsindex kodiert, z. B. „erstes Wort“ oder „zweites Wort“ und so weiter. Die beiden Vektoren werden dann hinzugefügt, um darzustellen, was das Wort ist und wo es sich befindet. Dieser resultierende Vektor wird oft als Positionskodierungsvektor bezeichnet.   

Es gibt verschiedene Möglichkeiten, eine Positionskodierung zu erstellen. In diesem Artikel untersuchen wir das bekannteste Beispiel für die Verwendung einer Sinusfunktion, das von den Autoren in Attention is all you need1 zur Erstellung von Positionskodierungen eingeführt wurde.  

Mixture of Experts | 28. August, Folge 70

KI entschlüsseln: Wöchentlicher Nachrichtenüberblick

Schließen Sie sich unserer erstklassigen Expertenrunde aus Ingenieuren, Forschern, Produktführern und anderen an, die sich durch das KI-Rauschen kämpfen, um Ihnen die neuesten KI-Nachrichten und Erkenntnisse zu liefern.

Positionskodierung in Transformern

In der Originalpublikation von Vaswani et al. in 2017 besteht die entscheidende Idee darin, durch Verwendung einer Sinusfunktion, insbesondere der Sinus- und Kosinusfunktion, eine feste und deterministische Kodierung für jede Positionsin(x)in einer Sequenz zu erzeugen cos(x) .  

Was sind sinusförmige Funktionen?

Die Sinusfunktionen sind ein grundlegendes mathematisches Konzept, das ein gleichmäßiges Wellenlängenmuster erzeugt. Insbesondere die Kosinus- und Sinusfunktionen werden von den Autoren in den ursprünglichen Transformer-Funktionen verwendet, um die Positionskodierung zu unterstützen.

Wenn wir  sin(x) und  cos(x) zeichnen, sehen wir eine Kurve, die zwischen -1 und 1 in einem sich wiederholenden, periodischen Muster steigt und fällt.

Einige Eigenschaften des Sinus, die ihn für die Positionskodierung so leistungsstark machen: 

  • Er ist periodisch: Er wiederholt sich regelmäßig über Intervalle, was nützlich ist, um sich wiederholende Muster darzustellen.

  • Es ist glatt und kontinuierlich: Kleine Änderungen in der Eingabe resultieren in kleinen Änderungen in der Ausgabe, was uns die Möglichkeit gibt, Positionen in einem differenzierbaren Raum darzustellen.

  • Indem wir die Frequenz der Wellenlängen über die Dimensionen hinweg variieren, können wir eine reichhaltige, mehrskalige Darstellung der Position erzeugen. 

Um zu visualisieren, wie die Sinus- und Kosinuswellen aussehen, zeichnen wir sie auf:

import numpy as np 
import matplotlib.pyplot as plt 

# Create an array of 100 x values evenly spaced from 0 to 2π (approx 6.28)
x = np.linspace(0, 2 * np.pi, 100) 

# Compute the sine and cosine of each x value 
sin_values = np.sin(x) 

# Create the plot 
plt.figure(figsize=(5, 2)) 
plt.plot(x, sin_values, label='sin(x)', color='blue') 

# Customize the plot 
plt.title('Sine Function') 
plt.xlabel('x') 
plt.ylabel('Function value') 
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0 
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0 
#plt.grid(True, linestyle='--', alpha=0.5) 
plt.legend() 
plt.tight_layout() 

# Show the plot 
plt.show() 

Die Sinusfunktion

Graph der Sinusfunktion, eine sich wiederholende Kurve mit einem positiven und negativen Bereich.

Und nun schauen wir uns an, wie wir die Kosinusfunktion darstellen können:

#apply the cosine function to the same array, x
cosine = np.cos(x) 

plt.figure(figsize = (5,2)) 
plt.plot(x, cosine, label = 'cos(x)', color = 'blue') 
plt.title('The Cosine Function') 
plt.xlabel('x') 
plt.ylabel('Function value') 
plt.axhline(0, color='black', linewidth=0.5) # horizontal line at y=0 
plt.axvline(0, color='black', linewidth=0.5) # vertical line at x=0 
#plt.grid(True, linestyle='--', alpha=0.5) 
plt.legend() 
plt.tight_layout() 
Ein Graph der Kosinusfunktion, der ihre periodische Natur und ihre wichtigsten Eigenschaften veranschaulicht.

Die Formeln für die sinusförmige Positionskodierung, die von den Autoren der Originalarbeit über Transformer (Vaswani et al. 2017) definiert wurden, werden wie folgt dargestellt:

Für gerade Positionen:

 PEpos,2i=sin(pos100002i/dmodel) 

Für ungerade Positionen:

 PEpos,2i+1=cos(pos100002i/dmodel) 

  •  k : Die Position des Wortes im Satz (z. B. 0 für das erste Wort, 1 für das zweite usw.)

  •  i : Der Dimensionsindex des Einbettungsvektors wird dem Spaltenindex zugeordnet. 2i gibt eine gerade Position an und 2i+1 gibt eine ungerade Position an

  •  dmodel : Die vordefinierte Dimensionalität der Token-Einbettungen (z. B. 512)

  •  n : Benutzerdefinierter Skalierungswert (zum Beispiel 10000)

  •  PE : Positionsfunktion zur Zuordnung von Position k in der Eingabesequenz, um die Positionszuordnung zu erhalten

     

 

Mit dieser Formel hat jedes Wort an Position k einen Einbettungswert, der auf der Position des Wortes basiert. Nehmen wir das Beispiel, das wir verwendet haben, „Allen füttert Hund“, und wir können die positionelle Einbettung für jedes Wort berechnen:

-  k1 = "Allen"

-  k2 = "füttert"

-  k3 ="Hund"

Schreiben wir eine einfache Python-Funktion, um den Wert zu berechnen von  PE(k) :

import numpy as np 

import matplotlib.pyplot as plt 

  

# create the positional encoding function using the formula above 

def getPositionEncoding(seq_len, d, n=10000): 

    # instantiate an array of 0s as a starting point 

    P = np.zeros((seq_len, d)) 

    # iterate through the positions of each word  

    for k in range(seq_len): 

        #calculate the positional encoding for even and odd position of each word 

        for i in np.arange(int(d/2)): 

            denominator = np.power(n, 2*i/d) 

            P[k, 2*i] = np.sin(k/denominator) 

            P[k, 2*i+1] = np.cos(k/denominator) 
    return P 

Sobald wir die Funktion aufgerufen und die Eingabe in unser Beispiel vorgenommen haben, in dem die Sequenzlänge 3 beträgt, mit einer vereinfachten Dimension von  d=4 , und  n=10000 

P = getPositionEncoding(seq_len=3, d=4, n=10000) 

print(P) 

Wir erhalten die folgende Kodierungsmatrix (auch Tensor genannt):

[[ 0.                      1.                      0.                       1.        ]

 [ 0,84147098 0,54030231 0,09983342 0,99500417]

 [ 0,90929743 -0,41614684  0,19866933  0,98006658]]

Um dieses Ergebnis konkreter darzustellen, erhalten wir

WortpositionDim 0
sin(pos ÷ 10000^(0 ÷ 4))
Dim 1
cos(pos ÷ 10000^(0 ÷ 4))
Dim 2
sin(pos ÷ 10000^(2 ÷ 4))
Dim 3
cos(pos ÷ 10000^(2 ÷ 4))
„Allen“ k = 00.00000.00000.00001,0000
„füttert“ k = 10,8414710,5403020,0100000,999950
„Hund“ k = 20.909297-0,4161470,0200000,999800

Hier können wir den konkreten Wert jedes Wortes und den entsprechenden Einbettungswert sehen. Wir können diese Einbettungen jedoch nicht direkt verwenden, um die Reihenfolge der Wörter zu interpretieren. Der hier berechnete Wert wird verwendet, um Informationen über die Position in einem Eingabevektor des Transformers einzufügen. Weil die Eingabe von sin(x)  und  cos(x) in jeder Position unterschiedlich ist,  kreagiert   auf eine andere Sinusfunktion. Die entsprechende Position der verschiedenen sinusförmigen Funktionen gibt uns Auskunft über die absolute Position und die relative Position des Wortes in „Allen füttert Hund“. Mit anderen Worten: Diese Informationen können vom Modell so genutzt werden, dass es lernen kann, diese Muster mit Ordnung, Abstand und Struktur zu verknüpfen.  

Implementieren wir nun eine Python-Funktion, um die Positionsmatrix zu visualisieren

import numpy as np 

import matplotlib.pyplot as plt 

  

def get_position_encoding(seq_len, d_model, n=10000): 

    P = np.zeros((seq_len, d_model)) 

    for pos in range(seq_len): 

        for i in range(d_model): 

            angle = pos / np.power(n, (2 * (i // 2)) / d_model) 

            P[pos, i] = np.sin(angle) if i % 2 == 0 else np.cos(angle) 

    return P 

  

# Parameters 

seq_len = 100   # Number of tokens 

d_model = 512   # Embedding dimensions 

  

# Generate positional encoding 

P = get_position_encoding(seq_len, d_model) 

  

# Plot 

plt.figure(figsize=(10, 6)) 

cax = plt.matshow(P, cmap='viridis', aspect='auto') 

plt.title("Sinusoidal Positional Encoding Heatmap") 

plt.xlabel("Embedding Dimension") 

plt.ylabel("Token Position") 

plt.colorbar(cax) 

plt.tight_layout() 

plt.show() 
Sinusförmige Heatmap

Letzte Gedanken

Wie wir an den verschiedenen Häufigkeiten basierend auf den Werten von x sehen können, unterscheidet sich jede entsprechende Position aus dem Eingabewort k auf einer Skala von  [-1.1] – dem Bereich der sin(x) Funktion. Unser auf Encoder und Decoder basierendes Transformer-Modell lernt und speichert die unterschiedliche Positionskodierung jedes Wortes, sodass das Modell die Informationen für das Training beibehält. Der kodierte Positionsvektor bleibt während des Trainings statisch, was parallele Berechnungen ermöglicht.

Weiterführende Lösungen
IBM watsonx.ai

Trainieren, validieren, optimieren und implementieren Sie generative KI, Foundation Models und maschinelle Lernfunktionen mit IBM watsonx.ai, einem Studio der nächsten Generation für AI Builder in Unternehmen. Erstellen Sie KI-Anwendungen mit einem Bruchteil der Zeit und Daten.

Entdecken sie watsonx.ai
Lösungen im Bereich künstlicher Intelligenz

Setzen Sie KI in Ihrem Unternehmen ein – mit branchenführendem Fachwissen im Bereich KI und dem Lösungsportfolio von IBM an Ihrer Seite.

Erkunden Sie KI-Lösungen
KI-Beratung und -Services

Erfinden Sie kritische Workflows und Abläufe neu, indem Sie KI einsetzen, um Erfahrungen, Entscheidungsfindung in Echtzeit und den geschäftlichen Nutzen zu maximieren.

KI-Services entdecken
Machen Sie den nächsten Schritt

Profitieren Sie von einem einheitlichen Zugriff auf Funktionen, die den gesamten Lebenszyklus der KI-Entwicklung abdecken. Erstellen Sie leistungsstarke KI-Lösungen mit benutzerfreundlichen Oberflächen, Workflows und Zugriff auf branchenübliche APIs und SDKs.

watsonx.ai erkunden Live-Demo buchen
Fußnoten

1. „Attention Is All You Need“, Ashish Vaswani et al., Proceedings of the 31st International Conference on Neural Information Processing Systems, arXiv:1706.03762v7, überarbeitet am 2. August 2023.

2. „Long Short-Term Memories“, Sepp Hochreiter and Jürgen Schmidhuber. 1997. Long Short-Term Memory. Neural Comput. 9, 8 (15. November 1997), 1735–1780., 

3. „Foundations of Recurrent Neural Networks (RNNs) and Long Short-Term Memories“ Alex Sherstinsky et al., Elsevier „Physica D: Nonlinear Phenomena“ Journal, Ausgabe 404, März 2020: Sonderausgabe über maschinelles Lernen und dynamische Systeme