{"id":65404,"date":"2025-06-17T12:55:54","date_gmt":"2025-06-17T10:55:54","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=65404"},"modified":"2025-06-19T08:28:56","modified_gmt":"2025-06-19T06:28:56","slug":"llm-grundlagen-teil-6-das-herz-der-aufmerksamkeit","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-6-das-herz-der-aufmerksamkeit.htm","title":{"rendered":"LLM Grundlagen, Teil 6: Das Herz der Aufmerksamkeit"},"content":{"rendered":"\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-5-die-vorletzte-black-box-transformer.htm\">Fortsetzung von hier.<\/a> Nix mehr mit Metaphorik, jetzt wird gerechnet. Gro\u00dfes Finale. Die Mathematik steckt in Punkt 3 und wird vielleicht von manchen \u00fcbersprungen werden, aber bitte wieder einsteigen sp\u00e4testens zum Ausprobieren mit Klicki-bunti in Punkt 6.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Wo wir stehen geblieben sind<\/h2>\n\n\n\n<p>Ein Lesekopf, Head, ist das Herz des Aufmerksamkeits-Untermoduls eines Decoders. Wir besch\u00e4ftigen uns mit reinen Decoder-Strukturen, da ist das noch einfacher als bei einem Encoder-Decoder-Transformer.<\/p>\n\n\n\n<p>Der Lesekopf nimmt den Vektor eines Tokens und modifiziert ihn in Abh\u00e4ngigkeit von den 8.000 Nachbarvektoren im Kontext. Das war es eigentlich. Er modifiziert ihn so, dass danach mehr wichtige Information im Vektor f\u00fcr das entsprechende Token enthalten sind. Die Gr\u00f6\u00dfe des Vektors \u00e4ndert sich dabei nicht, wir gehen im Beispiel immer von 10.000 aus.<\/p>\n\n\n\n<p>Der Lesekopf gibt das Ergebnis weiter an ein Neuronales Netz, und das produziert dann den Output als Input f\u00fcr die n\u00e4chste Decoder-Schicht.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Metaphorische Aufmerksamkeit<\/h2>\n\n\n\n<p>Ich zitiere mich:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p>Nehmen wir als Input: \u201eThe dogs bark loudly.\u201c (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 \u201ebark\u201c, das hier also mit \u201eThe\u201c, \u201edogs\u201c, \u201eloudly\u201c und \u201e.\u201c verglichen wird. Das Token \u201ebark\u201c sucht dabei besonders nach Token, die das Merkmal \u201eNomen im Plural\u201c und \u201eist ein Lebewesen\u201c tragen, oder auch \u201ees geht um B\u00e4ume\u201c, weil das ja auch \u201eBaumrinde\u201c bedeuten kann. Das ist wie bei diesem Kartenspiel, wo man die anderen fragt: \u201eHast du eine Herz Sieben?\u201c<\/p>\n\n\n\n<p>Beim \u201e.\u201c wird das \u201ebark\u201c nicht f\u00fcndig, bei \u201eThe\u201c nur ein wenig, aber als es zu \u201edogs\u201c kommt, schreit das sofort \u201ebiete Substantiv im Plural!\u201c und \u201ebiete Tier!\u201c Das ist das Zeichen f\u00fcr \u201ebark\u201c, dem Token \u201edogs\u201c 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 \u201edogs\u201c darf dann bestimmte Werte auf das Embedding von \u201ebark\u201c \u00fcbertragen, etwa Werte f\u00fcr \u201ebin dein Subjekt\u201c und \u201ees geht um Hunde\u201c und \u201edu bist ein Verb und nicht etwa ein Substantiv\u201c.<\/p>\n\n\n\n<p>Beim n\u00e4chsten Durchgang wird wieder jedes Input-Token modifiziert. Diesmal sucht \u201ebark\u201c nicht mehr nach B\u00e4umen. Ganz am Ende steckt dann im Embedding des letzten Tokens \u201e.\u201c die Information \u201egerade eben haben Hunde laut gebellt\u201c, und auf Basis dieses Embeddings wird dann das n\u00e4chste Token vorausgesagt, m\u00f6glicherweise: \u201eThey\u201c.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\">3. Mathematische Aufmerksamkeit<\/h2>\n\n\n\n<p>Eigentlich passiert im Decoder nur das:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2327\" height=\"5371\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated.png\" alt=\"\" class=\"wp-image-65554\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated.png 2327w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-130x300.png 130w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-700x1616.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-65x150.png 65w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-665x1536.png 665w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-887x2048.png 887w\" sizes=\"auto, (max-width: 2327px) 100vw, 2327px\" \/><\/a><\/figure>\n\n\n\n<p>Und das ist eigentlich ganz einfach. Der blaue Rahmen, das ist ein Decoder-Modul. Der gr\u00fcne Rahmen, das ist ein Attention-Submodul. Das ist der Lesekopf. Der nimmt <em>einen Haufen Vektoren <\/em>entgegen. Im Beispiel ist der Kontext nur 5 Token gro\u00df, das ist ein kleiner Haufen: The, dogs, bark, loudly, . (Statt: 8.000 wie in echt.) Jeder Vektor besteht aus 4 Zahlen. (Statt 10.000 wie in echt.) Statt <em>einen Haufen<\/em> sagt man technisch aus: eine Matrix. Man kann sich das wie eine kleine Tabelle vorstellen. Jede Zeile steht f\u00fcr ein Token-Embedding:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"256\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_1-300x256.png\" alt=\"\" class=\"wp-image-65486\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_1-300x256.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_1-150x128.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_1.png 698w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n\n\n\n<p>Die Zahlen habe ich mir einfach ausgedacht.<\/p>\n\n\n\n<p>F\u00fcr jeden dieser 5 Vektoren werden anhand von drei vorgefertigten Tabellen neue Vektoren erstellt. Das sind die drei vorgefertigten Tabellen; und weil das Embedding aus 4 Zahlen besteht, sind die Tabellen 4 x 4 gro\u00df:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2873\" height=\"461\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2.png\" alt=\"\" class=\"wp-image-65551\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2.png 2873w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2-300x48.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2-700x112.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2-150x24.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2-1536x246.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_2-2048x329.png 2048w\" sizes=\"auto, (max-width: 2873px) 100vw, 2873px\" \/><\/a><\/figure>\n\n\n\n<p>Die Zahlen habe ich mir ausgedacht. Tats\u00e4chlich werden sie trainiert, und eben diese drei 10.000 x 10.000 gro\u00dfen Tabellen auf geeignete Werte hin zu trainieren, und das f\u00fcr 120 Decoder-Schichten, ist eine der Hauptarbeiten beim Trainieren des LLM. Das sind dann dann schon mal 36 Milliarden Parameter; GPT-4 soll 1800 Milliarden Parameter haben insgesamt; es kommen ja noch ein paar dazu sp\u00e4ter. Wie gut jedenfalls, dass das P in GPT f\u00fcr &#8222;pre-trained&#8220; hei\u00dft, dann m\u00fcssen wir nur noch mit diesen fertigen Tabellen rechnen und sie nicht trainieren. Kostet immer noch genug Strom auch so.<\/p>\n\n\n\n<p>Diese Tabellen werden benutzt, um aus den 5 Eingangsvektoren jeweils einen Query-, einen Key- und einen Value-Vektor zu erzeugen. Sie sind hier wieder als <s>Haufen<\/s> <s>Tabelle<\/s> Matrix dargestellt:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2874\" height=\"600\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3.png\" alt=\"\" class=\"wp-image-65549\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3.png 2874w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3-300x63.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3-700x146.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3-150x31.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3-1536x321.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_3-2048x428.png 2048w\" sizes=\"auto, (max-width: 2874px) 100vw, 2874px\" \/><\/a><\/figure>\n\n\n\n<p>Die markierten Zeilen sind jeweils die Q-, K- und V-Vektoren f\u00fcr das Token &#8222;bark&#8220; von oben. Nur mit denen wird weitergerechnet, die alten Inputwerte k\u00f6nnen wir vergessen. <em>Wie<\/em> diese Vektoren entstehen, zum, Beispiel der Q-Vektor f\u00fcr &#8222;bark&#8220; ganz links: Die vierstellige Input-Zeile f\u00fcr pos2 wird multipliziert mit der gesamten Q-Tabelle, und das Ergebnis ist die vierstellige Query-Zeile f\u00fcr pos2. Wie kann man eine Zeile mit einer Tabelle multiplizieren, h\u00f6re ich die fragen, die damals im Mathematikunterricht beim Herrn Gerigk nicht aufgepasst haben: Ah, Matrizenmultiplikation, und mehr sage ich dazu nicht. Das ist jedenfalls keine besonders komplizierte Rechenaufgabe f\u00fcr einen Computer. <\/p>\n\n\n\n<p>Jetzt wird f\u00fcr jeder Q-Vektor mit jedem K-Vektor multipliziert. Wenn man einen Vektor mit einem anderen Vektor multipliziert (Herr Gerigk!) kommt eine simple Zahl heraus. Wenn ich also 5 Q-Vektoren jeweils mit 5 K-Vektoren multipiziere, kriege ich 25 Zahlen, und zwar diese hier:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"194\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_4-700x194.png\" alt=\"\" class=\"wp-image-65489\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_4-700x194.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_4-300x83.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_4-150x42.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_4-1536x426.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_4-2048x568.png 2048w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>(Tats\u00e4chlich rechnet man, also in Libre Office Calc zum Beispiel, nicht 25 mal den einen mal den anderen Vektor, sondern man multipliziert die ganze <s>Tabelle<\/s> Matrix mit der ganzen anderen <s>Tabelle<\/s> Matrix, und da ist sie dann noch noch einmal, unsere Matritzenmultiplikation.)<\/p>\n\n\n\n<p>Die gelbe Zeile in der Ergebnismatrix, die jetzt nicht mehr vier, sondern f\u00fcnf Spalten breit ist, gibt an, wie viel Aufmerksamkeit von pos2 aus auf alle anderen 5 Positionen, sich selber eingeschlossen, zu richten ist: Von pos2 auf pos0 am wenigsten, von pos2 auf pos1 bis pos4 dreimal so viel, von pos2 auf pos4 doppelt so viel.<\/p>\n\n\n\n<p>Diese Zahlen werden aus technischen Gr\u00fcnden noch ein bisschen ver\u00e4ndert und sozusagen vergleichbarer gemacht, das hei\u00dft hier: Skalierung und Softmax. Diese Attention-Tabelle wird dann mit der Values-Tabelle, die ganz oben erstellt worden ist, multipliziert, und damit hat das Attention-Submodul im Decoder seine Aufgabe erledigt:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2615\" height=\"1574\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5.png\" alt=\"\" class=\"wp-image-65552\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5.png 2615w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5-300x181.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5-700x421.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5-150x90.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5-1536x925.png 1536w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_5-2048x1233.png 2048w\" sizes=\"auto, (max-width: 2615px) 100vw, 2615px\" \/><\/a><\/figure>\n\n\n\n<p>Warum werden diese Matrizen multipliziert? Wenn man sich jeweils einzelne Vektoren anschaut, wird es ein bisschen klarer: <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1762\" height=\"1264\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6.png\" alt=\"\" class=\"wp-image-65544\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6.png 1762w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6-300x215.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6-700x502.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6-150x108.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_6-1536x1102.png 1536w\" sizes=\"auto, (max-width: 1762px) 100vw, 1762px\" \/><\/a><\/figure>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Die gelb markierte Zeile in der Softmax-Tabelle gibt an, wie viel Aufmerksamkeit von pos2 auf die anderen Token richtet. (Modifiziert von Query x Key.).<\/li>\n\n\n\n<li>Dieser Vektor wird multipliziert mit der entsprechen Values-Spalte im Values-Vektor oben.<\/li>\n\n\n\n<li>Der Values-Vektor oben, das sind die (modifizierten) urspr\u00fcnglichen Beziehungen zu allen anderen 5 Vektoren.<\/li>\n\n\n\n<li>Diese Werte zu multiplizieren mit dem Attention-Vektor hei\u00dft, eine gewichtete Addition durchzuf\u00fchren: die alten Werte werden durch den Aufmerksamkeitsfaktor modifiziert und dann addiert; 0,0 * 0,81 + 0,37 * 7,60 + 0,50 * 6,08 + 0,11 * 3,68 + 0,02 * 35, was ungef\u00e4hr 6,33 ergibt (Rundungsabweichungen sind ein paar drin).<\/li>\n\n\n\n<li>Das ergibt den einen markierten Wert unten; das hei\u00dft, dass in den dritten (von vier) Embedding-Wert von pos2 alle alten Werte aller Token eingeflossen sind, und f\u00fcr die anderen Embedding-Werte nat\u00fcrlich ebenso.<\/li>\n<\/ul>\n\n\n\n<p>Und das sind fast &#8211; nur fast! &#8211; schon unsere neuen Werte f\u00fcr den n\u00e4chsten Decoder. Aber zuvor geht das ganze noch in das zweite Submodul des Decoders, ein Neuronales Netz, wo unser eigener Computer wieder ein bisschen mehr rechnen muss als bisher. Richtig viel gerechnet wurde allerdings wieder beim Training des Netzes, dessen versteckte Ebene vermutlich aus etwa 40.000 Knoten besteht, was wieder zu zus\u00e4tzlichen Parametern f\u00fchrt.<\/p>\n\n\n\n<p>Das Neuronale Netz verarbeitet nach und nach, unabh\u00e4ngig voneinander, jeden Vektor und modifiziert ihn weiter.<\/p>\n\n\n\n<p>Noch einmal zusammen, damit man nicht hochbl\u00e4ttern muss:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated.png\"><img loading=\"lazy\" decoding=\"async\" width=\"2327\" height=\"5371\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated.png\" alt=\"\" class=\"wp-image-65554\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated.png 2327w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-130x300.png 130w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-700x1616.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-65x150.png 65w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-665x1536.png 665w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_decoder_annotated-887x2048.png 887w\" sizes=\"auto, (max-width: 2327px) 100vw, 2327px\" \/><\/a><\/figure>\n\n\n\n<p>Das Diagramm stellt den Vorgang immer mit ganzen <em>Haufen von <\/em>Vektoren dar, also Matrizen. In vielen Darstellungen wird das auch mit einzelnen Vektoren erkl\u00e4rt, also das 1 Token-Vektor reingeht, und f\u00fcr den Anfang 1 Q-Vektor und f\u00fcr das Ende 1 V-Vektor erstellt wird (aber K-Vektoren f\u00fcr alle Token im Kontext!). Dann wird der eine Q-Vektor mit allen K-Vektoren multipliziert, das Ergebnis skaliert und mit dem 1 V-Vektor multipliziert, was den vorl\u00e4ufigen neuen Token-Vektor ergibt. Ich habe \u00fcberlegt, ob ich das so darstellen soll, mich aber dagegen entschieden; nicht verwirren lassen, wenn man bei Erkl\u00e4rungen auf beides st\u00f6\u00dft.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">4. Was ich weggelassen habe<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Was das FFNN am Ende eigentlich macht, weil mir das selber noch nicht klar ist. <\/li>\n\n\n\n<li>Vor allem: Dass es nicht nur einen Lesekopf gibt, sondern 8 oder 12 oder 120, die sich die Arbeit teilen und unterschiedliche Schwerpunkte setzen k\u00f6nnen.<\/li>\n\n\n\n<li>Wie die Parameter f\u00fcr die drei Matrizen und das Neuronale Netz erstellt werden, also wie trainiert wird.<\/li>\n\n\n\n<li>Zur Erinnerung: Das ist self-attention, nicht cross attention; die ist noch ein klein wenig komplizierter.<\/li>\n\n\n\n<li>Nicht klar ist mir, ob Maskierung nicht doch eine Rolle spielt; ich lese da immer wieder Verschiedenes. Maskierung hie\u00dfe hier, dass nur die vorhergehenden Token ausgewertet werden, die sp\u00e4teren Token sozusagen ausgeblendet werden. Ich glaube, manche Modelle machen das so, andere so.<\/li>\n\n\n\n<li>\u00dcberhaupt, ist das nur eine \u00dcberblick, und es gibt auch andere Modelle mit Encoder-Decoder-Transfornern, und viele Details mehr:  aber es ging mir nur ums Prinzip, und mehr k\u00f6nnte ich auch gar nicht.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">5. Was Q und K und V bedeuten<\/h2>\n\n\n\n<p>Das oben war die Rechnerei, die, wenn man nach und nach Blogeintr\u00e4ge dar\u00fcber schreibt, sogar nachvollziehbar ist. Damit ist noch nicht gesagt, was man sich bei diesem Entwurf gedacht hat, was Query, Key und Value \u00fcberhaupt bedeuten.<\/p>\n\n\n\n<p>Query, das ist das metaphorische &#8222;Suche Subjekt. Suche Singular.&#8220; Man kann aber nicht wirlich sagen, wie die Eigenschaft hei\u00dft, nach der gesucht wird; das sind alles abstrakte, von der Maschine selbst angelegte Attribute.<\/p>\n\n\n\n<p>Key, das ist das metaphorische &#8222;Biete Subjekt. Biete Singular. Biete Tier.&#8220;<\/p>\n\n\n\n<p>Value, das bestimmt am Ende den Wert, der in der n\u00e4chsten Runde f\u00fcr die neuen Q- und K-Werte zust\u00e4ndig ist.<\/p>\n\n\n\n<p>Kontraintuitiv finde ich, dass es in jeder neuen Decoder-Schicht erst einmal fast neue Embbeddings f\u00fcr alle Token gibt. Die alten Embeddings werden durch die f\u00fcr diese Schicht g\u00fcltige Value-Werte-Matrix modifiziert. Das hei\u00dft, diese Schicht hat schon spezielle W\u00fcnsche, was die die zuk\u00fcnftigen Werte betrifft, wonach gesucht wird und was dann herauskommen k\u00f6nnte. Diese Werte ihrerseits werden jetzt mehr oder weniger abgeschw\u00e4cht, je nachdem, wie viel Aufmerksamkeit erforderlich ist.<\/p>\n\n\n\n<p>Der Query-Vektor des aktuellen Tokens wird separat mit den Key-Vektoren aller anderen Token multipliziert, das gibt jeweils eine einzelne Zahl, die niedrig ist, wenn das System keinen gro\u00dfen Zusammenhang zwischen dem aktuellen Token und dem anderen erkennt und hoch, wenn es einen Zusammenhang sieht. Diese Zahl kann auch k\u00fcnstlich auf 0 oder einen sehr negativen Wert gesetzt werden, wenn aus anderen Gr\u00fcnden dieses Token nicht mitverrechnet werden soll &#8211; das ist diese Maskierung, von der ab und zu die Rede war.<\/p>\n\n\n\n<p>(Hier m\u00fcsste ich noch mehr schreiben und noch mehr verstehen. Aber ich will fertig werden, also lasse ich das mal.)<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">6. Visualisierung<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">6.1 BertViz<\/h4>\n\n\n\n<p><a href=\"https:\/\/github.com\/jessevig\/bertviz\">BertViz<\/a> ist ein Werkzeug zur Visualisierung von Attention. Dort gibt es eine PDF-Anleitung und Jupyter Notebooks zum Kopieren, und das funktioniert bei mir auch! (Ich muss das erw\u00e4hnen, weil ich oft Schwierigkeiten habe, weil doch irgendein Paket nicht erreichbar oder eine falsche Python-Version und so weiter.)<\/p>\n\n\n\n<p>Mit BertViz kann man verschiedene Modelle herunterladen, zum Beispiel:<\/p>\n\n\n\n<p>BERT (2018)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>encoder-only, 2, 12 oder 24 Schichten (je nach Version)<\/li>\n\n\n\n<li>12 Attention Heads; Embedding-Gr\u00f6\u00dfe 768 &#8211; 1024<\/li>\n\n\n\n<li>30,000 Wortschatz, 110 &#8211; 340 Millionen Parameter<\/li>\n\n\n\n<li>trainiert auf 330 Millionen W\u00f6rtern (B\u00fccher, Wikipedia)<\/li>\n\n\n\n<li>arbeitet mit Token links und rechts der L\u00fccke<\/li>\n<\/ul>\n\n\n\n<p>GPT-2 (2019)<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>decoder-only; 12 &#8211; 48 Schichten (je nach Version)<\/li>\n\n\n\n<li>12 Attention Heads; Embedding-Gr\u00f6\u00dfe 768 &#8211; 1600<\/li>\n\n\n\n<li>50.257 Wortschatz, 117 &#8211; 1.542 Millionen Parameter<\/li>\n\n\n\n<li>trainiert auf 40 GB Text (Webseiten)<\/li>\n\n\n\n<li>maskiert nachfolgende Token<\/li>\n<\/ul>\n\n\n\n<p>Ich finde es sch\u00f6n, dass mir diese Zahlen jetzt etwas sagen!<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6.2 Funktionsweise<\/h4>\n\n\n\n<p>Dann kann man S\u00e4tze eingeben und auswerten lassen und sich zeigen lassen, welches Token wie aufmerksam zu anderen Token ist, und zwar unterschiedlich detailliert, bis hin dazu, wie der Q-Vektor f\u00fcr ein konkretes Token in einem bestimmten Head in einem bestimmten Layer ist, ditto der K-Vektor der anderen Token, und das Produkt Q x K dazu, das ja die Aumerksamkeit repr\u00e4sentiert.<\/p>\n\n\n\n<p>Manche Heads achten vor allem auf das vorhergehende Wort, andere auf alle vorhergehenden W\u00f6rter, dritte wiederum achten vor allem auf Verben, vierte auf zusammengeh\u00f6rende Aufz\u00e4hlungen, f\u00fcnfte auf Klammerungen, und so weiter (Jesse Vig 2019). Hier Illustrationen aus dem kurzen und gut lesbaren Aufsatz:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1946\" height=\"2109\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention.jpg\" alt=\"\" class=\"wp-image-65578\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention.jpg 1946w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention-277x300.jpg 277w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention-700x759.jpg 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention-138x150.jpg 138w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention-1417x1536.jpg 1417w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_vig_jesse_multiscale_visualization_of_attention-1890x2048.jpg 1890w\" sizes=\"auto, (max-width: 1946px) 100vw, 1946px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-small-font-size\">Vig, Jesse. &#8222;A Multiscale Visualization of Attention in the Transformer Model&#8220;, in: <em>Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics: System Demonstrations<\/em>. Florence, Italy: Association for Computational Linguistics 2019, p. 37-42. <a href=\"https:\/\/www.aclweb.org\/anthology\/P19-3007\">https:\/\/www.aclweb.org\/anthology\/P19-3007<\/a><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Links oben sieht man einen Head, der \u00c4pfel, Orangen und Bananen als Teil einer Aufz\u00e4hlung erkennt; rechts oben werden Akronyme auf Schl\u00fcsselw\u00f6rter bezogen.<\/li>\n\n\n\n<li>Unten sieht man in den beiden linken Spalten, wie &#8222;she\/he&#8220; auf Eigennamen oder gegenderte Begriffe bezogen werden, und in der rechten Spalte, wie der gleiche, einmal gefolgt von &#8222;she&#8220; und einmal von &#8222;he&#8220; unterschiedlich fortgesetzt wird (nicht im Bild), weil &#8222;she&#8220; und &#8222;he&#8220; einmal auf &#8222;nurse&#8220; und einmal auf &#8222;doctor&#8220; bezogen werden. Vig nennt das als Beispiel f\u00fcr Bias im Modell.<\/li>\n<\/ul>\n\n\n\n<p>Ich habe ein wenig mit BertViz herungespielt, denn wie gesagt, das funktioniert; aber es ist gar nicht leicht, so sch\u00f6ne Beispiele wie in dem Aufsatz zu finden. Es ist ja nicht so, dass man vorher wei\u00df, welcher Head wof\u00fcr zust\u00e4ndig ist und in welcher Schicht interessante Erkentnisse zu gewinnen sind. Daf\u00fcr m\u00fcsste ich mehr Zeit haben.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6.3 Ausprobieren<\/h4>\n\n\n\n<p>Aber dennoch habe ich etwas zum Ausprobieren vorbereitet:<\/p>\n\n\n\n<iframe src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm\/head_view.html\" title=\"BertViz-Beispiel\" style=\"height:320px; width:340px;\"><\/iframe>\n\n\n\n<iframe src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm\/head_view2.html\" title=\"BertViz-Beispiel\" style=\"height:320px; width:340px;\"><\/iframe>\n\n\n\n<p>Dazu einfach mit der Maus \u00fcber die Token fahren. Voreingestellt ist Layer 5, Aufmerksamkeitskopf 10, das ist das Beispiel aus dem Aufsatz; aber man kan auch die anderen K\u00f6pfe dazu klicken oder das Layer wechsen.<\/p>\n\n\n\n<p>Wer die Schichten und Heads im \u00dcberblick sehen m\u00f6chte, kann den <a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm\/model_view.html\"><em>model view<\/em> ausprobieren; (dort auf die einzelnen Grafiken klicken)<\/a>.  <\/p>\n\n\n\n<p>Die Q- und K-Vektoren kriegt man mit dem <a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm\/neuron_view.html\"><em>neuron view<\/em> (dort auf das Plus-Zeichen klicken, das beim Mouseover links neben den Token erscheint<\/a>). Blau bedeutet einen positiven Wert, orange einen negativen.<\/p>\n\n\n\n<p>Andere Beispiels\u00e4tze kann ich nat\u00fcrlich auch ausprobieren, oder andere Modelle, dazu habe ich mir eine Jupyter-Notebook-Datei angelegt, aber das kann ich technisch nicht hier im Blog zeigen.<\/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>Matrizenmultiplikation allgemein, sch\u00f6n erkl\u00e4rt: <a href=\"https:\/\/www.mathsisfun.com\/algebra\/matrix-multiplying.html\">https:\/\/www.mathsisfun.com\/algebra\/matrix-multiplying.html<\/a><\/li>\n\n\n\n<li>Hier ist das mit Matrizenmultiplikation sch\u00f6n illustriert: <a href=\"https:\/\/jalammar.github.io\/illustrated-transformer\/\">https:\/\/jalammar.github.io\/illustrated-transformer\/<\/a> Es geht allerdings um vollst\u00e4ndige Transformer mit Encoding- und Decoding-Schichten.<\/li>\n\n\n\n<li>Allgemeine LLM-Erkl\u00e4rung auf Deutsch aus der Geschichtswissenschaft: <a href=\"https:\/\/dhistory.hypotheses.org\/10423\">https:\/\/dhistory.hypotheses.org\/10423<\/a><\/li>\n\n\n\n<li>BertViz als Visualisierungswerkzeug: <a href=\"https:\/\/github.com\/jessevig\/bertviz\">https:\/\/github.com\/jessevig\/bertviz<\/a> &#8211; dort gibt es Material, insbesondere Links zu einem erkl\u00e4renden kurzen Aufsatz <a href=\"https:\/\/aclanthology.org\/P19-3007.pdf\">https:\/\/aclanthology.org\/P19-3007.pdf<\/a> und zu einer Seite, wo man das interaktiv ausprobieren kann, sofern man sich per Google anmeldet. <a href=\"https:\/\/colab.research.google.com\/drive\/1hXIQ77A4TYS4y3UthWF-Ci7V7vVUoxmQ?usp=sharing\">https:\/\/colab.research.google.com\/drive\/1hXIQ77A4TYS4y3UthWF-Ci7V7vVUoxmQ?usp=sharing<\/a><\/li>\n\n\n\n<li>Noch ein Visualierungswerkzeug: <a href=\"https:\/\/github.com\/jalammar\/ecco\">https:\/\/github.com\/jalammar\/ecco<\/a>, das ich aber nicht zum Laufen gekriegt habe, weil ab Python 3.12 nicht mehr m\u00f6glich<\/li>\n\n\n\n<li><a href=\"https:\/\/bbycroft.net\/llm\">https:\/\/bbycroft.net\/llm<\/a><\/li>\n<\/ul>\n\n\n\n<p>Ja, und das war es auch schon. Ein bisschen antiklimatikisch, ist es nicht? Ein paar einfache Tabellen und ein paar Neuronale Netze. Wo ist der Zauber hin, die Magie? F\u00fcr Zauber hielt ich es ohnehin nie, und auch nicht f\u00fcr Intelligenz, auch wenn mir noch immer genug unklar ist. Aber ich denke, wenn ich mich da auch noch reinknie, verliere ich den letzten Respekt davor.<\/p>\n\n\n\n<p><em><a href=\"https:\/\/www.herr-rau.de\/wordpress\/2025\/06\/llm-grundlagen-teil-7-rueckblick-und-zusammenfassung.htm\">Fortsetzung folgt.<\/a> Aber nur noch eine R\u00fcckschau und ein \u00dcberblick, wegen closure.<\/em><\/p>\n\n\n\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg07.met.vgwort.de\/na\/ffb7337ed33843bc9f2855d4acdbfc1d\" width=\"1\" height=\"1\" alt=\"\">\n\n\n\n<p class=\"has-text-align-center\">***<\/p>\n\n\n\n<p><em>Nachtrag: Na gut, einen habe ich noch. <\/em>Ich habe mir in der Tabellenkalkulation mal etwas zusammengebaut. Links oben das graue, das sind die Embeddings f\u00fcr die Token &#8222;She eats chips and pie.&#8220; Rechts daneben sind die gelernten Matrizen f\u00fcr Queries, Keys und Values in dieser Ebene. <\/p>\n\n\n\n<p>Die Query-Matrix erzeugt zusammen mit diesem Input Suchvektoren mit dem Inhalt &#8222;Ich habe einen hohen Wert bei emb0 und suche nach emb1,&#8220; was so viel hei\u00dfen k\u00f6nnte wie &#8222;hier sucht ein Pr\u00e4dikat nach Objekten,&#8220; wenn emb0 f\u00fcr &#8222;potentielles Pr\u00e4dikat&#8220; und emb1 f\u00fcr &#8222;potentielles Objekt&#8220; steht. Die Key-Matrix erzeugt Key-Vektoren mit &#8222;Ich habe einen hohen Wert bei emb1&#8220;, also &#8222;ich bin ein potentielles Objekt.&#8220;<\/p>\n\n\n\n<p>Der orange Q-Vektor f\u00fcr &#8222;eats&#8220; (aber auch alle anderen) wird mit allen Key-Vektoren, zum Beispiel dem blauen f\u00fcr &#8222;pie&#8220; (aber auch allen anderen) multipliziert, das gibt dann  die rote Aufmerksamkeitsmatrix. (Davor muss aus rechnerischen Gr\u00fcnden die Keys-Matrix transponiert, quasi gekippt werden.) Man sieht daran, dass in dieser Ebene vor allem &#8222;eats&#8220; auf &#8222;pie&#8220;, aber auch &#8222;chips&#8220; aufmerksam gemacht worden ist.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_attention_calc.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1469\" height=\"1084\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_attention_calc.png\" alt=\"\" class=\"wp-image-65644\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_attention_calc.png 1469w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_attention_calc-300x221.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_attention_calc-700x517.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm_attention_calc-150x111.png 150w\" sizes=\"auto, (max-width: 1469px) 100vw, 1469px\" \/><\/a><\/figure>\n\n\n\n<p>Klar, denn sowohl &#8222;pie&#8220; als auch &#8222;chips&#8220; haben einen hohen Wert bei emb1. Aufgabe dieser Ebene: finde heraus, was als Objekt f\u00fcr ein Verb in Betracht kommt. Diese Aufgabe ist in den gelernten Matrizen kodiert.<\/p>\n\n\n\n<p>Das ist nat\u00fcrlich grob vereinfacht. Die Zahlenwerte sind nicht realistisch, und die Embeddings bedeuten nicht so einfach etwas, das sich leicht verstehen l\u00e4sst. Und es fehlt v\u00f6llig, was dann mit den neuen Values passiert, die durch die Aufmerksamkeitsmatrix entstehen und die dann in das Neuronale Netz kommen, weil ich das nicht wei\u00df. Ich wei\u00df auch nicht, ob das Beispiel <em>zu<\/em> vereinfacht ist, aber es repr\u00e4sentiert das mentale Modell, das ich im Moment im Kopf davon habe, wie das funktioniert.<\/p>\n\n\n\n<p>In der Praxis: Mit der Maus \u00fcber das rechte &#8222;eats&#8220; fahren:<\/p>\n\n\n\n<iframe src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/llm\/head_view_eats.html\" title=\"BertViz-Beispiel\" style=\"height:320px; width:400px;\"><\/iframe>\n","protected":false},"excerpt":{"rendered":"<p>Fortsetzung von hier. Nix mehr mit Metaphorik, jetzt wird gerechnet. Gro\u00dfes Finale. Die Mathematik steckt in Punkt 3 und wird vielleicht von manchen \u00fcbersprungen werden, aber bitte wieder einsteigen sp\u00e4testens zum Ausprobieren mit Klicki-bunti in Punkt 6. 1. Wo wir stehen geblieben sind Ein Lesekopf, Head, ist das Herz des Aufmerksamkeits-Untermoduls eines Decoders. Wir besch\u00e4ftigen [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":65644,"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-65404","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_attention_calc.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/65404","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=65404"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/65404\/revisions"}],"predecessor-version":[{"id":65651,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/65404\/revisions\/65651"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/65644"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=65404"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=65404"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=65404"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}