{"id":65212,"date":"2025-06-15T17:19:15","date_gmt":"2025-06-15T15:19:15","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=65212"},"modified":"2025-06-18T13:33:40","modified_gmt":"2025-06-18T11:33:40","slug":"llm-grundlagen-teil-5-die-vorletzte-black-box-transformer","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-5-die-vorletzte-black-box-transformer.htm","title":{"rendered":"LLM Grundlagen, Teil 5: Die vorletzte Black Box &#8211; Transformer"},"content":{"rendered":"\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-4-ueberblick.htm\">Fortsetzung von hier.<\/a> Es wird noch technischer als beim vorletzten Mal, ich bitte um Entschuldigung und Verst\u00e4ndnis. Das ist nun einmal die Ebene, die mich interessiert, n\u00e4mlich die, auf der ich wenigstens einen Eindruck davon bekomme, was wirklich und nicht nur metaphorisch geschieht beim Auswerten eines Inputs und Erzeugen eines Texts. Respekt, wer das hier zu lesen versucht. Ich wiederhole mich mehrfach, finde das aber okay, das hilft mir zumindest beim Verstehen.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. \u00dcberblick<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">1.1 Der Ausgangspunkt<\/h4>\n\n\n\n<p>Und zwar sind wir bei diesem Diagramm stehen geblieben:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"296\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_4-700x296.png\" alt=\"\" class=\"wp-image-65275\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_4-700x296.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_4-300x127.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_4-150x63.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_4-1536x649.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_4-2048x866.png 2048w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Erweiterte Kontext-Vektoren gehen in die innere Black Box hinein (hier 8.000, weil der Beispielkontext so lang ist), eine Wahrscheinlichkeitsverteilung \u00fcber die (im Beispiel) 100.000 Token des Wortschatzes kommt heraus. Je nach System kann der Kontext auch schon 30.000 Token oder mehr lang sein, oder der Wortschatz nur halb so gro\u00df. Es m\u00fcssen nat\u00fcrlich nicht 8.000 Vektoren sein, der Kontext muss ja nicht voll ausgesch\u00f6pft werden.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.2 Was metaphorisch geschieht<\/h4>\n\n\n\n<p>Jedes Token ist ja durch, in unseren Beispiel: 10.000 Zahlenwerte embedded. Diese Zahlenwerte werden in mehreren Durchg\u00e4ngen modifiziert, bis am Ende die 10.000 Werte des letzten Tokens dar\u00fcber entscheiden, welches Token als n\u00e4chstes generiert wird. <\/p>\n\n\n\n<p>Nehmen wir als Input: &#8222;The dogs bark loudly.&#8220; (Es gibt technische Gr\u00fcnde f\u00fcr die Unnat\u00fcrlichkeit des Beispielsatzes.) Der Input sind ja eigentlich nicht diese Token, es geht hier nie um Token, sondern immer nur um deren Embedding, aber der Einfachkeit halber spreche ich hier ein Weilchen einfach von Token.<\/p>\n\n\n\n<p>In jedem Durchgang wird jedes Input-Token mit allen anderen Input-Token verglichen. Nehmen wir zum Beispiel das Token &#8222;bark&#8220;, das hier also mit &#8222;The&#8220;, &#8222;dogs&#8220;, &#8222;loudly&#8220; und &#8222;.&#8220; verglichen wird. Gesucht wird dabei besonders nach Token, die das Merkmal &#8222;Nomen im Plural&#8220; und &#8222;ist ein Lebewesen&#8220; tragen, oder auch &#8222;es geht um B\u00e4ume&#8220;, weil das ja auch &#8222;Baumrinde&#8220; bedeuten kann. Das ist wie bei diesem Kartenspiel, wo man die anderen fragt: &#8222;Hast du eine Herz Sieben?&#8220;<\/p>\n\n\n\n<p>Beim &#8222;.&#8220; wird man f\u00fcndig, bei &#8222;The&#8220; nur ein wenig, aber als es zu &#8222;dogs&#8220; kommt, schreit das sofort &#8222;biete Substantiv im Plural!&#8220; und &#8222;biete Tier!&#8220; Das ist das Zeichen f\u00fcr &#8222;bark&#8220;, dem Token &#8222;dogs&#8220; besonders viel Aufmerksamkeit zu widmen.<\/p>\n\n\n\n<p>Wenn f\u00fcr jedes Token ein Aufmerksamkeitswert ermittelt ist, geht es ans Modifizieren: das Token &#8222;dogs&#8220; darf dann bestimmte Werte auf das Embedding von &#8222;bark&#8220; \u00fcbertragen, etwa Werte f\u00fcr &#8222;bin dein Subjekt&#8220; und &#8222;es geht um Hunde&#8220; und &#8222;du bist ein Verb und nicht etwa ein Substantiv&#8220;.<\/p>\n\n\n\n<p>Beim n\u00e4chsten Durchgang wird wieder jedes Input-Token modifiziert. Diesmal sucht &#8222;bark&#8220; nicht mehr nach B\u00e4umen. Ganz am Ende steckt dann im Embedding des letzten Tokens &#8222;.&#8220; die Information &#8222;gerade eben haben Hunde laut gebellt&#8220;, und auf Basis dieses Embeddings wird dann das n\u00e4chste Token vorausgesagt, m\u00f6glicherweise: &#8222;They&#8220;.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.3 Alberner Exkurs<\/h4>\n\n\n\n<p>Und tats\u00e4chlich: Wenn ich den Prompt &#8222;Continue the sequence &#8218;The dogs bark loudly.&#8216; with one token.&#8220; eingebe, gibt mir der Chatbot &#8222;They&#8220; aus.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>&gt; Continue the sequence \"The dogs bark loudly.\" with one token.<br><strong>They<\/strong><\/code><\/p>\n\n\n\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They\" with one token.<br><strong>are<\/strong><\/code><\/p>\n\n\n\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They are\" with one token.<br><strong>running<\/strong><\/code><\/p>\n\n\n\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They are running\" with one token.<br><strong>in<\/strong><\/code><\/p>\n\n\n\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They are running in\" with one token.<br><strong>the<\/strong><\/code><\/p>\n\n\n\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They are running in the\" with one token.<br><strong>yard.<\/strong><\/code><\/p>\n<\/blockquote>\n\n\n\n<p>Na gut, am Ende waren das zwei Token, und auch &#8222;running&#8220; sind vermutlich zwei.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They are running in the\" with one token. Turn the temperature up really high.<br><strong>dust.<\/strong><\/code><\/p>\n<\/blockquote>\n\n\n\n<p>Interesting&#8230;<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p><code>&gt; Continue the sequence \"The dogs bark loudly. They are running in the\" with one token. Turn the temperature up as high as possible.<br><strong>void.<\/strong><\/code><\/p>\n<\/blockquote>\n\n\n\n<p>Das k\u00f6nnte ein reizvolles Spiel werden. Aber das bildet nat\u00fcrlich nicht wirklich innere Vorg\u00e4nge ab, weil der Prompt ja nicht wirklich nur aus diesen Token besteht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1.4 Das Geheimnis Enth\u00fcllt<\/h4>\n\n\n\n<p>Ab jetzt nicht mehr metaphorisch.<\/p>\n\n\n\n<p>In der Black Box ist eine Reihe von <strong>Decodern.<\/strong> Decoder geh\u00f6ren zum Transformer-Modell, das die Entwicklung ab 2017 revolutionierte, auch wenn die Idee an sich \u00e4lter ist. Zuvor arbeitete man mit einem anderen System (RNN), das aber Nachteile hatte, die mit etwas, das sich Attention nannte, halbwegs ausgeglichen werden konnten. Dann stellte sich heraus, dass man ohne RNN und nur mit Attention auch auskommt, und die moderne Transformer-Struktur entstand, auf der nicht alle, aber doch die bekannten modernen LLM basieren.<\/p>\n\n\n\n<p>Ein Transformer besteht eigentlich aus mehreren Encoder-Schichten gefolgt von mehreren Decoder-Schichten. F\u00fcr das Generieren von Text, anders als bei der maschinellen \u00dcbersetzung, verzichten die meisten Systeme, wie zum Beispiel GPT, auf die Encoder-Schichten, deshalb beschr\u00e4nke ich mich im weiteren Verlauf &#8211; von einem als solchen Exkurs abgesehen &#8211; auf Decoder.<\/p>\n\n\n\n<p>Neu am Transformer-Modell ist, dass diese 8000 Eingangsvektoren aus dem Bild oben nicht wie den Modellen zuvor sequentiell, also nacheinander, abgearbeitet werden m\u00fcssen, sondern parallel verarbeitet werden k\u00f6nnen. Das ist praktisch f\u00fcrs Rechnen mit mehreren Computern.<\/p>\n\n\n\n<p>Alle 8.000 Vektoren werden also verarbeitet und dabei modifiziert; die Berechnungen dazu laufen im Prinzip unabh\u00e4ngig voneinander. Aber jede Modifizierung eines einzelnen Vektors ist abh\u00e4ngig von den jeweils anderen 7.999 Vektoren des Kontexts.<\/p>\n\n\n\n<p>Jeder einzelne der 8.000 Vektoren wird also nach diesem Prinzip durch einen Decoder modifiziert, bis bis man am Ende wieder 8.000, jetzt: neue, Vektoren hat, weiterhin f\u00fcr jedes Token einen. Deren urspr\u00fcngliches Embedding ist jetzt aber durch den Kontext angereichert. Mit diesen angereicherten Vektoren wird dann weiter gearbeitet.<\/p>\n\n\n\n<p>Und zwar gehen sie in einen weiteren Decoder. Und noch einen. Und noch einen. Insgesamt 8 oder 96 oder 120, je nach System.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-scaled.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"295\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-700x295.png\" alt=\"\" class=\"wp-image-65448\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-700x295.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-300x126.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-150x63.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-1536x648.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_black_box_5-2048x864.png 2048w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p>Ich habe versucht, das im Bild zu zeigen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die 8.000 Vektoren bilden zusammen den Input in einen Decoder. <\/li>\n\n\n\n<li>Im Decoder werden die 8.000 Vektoren abgearbeitet. <\/li>\n\n\n\n<li>Jeder Vektor wird ver\u00e4ndert, und zwar beeinflusst durch die anderen 7.999 Vektoren.<\/li>\n\n\n\n<li>Am Ende des Durchgangs hat man wieder 8.000 Vektoren. <\/li>\n\n\n\n<li>Und diese gehen dann in den n\u00e4chsten &#8211; nicht noch einmal denselben! &#8211; Decoder<\/li>\n\n\n\n<li>Die Gr\u00f6\u00dfe der Vektoren ist dabei beim Eingang in den und Ausgang aus dem Decoder immer gleich.<\/li>\n<\/ul>\n\n\n\n<p>Auf Grundlage des Embedding-Vektors des letzten Tokens wird dann eine Wahrscheinlichkeitsberechnung \u00fcber dem Wortschatz erstellt.<\/p>\n\n\n\n<p>Es folgt ein Exkurs zu Transformern, blau markiert im Blog den kann man gerne \u00fcberspringen und bei Punkt 3 weiter machen.<\/p>\n\n\n\n<div class=\"wp-block-group has-background has-global-padding is-layout-constrained wp-container-coregroup-is-layout-a35945ca wp-block-group-is-layout-constrained\" style=\"background-color:#8dd2fc24;padding-top:var(--wp--preset--spacing--30);padding-right:var(--wp--preset--spacing--30);padding-bottom:var(--wp--preset--spacing--30);padding-left:var(--wp--preset--spacing--30)\">\n<h2 class=\"wp-block-heading\">2. Exkurs: Transformer<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">2.1 Der volle Transformer<\/h4>\n\n\n\n<p>Die folgende Grafik zeigt die urspr\u00fcngliche, inzwischen noch etwas verbesserte, vollst\u00e4ndige Transformer-Architektur:<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_full_architecture.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"736\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_full_architecture-700x736.png\" alt=\"\" class=\"wp-image-65228\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_full_architecture-700x736.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_full_architecture-285x300.png 285w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_full_architecture-143x150.png 143w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_full_architecture.png 1024w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n<\/div>\n\n\n\n<p class=\"has-small-font-size\">dvgodoy, <a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Transformer,_full_architecture.png\" target=\"_blank\" rel=\"noreferrer noopener\">Transformer, full architecture<\/a>, <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/legalcode\" target=\"_blank\" rel=\"noreferrer noopener\">CC BY 4.0<\/a><\/p>\n<\/div>\n<\/div>\n\n\n\n<p>Man sieht: Links unten geht eine Sequenz hinein, die wird in Embeddings umgewandelt, dazu kommt Positions-Embedding; dann beginnt die Black Box, und rechts oben kommen Vorhersagen heraus. <\/p>\n\n\n\n<p>Die Grafik zeigt die prinzipiellen Elemente oder Schichten; neu sind die eingekastelten Bl\u00f6cke in der Mitte, unsere bisherige Black Box:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Tokenizer-Schicht (zum Beispiel byte <em>pair encoding, <\/em>siehe <a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/05\/llm-grundlagen-teil-2-ueber-token.htm\">Blogeintrag<\/a>)<\/li>\n\n\n\n<li>Embedding-Schicht (Tabelle + Position, siehe <a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-3-ueber-embedding.htm\">Blogeintrag<\/a> und Blogeintrag)<\/li>\n\n\n\n<li><strong>Transformer-Schichten,<\/strong> bestehend aus mehreren Encoder-, gefolgt von mehreren Decoder-Schichten. LLMs bestehen oft nur aus Decoder-Schichten, Encoder braucht man vor allem f\u00fcr andere Aufgaben. Dazu sp\u00e4ter mehr.<\/li>\n\n\n\n<li>Un-embedding-Schicht (die Wahrscheinlichkeitsverteilung, ganz am Ende)<\/li>\n<\/ol>\n\n\n\n<p>Der linke gelb eingerahmte Block, das ist ein <strong>Encoder.<\/strong> Der rechte eingerahmte Block, das ist ein <strong>Decoder.<\/strong> \u00dcblicherweise sind bei Transformern mehrere Encoder hintereinander geschaltet, und danach mehrere Decoder. Es kann zum Beispiel 6 oder 12 oder 24 Encoder-Schichten (Layer) geben, gefolgt von 6 oder 12 oder noch viel mehr Decoder-Schichten, gr\u00f6\u00dfenordnungsm\u00e4\u00dfig. Manche Modelle benutzen die volle Encoder-Decoder-Struktur, andere sind <em>encoder-only<\/em> oder <em>decoder-only<\/em>.<\/p>\n\n\n\n<p>Die Encoding-Schichten \u00fcbersetzen zum Beispiel einen englischen Eingangstext in viele Zahlenwerte, also eine interne und abstrakte Repr\u00e4sentation des Eingangstexts. Die Decoding-Schichten \u00fcbersetzen Zahlenwerte dan zum Beispiel in Deutsch oder Franz\u00f6sisch. Das ist eine Art, wie maschinelle \u00dcbersetzung funktioniert. Aber dieses Transformer-Prinzip funktioniert nicht nur mit Text als Input, sondern auch mit Pixeln oder Audiomaterial. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.2 Blick hinein: Encoder und Decoder hintereinander<\/h4>\n\n\n\n<p>Das Bild zeigt vereinfachte Transformer-Einheiten. Vereinfacht, weil im Gegensatz zum Bild oben die Normalisierungs-Zwischenschritte fehlen, deren Position f\u00fcr die Effizienz wichtig ist und die sich im Vergleich zu dem urspr\u00fcnglichen Modell ver\u00e4ndert hat.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_stacked_layers_and_sublayers.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"349\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_stacked_layers_and_sublayers-700x349.png\" alt=\"\" class=\"wp-image-65241\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_stacked_layers_and_sublayers-700x349.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_stacked_layers_and_sublayers-300x150.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_stacked_layers_and_sublayers-150x75.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_stacked_layers_and_sublayers.png 1426w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-small-font-size\">dvgodoy, <a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Transformer,_stacked_layers_and_sublayers.png\" target=\"_blank\" rel=\"noreferrer noopener\">Transformer, stacked layers and sublayers<\/a>, <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/legalcode\" target=\"_blank\" rel=\"noreferrer noopener\">CC BY 4.0<\/a><\/p>\n\n\n\n<p>In der linken H\u00e4lfte der Grafik sieht man einen \u00dcberblick:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Es gibt erstens beispielhaft 6 Encoder-Schichten. Die erste Schicht arbeitet mit den oben erw\u00e4hnten Eingangs-Vektoren und gibt das Ergebnis, modifizierte Vektoren, an die n\u00e4chste Encoding-Schicht weiter, und die macht das ebenso. Am Ende der Encoding-Schicht steht eine interne Repr\u00e4sentation des Eingabetexts in Form vieler Zahlenwerte, sozusagen die Bedeutung des Inputs.<\/li>\n\n\n\n<li>Es gibt zweitens beispielhaft 6 Decoder-Schichten. Jede Schicht erh\u00e4lt als Input a) das feststehende Ergebnis der Encoding-Schicht, und b) das Ergebnis der vorhergehenden Decoding-Schicht. (Bis auf die erste Decoder-Einheit, die ja noch keinen Vorg\u00e4nger hat. Wir reden nicht dar\u00fcber, okay?) <\/li>\n<\/ul>\n\n\n\n<p>In der rechten H\u00e4lfte der Grafik sieht man Details:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine Encoder-Schicht. Die nimmt 1 Input entgegen und besteht aus 2 Elementen oder Teilschichten, der blauen und der gelben Box. Es gibt 1 Output.<\/li>\n\n\n\n<li>Eine Decoder-Schicht. Die nimmt 2 Inputs entgegen und besteht aus 3 Elementen oder Teilschichten, den roten, blauen und gelben Boxen. Es gibt 1 Output.<\/li>\n<\/ul>\n\n\n\n<p>Die gelben Schichten, das sind jeweils Neuronale Netze, ganz so, wie man sie in der Schule kennenlernt. <\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.3 Blick hinein: Eine Encoder- und eine Decoder-Schicht<\/h4>\n\n\n\n<p>Das n\u00e4chste Bild zeigt das auf die einfachen Teilschichten reduzierte Modell: Eine Encoder-Schicht, eine Decoder-Schicht. Sequenzierung und Embedding und Un-Embedding sind weggelassen. Die Encoding-Schicht hat als Eingang den vollst\u00e4ndigen vektorisierten Eingangstext; die zwei Eing\u00e4nge der Decoding-Schicht erhalten a) das Ergebnis der Encoding-Schicht und b) das Ergebnis der vorhergenden, hier nicht gezeigten, Decoding-Schicht.<\/p>\n\n\n\n<div class=\"wp-block-group has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\">\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_one_encoder-decoder_block.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"388\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_one_encoder-decoder_block-700x388.png\" alt=\"\" class=\"wp-image-65242\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_one_encoder-decoder_block-700x388.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_one_encoder-decoder_block-300x166.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_one_encoder-decoder_block-150x83.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_Transformer_one_encoder-decoder_block.png 1426w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-small-font-size\">dvgodoy, <a href=\"https:\/\/commons.wikimedia.org\/wiki\/File:Transformer,_one_encoder-decoder_block.png\" target=\"_blank\" rel=\"noreferrer noopener\">Transformer, one encoder-decoder block<\/a>, <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/legalcode\" target=\"_blank\" rel=\"noreferrer noopener\">CC BY 4.0<\/a><\/p>\n<\/div>\n\n\n\n<p>Was ein Encoder macht und was ein Decoder macht, das wissen wir immer noch nicht, das m\u00fcssen wir auch noch nicht wissen; ich n\u00e4here mich langsam.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2.4 Modelle nur mit Encoder- oder Decoder-Schichten<\/h4>\n\n\n\n<p>Es gibt manche Modelle, die bestehen praktisch nur aus Encoder-Schichten. BERT ist so eine Familie von Sprachmodellen, die nur aus Encodern besteht. In den Encoder-Schichten wird der Input, also zum Beispiel Text, in noch mehr Zahlenwerte als bisher encodiert, die immer mehr relevante Information enthalten. Das Encoding ist vor allem wichtig, lese ich, wenn mit den Zahlenwerten unmittelbar gearbeitet wird, bei Klassifizierungsaufgaben etwa, oder <em>sentiment analysis.<\/em> Aber daf\u00fcr kann man BERT nicht prompten; BERT ist nicht zur Texterzeugung da. Google nutzt oder nutzte ab 2019 BERT, um Suchanfragen auszuwerten.<\/p>\n\n\n\n<p>Die Aufgabe der Decoder-Schichten ist es, aus Zahlenwerten einen Output zu erzeugen. Einen neuen Text etwa, also eine Fortf\u00fchrung des bisherigen Textes oder eine \u00dcbersetzung in eine andere Sprache. <\/p>\n\n\n\n<p>GPT besteht nur aus Decoder-Schichten, die auf den Eingangsvektoren arbeiten. Der Grund, hei\u00dft es, dass das weniger Aufwand ist. F\u00fcr kleinere Modelle ist eine Encoder-Decoder-Struktur besser, f\u00fcr richtig gro\u00dfe zwar auch, aber der Abstand wird ausgeglichen durch den enormen Zuwachs an Leistungsf\u00e4higkeit insgesamt ab einer gewissen Gr\u00f6\u00dfe. (<a href=\"https:\/\/medium.com\/@yumo-bai\/why-are-most-llms-decoder-only-590c903e4789\">Mehr dazu.<\/a>) Der Bezeichner &#8222;Decoder-only&#8220; ist insofern irref\u00fchrend, als der Input nat\u00fcrlich schon encodiert ist und immer weiter encodiert wird, aber halt innerhalb der Decoding-Module.<\/p>\n<\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. Die Decoder-only-Schichten des LLM<\/h2>\n\n\n\n<p>Das n\u00e4chste Bild zeigt eine Decoder-only-Architektur, wie sie bei LLMs wie GPT eingesetzt wird. Der Vorgang beginnt unten mit dem Input, unseren 8.000 Token Kontext, die im roten K\u00e4stchen ihr Anfangsembeddings erhalten und die danach mit Positionsembedding erg\u00e4nzt werden. <\/p>\n\n\n\n<p>Dieser Haufen von 8.000 Vektoren ist der Input f\u00fcr den Decoder-Block, das ist der gro\u00dfe graue Kasten, der am Ende auch wieder einen Haufen von 8.000 modifizierten Vektoren an n\u00e4chsten grauen Decoder-Block weitergibt. Der Fachausdruck f\u00fcr Haufen ist Matrix.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"182\" height=\"494\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_only.png\" alt=\"\" class=\"wp-image-65308\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_only.png 182w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_only-111x300.png 111w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_only-55x150.png 55w\" sizes=\"auto, (max-width: 182px) 100vw, 182px\" \/><\/figure>\n\n\n\n<p class=\"has-small-font-size\">(Bild von hier: <a href=\"https:\/\/ai.stackexchange.com\/questions\/40179\/how-does-the-decoder-only-transformer-architecture-work\">https:\/\/ai.stackexchange.com\/questions\/40179\/how-does-the-decoder-only-transformer-architecture-work<\/a>)<\/p>\n\n\n\n<p>Diese modifizierten Vektoren hei\u00dfen auch &#8222;hidden states&#8220;, falls einem der Begriff mal begegnet; das sind sozusagen die ganzen Zwischenergebnisse, die auf dem Weg zum Endergebnis anfallen, und mit denen die Decoder arbeiten. Ihre Gr\u00f6\u00dfe, also die Anzahl an Zahlen im modifizierten Embedding, ist je nach LLM unterschiedlich, aber in der Regel immer konstant; die Vektoren werden also immer wieder modifiziert, haben aber stets die gleiche Gr\u00f6\u00dfe von, sagen wir, 10.000 Zahlenwerten.<\/p>\n\n\n\n<p>F\u00fcr die Gr\u00f6\u00dfenordnung: GPT4 (decoder-only) soll insgesamt solche 120 Decoder-Schichten haben. Je Schicht werden 8.000 Vektoren nach und nach verarbeitet, jeder Vektor besteht aus 10.000 Zahlen. Wer mehr bezahlt, kriegt auch Modelle mit mehr Kontext und anderen Werten. <\/p>\n\n\n\n<p>Am Ende wird das Embedding nur des letzten Tokens als Input f\u00fcr ein letztes Neuronales Netz herangezogen (das ist der gr\u00fcne <em>Linear-<\/em>Block oben). Dieses Netz erzeugt daraus einen neuen Vektor, der so gro\u00df ist wie der Wortschatz des LLM und f\u00fcr alle m\u00f6glichen Token im Wortschatz Rohwerte angibt (&#8222;Logits&#8220;), die proportional zur Wahrscheinlichkeit f\u00fcr dieses Token sind. Der Softmax-Block am Ende, der eigentlich ganz einfach ist, normalisiert diese Logits auf Gr\u00f6\u00dfen zwischen 0 und 1 und hei\u00dft auch &#8222;normalisierte Exponentialfunktion&#8220; und ist f\u00fcr das Prinzip nicht so wichtig. Dann schaut man im einfachsten Fall nach, welches Token der Position des h\u00f6chsten Wertes im Ergebnisvektor entspricht, und das ist dann das n\u00e4chste Token. (Tats\u00e4chlich k\u00f6nnte der Algorithmus noch etwas komplizierter sein, und auch die Temperatur spielt hier eine Rolle.) Ich habe versucht, diese letzten Schritte hier zu illustrieren:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_letzte_schritte.png\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"382\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_letzte_schritte-700x382.png\" alt=\"\" class=\"wp-image-65385\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_letzte_schritte-700x382.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_letzte_schritte-300x164.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_letzte_schritte-150x82.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_letzte_schritte.png 1494w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/figure>\n\n\n\n<p>Aber vielleicht ist es noch einfacher, den gesamten Vorgang noch einmal im Diagramm zu betrachten. Im n\u00e4chsten Bild wird (1) der Kontext &#8222;The dogs bark loudly.&#8220; (2) in Token zerlegt, (3) deren ID ermittelt, (4) deren Anfangs-Embedding nachgeschlagen, (5) die Position erg\u00e4nzt, und das ganze dann (6.1 bis 6.3) in 3 Decoder geschoben und am Ende (7 &#8211; 9) ausgewertet: (10) Das n\u00e4chste Token ist &#8222;They&#8220; und die Runde kann jetzt mit &#8222;The dogs bark loudly. They&#8220; wieder von vorne beginnen.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_verarbeitung_ueberblick.svg\"><img decoding=\"async\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_verarbeitung_ueberblick.svg\" alt=\"\" class=\"wp-image-65419\"\/><\/a><\/figure>\n\n\n\n<p>Wichtig: Der blaue Pfeil verfolgt die Berechnung des dritten Tokens. Genau das gleiche geschieht auf dieser Schicht aber auch parallel mit den anderen Token, man m\u00fcsste also noch auf jeder Schicht vier weitere bunte Pfeile und 16 gestrichelte Pfeile erg\u00e4nzen, aber dann wird es un\u00fcbersichtlich.<\/p>\n\n\n\n<p>Jetzt bleibt nur noch zu kl\u00e4ren, wie so ein Decoder funktioniert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. \u00dcberblick: Die Decoder-Schicht<\/h2>\n\n\n\n<p>Ein Decoder-Modul besteht &#8211; siehe das Diagramm oben &#8211; aus zwei Untermodulen: a) Masked Multi-Head (Self-, nicht Cross-) Attention gefolgt von b) einem Neuronalen Netz (das ist das Feed Forward). &#8222;Norm&#8220; steht f\u00fcr Normalisierung und interessiert uns jetzt nicht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.1 Das Untermodul Attention<\/h4>\n\n\n\n<p>Attention, Aufmerksamkeit, hei\u00dft: Manche Elemente des Inputs sind wichtiger als andere, und zwar um eine bestimmte Gr\u00f6\u00dfe. Diese zwei Aspekte verfeinern den Input also und betonen die relevanten Aspekte darin. Das ist das Interessanteste und Neue und wird weiter unten und im n\u00e4chsten Eintrag ausf\u00fchrlicher erkl\u00e4rt. Attention bestimmt, welche Elemente im Kontext wichtig sind, und ver\u00e4ndert Vektoren in Abh\u00e4ngigkeit davon.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">4.2 Das Untermodul Feed Forward<\/h4>\n\n\n\n<p>Das Neuronale Netz (das ist mit Feed Forward gemeint) verarbeitet dann diese Information, entscheidet sozusagen, was damit gemacht wird. Diese Entscheidungen sind, wie es bei Neuronalen Netzen allgemein der Fall ist, nicht mehr nachvollziehbar. Es <em>geschieht etwas<\/em> mit dem Eingangsvektor. Mehr wei\u00df ich im Moment nicht.<\/p>\n\n\n\n<p>Das Neuronale Netz hat in der verdeckten Schicht gr\u00f6\u00dfenordnungsm\u00e4\u00dfig viermal so viele Knoten wie jeweils beim Input und Output. Input und Output, das ist die aktuelle Embedding-Gr\u00f6\u00dfe <em>d_model,<\/em> der <em>hidden states size,<\/em> in unserem Beispiel 10.000. Bei dieser Embedding-Gr\u00f6\u00dfe hat das Neuronale Netz dieser Decoding-Schicht demnach 40.000 Knoten in der verdeckten Schicht. Diese Zahl ist es, wenn man von &#8222;intermediate size&#8220; oder &#8222;filter size&#8220; oder &#8222;feedforward size&#8220; spricht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">5. \u00dcberblick: Das Aufmerksamkeits-Untermodul<\/h2>\n\n\n\n<p>Das Prinzip hier hei\u00dft <em><strong>Masked Multi-Head (Self-) Attention.<\/strong><\/em> Diese Begriffe verwirren erst einmal, deshalb erkl\u00e4re ich sie etwas ausf\u00fchrlicher; sie sind dann gar nicht so schwer zu verstehen, bis auf den ersten.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">&#8222;Attention&#8220;<\/h4>\n\n\n\n<p>Bestimmte Elemente des Eingangs werden st\u00e4rker gewichtet als andere. Welche? Und wie stark? Das sind genau die Fragen, die in diesem Untermodul gekl\u00e4rt werden. <em>Self-<\/em>Attention hei\u00dft dabei, dass nur der eigene Input ausgewertet wird. (Beim Standard-Transformer-Modell mit Encodern gibt es im Decoder n\u00e4mlich au\u00dferdem ein zus\u00e4tzliches Untermodul <em>Cross-<\/em>Attention, was hei\u00dft, dass der eigene Input <em>und<\/em> der Encoder-Input ausgewertet werden. Aber separate Encoder-Module gibt es bei uns ja keine, weil wir uns nur Texterzeugung und nicht \u00dcbersetzung anschauen.)<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">&#8222;Masked&#8220;<\/h4>\n\n\n\n<p>Beim <em>Training<\/em> hei\u00dft das, dass das LLM nicht schummelt, sondern nur alle Token vom Anfang des Inputs bis zur vorherzusagenden L\u00fccke auswertet und nicht etwas die darauf folgenden Token. Es geht zum Beispiel darum, die L\u00fccke in &#8222;Der Einbrecher \u00f6ffnete den ______________ schnell, weil er die Kombination wusste&#8220; zu schlie\u00dfen, ohne das hilfreiche &#8222;Kombination&#8220; zu verwenden, sondern nur die vier W\u00f6rter vor der L\u00fccke. (Tats\u00e4chlich wird der Input l\u00e4nger sein und es nicht nur um diesen einen Satz gehen.) Technisch geschieht das, indem der Aufmerksamkeitswert f\u00fcr nachfolgende Token auf 0 oder etwas entsprechendes gesetzt wird.<\/p>\n\n\n\n<p>Beim <em>Erzeugen<\/em> von Text mit dem fertig trainierten Modell hei\u00dft das mit dem &#8222;masked&#8220; nicht viel.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">&#8222;Multi-head&#8220;<\/h4>\n\n\n\n<p>Die f\u00fcr die Attention zust\u00e4ndigen Elemente hei\u00dfen <em>Head,<\/em> also Lesekopf<em>.<\/em> Ein Head durchsucht den Input nach Auff\u00e4lligkeiten und gewichtet sie und gibt die Ergebnisse weiter an das n\u00e4chste Submodul, das Neuronale Netz. Multi-Head hei\u00dft, dass mehrere Heads parallel und unabh\u00e4ngig voneinander arbeiten und deren Ergebnisse dann kombiniert werden. Mir reicht es aber v\u00f6llig, wenn wir verstehen, wie ein einzelner Head funktioniert, und selbst das erst im n\u00e4chsten Blogeintrag dazu. Wie viele Heads gibt es pro Schicht? Bei kleinen Modellen vielleicht 8, bei gro\u00dfen 100 oder mehr.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Ausblick<\/h2>\n\n\n\n<p>Ein letztes Mal: Es gehen 8000 Vektoren in das Aufmerksamkeitsmodul hinein. Die werden in beliebiger Reihenfolge einzeln verarbeit, was gut f\u00fcr Parallelisierung ist, also das Verteilen der Arbeit auf mehrere Rechner. Die Reihenfolge kann deshalb beliebig sein, weil die Information dar\u00fcber, ob das Token, dessen Vektor gerade bearbeitet wird, vorne oder hinten im Kontext steht, ja durch das Positionsembedding irgendwie verwertbar gemacht wird. Bei jeder Verarbeitung eines Vektors spielen die anderen 7.999 Vektoren eine Rolle, und zwar eine unterschiedlich gro\u00dfe &#8211; je nachdem, wie viel Aufmerksamkeit sie erhalten.<\/p>\n\n\n\n<p>Wir wissen also: Ein Lesekopf verarbeitet einen Inputvektor unter Ber\u00fccksichtigung der anderen Vektoren im Kontext; genau genommen nicht nur einer, sondern mehrere Lesek\u00f6pfe; und das Ergebnis geht an ein Neuronales Netz, das Dinge damit macht.<\/p>\n\n\n\n<p>N\u00e4chstes Mal: Attention, everybody!<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">7. Links und Ausprobieren<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Eine kurze, aber nachvollziehbare Erkl\u00e4rung speziell zum LLM-Aufbau: <a href=\"https:\/\/ai.stackexchange.com\/questions\/40179\/how-does-the-decoder-only-transformer-architecture-work\">https:\/\/ai.stackexchange.com\/questions\/40179\/how-does-the-decoder-only-transformer-architecture-work<\/a><\/li>\n\n\n\n<li>Der Wikipedia-Eintrag zu Transformern an sich, technischer und allgemeiner: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Transformer_(deep_learning_architecture)\">https:\/\/en.wikipedia.org\/wiki\/Transformer_(deep_learning_architecture)<\/a><\/li>\n\n\n\n<li>\u00dcber LLM mit Encoder-Decoder-Architektur und Decoder-only: <a href=\"https:\/\/medium.com\/@yumo-bai\/why-are-most-llms-decoder-only-590c903e4789\">https:\/\/medium.com\/@yumo-bai\/why-are-most-llms-decoder-only-590c903e4789<\/a><\/li>\n<\/ul>\n\n\n\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-6-das-herz-der-aufmerksamkeit.htm\">Fortsetzung folgt.<\/a> Nix mehr mit Metaphorik, jetzt wird gerechnet. Gro\u00dfes Finale, mit vielleicht noch mit einem Anhang dahinter.<\/em><\/p>\n\n\n\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg07.met.vgwort.de\/na\/069b94db3b1a467ea9ca1369ab5a26c3\" width=\"1\" height=\"1\" alt=\"\">\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Fortsetzung von hier. Es wird noch technischer als beim vorletzten Mal, ich bitte um Entschuldigung und Verst\u00e4ndnis. Das ist nun einmal die Ebene, die mich interessiert, n\u00e4mlich die, auf der ich wenigstens einen Eindruck davon bekomme, was wirklich und nicht nur metaphorisch geschieht beim Auswerten eines Inputs und Erzeugen eines Texts. Respekt, wer das hier [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":65419,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,254],"class_list":["post-65212","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-ki"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_verarbeitung_ueberblick.svg","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/65212","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=65212"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/65212\/revisions"}],"predecessor-version":[{"id":65643,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/65212\/revisions\/65643"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/65419"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=65212"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=65212"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=65212"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}