Zum Inhalt springen

„Transformer (maschinelles Lernen)“ – Versionsunterschied

aus AufEinWort, der freien Forschung
[ungesichtete Version][ungesichtete Version]
Die Seite wurde neu angelegt: „<div><p>Ein '''Transformer''' ist eine von [https://de.wikipedia.org/wiki/Google Google] entwickelte [https://de.wikipedia.org/wiki/Deep_Learning Deep-Learning]-Architektur, die einen Aufmerksamkeits''mechanismus'' integriert, der erstmals im Artikel ''Attention Is All You Need'' aus dem Jahr 2017 vorgestellt wurde. Dabei wird Text in [https://de.wikipedia.org/wiki/Zahl numerische] Darstellungen, die als [https://de.wikipedia.org/wiki/Tokenisierung T…“
 
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
<div><p>Ein '''Transformer''' ist eine von [https://de.wikipedia.org/wiki/Google Google] entwickelte [https://de.wikipedia.org/wiki/Deep_Learning Deep-Learning]-Architektur, die einen Aufmerksamkeits''mechanismus'' integriert, der erstmals im Artikel ''Attention Is All You Need'' aus dem Jahr&nbsp;2017 vorgestellt wurde. Dabei wird Text in [https://de.wikipedia.org/wiki/Zahl numerische] Darstellungen, die als [https://de.wikipedia.org/wiki/Tokenisierung Token] bezeichnet werden, und anschließend durch [https://de.wikipedia.org/wiki/Worteinbettung Worteinbettung] in [https://de.wikipedia.org/wiki/Tupel_(Informatik) Vektoren] umgewandelt.</p><p>Dies kann z.&nbsp;B. dazu benutzt werden, Text von einer Sprache in eine andere zu [https://de.wikipedia.org/wiki/%C3%9Cbersetzung_(Linguistik) übersetzen]. Dazu wird ein Transformer mittels [https://de.wikipedia.org/wiki/Maschinelles_Lernen maschinellem Lernen] anhand einer (großen) Menge von Beispieltexten trainiert, bevor das trainierte Modell dann zur Übersetzung verwendet werden kann. Weitere Beispielanwendungen von Transformern sind die [https://de.wikipedia.org/wiki/Textgenerierung Textgenerierung] oder die [https://de.wikipedia.org/wiki/Zusammenfassung Zusammenfassung] längerer Texte.</p><p>Transformer sind hierbei effizienter als [https://de.wikipedia.org/wiki/Long_short_term_memory Long-short-term-memory]-[https://de.wikipedia.org/wiki/Architektur_(Informatik) Architekturen]&nbsp;(LSTM) und bilden die Grundarchitektur des [https://de.wikipedia.org/wiki/Generativer_vortrainierter_Transformer generativen vortrainierten Transformers]&nbsp;(GPT) sowie anderer vortrainierter Machine-Learning-Modelle.</p><p>Lineare Transformer sind eine Form von „''fast weight programmers''“, welche 1991 vorgeschlagen wurden.<sup id="cite_ref-1" class="reference">[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#cite_note-1 <span class="cite-bracket">[</span>1<span class="cite-bracket">]</span>]</sup></p><div id="toc" class="toc" role="navigation" aria-labelledby="mw-toc-heading"><div class="toctitle" dir="ltr" lang="de">
Ein '''Transformer''' ist eine von [[Google]] entwickelte [[Deep Learning|Deep-Learning]]-Architektur, die einen Aufmerksamkeitsmechanismus ({{enS|Attention}}) integriert. Dabei wird Text durch [[Worteinbettung]] in [[Zahl|numerisch]]e Darstellungen in Form von [[Tupel (Informatik)|Vektoren]] umgewandelt. Dies kann z.&nbsp;B. dazu benutzt werden, Text von einer Sprache in eine andere zu [[Übersetzung (Linguistik)|übersetzen]] (siehe auch [[Maschinelle Übersetzung]]). Dazu wird ein Transformer mittels [[Maschinelles Lernen|maschinellem Lernen]] anhand einer (großen) Menge von Beispieltexten trainiert, bevor das trainierte Modell dann zur Übersetzung verwendet werden kann. Weitere Beispielanwendungen von Transformern sind die [[Textgenerierung]] oder die [[Zusammenfassung]] längerer Texte. Transformer sind hierbei effizienter als [[Long short-term memory|Long-short-term-memory]]-[[Architektur (Informatik)|Architekturen]]&nbsp;(LSTM) und bilden die Grundarchitektur des [[generativer vortrainierter Transformer|generativen vortrainierten Transformers]]&nbsp;(GPT) sowie anderer vortrainierter Machine-Learning-Modelle.
== Inhaltsverzeichnis ==
 
<span class="toctogglespan"><label class="toctogglelabel" for="toctogglecheckbox"></label></span></div>
Lineare Transformer sind eine Form von „''{{lang|en|fast weight programmers}}''“, welche 1991 vorgeschlagen wurden.<ref>Schmidhuber, Jürgen, and A. I. Blog. "Before 1991, no network learned by gradient descent to quickly compute the changes of the fast weight storage of another network or of itself. Such Fast Weight Programmers (FWPs) were published in 1991-93 [FWP0-2](Sec. 1, 2, 3, 4). They embody the principles found in certain types of what is now called attention [ATT](Sec. 4) and Transformers [TR1-6](Sec. 2, 3, 4, 5)." https://people.idsia.ch/~juergen/fast-weight-programmer-1991-transformer.html</ref>
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Hintergrund 1Hintergrund]
 
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Architektur 2Architektur]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Kodierer 2.1Kodierer]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Dekodierer 2.2Dekodierer]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Diagramme 2.3Diagramme]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Pseudocode 2.4Pseudocode]
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Attention-Modul 3Attention-Modul]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Unterschiede_zwischen_Attention_im_Encoder_und_Decoder 3.1Unterschiede zwischen Attention im Encoder und Decoder]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Masked_Attention 3.2Masked Attention]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Multi-Head-Attention 3.3Multi-Head-Attention]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Scaled_Dot-Product_Attention 3.4Scaled Dot-Product Attention]
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Adding_Position_Embeddings 4Adding Position Embeddings]
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Positional_Encoding 5Positional Encoding]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Absolute_Positional_Encoding 5.1Absolute Positional Encoding]
**[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Rotary_Positional_Embedding 5.2Rotary Positional Embedding]
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Multimodalit%C3%A4t 6Multimodalität]
*[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#Weblinks 7Weblinks]
*
</div></div><div class="mw-heading mw-heading2">
== Hintergrund ==
== Hintergrund ==
</div><p>Transformer wurden im Dezember&nbsp;2017 im Rahmen der [https://de.wikipedia.org/wiki/Salk_Institute_for_Biological_Studies#NeurIPS Neural-Information-Processing-Systems]-Konferenz von einem Team von&nbsp;8&nbsp;Google-Mitarbeitern vorgestellt und mit dem Artikel „Attention Is All You Need“ veröffentlicht.<sup id="cite_ref-Attention_is_all_you_need_2-0" class="reference">[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#cite_note-Attention_is_all_you_need-2 <span class="cite-bracket">[</span>2<span class="cite-bracket">]</span>]</sup><sup id="cite_ref-3" class="reference">[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#cite_note-3 <span class="cite-bracket">[</span>3<span class="cite-bracket">]</span>]</sup></p><p>Bei der [https://de.wikipedia.org/wiki/Verarbeitung_nat%C3%BCrlicher_Sprache Verarbeitung natürlicher Sprache]&nbsp;(NLP) wurden vor der Einführung des Transformers [https://de.wikipedia.org/wiki/Rekurrentes_neuronales_Netz rekurrente Modelle] wie&nbsp;LSTM, [https://de.wikipedia.org/w/index.php?title=Gated_recurrent_unit&action=edit&redlink=1 GRU] und [https://de.wikipedia.org/w/index.php?title=Seq2Seq&action=edit&redlink=1 Seq2Seq] eingesetzt, welche eine Eingangssequenz sequenziell abarbeiten. Diese Methoden wurden später um einen Aufmerksamkeitsmechanismus (engl. attention) erweitert.</p><p>Transformer verzichten auf die rekurrente Struktur und basieren stattdessen nur auf dem Aufmerksamkeitsmechanismus; dieser soll menschliche [https://de.wikipedia.org/wiki/Kognitiv kognitive][https://de.wikipedia.org/wiki/Aufmerksamkeit Aufmerksamkeit] nachahmen und die wesentlichen Sinnzusammenhänge in einem gegebenen [https://de.wikipedia.org/wiki/Kontext_(Sprachwissenschaft) Kontext] erkennen. Er berechnet eine „weiche“ [https://de.wikipedia.org/wiki/Gewichtung Gewichtung] für jedes Wort, genauer gesagt für die Einbettung in seinem aktuellen Kontextfenster. Diese Gewichte können berechnet werden:</p>
Transformer wurden im Dezember&nbsp;2017 im Rahmen der [[Salk Institute for Biological Studies#NeurIPS|Neural-Information-Processing-Systems]]-Konferenz von einem Team von acht Google-Mitarbeitern vorgestellt und mit dem Artikel „''Attention Is All You Need''“ veröffentlicht.<ref name="Attention is all you need">{{Internetquelle |autor=[[Ashish Vaswani]], Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, Illia Polosukhin |url=https://proceedings.neurips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf |titel=Attention is All you Need |werk=Advances in Neural Information Processing Systems |hrsg=Curran Associates, Inc. |datum=2017 |format=PDF |sprache=en |abruf=2024-04-29}}</ref><ref>{{internetquelle|autor=Steven Levy |url=https://www.wired.com/story/eight-google-employees-invented-modern-ai-transformers-paper/ |titel=8 Google Employees Invented Modern AI. Here’s the Inside Story |datum=2024-03-20|hrsg=[[Wired]]|zugriff=2024-05-02|sprache=en}}</ref>
*parallel (z.&nbsp;B. in Transformern)
 
*sequentiell (z.&nbsp;B. in rekurrenten neuronalen Netzen).
Bei der [[Verarbeitung natürlicher Sprache]]&nbsp;(NLP) wurden vor der Einführung des Transformers [[Rekurrentes neuronales Netz|rekurrente Modelle]] wie&nbsp;LSTM, [[Gated recurrent unit|GRU]] und [[Seq2Seq]] eingesetzt, welche eine Eingangssequenz sequenziell abarbeiten. Diese Methoden wurden später um einen Aufmerksamkeitsmechanismus erweitert.<ref>{{Literatur |Autor=Dzmitry Bahdanau, KyungHyun Cho, [[Yoshua Bengio]] |Titel=Neural Machine Translation by Jointly Learning To Align and Translate |Datum=2015 |Sprache=en |arXiv=1409.0473}}</ref>
<p>„Weiche“ Gewichte können sich im Gegensatz zu (vor)trainierten „harten“ Gewichten, die fix sind und keine Anpassung an wechselnden Kontext erlauben, bei jedem Durchlauf ändern. Sie erzielen bei geringerem [https://de.wikipedia.org/wiki/Rechenaufwand Rechenaufwand] ähnliche oder bessere Ergebnisse bei der Transformation von Sequenzen als rekurrente Modelle.</p><p>Beispiele für Transformermodelle sind ''Bidirectional Encoder Representations from Transformers'' (BERT)<sup id="cite_ref-heisebert_4-0" class="reference">[https://de.wikipedia.org/wiki/Transformer_(Maschinelles_Lernen)#cite_note-heisebert-4 <span class="cite-bracket">[</span>4<span class="cite-bracket">]</span>]</sup> und [https://de.wikipedia.org/wiki/Generative_Pretrained_Transformer Generative Pretrained Transformer]&nbsp;(GPT). Auch in [https://de.wikipedia.org/wiki/AlphaFold AlphaFold]2 sind Transformer als ''Evoformer'' in der Architektur enthalten.</p>
 
Transformer verzichten auf die rekurrente Struktur und basieren stattdessen nur auf dem Aufmerksamkeitsmechanismus; dieser soll menschliche [[kognitiv]]e [[Aufmerksamkeit]] nachahmen und die wesentlichen Sinnzusammenhänge in einem gegebenen [[Kontext (Sprachwissenschaft)|Kontext]] erkennen. Er berechnet eine „weiche“ [[Gewichtung]] für jedes Wort, genauer gesagt für die Einbettung in seinem aktuellen Kontextfenster. Diese Gewichte können berechnet werden:
* parallel (z.&nbsp;B. in Transformern)
* sequentiell (z.&nbsp;B. in rekurrenten neuronalen Netzen).
„Weiche“ Gewichte können sich im Gegensatz zu (vor)trainierten „harten“ Gewichten, die fix sind und keine Anpassung an wechselnden Kontext erlauben, bei jedem Durchlauf ändern.
Sie erzielen bei geringerem [[Rechenaufwand]] ähnliche oder bessere Ergebnisse bei der Transformation von Sequenzen als rekurrente Modelle.
 
Beispiele für Transformermodelle sind ''Bidirectional Encoder Representations from Transformers'' (BERT)<ref name="heisebert" /> und ''Generative Pretrained Transformer'' (GPT).
Auch in [[AlphaFold]]2 sind Transformer als ''Evoformer'' in der Architektur enthalten.
 
== Architektur ==
[[Datei:Transformer, full architecture.png|mini|463x463px|Transformer-Modellarchitektur mit originaler Position der [[Layer-Normalisierung]]. 2020 wurde eine verbesserte Positionierung der Layer-Normalisierung vor der Multi-Head Attention gefunden.]]
Ein Transformer besteht in seiner ursprünglich vorgestellten Form im Wesentlichen aus in Serie geschalteten [[Kodierer]]n (Encoder) und in Serie geschalteten [[Dekodierer]]n (Decoder).<ref name="Attention is all you need" /><ref name="at" /><ref name="it" />
Die Eingabesequenz wird durch eine sogenannte [[Worteinbettung|Embedding]]-Schicht in eine Vektorrepräsentation überführt. Die Gewichte der Embedding-Schicht werden während des Trainings angepasst. Im Falle des Transformers kommt zusätzlich eine Positionskodierung zum Einsatz, wodurch die sequentielle Abfolge der Wörter berücksichtigt werden kann. Ein Wort erhält somit zu Beginn eines Satzes eine andere Repräsentation als am Ende.<ref name="at" />
 
Die Eingabesequenz wird in der [[Vektor]]repräsentation einer Serie von Kodierern übergeben und in eine interne Repräsentation überführt. Diese interne Repräsentation bildet die Bedeutung der Eingabesequenz abstrakt ab<ref name="it" /> und wird durch die Dekodierer in eine Ausgabesequenz übersetzt.<ref name="it" /> Die Eingabesequenz wird hierbei in [[Stapelverarbeitung|Batches]] verarbeitet, wobei die Länge der Kodierer-Dekodierer-Pipeline die maximale Länge der Eingabesequenz beschränkt.<ref name="at" /> Je nach Größe des Netzwerks können beispielsweise einzelne Sätze oder auch ganze Absätze verarbeitet werden. Bei Eingabesequenzen, welche kürzer sind als die Kodierer-Dekodierer-Pipeline, wird [[Padding (Informatik)|Padding]] zum Auffüllen der Eingabesequenz genutzt.<ref name="at" />
Ein Kodierer besteht aus einem ''Self-Attention''-Modul und einem [[Feedforward neural network|Feedforward]]-Modul, während der Dekodierer aus einem ''Self-Attention''-Modul, einem Kodierer-Dekodierer-Attention-Modul und einem Feedforward-Modul besteht.<ref name="it" />
 
Transformer versuchen, das Problem der Parallelisierung durch die Verwendung von Kodierern und Dekodierer zusammen mit Attention-Modulen zu lösen. Attention-Module steigern die Geschwindigkeit, mit der das Modell von einer Sequenz in eine andere übersetzen kann. Alle Kodierer haben die gleiche Architektur. Dekodierer sind einander auch sehr ähnlich. Jeder Kodierer besteht aus zwei Schichten: Self-Attention und einem Feedforward Neural Network. Die Eingaben des Kodierers durchlaufen zunächst ein Self-Attention Layer. Der Dekodierer verfügt über beide Ebenen, aber zwischen ihnen befindet sich ein Attention Layer, das dem Dekodierer hilft, sich auf relevante Teile der Eingabemenge zu konzentrieren.<ref>Giuliano Giacaglia, Towards Data Science: [https://towardsdatascience.com/transformers-141e32e69591 How Transformers Work]</ref>
Außerdem sind in der Architektur mehrere Residualverbindungen und [[Layer-Normalisierung]]en<ref>Xiong, Ruibin et al. "On layer normalization in the transformer architecture." International Conference on Machine Learning. PMLR, 2020. https://proceedings.mlr.press/v119/xiong20b</ref> enthalten.
 
Attention-Mechanismen wurden erstmals 2015 im Kontext der maschinellen Übersetzung von Bahdanau, Cho und Bengio verwendet. Während sie immer noch auf einem [[rekurrentes neuronales Netz|rekurrenten neuronalen Netz]] basierten, schlugen Vaswani et al. 2017 ein Modell vor, das nur auf Attention beruht. Sie stellten fest, dass es rekurrente neuronale Netze bei [[Maschinelle Übersetzung|maschineller Übersetzung]] übertrifft. In ihrem Artikel stellten sie eine neue neuronale Netzwerkarchitektur vor: das Transformer-Modell.
 
Der essentielle Baustein des Transformer-Modells, der Transformator Encoder Block, ist eine Funktion <math>
f\colon \R^{t_{max} \times d}\to \R^{t_{max} \times d}
</math> mit <math>
f_{\theta}(X) = Z
</math>, die definiert ist durch
 
:<math>
\begin{align}
A &= \sqrt{\frac{1}{d}}XW^{(q)}(XW^{(k)})^T \\
M &= \mathrm{SoftMax}(A)XW^{(v)} \\
O &= \mathrm{LayerNorm_1}(M+X) \\
F &= \mathrm{ReLU}(OW^{(f_1)}+b^{(f_1)})W^{(f_2)}+b^{(f_2)} \\
Z &= \mathrm{LayerNorm_2}(O+F) \\
\end{align}
</math>
 
Dabei wird die [[Softmax-Funktion]] und ein Rectifier ([[ReLU]]) verwendet.<ref name=":0">Philipp Dufter, Martin Schmitt, Hinrich Schütze: [https://direct.mit.edu/coli/article/48/3/733/111478/Position-Information-in-Transformers-An-Overview Position Information in Transformers: An Overview]</ref>
 
Jede Encoderschicht enthält 2 Unterschichten: die Selbstaufmerksamkeit und das Feedforward-Netzwerk.
 
=== Kodierer ===
Die erste Teilschicht implementiert einen Mechanismus mit Multi-Head Self-Attention. Dieser Mechanismus implementiert Heads, die eine linear projizierte Version der Abfragen, Schlüssel und Werte empfangen und parallel jeweils die gleiche Anzahl Ausgaben erzeugen, die dann zum Generieren eines Endergebnisses verwendet werden. Die zweite Teilschicht ist ein vollständig verbundenes Feedforward Neural Network, das aus zwei linearen Transformationen mit dazwischenliegender Aktivierung der [[Rectified linear unit|Rectified Linear Unit]] (ReLU) besteht. Alle sechs Schichten des Kodierers wenden die gleichen linearen Transformationen auf alle Wörter in der Eingabesequenz an, aber jede Schicht verwendet dazu unterschiedliche Parameter. Auf jede Teilschicht folgt eine Normalisierungsschicht, die die berechnete Summe zwischen der Eingabe in die Teilschicht und der von der Teilschicht generierten Ausgabe normalisiert.
 
Die Transformer-Architektur kann grundsätzlich keine Informationen über die relativen Positionen der Wörter in der Sequenz erfassen, weil sie keine Wiederholung nutzt. Diese Informationen müssen durch die [[Kodierung]] der Positionen in die Eingabeeinbettungen eingefügt werden. Die Vektoren für die Kodierung der Positionen haben die gleiche [[Dimension (Mathematik)|Dimension]] wie die Eingabeeinbettungen und werden mithilfe von [[Sinus und Kosinus]] unterschiedlicher [[Frequenz]] generiert. Anschließend werden sie zu den Eingabeeinbettungen summiert, um die Positionsinformationen einzufügen.<ref name=":1">Stefania Cristina, Machine Learning Mastery: [https://machinelearningmastery.com/the-transformer-model/ The Transformer Model]</ref>
 
=== Dekodierer ===
Während der Inferenz kann ein Dekodierer zur [[Autoregressiver Prozess|autoregressiven]] Erzeugung von Sequenzen verwendet werden: Der Dekodierer wird mit einer Startsequenz abgefragt und sagt dann das nächste wahrscheinlichste Token vorher, welches im nächsten Schritt Teil der Eingabe wird (und so weiter). Beim Training des Dekodierers wird dieser Prozess durch [[Teacher Forcing]] und Maskierung im Dekodierer ersetzt, womit das Training stark beschleunigt wird.
 
Jede Schicht Dekodierer enthält drei Teilschichten: die kausal maskierte Selbstaufmerksamkeit (engl. ''causally masked self-attention''), die Kreuzaufmerksamkeit (engl. ''cross-attention'') und das Feedforward-Netzwerk. Weitere Details sind die residual connections eines [[residual neural network]] und die Schichtnormalisierung (Funktion ''LayerNorm''), die zwar konzeptionell unnötig, aber für numerische Stabilität und Konvergenz erforderlich sind. Ähnlich wie die Feedforward-Netzwerkmodule einzeln auf jeden Vektor angewendet werden, wird auch ''LayerNorm'' einzeln auf jeden Vektor angewendet. Es werden zwei gängige Konventionen verwendet: die Post-LN- und die Pre-LN-Konvention. In der Post-LN-Konvention ist die Ausgabe jeder Teilschicht
 
:<math>
\mathrm{LayerNorm}(x + \mathrm{Sublayer}(x))
</math>
 
wobei <math>\mathrm{Sublayer}(x)</math> die von der Teilschicht selbst implementierte Funktion ist.
 
In der Pre-LN-Konvention ist die Ausgabe jeder Unterschicht
 
:<math>
x + \mathrm{Sublayer}(\mathrm{LayerNorm}(x))
</math>
 
Der ursprüngliche Transformer von 2017 verwendete die Post-LN-Konvention. Es war schwierig zu trainieren und erforderte eine sorgfältige Abstimmung der Hyperparameter und ein „Aufwärmen“ der Lernrate, bei dem sie klein beginnt und allmählich zunimmt. Die im Jahr 2018 vorgeschlagene Pre-LN-Konvention erwies sich als einfacher zu trainieren, da kein „Aufwärmen“ erforderlich ist und die Konvergenz somit schneller erfolgt.
 
=== Diagramme ===
<gallery>
Datei:Transformer, stacked multilayers.png|Links: Kodierer und Dekodierer mit jeweils einer Schicht. Rechts: Kodierer und Dekodierer mit jeweils zwei Schichten.
Datei:Transformer encoder, with norm-first and norm-last.png|Links: Kodierer mit Normalisierung am Ende jeder Teilschicht (Post-LN). Rechts: Kodierer mit Normalisierung am Anfang jeder Teilschicht (Pre-LN).
Datei:Transformer decoder, with norm-first and norm-last.png|Links: Dekodierer mit Normalisierung am Ende jeder Teilschicht (Post-LN). Rechts: Dekodierer mit Normalisierung am Anfang jeder Teilschicht (Pre-LN).
</gallery>
 
=== Pseudocode ===
Der folgende [[Pseudocode]] zeigt die Grundstruktur für den [[Algorithmus]] eines Transformers mit Kodierer, Dekodierer und Pre-LN-Konvention:<ref>Mary Phuong, Marcus Hutter: [[arxiv:2207.09238|''Formal Algorithms for Transformers'']]</ref>
    input: Encoder input t_e
          Decoder input t_d
    output: Array of probability distributions, with shape (decoder vocabulary size x length(decoder output sequence))
 
    /* Kodierer */
    z_e = encoder.tokenizer(t_e)
 
    foreach (t in 1:length(z_e))
    {
        z_e[t] = encoder.embedding(z_e[t]) + encoder.positional_embedding(t)
    }
 
    foreach (l in 1:length(encoder.layers))
    {
        layer = encoder.layers[l]
 
        /* Erste Teilschicht */
        z_e_copy = copy(z_e)
        foreach (t in 1:length(z_e))
        {
            z_e[t] = layer.layer_norm(z_e[t])
        }
        z_e = layer.multiheaded_attention(z_e, z_e, z_e)
        foreach (t in 1:length(z_e))
        {
            z_e[t] = z_e[t] + z_e_copy[t]
        }
 
        /* Zweite Teilschicht */
        z_e_copy = copy(z_e)
        foreach (t in 1:length(z_e))
        {
            z_e[t] = layer.layer_norm(z_e[t])
        }
        z_e = layer.feedforward(z_e)
        foreach (t in 1:length(z_e))
        {
            z_e[t] = z_e[t] + z_e_copy[t]
        }
    }
 
    foreach (t in 1:length(z_e))
    {
        z_e[t] = encoder.final_layer_norm(z_e[t])
    }
 
    /* Dekodierer */
    z_d = decoder.tokenizer(t_d)
 
    foreach (t in 1:length(z_d))
    {
        z_d[t] = decoder.embedding(z_d[t]) + decoder.positional_embedding(t)
    }
 
    foreach (l in 1:length(decoder.layers))
    {
        layer = decoder.layers[l]
 
        /* Erste Teilschicht */
        z_d_copy = copy(z_d)
        foreach (t in 1:length(z_d))
        {
            z_d[t] = layer.layer_norm(z_d[t])
        }
        z_d = layer.masked_multiheaded_attention(z_d, z_d, z_d)
        foreach (t in 1:length(z_d))
        {
            z_d[t] = z_d[t] + z_d_copy[t]
        }
 
        /* Zweite Teilschicht */
        z_d_copy = copy(z_d)
        foreach (t in 1:length(z_d))
        {
            z_d[t] = layer.layer_norm(z_d[t])
        }
        z_d = layer.multiheaded_attention(z_d, z_e, z_e)
        foreach (i in 1:length(z_d))
        {
            z_d[t] = z_d[t] + z_d_copy[t]
        }
 
        /* Dritte Teilschicht */
        z_d_copy = copy(z_d)
        foreach (t in 1:length(z_d))
        {
            z_d[t] = layer.layer_norm(z_d[t])
        }
        z_d = layer.feedforward(z_d)
        foreach (t in 1:length(z_d))
        {
            z_d[t] = z_d[t] + z_d_copy[t]
        }
    }
 
    z_d = decoder.final_layer_norm(z_d)
 
    output_distributions = []
    foreach (t in 1:length(z_d))
    {
        output_distributions.append(decoder.unembed(z_d[t]))
    }
 
    return output_distributions
 
== Attention-Modul ==
 
Die Aufgabe des Attention-Moduls besteht darin, die Korrelation eines Eingabesymbols (Token) zu den anderen Eingabesymbolen zu berechnen.
Gegeben sei die [[Worteinbettung]] (engl. {{lang|en|embedding}}) <math>\vec{x}_i</math> des i-ten Tokens einer Sequenz. Diese Einbettung ist ein als Vektor kodiertes Eingabesymbol.
Aus jeder Einbettung werden unabhängig voneinander drei Vektoren berechnet, indem die Einbettung mit einer jeweils erlernten Matrix <math>Q</math>, <math>K</math> oder <math>V</math> multipliziert wird:
 
:<math>\vec{q}_i = \vec{x}_i \cdot Q</math>, der Abfragevektor (engl. {{lang|en|query}})
:<math>\vec{k}_i = \vec{x}_i \cdot K</math>, der Schlüsselvektor (engl. {{lang|en|key}})
:<math>\vec{v}_i = \vec{x}_i \cdot V</math>, der Wertevektor (engl. {{lang|en|value}})
 
Hieraus wird das Aufmerksamkeitsgewicht (attention score) zwischen Token i und Token j der Sequenz durch das [[Skalarprodukt]] <math>s_{i,j}</math> berechnet
 
:<math>s_{i,j} = \vec{q}_i \cdot \vec{k}_j</math>
 
und schließlich durch die Quadratwurzel der Länge der Schlüsselvektoren <math>\dim(k)</math> geteilt, um stabilere [[Gradient]]en zu erhalten (da die Softmax-Funktion bei großen absoluten Funktionsargumenten stark abflacht und der Gradient somit sehr klein wird):
 
:<math>\frac{s_{i,j} }{\sqrt{\dim(k)}}</math>
 
Hierauf wird die [[Softmax]]-Funktion <math>\sigma</math> entlang der letzten Dimension angewandt:
 
:<math>\tilde{s}_{i}=\sigma\left(\frac{s_{i,j}}{\sqrt{\dim(k)}}\right)</math>
 
Dieser skalare Wert wird nun mit dem Wertevektor multipliziert, was dazu führt, dass der Wertevektor mit einem Aufmerksamkeitsfaktor <math>\tilde{s}_{i}</math> vergrößert oder verkleinert wird:
 
:<math>\vec{z}_i = \tilde{s}_{i}\cdot \vec{v}_i= \sigma\left(\frac{s_{i,j}}{\sqrt{\dim(k)}}\right) \cdot \vec{v}_i,</math>
 
wobei der Vektor <math>\vec{z}_i</math> die berechnete Ausgabe des Attention-Moduls für Token i darstellt.
 
=== Unterschiede zwischen Attention im Encoder und Decoder ===
Der Unterschied zwischen dem Self-Attention-Modul (im Encoder) und dem Kodierer-Dekodierer-Attention-Modul (im Decoder mit Encoder) besteht darin, dass das Self-Attention-Modul ausschließlich die Werte des vorhergehenden Kodierers bzw. Dekodierers verwendet und die Vektoren <math>\vec{q}_i</math>, <math>\vec{k}_i</math> und <math>\vec{v}_i</math> berechnet.
Das Kodierer-Dekodierer-Attention-Modul hingegen berechnet nur den Abfragevektor <math>\vec{q}_i</math> aus dem vorgelagerten Attention-Modul, während die Vektoren <math>\vec{k}_i</math> und <math>\vec{v}_i</math> aus dem Kodierer (Encoder) bezogen werden.
 
=== Masked Attention ===
Die Maskierung der Attention (welche insbesondere im Decoder beim Training notwendig ist, damit nur vergangene Tokens beachtet werden) ist durch folgende Modifikation gegeben:
:<math>\begin{align}
\text{MaskedAttention}(Q, K, V) = \text{softmax}\left(M + \frac{QK^\mathrm{T}}{\sqrt{d_k}}\right)V,
\end{align}</math>
wobei M die Maskierungsmatrix ist, welche bei unmaskierten Werten den Wert 0 und bei maskierten Werten den Wert <math>-\infty</math> annimmt. Stark negative Werte in der Maskierungsmatrix resultieren durch die [[Softmax]]-Funktion in einer maskierten Attention von Null.
Die Maske wird häufig so gewählt, dass nur auf vorhergehende Werte Wert gelegt wird, d.&nbsp;h., dass eine [[Kausalstruktur|kausale]] Maskierung erfolgt.
 
=== Multi-Head-Attention ===
In der Praxis wird die sogenannte Multi-Head-Attention eingesetzt. Jeder ''Head'' besteht hierbei aus einer eigenen Version der Matrizen <math>Q</math>, <math>K</math> und <math>V</math>. Jedes Attention-Modul besitzt mehrere Heads. Wenn ein Head für eine bestimmte Eingabe <math>x</math> nicht relevant ist, wird ein niedriger Wert berechnet, während ein für eine Eingabe relevanter Head einen hohen Ausgabewert berechnet.
 
=== Scaled Dot-Product Attention ===
 
Der Transformer implementiert ein Scaled Dot-Product Attention, das dem Verfahren des allgemeinen Aufmerksamkeitsmechanismus folgt. Scaled Dot-Product Attention berechnet zunächst ein [[Skalarprodukt]] für jede Abfrage <math>q</math> mit allen Schlüsseln <math>k</math>. Anschließend dividiert es jedes Ergebnis durch den Skalierungsfaktor <math>\tfrac{1}{\sqrt{d_k}}</math> und wendet dann die [[Softmax-Funktion]] an. Dabei erhält es die Gewichte, mit denen die Werte skaliert werden. In der Praxis können die Berechnungen effizient auf die gesamte Menge von Abfragen gleichzeitig angewendet werden. Zu diesem Zweck werden die [[Matrix (Mathematik)|Matrizen]] <math>Q</math>, <math>K</math> und <math>V</math> als Eingaben für die Aufmerksamkeitsfunktion ''attention'' bereitgestellt. Diese kann so dargestellt werden:
:<math>\mathrm{attention}(Q, K, V) = \mathrm{softmax} \left(\frac{QK^T}{ \sqrt{d_k} }\right) \cdot V</math>
Dieser Skalierungsfaktor wurde eingeführt, um dem Effekt entgegenzuwirken, dass die [[Skalarprodukt]]e bei großen Werten stark ansteigen, wobei die Anwendung der [[Softmax-Funktion]] dann extrem kleine [[Gradient (Mathematik)|Gradienten]] zurückgeben würde, was zum Problem verschwindender Gradienten führen würde. Der Skalierungsfaktor dient dazu, die durch das Skalarprodukt berechneten Ergebnisse nach unten zu ziehen und dieses Problem zu vermeiden.
 
Das Verfahren zur Berechnung von <math>\mathrm{attention}(Q, K, V)</math> ist wie folgt:
 
* Die Ausrichtungswerte werden berechnet, indem die in der [[Matrix (Mathematik)|Matrix]] <math>Q</math> gespeicherte Menge von Abfragen mit den Schlüsseln in der Matrix <math>K</math> multipliziert wird. Wenn <math>Q</math> eine <math>m \times d_k</math>-Matrix und <math>K</math> eine <math>n \times d_k</math>-Matrix ist, dann ist die resultierende Matrix <math>QK^T</math> eine <math>m \times n</math>-Matrix:
:<math>
QK^T = \begin{pmatrix}
e_{11} & e_{12} & \cdots & e_{1n} \\
e_{21} & e_{22} & \cdots & e_{2n} \\
\vdots & \vdots &        & \vdots \\
e_{m1} & e_{m2} & \cdots & e_{mn} \\
\end{pmatrix}
</math>
* Jeder der Ausrichtungswert wird mit <math>\tfrac{1}{\sqrt{d_k}}</math> skaliert:
:<math>
\frac{QK^T}{ \sqrt{d_k} } = \begin{pmatrix}
\tfrac{e_{11}}{ \sqrt{d_k} } & \tfrac{e_{12}}{ \sqrt{d_k} } & \cdots & \tfrac{e_{1n}}{ \sqrt{d_k} } \\
\tfrac{e_{21}}{ \sqrt{d_k} } & \tfrac{e_{22}}{ \sqrt{d_k} } & \cdots & \tfrac{e_{2n}}{ \sqrt{d_k} } \\
\vdots                      & \vdots                      &        & \vdots \\
\tfrac{e_{m1}}{ \sqrt{d_k} } & \tfrac{e_{m2}}{ \sqrt{d_k} } & \cdots & \tfrac{e_{mn}}{ \sqrt{d_k} } \\
\end{pmatrix}
</math>
* Es wird die [[Softmax-Funktion]] angewendet, um eine Menge von Gewichten zu erhalten.
* Die resultierenden Gewichte werden mithilfe der [[Matrizenmultiplikation|Matrixmultiplikation]] auf die Elemente der <math>n \times d_v</math>-Matrix <math>V</math> angewendet:<ref name=":1" />
:<math>
\mathrm{softmax} \left(\frac{QK^T}{ \sqrt{d_k} }\right) \cdot V = \begin{pmatrix}
\mathrm{softmax}( \tfrac{e_{11}}{ \sqrt{d_k} } & \tfrac{e_{12}}{ \sqrt{d_k} } & \cdots & \tfrac{e_{1n}}{ \sqrt{d_k} } ) \\
\mathrm{softmax}( \tfrac{e_{21}}{ \sqrt{d_k} } & \tfrac{e_{22}}{ \sqrt{d_k} } & \cdots & \tfrac{e_{2n}}{ \sqrt{d_k} } ) \\
\vdots                                        & \vdots                      &        & \vdots \\
\mathrm{softmax}( \tfrac{e_{m1}}{ \sqrt{d_k} } & \tfrac{e_{m2}}{ \sqrt{d_k} } & \cdots & \tfrac{e_{mn}}{ \sqrt{d_k} } ) \\
\end{pmatrix}
\cdot
\begin{pmatrix}
v_{11} & v_{12} & \cdots & v_{1d_v} \\
v_{21} & v_{22} & \cdots & v_{2d_v} \\
\vdots & \vdots &        & \vdots \\
v_{n1} & v_{n2} & \cdots & v_{nd_v} \\
\end{pmatrix}
</math>
 
== Adding Position Embeddings ==
Ein gängiger Ansatz besteht darin, der Eingabe Positionseinbettungen hinzuzufügen, bevor sie dem tatsächlichen Transformer-Modell zugeführt wird: Wenn <math>
U \in \R^{t_{max} \times d}
</math> die Matrix der Einheitseinbettungen ist, wird eine Matrix <math>
P \in \R^{t_{max} \times d}
</math> hinzugefügt, die die Positionsinformationen darstellt, und ihre Summe wird dem Transformer-Modell zugeführt: <math>
T(U + P)
</math> . Für die erste Transformer-Ebene hat das folgenden Effekt:
:<math>
\begin{align}
\tilde{A} &= \sqrt{\frac{1}{d}}(U+P)W^{(q)}{W^{(k)}}^T(U+P)^T \\
\tilde{M} &= \mathrm{SoftMax}(\tilde{A})(U+P)W^{(v)} \\
\tilde{O} &= \mathrm{LayerNorm_1}(\tilde{M}+U+P) \\
\tilde{F} &= \mathrm{ReLU}(\tilde{O}W^{(f_1)}+b^{(f_1)})W^{(f_2)}+b^{(f_2)} \\
\tilde{Z} &= \mathrm{LayerNorm_2}(\tilde{O}+\tilde{F}) \\
\end{align}
</math>
 
Dabei wird die [[Softmax-Funktion]] und ein Rectifier ([[ReLU]]) verwendet.<ref name=":0" />
 
== Positional Encoding ==
Die Transformer-Architektur ist eine Architektur, die aus gestapelten Encoder-Schichten und Decoder-Schichten besteht. Zum Erzeugen von Sequenzdarstellungen nutzt der Transformer Self-Attention. Eine Encoder-Schicht besteht aus einer Self-Attention-Teilschicht, gefolgt von einer Feedforward-Teilschicht. Auf ähnliche Weise besteht eine Decoder-Schicht aus einer Self-Attention-Teilschicht, gefolgt von einer Encoder-Decodierer-Attention-Teilschicht, auf die eine Feedforward-Teilschicht folgt. Der Aufmerksamkeitsmechanismus ignoriert die Sequenzreihenfolge, weshalb in der Transformer-Architektur Positionskodierungen verwendet werden.
 
=== Absolute Positional Encoding ===
In der ursprünglichen Transformer-Architektur wird zu jedem eingebetteten Quell- und Zielwort ein absoluter Positionskodierungsvektor <math>PE_j</math> hinzugefügt, um dessen Position <math>j</math> anzugeben. Die Idee besteht darin, [[Sinuskurve]]n unterschiedlicher [[Wellenlänge]]n zum Kodieren unterschiedlicher Positionen zu verwenden. Für die Position <math>j \in \{1, \ldots, J\}</math> in einer Sequenz der Länge <math>J</math> wird der absolute Positionskodierungsvektor <math>PE_j \in \R^{d_{\mathrm{model}}}</math> definiert durch
 
:<math>
\begin{align}
PE_{j,2 \beta} &= \sin(j/10000^{2 \beta / d_{\mathrm{model}}}) \\
PE_{j,2 \beta + 1} &= \cos(j/10000^{2 \beta / d_{\mathrm{model}}}) \\
\end{align}
</math>
 
wobei <math>\beta \in \{1, \ldots, \lfloor \tfrac{d_{\mathrm{model}}}{2} \rfloor\}</math>. Vaswani et al. schlagen vor, dass sinusförmige Positionseinbettungen genauso gut funktionieren wie erlernte Positionskodierungen, und sie stellen die Hypothese auf, dass erstere auf längere Sequenzen verallgemeinert werden können.<ref name=":2">Jan Rosendahl, Viet Anh Khoa Tran, Weiyue Wang, Hermann Ney, RWTH Aachen: [https://www-i6.informatik.rwth-aachen.de/publications/download/1132/RosendahlJanTranVietAnhKhoaWangWeiyueNeyHermann--AnalysisofPositionalEncodingsforNeuralMachineTranslation--2019.pdf Analysis of Positional Encodings for Neural Machine Translation]</ref>
 
=== Rotary Positional Embedding ===
Rotary Positional Embedding (RoPE) basiert auf einer Liste [[Zweidimensional|zweidimensionaler]] [[Vektor]]en <math>[(x^{(1)}_1, x^{(2)}_1), (x^{(1)}_2, x^{(2)}_2), (x^{(1)}_3, x^{(2)}_3), \dots]</math>. Ist ein Winkel <math>\theta</math> vorgegeben, dann wird die RoPE-Kodierung für den Vektor <math>(x^{(1)}_m, x^{(2)}_m)</math>berechnet wie folgt:
 
:<math>\mathrm{RoPE}(x^{(1)}_m, x^{(2)}_m, m) =
\begin{pmatrix}
\cos(m \cdot \theta) & -\sin(m \cdot \theta) \\
\sin(m \cdot \theta) & \cos(m \cdot \theta) \\
\end{pmatrix}
\cdot
\begin{pmatrix}
x^{(1)}_m \\
x^{(2)}_m \\
\end{pmatrix}
=
\begin{pmatrix}
x^{(1)}_m \cdot \cos(m \cdot \theta) - x^{(2)}_m \cdot \sin(m \cdot \theta) \\
x^{(2)}_m \cdot \cos(m \cdot \theta) + x^{(1)}_m \cdot \sin(m \cdot \theta) \\
\end{pmatrix}</math>
 
Die RoPE-Kodierung ist also einfach eine Multiplikation mit einem Winkel <math>\theta</math>, wenn die zweidimensionalen Vektoren als [[Komplexe Zahl|komplexe Zahlen]] <math>z_m := x^{(1)}_m + i \cdot x^{(2)}_m </math> dargestellt werden:
 
:<math>\mathrm{RoPE}(z_m, m) = e^{i \cdot m \cdot \theta} \cdot z_m</math>
 
Für eine Liste <math>2 \cdot n </math>-dimensionaler Vektoren wird eine RoPE-Kodierung durch eine endliche Folge <math>\theta^{(1)}, \dots, \theta^{(n)} </math> von Winkeln definiert. Dann wird die RoPE-Kodierung auf jedes Koordinatenpaar <math>(x^{(1)}_m, x^{(2)}_m)</math> angewendet. Der Vorteil von RoPE besteht darin, dass das [[Skalarprodukt]] zwischen zwei Vektoren nur von ihrer relativen Position abhängt, denn es gilt
 
:<math>\mathrm{RoPE}(x, m)^T \cdot \mathrm{RoPE}(y, n) = \mathrm{RoPE}(x, m + k)^T \cdot \mathrm{RoPE}(y, n + k)</math>
 
für jede positive [[ganze Zahl]] <math>k </math>.<ref>{{Literatur |Autor=Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Yunfeng Liu |Titel=RoFormer: Enhanced Transformer with Rotary Position Embedding |Datum=2021 |DOI=10.48550/ARXIV.2104.09864}}</ref>
 
== Multimodalität ==
Transformer können auch für Modalitäten verwendet werden, die nicht textbasiert sind, indem man einen Weg findet, die Modalität in [[Token (Übersetzerbau)|Token]] zu zerlegen. Eine Studie aus dem Jahr 2022 ergab, dass Transformatoren, die nur auf natürliche Sprache vortrainiert wurden, nur auf 0,03 % der Parameter feinabgestimmt werden können und bei vielen logischen und visuellen Aufgaben mit [[Long short-term memory]] konkurrieren können, was ein Hinweis auf Transferleistungen bei [[Deep Learning|Deep-Learning]] ist.
 
''Vision Transformer'' passen den Transformator an [[Computer Vision#Maschinelles Sehen|Maschinelles Sehen]] an, indem sie Eingabebilder in eine Reihe von Patches zerlegen, sie in [[Vektor]]en umwandeln und sie wie [[Token (Übersetzerbau)|Token]] in einem Standard-Transformer behandeln. Conformer und später Whisper folgen demselben Muster für die [[Spracherkennung]], indem sie das Sprachsignal zunächst in ein [[Spektrogramm]] umwandeln, das dann wie ein Bild behandelt wird, d. h. in eine Reihe von Patches zerlegt, in Vektoren umgewandelt und wie Token in einem Standard-Transformer behandelt wird. ''Perceiver'' sind eine Variante von Transformern, die für Multimodalität entwickelt wurden. Beispiele für Bildgeneratoren, die multimodale Transformer verwenden, sind zum Beispiel [[DALL-E]] und [[Stable Diffusion]]. Im Gegensatz zu späteren Modellen ist DALL-E kein Diffusionsmodell. Stattdessen verwendet es einen Nur-Decoder-Transformer, der autoregressiv einen Text generiert, gefolgt von der Token-Darstellung eines Bildes, das dann von einem ''Variational Autoencoder'' in ein Bild umgewandelt wird.
 
== Weblinks ==
[[Kategorie:Wikipedia.de Artikel]]
* {{Internetquelle |autor=Tianyang Lin, Yuxin Wang, Xiangyang Liu, Xipeng Qiu |url=https://arxiv.org/pdf/2106.04554.pdf |titel=A Survey of Transformers |datum=2021-06-08 |format=PDF |sprache=en |abruf=2021-06-15 |kommentar=Übersicht über Transformer-Architekturen}}
* {{Internetquelle |autor=Michael Phi |url=https://towardsdatascience.com/illustrated-guide-to-transformers-step-by-step-explanation-f74876522bc0 |titel=Illustrated Guide to Transformers - Step by Step Explanation |datum=2020-05-01 |sprache=en |abruf=2021-06-15}}
 
== Einzelnachweise ==
<references responsive>
<ref name="at">
{{Internetquelle
|autor=Alexander Rush
|url=https://nlp.seas.harvard.edu/2018/04/03/attention.html
|titel=The Annotated Transformer
|hrsg=Harvard NLP
|sprache=en
|abruf=2020-06-19}}
</ref>
<ref name="it">
{{Internetquelle
|autor=Jay Alammar
|url=http://jalammar.github.io/illustrated-transformer/
|titel=The Illustrated Transformer
|sprache=en
|abruf=2020-06-19}}
</ref>
<ref name="heisebert">
{{Internetquelle
|autor=Rainald Menge-Sonnentag
|url=https://www.heise.de/hintergrund/Wer-wie-was-Textanalyse-mit-BERT-4864558.html?seite=all
|titel=Wer, wie, was: Textanalyse über Natural Language Processing mit BERT
|werk=Heise Online
|datum=2019-08-12
|sprache=de
|abruf=2020-08-13}}
</ref>
</references>
 
[[Kategorie:Angewandte Informatik]]
[[Kategorie:künstliche neuronale Netze]]
[[Kategorie:Transformer (maschinelles Lernen)]]

Aktuelle Version vom 31. Juli 2026, 14:30 Uhr

Ein Transformer ist eine von Google entwickelte Deep-Learning-Architektur, die einen Aufmerksamkeitsmechanismus (englisch Attention) integriert. Dabei wird Text durch Worteinbettung in numerische Darstellungen in Form von Vektoren umgewandelt. Dies kann z. B. dazu benutzt werden, Text von einer Sprache in eine andere zu übersetzen (siehe auch Maschinelle Übersetzung). Dazu wird ein Transformer mittels maschinellem Lernen anhand einer (großen) Menge von Beispieltexten trainiert, bevor das trainierte Modell dann zur Übersetzung verwendet werden kann. Weitere Beispielanwendungen von Transformern sind die Textgenerierung oder die Zusammenfassung längerer Texte. Transformer sind hierbei effizienter als Long-short-term-memory-Architekturen (LSTM) und bilden die Grundarchitektur des generativen vortrainierten Transformers (GPT) sowie anderer vortrainierter Machine-Learning-Modelle.

Lineare Transformer sind eine Form von „'fast weight programmers'“, welche 1991 vorgeschlagen wurden.[1]

Hintergrund

Transformer wurden im Dezember 2017 im Rahmen der Neural-Information-Processing-Systems-Konferenz von einem Team von acht Google-Mitarbeitern vorgestellt und mit dem Artikel „Attention Is All You Need“ veröffentlicht.[2][3]

Bei der Verarbeitung natürlicher Sprache (NLP) wurden vor der Einführung des Transformers rekurrente Modelle wie LSTM, GRU und Seq2Seq eingesetzt, welche eine Eingangssequenz sequenziell abarbeiten. Diese Methoden wurden später um einen Aufmerksamkeitsmechanismus erweitert.[4]

Transformer verzichten auf die rekurrente Struktur und basieren stattdessen nur auf dem Aufmerksamkeitsmechanismus; dieser soll menschliche kognitive Aufmerksamkeit nachahmen und die wesentlichen Sinnzusammenhänge in einem gegebenen Kontext erkennen. Er berechnet eine „weiche“ Gewichtung für jedes Wort, genauer gesagt für die Einbettung in seinem aktuellen Kontextfenster. Diese Gewichte können berechnet werden:

  • parallel (z. B. in Transformern)
  • sequentiell (z. B. in rekurrenten neuronalen Netzen).

„Weiche“ Gewichte können sich im Gegensatz zu (vor)trainierten „harten“ Gewichten, die fix sind und keine Anpassung an wechselnden Kontext erlauben, bei jedem Durchlauf ändern. Sie erzielen bei geringerem Rechenaufwand ähnliche oder bessere Ergebnisse bei der Transformation von Sequenzen als rekurrente Modelle.

Beispiele für Transformermodelle sind Bidirectional Encoder Representations from Transformers (BERT)[5] und Generative Pretrained Transformer (GPT). Auch in AlphaFold2 sind Transformer als Evoformer in der Architektur enthalten.

Architektur

Transformer-Modellarchitektur mit originaler Position der Layer-Normalisierung. 2020 wurde eine verbesserte Positionierung der Layer-Normalisierung vor der Multi-Head Attention gefunden.

Ein Transformer besteht in seiner ursprünglich vorgestellten Form im Wesentlichen aus in Serie geschalteten Kodierern (Encoder) und in Serie geschalteten Dekodierern (Decoder).[2][6][7] Die Eingabesequenz wird durch eine sogenannte Embedding-Schicht in eine Vektorrepräsentation überführt. Die Gewichte der Embedding-Schicht werden während des Trainings angepasst. Im Falle des Transformers kommt zusätzlich eine Positionskodierung zum Einsatz, wodurch die sequentielle Abfolge der Wörter berücksichtigt werden kann. Ein Wort erhält somit zu Beginn eines Satzes eine andere Repräsentation als am Ende.[6]

Die Eingabesequenz wird in der Vektorrepräsentation einer Serie von Kodierern übergeben und in eine interne Repräsentation überführt. Diese interne Repräsentation bildet die Bedeutung der Eingabesequenz abstrakt ab[7] und wird durch die Dekodierer in eine Ausgabesequenz übersetzt.[7] Die Eingabesequenz wird hierbei in Batches verarbeitet, wobei die Länge der Kodierer-Dekodierer-Pipeline die maximale Länge der Eingabesequenz beschränkt.[6] Je nach Größe des Netzwerks können beispielsweise einzelne Sätze oder auch ganze Absätze verarbeitet werden. Bei Eingabesequenzen, welche kürzer sind als die Kodierer-Dekodierer-Pipeline, wird Padding zum Auffüllen der Eingabesequenz genutzt.[6] Ein Kodierer besteht aus einem Self-Attention-Modul und einem Feedforward-Modul, während der Dekodierer aus einem Self-Attention-Modul, einem Kodierer-Dekodierer-Attention-Modul und einem Feedforward-Modul besteht.[7]

Transformer versuchen, das Problem der Parallelisierung durch die Verwendung von Kodierern und Dekodierer zusammen mit Attention-Modulen zu lösen. Attention-Module steigern die Geschwindigkeit, mit der das Modell von einer Sequenz in eine andere übersetzen kann. Alle Kodierer haben die gleiche Architektur. Dekodierer sind einander auch sehr ähnlich. Jeder Kodierer besteht aus zwei Schichten: Self-Attention und einem Feedforward Neural Network. Die Eingaben des Kodierers durchlaufen zunächst ein Self-Attention Layer. Der Dekodierer verfügt über beide Ebenen, aber zwischen ihnen befindet sich ein Attention Layer, das dem Dekodierer hilft, sich auf relevante Teile der Eingabemenge zu konzentrieren.[8] Außerdem sind in der Architektur mehrere Residualverbindungen und Layer-Normalisierungen[9] enthalten.

Attention-Mechanismen wurden erstmals 2015 im Kontext der maschinellen Übersetzung von Bahdanau, Cho und Bengio verwendet. Während sie immer noch auf einem rekurrenten neuronalen Netz basierten, schlugen Vaswani et al. 2017 ein Modell vor, das nur auf Attention beruht. Sie stellten fest, dass es rekurrente neuronale Netze bei maschineller Übersetzung übertrifft. In ihrem Artikel stellten sie eine neue neuronale Netzwerkarchitektur vor: das Transformer-Modell.

Der essentielle Baustein des Transformer-Modells, der Transformator Encoder Block, ist eine Funktion f:ℝtmax×d→ℝtmax×d mit fθ(X)=Z, die definiert ist durch

A=1dXW(q)(XW(k))TM=SoftMax(A)XW(v)O=LayerNorm1(M+X)F=ReLU(OW(f1)+b(f1))W(f2)+b(f2)Z=LayerNorm2(O+F)

Dabei wird die Softmax-Funktion und ein Rectifier (ReLU) verwendet.[10]

Jede Encoderschicht enthält 2 Unterschichten: die Selbstaufmerksamkeit und das Feedforward-Netzwerk.

Kodierer

Die erste Teilschicht implementiert einen Mechanismus mit Multi-Head Self-Attention. Dieser Mechanismus implementiert Heads, die eine linear projizierte Version der Abfragen, Schlüssel und Werte empfangen und parallel jeweils die gleiche Anzahl Ausgaben erzeugen, die dann zum Generieren eines Endergebnisses verwendet werden. Die zweite Teilschicht ist ein vollständig verbundenes Feedforward Neural Network, das aus zwei linearen Transformationen mit dazwischenliegender Aktivierung der Rectified Linear Unit (ReLU) besteht. Alle sechs Schichten des Kodierers wenden die gleichen linearen Transformationen auf alle Wörter in der Eingabesequenz an, aber jede Schicht verwendet dazu unterschiedliche Parameter. Auf jede Teilschicht folgt eine Normalisierungsschicht, die die berechnete Summe zwischen der Eingabe in die Teilschicht und der von der Teilschicht generierten Ausgabe normalisiert.

Die Transformer-Architektur kann grundsätzlich keine Informationen über die relativen Positionen der Wörter in der Sequenz erfassen, weil sie keine Wiederholung nutzt. Diese Informationen müssen durch die Kodierung der Positionen in die Eingabeeinbettungen eingefügt werden. Die Vektoren für die Kodierung der Positionen haben die gleiche Dimension wie die Eingabeeinbettungen und werden mithilfe von Sinus und Kosinus unterschiedlicher Frequenz generiert. Anschließend werden sie zu den Eingabeeinbettungen summiert, um die Positionsinformationen einzufügen.[11]

Dekodierer

Während der Inferenz kann ein Dekodierer zur autoregressiven Erzeugung von Sequenzen verwendet werden: Der Dekodierer wird mit einer Startsequenz abgefragt und sagt dann das nächste wahrscheinlichste Token vorher, welches im nächsten Schritt Teil der Eingabe wird (und so weiter). Beim Training des Dekodierers wird dieser Prozess durch Teacher Forcing und Maskierung im Dekodierer ersetzt, womit das Training stark beschleunigt wird.

Jede Schicht Dekodierer enthält drei Teilschichten: die kausal maskierte Selbstaufmerksamkeit (engl. causally masked self-attention), die Kreuzaufmerksamkeit (engl. cross-attention) und das Feedforward-Netzwerk. Weitere Details sind die residual connections eines residual neural network und die Schichtnormalisierung (Funktion LayerNorm), die zwar konzeptionell unnötig, aber für numerische Stabilität und Konvergenz erforderlich sind. Ähnlich wie die Feedforward-Netzwerkmodule einzeln auf jeden Vektor angewendet werden, wird auch LayerNorm einzeln auf jeden Vektor angewendet. Es werden zwei gängige Konventionen verwendet: die Post-LN- und die Pre-LN-Konvention. In der Post-LN-Konvention ist die Ausgabe jeder Teilschicht

LayerNorm(x+Sublayer(x))

wobei Sublayer(x) die von der Teilschicht selbst implementierte Funktion ist.

In der Pre-LN-Konvention ist die Ausgabe jeder Unterschicht

x+Sublayer(LayerNorm(x))

Der ursprüngliche Transformer von 2017 verwendete die Post-LN-Konvention. Es war schwierig zu trainieren und erforderte eine sorgfältige Abstimmung der Hyperparameter und ein „Aufwärmen“ der Lernrate, bei dem sie klein beginnt und allmählich zunimmt. Die im Jahr 2018 vorgeschlagene Pre-LN-Konvention erwies sich als einfacher zu trainieren, da kein „Aufwärmen“ erforderlich ist und die Konvergenz somit schneller erfolgt.

Diagramme

Pseudocode

Der folgende Pseudocode zeigt die Grundstruktur für den Algorithmus eines Transformers mit Kodierer, Dekodierer und Pre-LN-Konvention:[12]

   input: Encoder input t_e
          Decoder input t_d
   output: Array of probability distributions, with shape (decoder vocabulary size x length(decoder output sequence))
   /* Kodierer */
   z_e = encoder.tokenizer(t_e)
   foreach (t in 1:length(z_e))
   {
       z_e[t] = encoder.embedding(z_e[t]) + encoder.positional_embedding(t)
   }
   foreach (l in 1:length(encoder.layers))
   {
       layer = encoder.layers[l]
       /* Erste Teilschicht */
       z_e_copy = copy(z_e)
       foreach (t in 1:length(z_e))
       {
           z_e[t] = layer.layer_norm(z_e[t])
       }
       z_e = layer.multiheaded_attention(z_e, z_e, z_e)
       foreach (t in 1:length(z_e))
       {
           z_e[t] = z_e[t] + z_e_copy[t]
       }
       /* Zweite Teilschicht */
       z_e_copy = copy(z_e)
       foreach (t in 1:length(z_e))
       {
           z_e[t] = layer.layer_norm(z_e[t])
       }
       z_e = layer.feedforward(z_e)
       foreach (t in 1:length(z_e))
       {
           z_e[t] = z_e[t] + z_e_copy[t]
       }
   }
   foreach (t in 1:length(z_e))
   {
       z_e[t] = encoder.final_layer_norm(z_e[t])
   }
   /* Dekodierer */
   z_d = decoder.tokenizer(t_d)
   foreach (t in 1:length(z_d))
   {
       z_d[t] = decoder.embedding(z_d[t]) + decoder.positional_embedding(t)
   }
   foreach (l in 1:length(decoder.layers))
   {
       layer = decoder.layers[l]
       /* Erste Teilschicht */
       z_d_copy = copy(z_d)
       foreach (t in 1:length(z_d))
       {
           z_d[t] = layer.layer_norm(z_d[t])
       }
       z_d = layer.masked_multiheaded_attention(z_d, z_d, z_d)
       foreach (t in 1:length(z_d))
       {
           z_d[t] = z_d[t] + z_d_copy[t]
       }
       /* Zweite Teilschicht */
       z_d_copy = copy(z_d)
       foreach (t in 1:length(z_d))
       {
           z_d[t] = layer.layer_norm(z_d[t])
       }
       z_d = layer.multiheaded_attention(z_d, z_e, z_e)
       foreach (i in 1:length(z_d))
       {
           z_d[t] = z_d[t] + z_d_copy[t]
       }
       /* Dritte Teilschicht */
       z_d_copy = copy(z_d)
       foreach (t in 1:length(z_d))
       {
           z_d[t] = layer.layer_norm(z_d[t])
       }
       z_d = layer.feedforward(z_d)
       foreach (t in 1:length(z_d))
       {
           z_d[t] = z_d[t] + z_d_copy[t]
       }
   }
   z_d = decoder.final_layer_norm(z_d)
   output_distributions = []
   foreach (t in 1:length(z_d))
   {
       output_distributions.append(decoder.unembed(z_d[t]))
   }
   return output_distributions

Attention-Modul

Die Aufgabe des Attention-Moduls besteht darin, die Korrelation eines Eingabesymbols (Token) zu den anderen Eingabesymbolen zu berechnen. Gegeben sei die Worteinbettung (engl. embedding) x→i des i-ten Tokens einer Sequenz. Diese Einbettung ist ein als Vektor kodiertes Eingabesymbol. Aus jeder Einbettung werden unabhängig voneinander drei Vektoren berechnet, indem die Einbettung mit einer jeweils erlernten Matrix Q, K oder V multipliziert wird:

q→i=x→i⋅Q, der Abfragevektor (engl. query)
k→i=x→i⋅K, der Schlüsselvektor (engl. key)
v→i=x→i⋅V, der Wertevektor (engl. value)

Hieraus wird das Aufmerksamkeitsgewicht (attention score) zwischen Token i und Token j der Sequenz durch das Skalarprodukt si,j berechnet

si,j=q→i⋅k→j

und schließlich durch die Quadratwurzel der Länge der Schlüsselvektoren dim⁡(k) geteilt, um stabilere Gradienten zu erhalten (da die Softmax-Funktion bei großen absoluten Funktionsargumenten stark abflacht und der Gradient somit sehr klein wird):

si,jdim⁡(k)

Hierauf wird die Softmax-Funktion σ entlang der letzten Dimension angewandt:

s~i=σ(si,jdim⁡(k))

Dieser skalare Wert wird nun mit dem Wertevektor multipliziert, was dazu führt, dass der Wertevektor mit einem Aufmerksamkeitsfaktor s~i vergrößert oder verkleinert wird:

z→i=s~i⋅v→i=σ(si,jdim⁡(k))⋅v→i,

wobei der Vektor z→i die berechnete Ausgabe des Attention-Moduls für Token i darstellt.

Unterschiede zwischen Attention im Encoder und Decoder

Der Unterschied zwischen dem Self-Attention-Modul (im Encoder) und dem Kodierer-Dekodierer-Attention-Modul (im Decoder mit Encoder) besteht darin, dass das Self-Attention-Modul ausschließlich die Werte des vorhergehenden Kodierers bzw. Dekodierers verwendet und die Vektoren q→i, k→i und v→i berechnet. Das Kodierer-Dekodierer-Attention-Modul hingegen berechnet nur den Abfragevektor q→i aus dem vorgelagerten Attention-Modul, während die Vektoren k→i und v→i aus dem Kodierer (Encoder) bezogen werden.

Masked Attention

Die Maskierung der Attention (welche insbesondere im Decoder beim Training notwendig ist, damit nur vergangene Tokens beachtet werden) ist durch folgende Modifikation gegeben:

MaskedAttention(Q,K,V)=softmax(M+QKTdk)V,

wobei M die Maskierungsmatrix ist, welche bei unmaskierten Werten den Wert 0 und bei maskierten Werten den Wert −∞ annimmt. Stark negative Werte in der Maskierungsmatrix resultieren durch die Softmax-Funktion in einer maskierten Attention von Null. Die Maske wird häufig so gewählt, dass nur auf vorhergehende Werte Wert gelegt wird, d. h., dass eine kausale Maskierung erfolgt.

Multi-Head-Attention

In der Praxis wird die sogenannte Multi-Head-Attention eingesetzt. Jeder Head besteht hierbei aus einer eigenen Version der Matrizen Q, K und V. Jedes Attention-Modul besitzt mehrere Heads. Wenn ein Head für eine bestimmte Eingabe x nicht relevant ist, wird ein niedriger Wert berechnet, während ein für eine Eingabe relevanter Head einen hohen Ausgabewert berechnet.

Scaled Dot-Product Attention

Der Transformer implementiert ein Scaled Dot-Product Attention, das dem Verfahren des allgemeinen Aufmerksamkeitsmechanismus folgt. Scaled Dot-Product Attention berechnet zunächst ein Skalarprodukt für jede Abfrage q mit allen Schlüsseln k. Anschließend dividiert es jedes Ergebnis durch den Skalierungsfaktor 1dk und wendet dann die Softmax-Funktion an. Dabei erhält es die Gewichte, mit denen die Werte skaliert werden. In der Praxis können die Berechnungen effizient auf die gesamte Menge von Abfragen gleichzeitig angewendet werden. Zu diesem Zweck werden die Matrizen Q, K und V als Eingaben für die Aufmerksamkeitsfunktion attention bereitgestellt. Diese kann so dargestellt werden:

attention(Q,K,V)=softmax(QKTdk)⋅V

Dieser Skalierungsfaktor wurde eingeführt, um dem Effekt entgegenzuwirken, dass die Skalarprodukte bei großen Werten stark ansteigen, wobei die Anwendung der Softmax-Funktion dann extrem kleine Gradienten zurückgeben würde, was zum Problem verschwindender Gradienten führen würde. Der Skalierungsfaktor dient dazu, die durch das Skalarprodukt berechneten Ergebnisse nach unten zu ziehen und dieses Problem zu vermeiden.

Das Verfahren zur Berechnung von attention(Q,K,V) ist wie folgt:

  • Die Ausrichtungswerte werden berechnet, indem die in der Matrix Q gespeicherte Menge von Abfragen mit den Schlüsseln in der Matrix K multipliziert wird. Wenn Q eine m×dk-Matrix und K eine n×dk-Matrix ist, dann ist die resultierende Matrix QKT eine m×n-Matrix:
QKT=(e11e12⋯e1ne21e22⋯e2n⋮⋮⋮em1em2⋯emn)
  • Jeder der Ausrichtungswert wird mit 1dk skaliert:
QKTdk=(e11dke12dk⋯e1ndke21dke22dk⋯e2ndk⋮⋮⋮em1dkem2dk⋯emndk)
  • Es wird die Softmax-Funktion angewendet, um eine Menge von Gewichten zu erhalten.
  • Die resultierenden Gewichte werden mithilfe der Matrixmultiplikation auf die Elemente der n×dv-Matrix V angewendet:[11]
softmax(QKTdk)⋅V=(softmax(e11dke12dk⋯e1ndk)softmax(e21dke22dk⋯e2ndk)⋮⋮⋮softmax(em1dkem2dk⋯emndk))⋅(v11v12⋯v1dvv21v22⋯v2dv⋮⋮⋮vn1vn2⋯vndv)

Adding Position Embeddings

Ein gängiger Ansatz besteht darin, der Eingabe Positionseinbettungen hinzuzufügen, bevor sie dem tatsächlichen Transformer-Modell zugeführt wird: Wenn U∈ℝtmax×d die Matrix der Einheitseinbettungen ist, wird eine Matrix P∈ℝtmax×d hinzugefügt, die die Positionsinformationen darstellt, und ihre Summe wird dem Transformer-Modell zugeführt: T(U+P) . Für die erste Transformer-Ebene hat das folgenden Effekt:

A~=1d(U+P)W(q)W(k)T(U+P)TM~=SoftMax(A~)(U+P)W(v)O~=LayerNorm1(M~+U+P)F~=ReLU(O~W(f1)+b(f1))W(f2)+b(f2)Z~=LayerNorm2(O~+F~)

Dabei wird die Softmax-Funktion und ein Rectifier (ReLU) verwendet.[10]

Positional Encoding

Die Transformer-Architektur ist eine Architektur, die aus gestapelten Encoder-Schichten und Decoder-Schichten besteht. Zum Erzeugen von Sequenzdarstellungen nutzt der Transformer Self-Attention. Eine Encoder-Schicht besteht aus einer Self-Attention-Teilschicht, gefolgt von einer Feedforward-Teilschicht. Auf ähnliche Weise besteht eine Decoder-Schicht aus einer Self-Attention-Teilschicht, gefolgt von einer Encoder-Decodierer-Attention-Teilschicht, auf die eine Feedforward-Teilschicht folgt. Der Aufmerksamkeitsmechanismus ignoriert die Sequenzreihenfolge, weshalb in der Transformer-Architektur Positionskodierungen verwendet werden.

Absolute Positional Encoding

In der ursprünglichen Transformer-Architektur wird zu jedem eingebetteten Quell- und Zielwort ein absoluter Positionskodierungsvektor PEj hinzugefügt, um dessen Position j anzugeben. Die Idee besteht darin, Sinuskurven unterschiedlicher Wellenlängen zum Kodieren unterschiedlicher Positionen zu verwenden. Für die Position j∈{1,…,J} in einer Sequenz der Länge J wird der absolute Positionskodierungsvektor PEj∈ℝdmodel definiert durch

PEj,2β=sin⁡(j/100002β/dmodel)PEj,2β+1=cos⁡(j/100002β/dmodel)

wobei β∈{1,…,⌊dmodel2⌋}. Vaswani et al. schlagen vor, dass sinusförmige Positionseinbettungen genauso gut funktionieren wie erlernte Positionskodierungen, und sie stellen die Hypothese auf, dass erstere auf längere Sequenzen verallgemeinert werden können.[13]

Rotary Positional Embedding

Rotary Positional Embedding (RoPE) basiert auf einer Liste zweidimensionaler Vektoren [(x1(1),x1(2)),(x2(1),x2(2)),(x3(1),x3(2)),…]. Ist ein Winkel θ vorgegeben, dann wird die RoPE-Kodierung für den Vektor (xm(1),xm(2))berechnet wie folgt:

RoPE(xm(1),xm(2),m)=(cos⁡(m⋅θ)−sin⁡(m⋅θ)sin⁡(m⋅θ)cos⁡(m⋅θ))⋅(xm(1)xm(2))=(xm(1)⋅cos⁡(m⋅θ)−xm(2)⋅sin⁡(m⋅θ)xm(2)⋅cos⁡(m⋅θ)+xm(1)⋅sin⁡(m⋅θ))

Die RoPE-Kodierung ist also einfach eine Multiplikation mit einem Winkel θ, wenn die zweidimensionalen Vektoren als komplexe Zahlen zm:=xm(1)+i⋅xm(2) dargestellt werden:

RoPE(zm,m)=ei⋅m⋅θ⋅zm

Für eine Liste 2⋅n-dimensionaler Vektoren wird eine RoPE-Kodierung durch eine endliche Folge θ(1),…,θ(n) von Winkeln definiert. Dann wird die RoPE-Kodierung auf jedes Koordinatenpaar (xm(1),xm(2)) angewendet. Der Vorteil von RoPE besteht darin, dass das Skalarprodukt zwischen zwei Vektoren nur von ihrer relativen Position abhängt, denn es gilt

RoPE(x,m)T⋅RoPE(y,n)=RoPE(x,m+k)T⋅RoPE(y,n+k)

für jede positive ganze Zahl k.[14]

Multimodalität

Transformer können auch für Modalitäten verwendet werden, die nicht textbasiert sind, indem man einen Weg findet, die Modalität in Token zu zerlegen. Eine Studie aus dem Jahr 2022 ergab, dass Transformatoren, die nur auf natürliche Sprache vortrainiert wurden, nur auf 0,03 % der Parameter feinabgestimmt werden können und bei vielen logischen und visuellen Aufgaben mit Long short-term memory konkurrieren können, was ein Hinweis auf Transferleistungen bei Deep-Learning ist.

Vision Transformer passen den Transformator an Maschinelles Sehen an, indem sie Eingabebilder in eine Reihe von Patches zerlegen, sie in Vektoren umwandeln und sie wie Token in einem Standard-Transformer behandeln. Conformer und später Whisper folgen demselben Muster für die Spracherkennung, indem sie das Sprachsignal zunächst in ein Spektrogramm umwandeln, das dann wie ein Bild behandelt wird, d. h. in eine Reihe von Patches zerlegt, in Vektoren umgewandelt und wie Token in einem Standard-Transformer behandelt wird. Perceiver sind eine Variante von Transformern, die für Multimodalität entwickelt wurden. Beispiele für Bildgeneratoren, die multimodale Transformer verwenden, sind zum Beispiel DALL-E und Stable Diffusion. Im Gegensatz zu späteren Modellen ist DALL-E kein Diffusionsmodell. Stattdessen verwendet es einen Nur-Decoder-Transformer, der autoregressiv einen Text generiert, gefolgt von der Token-Darstellung eines Bildes, das dann von einem Variational Autoencoder in ein Bild umgewandelt wird.

Einzelnachweise

  1. ↑ Schmidhuber, Jürgen, and A. I. Blog. "Before 1991, no network learned by gradient descent to quickly compute the changes of the fast weight storage of another network or of itself. Such Fast Weight Programmers (FWPs) were published in 1991-93 [FWP0-2](Sec. 1, 2, 3, 4). They embody the principles found in certain types of what is now called attention [ATT](Sec. 4) and Transformers [TR1-6](Sec. 2, 3, 4, 5)." https://people.idsia.ch/~juergen/fast-weight-programmer-1991-transformer.html
  2. ↑ a b Ashish Vaswani, Noam Shazeer, Niki Parmar, Jakob Uszkoreit, Llion Jones, Aidan N Gomez, Łukasz Kaiser, Illia Polosukhin: Attention is All you Need. (PDF) In: Advances in Neural Information Processing Systems. Curran Associates, Inc., 2017, abgerufen am 29. April 2024 (englisch).
  3. ↑ Steven Levy: 8 Google Employees Invented Modern AI. Here’s the Inside Story. Wired, 20. März 2024, abgerufen am 2. Mai 2024 (englisch).
  4. ↑ Dzmitry Bahdanau, KyungHyun Cho, Yoshua Bengio: Neural Machine Translation by Jointly Learning To Align and Translate. 2015, arxiv:1409.0473 (englisch).
  5. ↑ Rainald Menge-Sonnentag: Wer, wie, was: Textanalyse über Natural Language Processing mit BERT. In: Heise Online. 12. August 2019, abgerufen am 13. August 2020.
  6. ↑ a b c d Alexander Rush: The Annotated Transformer. Harvard NLP, abgerufen am 19. Juni 2020 (englisch).
  7. ↑ a b c d Jay Alammar: The Illustrated Transformer. Abgerufen am 19. Juni 2020 (englisch).
  8. ↑ Giuliano Giacaglia, Towards Data Science: How Transformers Work
  9. ↑ Xiong, Ruibin et al. "On layer normalization in the transformer architecture." International Conference on Machine Learning. PMLR, 2020. https://proceedings.mlr.press/v119/xiong20b
  10. ↑ a b Philipp Dufter, Martin Schmitt, Hinrich Schütze: Position Information in Transformers: An Overview
  11. ↑ a b Stefania Cristina, Machine Learning Mastery: The Transformer Model
  12. ↑ Mary Phuong, Marcus Hutter: Formal Algorithms for Transformers
  13. ↑ Jan Rosendahl, Viet Anh Khoa Tran, Weiyue Wang, Hermann Ney, RWTH Aachen: Analysis of Positional Encodings for Neural Machine Translation
  14. ↑ Jianlin Su, Yu Lu, Shengfeng Pan, Ahmed Murtadha, Bo Wen, Yunfeng Liu: RoFormer: Enhanced Transformer with Rotary Position Embedding. 2021, doi:10.48550/ARXIV.2104.09864.