Das obige Diagramm gibt Ihnen einen Überblick darüber, woraus der Transformer besteht. Sie basieren auf der Encoder-Decoder-Architektur, wobei der linke Block den Encoder und der rechte Block den Decoder darstellt. Der Encoder „codiert“ die Eingabesequenz in eine Sequenz „kontinuierlicher Darstellung“, die dann auf halbem Weg dem Decoder zugeführt wird, der dann die Ausgabesequenz „decodiert“, indem er sowohl die Ausgabe des Encoders als auch die Zwischenausgabe des vorherigen verwendet vom Decoder generierte Ausgabe (oder während des Trainings die Zielausgabe selbst).
Dieser generative Zyklus des Decoders ist der Grund, warum Modelle aufgerufen werden, die diese Architektur verwenden Generative Modelle. Beachten Sie jedoch, dass es nicht zwingend erforderlich ist, diese Modelle auf diese Weise zu verwenden. Sie könnten den Decoder nur einmal ausführen, müssten aber dennoch auch einige Daten an den Decoder übermitteln.
Lassen Sie uns nun auf die einzelnen Module eingehen, um sie im Element zu verstehen.
Einbetten
Bevor wir tatsächlich mit dem Coaching unseres Modells beginnen können, müssen wir unsere Textsequenzen in ein Format konvertieren, das das Modell verstehen kann. In diesem Fall handelt es sich bei dem Format um Zahlen, daher müssen wir jedes Wort/Token in unserem Satz einer eindeutigen Zahl zuordnen und dies für jeden Satz in unserem gesamten Eingabedatensatz tun. Sobald dies erledigt ist, konvertieren wir jedes Wort/Token in eine Vektordarstellung, die das darstellt Einbettungsschicht. Zuvor haben wir feste Einbettungen wie GloVe verwendet, um jedes Wort darzustellen. Dies battle jedoch nicht sinnvoll, da auch der Kontext, in dem das Wort verwendet wird, von Bedeutung ist. Daher verwenden wir stattdessen erlernte Einbettungen, die die Vektoren während des Trainings anpassen. Die berechneten Einbettungen werden mit √d multipliziert, wobei d die Dimension der Einbettung ist (diese Dimension ist ein Hyperparameter, der während des Trainings angepasst werden kann)
Positionskodierung
Da Transformers keine RNNs verwenden, gibt es keine sequentielle Reihenfolge, die das Modell während der Berechnung verwenden kann, was bei Textual content wichtig ist, um zu verstehen, wie sich der Kontext bewegt. Stattdessen fügen wir einen neuen Satz von Codierungen mit dem Namen „ Positionskodierungen die die Place eines Tokens/Worts relativ zu den anderen in einer bestimmten Textsequenz darstellen. Die von den Autoren zur Berechnung verwendete Formel lautet:
Ich werde nicht weiter darauf eingehen, aber im Grunde stellen die beiden oben genannten Funktionen die Place für Token mit gerader und ungerader Place dar und werden miteinander verschachtelt, um die gesamte Positionskodierung zu erhalten. Die Autoren nutzten dies, weil sie die Hypothese aufstellten, dass es dem Modell aufgrund der linearen Eigenschaften der oben genannten Funktionen ermöglichen würde, leicht zu lernen, relative Positionen zu berücksichtigen.
Wenn Sie dies besser verstehen möchten, dieses Tutorial bietet eine bessere visuelle Darstellung der obigen Gleichungen.
Die oben genannten Positionskodierungen werden dann zu den zuvor generierten Worteinbettungen hinzugefügt und diese Summe stellt die Eingabe für den Kodierer und Dekodierer dar.
Eine Aufmerksamkeitsfunktion kann als Zuordnung einer Abfrage und einer Reihe von Schlüssel-Wert-Paaren zu einer Ausgabe beschrieben werden, wobei Abfrage, Schlüssel, Werte und Ausgabe allesamt Vektoren sind. Die Ausgabe wird als gewichtete Summe der Werte berechnet, wobei die jedem Wert zugewiesene Gewichtung durch eine Kompatibilitätsfunktion der Abfrage mit dem entsprechenden Schlüssel berechnet wird. (Abschnitt 3.2, Aufmerksamkeit ist alles, was Sie brauchen)
Wenn das verwirrend klingt, denken Sie daran:
Der Anfrage ist das, was Sie suchen.
Der Style ist, welche Artwork von Informationen das Wörterbuch enthält.
Der Wert sind das Informationen.
Quelle – (TensorFlow Transformer-Tutorial)
Transformers führte einen Aufmerksamkeitsmechanismus namens ein Skalierte Punktproduktaufmerksamkeit. Die Gleichung dafür ist gegeben durch:
Wo Q, Okay, V stellen die Abfrage-, Schlüssel- und Wertvektoren dar. In den meisten Anwendungen von Transformatoren sind Okay und V derselbe Vektor, wobei Q der Eingang ist, für den Sie eine Antwort benötigen. Wir berechnen das Skalarprodukt von Q und Okay und dividieren es durch √d, wobei d die Dimension der Aufmerksamkeitsschicht ist. Wir nehmen dann den Softmax dieser Ausgabe, der im Grunde die Ausgabe in Wahrscheinlichkeitswerte umwandelt, die wir dann mit dem Wertevektor multiplizieren. Dieser Aufmerksamkeitsmechanismus ermöglicht es uns, uns auf die relevanten Teile des Wertevektors zu konzentrieren, damit sie in späteren Berechnungen verwendet werden können.
Anstatt eine einzelne Aufmerksamkeit durchzuführen, was für größere Dimensionen von Schlüssel, Wert und Abfrage teuer wäre, führen wir stattdessen eine lineare Projektion auf Q, Okay und V durch, um sie in kleinere Dimensionen umzuwandeln, und führen dann die oben genannte Aufmerksamkeit durch. Wir führen dies mehrmals in separaten Instanzen oder „Köpfen“ durch, mit dem Ziel, dass das Modell gemeinsam auf Informationen aus verschiedenen Darstellungen eingehen kann, da jeder Kopf wahrscheinlich unterschiedliche Räume für dasselbe Q-, Okay- und V-Paar betreuen würde. Die Ausgabe jedes Aufmerksamkeitskopfes wird dann verkettet und linear projiziert, um eine aggregierte Ausgabe zu erhalten.
Am Ende eines Encoder-/Decoderblocks wenden wir a an Feed-Ahead-Schicht. Dies ist im Grunde ein mehrschichtiges Perzeptron mit einer ReLU-Aktivierungsfunktion (Rectified Linear Unit) (entfernt im Wesentlichen destructive Zahlen aus dem Vektor und setzt sie stattdessen auf Null) zwischen den beiden vollständig verbundenen Schichten und einer Dropout-Schicht am Ende. Die innere, vollständig verbundene Schicht hat eine Dimensionalität, die typischerweise viermal größer ist als die Eingabe-/Ausgabedimension. Die Gleichung für dieses Netzwerk lautet:
Wobei die vollständig verbundene Schicht dargestellt wird als F(x) = xW + b
wobei W das Gewicht und b die Vorspannung ist. ReLU wird dargestellt als ReLU(x) = max(0, x)
.
Nach jedem Aufmerksamkeits- und Feed-Ahead-Block fügen wir den Eingabevektor zum Ausgabevektor hinzu (dies wird als a bezeichnet). Restverbindung) und dann treten wir auf Schichtnormalisierung auf die Summe. Dies geschieht normalerweise, um die Trainingsleistung und -stabilität zu verbessern.
Nachdem wir nun jeden Block gesehen haben, ist es an der Zeit, zu sehen, wie sie zusammenpassen. Die von uns bereitgestellten Eingabeeinbettungen werden von berechnet ein Satz von N Encoderblöcken. Jeder Encoderblock besteht aus einer mehrköpfigen Aufmerksamkeitsschicht, in der wir ihn ausführen Selbstaufmerksamkeit am Eingang, dh wo Q, Okay und V der gleiche Vektor sind. Die Ausgabe davon wird dann der Feed-Ahead-Schicht zugeführt, deren Ausgabe dann vom nächsten Encoderblock als Eingabe verwendet wird. Der Ausgang des N-ten Encoderblocks wird dann als Okay-V-Paar für die Queraufmerksamkeitsschicht in den Decoderblöcken verwendet. Die Eingabeeinbettungen und die N Encoderblöcke bilden die Encoderschicht.
Selbstaufmerksamkeit
Wenn wir den gleichen Eingabevektor wie die Abfrage, den gleichen Schlüssel und den gleichen Wert an den Multi-Head Consideration-Block liefern, wird dies als bezeichnet Selbstaufmerksamkeit. Selbstaufmerksamkeit ermöglicht jedem Ingredient in der Sequenz den parallelen Zugriff auf jedes andere Ingredient in der Sequenz und ermöglicht so den Elementen, sich mit anderen Elementen zu assoziieren und stärkere Darstellungen des Kontexts aufzubauen. Bisher wurde dies mit Hilfe von RNNs und CNNs durchgeführt, diese waren jedoch durch ihre sequentielle Natur und Reichweite begrenzt.
Die Decoder-Ebene ist etwas interessanter. Der größte Teil der Struktur ist ziemlich gleich, mit N Anzahl Decoderblöcke Nehmen Sie die Ausgabeeinbettungen als Eingabe und verwenden Sie deren Ausgabe dann vom nächsten Block, bis schließlich die endgültige Ausgabe an den gesendet wird Klassifizierungsschicht. Möglicherweise fällt Ihnen auf, dass es hier zwei Multi-Head Consideration-Blöcke gibt. Der erste fügt dem üblichen Selbstaufmerksamkeitsblock namens „ maskierte Selbstaufmerksamkeit. Die Ausgabe davon wird dann als Abfragevektor im nächsten Multi-Consideration-Block namens Cross-Consideration-Block verwendet, wobei das Schlüssel-Wert-Paar durch die endgültige Ausgabe der Encoderschicht gegeben wird. Hier lernt das Modell tatsächlich, die Ausgabe so abzubilden, dass sie mit dem übereinstimmt, was die Eingabe darstellt. Die endgültige Ausgabe nach dem Durchlaufen aller Decoderblöcke wird dann linear auf einen Vektor projiziert, auf den wir Softmax anwenden, um die Ausgabewahrscheinlichkeiten zu erhalten, die dann zur Vorhersage des wahrscheinlichsten Tokens verwendet werden können, das generiert werden sollte.
Die endgültigen linearen und Softmax-Ebenen können durch einen beliebigen Klassifizierungskopf ersetzt werden, basierend auf der Aufgabe, für die Sie Ihr Modell trainieren möchten.
Maskierte Selbstaufmerksamkeit
Die Wendung in der vom Decoder verwendeten Selbstaufmerksamkeit besteht darin, dass Okay und V maskiert werden, sodass für eine gegebene Sequenz das Ingredient im Q-Vektor maskiert werden kann Achten Sie nur auf die vorherigen Elemente. Dies ist nützlich, um dem Modell während des Trainings beizubringen, dass es sich nicht auf Informationen weiter unten in der Sequenz verlassen kann, auf die es zugreifen könnte, wenn das Modell trainiert wird, nicht jedoch, wenn es während der Inferenz verwendet wird. Infolgedessen haben wir während des Trainings Verschieben Sie die Ausgabereihenfolge nach rechts einmal (durch Hinzufügen eines