In dieser Artikelserie implementieren wir Lama3 von Grund auf.
Die Gesamtarchitektur von Llama3:
Bilder
Die Modellparameter von Llama3:
Werfen wir einen Blick auf die tatsächlichen Werte dieser Parameter im LlaMa 3-Modell.
Bilder
Beim Instanziieren der LlaMa-Klasse definiert die Variable max_seq_len das Kontextfenster. Es gibt andere Parameter in der Klasse, aber dieser Parameter steht in direktem Zusammenhang mit dem Transformatormodell. Die max_seq_len beträgt hier 8K.
Bilder
Die Transformer-Klasse ist ein Modell, das Vokabular und Anzahl der Ebenen definiert. Vokabular bezieht sich hier auf die Menge an Wörtern (und Token), die das Modell erkennen und verarbeiten kann. Aufmerksamkeitsschichten beziehen sich auf den im Modell verwendeten Transformatorblock (eine Kombination aus Aufmerksamkeits- und Feed-Forward-Schichten).
Bilder
Diesen Zahlen zufolge hat LlaMa 3 einen Wortschatz von 128K, was ziemlich groß ist. Darüber hinaus verfügt es über 32 Transformatorblöcke.
[3] Feature-Dimension und Aufmerksamkeitsköpfe
Feature-Dimension und Aufmerksamkeitsköpfe werden in das Modul Selbstaufmerksamkeit eingeführt. Die Merkmalsdimension bezieht sich auf die Vektorgröße von Token im Einbettungsraum (die Merkmalsdimension bezieht sich auf die Dimensionsgröße der Eingabedaten oder des Einbettungsvektors), während Aufmerksamkeitsköpfe das QK-Modul umfassen, das den Selbstaufmerksamkeitsmechanismus in Transformatoren steuert.
Bilder
Versteckte Dimensionen beziehen sich auf die Dimensionsgröße der verborgenen Schicht im Feed-Forward-Neuronalen Netzwerk (Feed Forward). Feedforward-Neuronale Netze enthalten normalerweise eine oder mehrere verborgene Schichten, und die Abmessungen dieser verborgenen Schichten bestimmen die Kapazität und Komplexität des Netzwerks. Im Transformer-Modell beträgt die verborgene Schichtdimension des vorwärtsgerichteten neuronalen Netzwerks normalerweise ein Vielfaches der Merkmalsdimension, um die Darstellungsfähigkeit des Modells zu erhöhen. In LLama3 beträgt die verborgene Dimension das 1,3-fache der Feature-Dimension. Es ist zu beachten, dass es sich bei verborgenen Schichten und verborgenen Dimensionen um zwei Konzepte handelt.
Eine höhere Anzahl verborgener Ebenen ermöglicht es dem Netzwerk, intern umfangreichere Darstellungen zu erstellen und zu bearbeiten, bevor sie wieder in kleinere Ausgabedimensionen projiziert werden.
Bild
Die erste Matrix ist die Eingabe-Feature-Matrix, die von der Aufmerksamkeitsschicht verarbeitet wird, um aufmerksamkeitsgewichtete Features zu generieren. In diesem Bild ist die Eingabe-Feature-Matrix nur 5 x 3 groß, aber im echten Llama 3-Modell wächst sie auf 8K x 4096, was riesig ist.
Als nächstes folgen die verborgenen Schichten im Feed-Forward-Netzwerk, die auf 5325 anwachsen und dann in der letzten Schicht auf 4096 zurückfallen.
Bilder
LlaMa 3 kombiniert die oben genannten 32 Transformer-Blöcke und die Ausgabe wird von einem Block zum nächsten weitergeleitet, bis sie den letzten erreicht.
Bilder
Sobald wir mit allen oben genannten Teilen begonnen haben, ist es an der Zeit, sie zusammenzusetzen und zu sehen, wie sie den LlaMa-Effekt erzeugen.
Bilder
Schritt 1: Zuerst haben wir unsere Eingabematrix mit der Größe 8K (Kontextfenster) x 128K (Vokabulargröße). Diese Matrix durchläuft einen Einbettungsprozess, um diese hochdimensionale Matrix in eine niedrigdimensionale Matrix umzuwandeln.
Schritt 2: In diesem Fall wird dieses niedrigdimensionale Ergebnis zu 4096, was der angegebenen Dimension der Features im LlaMa-Modell entspricht, das wir zuvor gesehen haben.
In neuronalen Netzen sind Dimensionsverstärkung und Dimensionsreduktion übliche Vorgänge, die jeweils unterschiedliche Zwecke und Auswirkungen haben.
Dimensionserweiterung dient normalerweise dazu, die Kapazität des Modells zu erhöhen, damit es komplexere Merkmale und Muster erfassen kann. Wenn die Eingabedaten in einen höherdimensionalen Raum abgebildet werden, können verschiedene Merkmalskombinationen vom Modell leichter unterschieden werden. Dies ist besonders nützlich, wenn es um nichtlineare Probleme geht, da es dem Modell helfen kann, komplexere Entscheidungsgrenzen zu lernen.
Dimensionalitätsreduzierung dient dazu, die Komplexität des Modells und das Risiko einer Überanpassung zu verringern. Durch die Reduzierung der Dimensionalität des Merkmalsraums kann das Modell gezwungen werden, verfeinerte und allgemeinere Merkmalsdarstellungen zu lernen. Darüber hinaus kann die Dimensionsreduktion als Regularisierungsmethode verwendet werden, um die Generalisierungsfähigkeit des Modells zu verbessern. In einigen Fällen kann die Reduzierung der Dimensionalität auch die Rechenkosten senken und die Betriebseffizienz des Modells verbessern.
In praktischen Anwendungen kann die Strategie der Dimensionserhöhung und anschließenden Dimensionsreduzierung als Prozess der Merkmalsextraktion und -transformation angesehen werden. In diesem Prozess untersucht das Modell zunächst die intrinsische Struktur der Daten durch Erhöhen der Dimensionalität und extrahiert dann die nützlichsten Merkmale und Muster durch Reduzieren der Dimensionalität. Dieser Ansatz kann dazu beitragen, dass das Modell eine Überanpassung an die Trainingsdaten vermeidet und gleichzeitig eine ausreichende Komplexität beibehält.
Schritt 3: Diese Funktion wird durch den Transformer-Block verarbeitet, zuerst durch die Aufmerksamkeitsschicht und dann durch die FFN-Schicht. Die Aufmerksamkeitsschicht verarbeitet Features horizontal, während die FFN-Schicht dimensionsübergreifend vertikal verarbeitet.
Schritt 4: Schritt 3 wird für 32 Schichten des Transformer-Blocks wiederholt. Schließlich sind die Abmessungen der resultierenden Matrix dieselben wie die für die Merkmalsabmessungen verwendeten.
Schritt 5: Abschließend wird diese Matrix wieder in die ursprüngliche Vokabularmatrixgröße von 128 KB konvertiert, damit das Modell die im Vokabular verfügbaren Wörter auswählen und zuordnen kann.
So schneidet LlaMa 3 in diesen Benchmarks gut ab und erzeugt den LlaMa 3-Effekt.
Wir fassen einige leicht zu verwechselnde Begriffe kurz zusammen:
Dies ist die maximale Anzahl von Token, die das Modell in einer einzelnen Verarbeitung akzeptieren kann.
Im LlaMa 3-8B-Modell ist dieser Parameter auf 8.000 Token eingestellt, d. h. Kontextfenstergröße = 8K. Das bedeutet, dass das Modell maximal 8.000 Token in einer einzelnen Verarbeitung berücksichtigen kann. Dies ist entscheidend, um lange Texte zu verstehen oder den Kontext langfristiger Gespräche aufrechtzuerhalten.
Dies ist die Anzahl aller verschiedenen Token, die das Modell erkennen kann. Dazu gehören alle möglichen Wörter, Satzzeichen und Sonderzeichen. Der Wortschatz des Modells beträgt 128.000, ausgedrückt als Vokabulargröße = 128 KB. Das bedeutet, dass das Modell 128.000 verschiedene Token erkennen und verarbeiten kann, darunter verschiedene Wörter, Satzzeichen und Sonderzeichen.
Eine Hauptkomponente im Transformer-Modell. Es ist hauptsächlich für die Verarbeitung von Eingabedaten verantwortlich, indem es lernt, welche Teile der Eingabedaten am wichtigsten sind (d. h. welche Token „beaufsichtigt“ werden). Ein Modell kann über mehrere solcher Ebenen verfügen, von denen jede versucht, die Eingabedaten aus einer anderen Perspektive zu verstehen.
Das Modell LlaMa 3-8B enthält 32 Verarbeitungsebenen, d. h. Anzahl der Ebenen = 32. Zu diesen Schichten gehören mehrere Aufmerksamkeitsschichten und andere Arten von Netzwerkschichten, von denen jede die Eingabedaten aus einer anderen Perspektive verarbeitet und versteht.
Enthält Module aus mehreren verschiedenen Schichten, normalerweise einschließlich mindestens einer Aufmerksamkeitsschicht und eines Feed-Forward-Netzwerks. Ein Modell kann mehrere Transformatorblöcke haben, die nacheinander verbunden sind und der Ausgang jedes Blocks der Eingang des nächsten Blocks ist. Der Transformatorblock kann auch als Decoderschicht bezeichnet werden.
Im Kontext des Transformer-Modells sagen wir normalerweise, dass das Modell „32 Schichten“ hat, was gleichbedeutend damit sein kann, dass das Modell „32 Transformer-Blöcke“ hat. Jeder Transformer-Block enthält normalerweise eine Selbstaufmerksamkeitsschicht und eine Feed-Forward-Neuronale Netzwerkschicht. Diese beiden Unterschichten bilden zusammen eine vollständige Verarbeitungseinheit oder „Schicht“.
Wenn wir also sagen, dass das Modell 32 Transformer-Blöcke hat, beschreiben wir eigentlich, dass das Modell aus 32 solchen Verarbeitungseinheiten besteht, von denen jede zur Selbstaufmerksamkeitsverarbeitung und zur Feed-Forward-Netzwerkverarbeitung von Daten fähig ist. Diese Präsentation betont die hierarchische Struktur des Modells und seine Verarbeitungsmöglichkeiten auf jeder Ebene.
Zusammenfassend sind „32 Schichten“ und „32 Transformer-Blöcke“ bei der Beschreibung der Transformer-Modellstruktur grundsätzlich synonym. Beide bedeuten, dass das Modell 32 unabhängige Datenverarbeitungszyklen enthält und jeder Zyklus Selbstaufmerksamkeit und Feedforward-Netzwerkbetrieb umfasst.
Dies ist die Dimension jedes Vektors, wenn das Eingabetoken als Vektor im Modell dargestellt wird.
Jedes Token wird in einen Vektor umgewandelt, der 4096 Features im Modell enthält, d. h. Feature-Dimension = 4096. Diese hohe Dimension ermöglicht es dem Modell, umfangreichere semantische Informationen und Kontextbeziehungen zu erfassen.
In jeder Aufmerksamkeitsebene kann es mehrere Aufmerksamkeitsköpfe geben, und jeder Kopf analysiert die Eingabedaten unabhängig aus verschiedenen Perspektiven.
Jede Aufmerksamkeitsschicht enthält 32 unabhängige Aufmerksamkeitsköpfe, d. h. Anzahl der Aufmerksamkeitsköpfe = 32. Diese Köpfe analysieren Eingabedaten unter verschiedenen Aspekten und bieten gemeinsam umfassendere Datenanalysefunktionen.
Dies bezieht sich normalerweise auf die Breite der Schicht im Feed-Forward-Netzwerk, also auf die Anzahl der Neuronen in jeder Schicht. Normalerweise sind versteckte Dimensionen größer als Feature-Dimensionen, wodurch das Modell intern eine umfassendere Datendarstellung erstellen kann.
In Feed-Forward-Netzwerken beträgt die Dimension der verborgenen Schicht 5325, d. h. versteckte Dimensionen = 5325. Dies ist größer als die Feature-Dimension, sodass das Modell eine tiefere Feature-Übersetzung und ein tieferes Lernen zwischen internen Schichten durchführen kann.
Beziehung zwischen Aufmerksamkeitsebenen und Aufmerksamkeitsköpfen: Jede Aufmerksamkeitsebene kann mehrere Aufmerksamkeitsköpfe enthalten.
Numerische Beziehung: Ein Modell kann mehrere Transformatorblöcke haben, jeder Block enthält eine Aufmerksamkeitsschicht und eine oder mehrere andere Schichten. Jede Aufmerksamkeitsschicht kann mehrere Aufmerksamkeitsköpfe haben. Auf diese Weise führt das gesamte Modell eine komplexe Datenverarbeitung in verschiedenen Schichten und Köpfen durch.
Laden Sie das offizielle Linkskript des Llama3-Modells herunter: https://llama.meta.com/llama-downloads/
Der folgende Code zeigt, wie Sie die Tiktoken-Bibliothek zum Laden und Verwenden von a verwenden Bytepaarbasierter Tokenizer für die Kodierung (BPE). Dieser Tokenizer wurde für die Verarbeitung von Textdaten entwickelt, insbesondere für den Einsatz in Modellen zur Verarbeitung natürlicher Sprache und für maschinelles Lernen.
Wir betreten „Hallo Welt“ und sehen, wie der Wortsegmentierer die Wortsegmentierung durchführt.
from pathlib import Pathimport tiktokenfrom tiktoken.load import load_tiktoken_bpeimport torchimport jsonimport matplotlib.pyplot as plttokenizer_path = "Meta-Llama-3-8B/tokenizer.model"special_tokens = ["<|begin_of_text|>","<|end_of_text|>","<|reserved_special_token_0|>","<|reserved_special_token_1|>","<|reserved_special_token_2|>","<|reserved_special_token_3|>","<|start_header_id|>","<|end_header_id|>","<|reserved_special_token_4|>","<|eot_id|>",# end of turn] + [f"<|reserved_special_token_{i}|>" for i in range(5, 256 - 5)]mergeable_ranks = load_tiktoken_bpe(tokenizer_path)tokenizer = tiktoken.Encoding(name=Path(tokenizer_path).name,pat_str=r"(?i:'s|'t|'re|'ve|'m|'ll|'d)|[^\r\n\p{L}\p{N}]?\p{L}+|\p{N}{1,3}| ?[^\s\p{L}\p{N}]+[\r\n]*|\s*[\r\n]+|\s+(?!\S)|\s+",mergeable_ranks=mergeable_ranks,special_tokens={token: len(mergeable_ranks) + i for i, token in enumerate(special_tokens)},)tokenizer.decode(tokenizer.encode("hello world!"))
Bilder
Sehen Sie sich die Namen der ersten 20 Parameter oder Gewichte an, die in der geladenen Modelldatei enthalten sind.
model = torch.load("Meta-Llama-3-8B/consolidated.00.pth")print(json.dumps(list(model.keys())[:20], indent=4))
Pictures
Bilder
Insgesamt zeigt diese Ausgabe die Schlüsselkomponenten eines Deep-Learning-Modells auf Basis der Transformer-Architektur. Dieses Modell wird häufig bei der Verarbeitung natürlicher Sprache verwendet, beispielsweise bei der Textklassifizierung, maschinellen Übersetzung, Frage-Antwort-Systemen usw. Die Struktur jeder Schicht ist nahezu gleich, einschließlich Aufmerksamkeitsmechanismus, Feed-Forward-Netzwerk und Normalisierungsschicht, was dem Modell hilft, komplexe Eingabesequenzmerkmale zu erfassen.
Sehen Sie sich die Parameterkonfiguration des Llama3-Modells an:
with open("Meta-Llama-3-8B/params.json", "r") as f:config = json.load(f)config
图片
我们使用这个配置来推断模型的细节,比如:
dim = config["dim"]n_layers = config["n_layers"]n_heads = config["n_heads"]n_kv_heads = config["n_kv_heads"]vocab_size = config["vocab_size"]multiple_of = config["multiple_of"]ffn_dim_multiplier = config["ffn_dim_multiplier"]norm_eps = config["norm_eps"]rope_theta = torch.tensor(config["rope_theta"])
图片
代码如下:
prompt = "the answer to the ultimate question of life, the universe, and everything is "tokens = [128000] + tokenizer.encode(prompt)print(tokens)tokens = torch.tensor(tokens)prompt_split_as_tokens = [tokenizer.decode([token.item()]) for token in tokens]print(prompt_split_as_tokens)
[128000, 1820, 4320, 311, 279, 17139, 3488, 315, 2324, 11, 279, 15861, 11, 323, 4395, 374, 220]['<|begin_of_text|>', 'the', ' answer', ' to', ' the', ' ultimate', ' question', ' of', ' life', ',', ' the', ' universe', ',', ' and', ' everything', ' is', ' ']
截止到目前,我们的[17x1]令牌现在变成了[17x4096],即长度为4096的17个嵌入(每个令牌一个)。
下图是为了验证我们输入的这句话,是17个token。
图片
代码如下:
embedding_layer = torch.nn.Embedding(vocab_size, dim)embedding_layer.weight.data.copy_(model["tok_embeddings.weight"])token_embeddings_unnormalized = embedding_layer(tokens).to(torch.bfloat16)token_embeddings_unnormalized.shape
图片
我们接着使用 RMS 归一化对嵌入进行归一化,也就是图中这个位置:
图片
使用公式如下:
图片
代码如下:
# def rms_norm(tensor, norm_weights):# rms = (tensor.pow(2).mean(-1, keepdim=True) + norm_eps)**0.5# return tensor * (norm_weights / rms)def rms_norm(tensor, norm_weights):return (tensor * torch.rsqrt(tensor.pow(2).mean(-1, keepdim=True) + norm_eps)) * norm_weights
这段代码定义了一个名为 rms_norm 的函数,它实现了对输入张量(tensor)的RMS(Root Mean Square,均方根)归一化处理。这个函数接受两个参数:tensor 和 norm_weights。tensor 是需要进行归一化处理的输入张量,而 norm_weights 是归一化时使用的权重。
函数的工作原理如下:
在进行归一化处理后,我们的数据形状仍然保持为 [17x4096],这与嵌入层的形状相同,只不过数据已经过归一化。
token_embeddings = rms_norm(token_embeddings_unnormalized, model["layers.0.attention_norm.weight"])token_embeddings.shape
图片
图片
接下来,我们介绍注意力机制的实现,也就是下图中的红框标注的位置:
图片
图片
计算 ( Q ) 和 ( K ) 的点积。
对点积结果进行缩放。
应用softmax函数得到注意力权重。
用注意力权重乘以值矩阵 ( V ) 得到输出矩阵 ( Z )。
这张图展示了Transformer模型中多头注意力机制的实现过程,从输入句子的嵌入开始,经过多头分割、注意力计算,最后拼接结果并生成输出。每个步骤都详细说明了如何从输入矩阵 ( X ) 生成最终的输出矩阵 ( Z )。
当我们从模型中加载查询(query)、键(key)、值(value)和输出(output)向量时,我们注意到它们的形状分别是 [4096x4096]、[1024x4096]、[1024x4096]、[4096x4096]
乍一看这很奇怪,因为理想情况下我们希望每个头的每个q、k、v和o都是单独的
print(model["layers.0.attention.wq.weight"].shape,model["layers.0.attention.wk.weight"].shape,model["layers.0.attention.wv.weight"].shape,model["layers.0.attention.wo.weight"].shape)
Bild
Die Form der Abfragegewichtsmatrix (wq.weight) ist [4096, 4096]. Die Form der Schlüsselgewichtsmatrix (wk.weight) ist [1024, 4096]. Die Form der Wertgewichtungsmatrix (wv.weight) ist [1024, 4096]. Die Form der Ausgabegewichtsmatrix (Wo.weight) ist [4096, 4096]. Die Ausgabeergebnisse zeigen, dass die Formen der Gewichtsmatrizen der Abfrage (Q) und der Ausgabe (O) gleich sind, beide [4096, 4096]. Dies bedeutet, dass sowohl das Eingabe-Feature als auch das Ausgabe-Feature sowohl für die Abfrage als auch für die Ausgabe die Dimension 4096 haben. Die Formen der Schlüssel- (K) und Werte- (V) Gewichtsmatrizen sind ebenfalls gleich, beide [1024, 4096]. Dies zeigt, dass die Eingabe-Feature-Abmessungen für Schlüssel und Werte 4096 betragen, die Ausgabe-Feature-Abmessungen jedoch auf 1024 komprimiert sind. Die Form dieser Gewichtsmatrizen spiegelt wider, wie der Modelldesigner die Abmessungen verschiedener Teile des Aufmerksamkeitsmechanismus festlegt. Insbesondere werden die Dimensionen von Schlüsseln und Werten reduziert, wahrscheinlich um die Rechenkomplexität und den Speicherverbrauch zu reduzieren, während Abfragen und Ausgaben höher in der Dimensionalität gehalten werden können, um mehr Informationen zu behalten. Diese Designauswahl hängt von der spezifischen Modellarchitektur und dem Anwendungsszenario ab.
Lassen Sie uns den Satz „Ich bewundere Li Hongzhang“ als Beispiel verwenden, um den Implementierungsprozess zur Erläuterung des Aufmerksamkeitsmechanismus in dieser Abbildung zu vereinfachen. Geben Sie den Satz ein: Zuerst haben wir den Satz „Ich bewundere Li Hongzhang“. Bevor wir diesen Satz verarbeiten, müssen wir jedes Wort im Satz in eine mathematisch verarbeitbare Form umwandeln, nämlich in einen Wortvektor. Dieser Vorgang wird Worteinbettung genannt.
Worteinbettung: Jedes Wort, wie „I“, „Appreciation“, „Li Hongzhang“, wird in einen Vektor fester Größe umgewandelt. Diese Vektoren enthalten die semantischen Informationen der Wörter.
In mehrere Köpfe aufteilen: Damit das Modell den Satz aus verschiedenen Perspektiven verstehen kann, teilen wir den Vektor jedes Wortes in mehrere Teile auf, hier sind 8 Köpfe. Jeder Kopf konzentriert sich auf einen anderen Aspekt des Satzes.
Aufmerksamkeit berechnen: Für jeden Kopf berechnen wir etwas namens Aufmerksamkeit. Dieser Prozess umfasst drei Schritte: Nehmen wir „Ich schätze Li Hongzhang“ als Beispiel. Wenn wir uns auf das Wort „Wertschätzung“ konzentrieren wollen, dann ist „Wertschätzung“ die Abfrage und andere Wörter wie „Ich“ und „Li Hongzhang“. sind Schlüssel. Der Vektor von ist der Wert.
Abfrage (F): Dies ist der Teil, in dem wir Informationen finden möchten. Schlüssel (K): Dies ist der Teil, der die Informationen enthält. Wert (V): Dies ist der eigentliche Informationsgehalt. Spleißen und Ausgabe: Nachdem wir die Aufmerksamkeit jedes Kopfes berechnet haben, verketten wir diese Ergebnisse und generieren die endgültige Ausgabe über eine Gewichtsmatrix Wo. Diese Ausgabe wird in der nächsten Verarbeitungsebene oder als Teil des Endergebnisses verwendet.
Bei dem in den Kommentaren zur Abbildung erwähnten Formproblem geht es darum, wie diese Vektoren effizient in einem Computer gespeichert und verarbeitet werden können. Um die Effizienz zu verbessern, können Entwickler bei der tatsächlichen Codeimplementierung die Abfrage-, Schlüssel- und Wertvektoren mehrerer Header zusammenpacken, anstatt jeden Header einzeln zu verarbeiten. Dadurch können die Parallelverarbeitungsfähigkeiten moderner Computer genutzt werden, um Berechnungen zu beschleunigen.
Die Ausgabeergebnisse zeigen, dass:
Die Form dieser Gewichtsmatrizen spiegelt wider, wie der Modelldesigner die Abmessungen verschiedener Teile des Aufmerksamkeitsmechanismus festlegt. Insbesondere werden die Dimensionen von Schlüsseln und Werten reduziert, wahrscheinlich um die Rechenkomplexität und den Speicherverbrauch zu reduzieren, während Abfragen und Ausgaben höher in der Dimensionalität gehalten werden können, um mehr Informationen zu behalten. Diese Designauswahl hängt von der spezifischen Modellarchitektur und dem Anwendungsszenario ab.
Verwenden wir den Satz „Ich bewundere Li Hongzhang“ als Beispiel, um den Implementierungsprozess zur Erläuterung des Aufmerksamkeitsmechanismus in dieser Abbildung zu vereinfachen.
Abfrage (F): Dies ist der Teil, in dem wir Informationen finden möchten.
Schlüssel (K): Dies ist der Teil, der Informationen enthält.
Wert (V): Dies ist der eigentliche Informationsgehalt.
Bei dem in den Kommentaren zur Abbildung erwähnten Formproblem geht es darum, wie diese Vektoren effizient in einem Computer gespeichert und verarbeitet werden können. Um die Effizienz zu verbessern, können Entwickler bei der tatsächlichen Codeimplementierung die Abfrage-, Schlüssel- und Wertvektoren mehrerer Header zusammenpacken, anstatt jeden Header einzeln zu verarbeiten. Dadurch können die Parallelverarbeitungsfähigkeiten moderner Computer genutzt werden, um Berechnungen zu beschleunigen.
Wir verwenden weiterhin den Satz „Ich schätze Li Hongzhang“, um die Rolle der Gewichtsmatrizen WQ, WK, WV und WO zu erklären.
Im Transformer-Modell wird jedes Wort durch Worteinbettung in einen Vektor umgewandelt. Diese Vektoren durchlaufen dann eine Reihe linearer Transformationen, um Aufmerksamkeitswerte zu berechnen. Diese linearen Transformationen werden durch die Gewichtsmatrizen WQ, WK, WV und WO umgesetzt.
Im gesamten Prozess werden WQ, WK, WV und WO durch Training gelernt. Sie bestimmen, wie das Modell die eingegebenen Wortvektoren in verschiedene Darstellungen umwandelt und wie diese Darstellungen kombiniert werden, um die endgültige Ausgabe zu erhalten. Diese Matrizen sind der Kernbestandteil des Aufmerksamkeitsmechanismus im Transformer-Modell und ermöglichen es dem Modell, die Beziehung zwischen verschiedenen Wörtern im Satz zu erfassen.
WQ (Gewichtsmatrix Q), WK (Gewichtsmatrix K), WV (Gewichtsmatrix V) und WO (Gewichtsmatrix O) sind Parameter im Transformer-Modell. Sie werden während des Modelltrainingsprozesses durch Backpropagation geleitet Es wird aus Optimierungsmethoden wie Algorithmen und Gradientenabstieg gelernt.
Mal sehen, wie dieser Lernprozess funktioniert:
在本小节中,我们将从多个注意力头中展开查询向量,得到的形状是 [32x128x4096] 这里,32 是 llama3 中注意力头的数量,128 是查询向量的大小,而 4096 是令牌嵌入的大小。
q_layer0 = model["layers.0.attention.wq.weight"]head_dim = q_layer0.shape[0] // n_headsq_layer0 = q_layer0.view(n_heads, head_dim, dim)q_layer0.shape
图片
这段代码通过对模型中第一层的查询(Q)权重矩阵进行重塑(reshape),将其分解为多个注意力头的形式,从而揭示了32和128这两个维度。
之所以在这段代码中出现了32和128这两个维度,而在之前的代码段中没有,是因为这段代码通过重塑操作明确地将查询权重矩阵分解为多个注意力头,每个头具有自己的维度。32代表了模型中注意力头的数量,而128代表了分配给每个头的特征维度大小。这种分解是为了实现多头注意力机制,其中每个头可以独立地关注输入的不同部分,最终通过组合这些头的输出来提高模型的表达能力。
访问了第一层第一个头的查询(query)权重矩阵,这个查询权重矩阵的大小是 [128x4096]。
q_layer0_head0 = q_layer0[0]q_layer0_head0.shape
图片
在这里,你可以看到结果形状是 [17x128],这是因为我们有17个令牌,每个令牌都有一个长度为128的查询(每个令牌在一个头上方的查询)。
br
Bild
Dieser Code führt eine Matrixmultiplikationsoperation durch und vergleicht die Token-Einbettungen (token_embeddings) mit der Transponierten (.T) der Abfragegewichtsmatrix (q_layer0_head0) des ersten Kopfes der ersten Ebene. Multiplizieren Sie, um eine Per zu generieren -token-Abfragevektor (q_per_token).
torch.matmul ist die Matrixmultiplikationsfunktion in PyTorch, die die Multiplikation zweier Tensoren verarbeiten kann.
token_embeddings sollte ein Tensor der Form [17, 4096] sein, der 17 Token darstellt, die jeweils durch einen 4096-dimensionalen Einbettungsvektor dargestellt werden.
q_layer0_head0 ist die Abfragegewichtsmatrix des ersten Kopfes der ersten Ebene und ihre ursprüngliche Form ist [128, 4096]. .T ist die Transponierungsoperation in PyTorch, die die Form von q_layer0_head0 in [4096, 128] transponiert.
Auf diese Weise ist die Matrixmultiplikation von token_embeddings und q_layer0_head0.T die Multiplikation von [17, 4096] und [4096, 128], und das Ergebnis ist ein Tensor mit der Form [17, 128].
Diese Codezeile gibt die Form des q_per_token-Tensors aus und bestätigt, dass es sich um [17, 128] handelt.
Das bedeutet, dass wir für jeden eingegebenen Token (insgesamt 17) nun einen 128-dimensionalen Abfragevektor haben. Dieser 128-dimensionale Abfragevektor wird durch Multiplikation der Token-Einbettung und der Abfragegewichtsmatrix erhalten und kann für nachfolgende Berechnungen des Aufmerksamkeitsmechanismus verwendet werden.
Zusammenfassend wandelt dieser Code den Einbettungsvektor jedes Tokens durch Matrixmultiplikation in einen Abfragevektor um und bereitet so den nächsten Schritt der Implementierung des Aufmerksamkeitsmechanismus vor. Zu jedem Token gehört nun ein Abfragevektor, und diese Abfragevektoren werden zur Berechnung der Aufmerksamkeitswerte mit anderen Token verwendet.
Das obige ist der detaillierte Inhalt vonHandzerreißen von Llama3 Schicht 1: Implementierung von llama3 von Grund auf. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!