Nachricht

Wie Sparse-Autoencoder funktionieren, finden Sie hier eine intuitive Erklärung

2024-08-05

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina



Maschinenherzbericht

Herausgeber: Panda

Kurz gesagt: Matrix → ReLU-Aktivierung → Matrix

Sparse Autoencoder (SAEs) sind ein zunehmend verbreitetes Werkzeug zur Interpretation von Modellen für maschinelles Lernen (obwohl es SAEs bereits seit 1997 gibt).

Modelle für maschinelles Lernen und LLMs werden immer leistungsfähiger und nützlicher, aber sie sind immer noch Black Boxes und wir verstehen nicht, wie sie ihre Aufgaben erfüllen. Zu verstehen, wie sie funktionieren, sollte von großem Nutzen sein.

SAE hilft uns, die Berechnungen eines Modells in verständliche Komponenten zu zerlegen. Kürzlich veröffentlichte der LLM-Interpretierbarkeitsforscher Adam Karvonen einen Blogbeitrag, in dem er intuitiv erklärt, wie SAE funktioniert.

Das Interpretierbarkeitsproblem

Die natürlichsten Bestandteile neuronaler Netze sind einzelne Neuronen. Leider entspricht ein einzelnes Neuron nicht einfach einem einzelnen Konzept, beispielsweise einem akademischen Zitat, einer englischen Konversation, einer HTTP-Anfrage und einem koreanischen Text. In neuronalen Netzen werden Konzepte durch Kombinationen von Neuronen dargestellt, was als Superposition bezeichnet wird.

Der Grund dafür ist, dass viele Variablen auf der Welt von Natur aus dünn besetzt sind.

Beispielsweise erscheint der Geburtsort einer Berühmtheit möglicherweise in weniger als einer von einer Milliarde Trainingstokens, aber moderne LLMs können diese Tatsache und eine Fülle anderer Kenntnisse über die Welt immer noch lernen. Die Trainingsdaten enthalten mehr einzelne Fakten und Konzepte als Neuronen im Modell, was wahrscheinlich der Grund für die Überlagerung ist.

In letzter Zeit wird zunehmend die Sparse-Autoencoder-Technologie (SAE) eingesetzt, um neuronale Netze in verständliche Komponenten zu zerlegen. Das Design von SAE ist von der Sparse-Coding-Hypothese in den Neurowissenschaften inspiriert. Heute ist SAE eines der vielversprechendsten Werkzeuge zur Interpretation künstlicher neuronaler Netze. SAE ähnelt einem Standard-Autoencoder.

Ein herkömmlicher Autoencoder ist ein neuronales Netzwerk, das zur Komprimierung und Rekonstruktion von Eingabedaten verwendet wird.

Wenn die Eingabe beispielsweise ein 100-dimensionaler Vektor ist (eine Liste mit 100 Werten), leitet der Autoencoder die Eingabe zunächst durch eine Encoderschicht, um sie in einen 50-dimensionalen Vektor zu komprimieren, und komprimiert dann die codierte Darstellung Der Decoder erhält einen 100-dimensionalen Ausgabevektor. Der Rekonstruktionsprozess ist normalerweise nicht perfekt, da der Komprimierungsprozess die Rekonstruktionsaufgabe sehr erschwert.



Schematische Darstellung eines Standard-Autoencoders mit einem 1x4-Eingangsvektor, einem 1x2-Zwischenzustandsvektor und einem 1x4-Ausgangsvektor. Die Farbe der Zelle stellt den Aktivierungswert dar. Die Ausgabe ist eine unvollständige Rekonstruktion der Eingabe.

Erklären von spärlichen Autoencodern

Wie Sparse-Autoencoder funktionieren

Ein Sparse-Autoencoder wandelt einen Eingabevektor in einen Zwischenvektor um, der höhere, gleiche oder niedrigere Abmessungen als die Eingabe haben kann. Bei Verwendung in LLM haben die Zwischenvektoren normalerweise höhere Dimensionen als die Eingabe. In diesem Fall ist die Aufgabe ohne zusätzliche Einschränkungen einfach und SAE kann die Identitätsmatrix verwenden, um die Eingabe ohne Überraschungen perfekt zu rekonstruieren. Wir werden jedoch Einschränkungen hinzufügen. Eine davon besteht darin, dem Trainingsverlust eine Sparsity-Strafe hinzuzufügen, die dazu führt, dass SAE spärliche Zwischenvektoren erstellt.

Beispielsweise können wir eine 100-dimensionale Eingabe in einen 200-dimensionalen codierten Darstellungsvektor erweitern und den SAE so trainieren, dass die codierte Darstellung nur etwa 20 Nicht-Null-Elemente enthält.



Schematische Darstellung eines Sparse-Autoencoders. Beachten Sie, dass die Zwischenaktivierungen spärlich sind und nur zwei Werte ungleich Null aufweisen.

Wir verwenden SAE für Zwischenaktivierungen innerhalb neuronaler Netze, die viele Schichten enthalten können. Während des Vorwärtsdurchlaufs gibt es Zwischenaktivierungen innerhalb jeder Schicht und zwischen jeder Schicht.

GPT-3 hat beispielsweise 96 Schichten. Während des Vorwärtsdurchlaufs verfügt jedes Token in der Eingabe über einen 12.288-dimensionalen Vektor (eine Liste mit 12.288 Werten). Dieser Vektor sammelt alle Informationen, die das Modell zur Vorhersage des nächsten Tokens auf jeder Verarbeitungsebene verwendet. Er ist jedoch undurchsichtig, sodass es schwierig ist, zu verstehen, welche Informationen darin enthalten sind.

Wir können SAE verwenden, um diese Zwischenaktivierung zu verstehen. SAE ist im Grunde „Matrix → ReLU-Aktivierung → Matrix“.

Wenn beispielsweise der Erweiterungsfaktor von GPT-3 SAE 4 beträgt und seine Eingabeaktivierungen 12.288 Dimensionen haben, dann hat seine SAE-codierte Darstellung 49.512 Dimensionen (12.288 x 4). Die erste Matrix ist die Encoder-Formmatrix (12.288, 49.512) und die zweite Matrix ist die Decoder-Formmatrix (49.512, 12.288). Durch Multiplizieren der GPT-Aktivierungen mit dem Encoder und Verwendung von ReLU kann eine 49.512-dimensionale SAE-codierte Sparse-Darstellung erhalten werden, da die SAE-Verlustfunktion die Sparsity fördert.

Im Allgemeinen besteht unser Ziel darin, weniger als 100 Nicht-Null-Werte in der SAE-Darstellung zu haben. Durch Multiplikation der SAE-Darstellung mit dem Decoder wird eine 12.288-dimensionale rekonstruierte Modellaktivierung erhalten. Diese Rekonstruktion stimmt nicht perfekt mit den ursprünglichen GPT-Aktivierungen überein, da Sparsity-Einschränkungen es schwierig machen würden, eine perfekte Übereinstimmung zu erreichen.

Im Allgemeinen wird ein SAE nur für eine Position im Modell verwendet. Beispielsweise können wir einen SAE für Zwischenaktivierungen zwischen den Schichten 26 und 27 trainieren. Um die in den Ausgaben aller 96 Schichten von GPT-3 enthaltenen Informationen zu analysieren, können 96 separate SAEs trainiert werden – eine für die Ausgabe jeder Schicht. Wenn wir auch die verschiedenen Zwischenaktivierungen innerhalb jeder Schicht analysieren wollten, wären Hunderte von SAEs erforderlich. Um Trainingsdaten für diese SAEs zu erhalten, muss eine große Menge verschiedener Texte in dieses GPT-Modell eingespeist werden, und dann werden die Zwischenaktivierungen für jede ausgewählte Position gesammelt.

Nachfolgend finden Sie eine PyTorch-Referenzimplementierung von SAE. Die Variablen werden mit Formen annotiert. Diese Idee stammt von Noam Shazeer, siehe: https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd. Bitte beachten Sie, dass verschiedene SAE-Implementierungen zur Maximierung der Leistung häufig unterschiedliche Bias-Terme, Normalisierungsschemata oder Initialisierungsschemata haben. Eine der häufigsten Ergänzungen ist eine Art Einschränkung der Decoder-Vektornorm. Weitere Informationen finden Sie in den folgenden Implementierungen:

  • OpenAI: https://github.com/openai/sparse_autoencoder/blob/main/sparse_autoencoder/model.py#L16
  • SAELens: https://github.com/jbloomAus/SAELens/blob/main/sae_lens/sae.py#L97
  • dictionary_learning: https://github.com/saprmarks/dictionary_learning/blob/main/dictionary.py#L30

Taschenlampe importieren

importiere torch.nn als nn

# D = d_Modell, F = Wörterbuchgröße

# zB wenn d_model = 12288 und dictionary_size = 49152

# dann model_activations_D.shape = (12288,) und encoder_DF.weight.shape = (12288, 49152)

Klasse SparseAutoEncoder (nn.Modul):

Ein einschichtiger Autoencoder.

def __init__(selbst, Aktivierungsdim: int, dict_size: int):

super ().__init__()

self.activation_dim = Aktivierungsdim

self.dict_size = dict_size

self.encoder_DF = nn.Linear (Aktivierungsdim, Diktatgröße, Bias=True)

self.decoder_FD = nn.Linear (dict_size, Aktivierungsdim, Bias=True)

def encode (selbst, model_activations_D: torch.Tensor) -> torch.Tensor:

gibt nn.ReLU ()(self.encoder_DF (model_activations_D)) zurück

def decode (selbst, codierte_Darstellung_F: torch.Tensor) -> torch.Tensor:

return self.decoder_FD (kodierte_Darstellung_F)

def forward_pass (selbst, model_activations_D: torch.Tensor) -> Tupel [torch.Tensor, torch.Tensor]:

kodierte_Darstellung_F = selbst.kodieren (Modellaktivierungen_D)

rekonstruierte Modellaktivierungen_D = selbstdekodieren (kodierte Darstellung_F)

Rückgabewerte für rekonstruierte Modellaktivierungen D und kodierte Darstellung F

Die Verlustfunktion eines Standard-Autoencoders basiert auf der Genauigkeit der Eingaberekonstruktionsergebnisse. Um Sparsity einzuführen, besteht der einfachste Weg darin, der Verlustfunktion von SAE einen Sparsity-Strafterm hinzuzufügen. Die gebräuchlichste Methode zur Berechnung dieses Strafterms besteht darin, den L1-Verlust der codierten Darstellung dieses SAE (nicht die SAE-Gewichte) zu nehmen und ihn mit einem L1-Koeffizienten zu multiplizieren. Dieser L1-Koeffizient ist ein wichtiger Hyperparameter im SAE-Training, da er den Kompromiss zwischen dem Erreichen einer Sparsity und der Aufrechterhaltung der Rekonstruktionsgenauigkeit bestimmt.

Beachten Sie, dass dies nicht auf Interpretierbarkeit optimiert ist. Stattdessen sind interpretierbare SAE-Merkmale ein Nebeneffekt der Optimierung von Sparsity und Rekonstruktion. Nachfolgend finden Sie eine Referenzverlustfunktion.

# B = Batchgröße, D = d_model, F = Wörterbuchgröße

def Verlust berechnen (Autoencoder: SparseAutoEncoder, model_activations_BD: torch.Tensor, l1_coeffient: float) -> torch.Tensor:

rekonstruierte Modellaktivierungen_BD, kodierte Darstellung_BF = autoencoder.forward_pass (Modellaktivierungen_BD)

Rekonstruktionsfehler_BD = (rekonstruierte Modellaktivierungen_BD - Modellaktivierungen_BD).pow (2)

Rekonstruktionsfehler_B = einops.reduce (Rekonstruktionsfehler_BD, „BD -> B“, „Summe“)

l2_loss = Rekonstruktionsfehler_B.mean ()

l1_Verlust = l1_Koeffizient * codierte_Darstellung_BF.Summe ()

Verlust = l2_Verlust + l1_Verlust

Rückflussdämpfung



Schematische Darstellung des Vorwärtsdurchlaufs eines Sparse-Autoencoders.

Dies ist ein einzelner Vorwärtsdurchlauf des Sparse-Autoencoders. Erstens ist der Modellvektor der Größe 1x4. Dies wird dann mit einer 4x8-Encodermatrix multipliziert, um einen 1x8-codierten Vektor zu erhalten, und ReLU wird angewendet, um negative Werte in Null umzuwandeln. Dieser codierte Vektor ist dünn besetzt. Multiplizieren Sie es dann mit einer 8x4-Decodermatrix, um eine unvollständig rekonstruierte 1x4-Modellaktivierung zu erhalten.

Hypothetische SAE-Funktionsdemonstration

Im Idealfall entspricht jeder signifikante numerische Wert in der SAE-Darstellung einer verständlichen Komponente.

Hier gehen wir zur Veranschaulichung von einem Fall aus. Nehmen Sie an, dass ein 12.288-dimensionaler Vektor [1,5, 0,2, -1,2, ...] aus Sicht von GPT-3 „Golden Retriever“ darstellt. SAE ist eine Formmatrix (49.512, 12.288), wir können sie uns aber auch als eine Menge von 49.512 Vektoren vorstellen, von denen jeder die Form (1, 12.288) hat. Wenn der 317-Vektor des SAE-Decoders das gleiche „Golden Retriever“-Konzept wie GPT-3 lernt, dann ist der Decoder-Vektor ungefähr gleich [1,5, 0,2, -1,2, ...].

Immer wenn das 317-Element der SAE-Aktivierung ungleich Null ist, wird der Vektor, der dem „Golden Retriever“ entspricht (und auf der Größe des 317-Elements basiert), zur rekonstruierten Aktivierung hinzugefügt. In Bezug auf die mechanische Interpretierbarkeit kann dies kurz und bündig beschrieben werden als „der Decoder-Vektor entspricht einer linearen Darstellung der Merkmale im Restflussraum“.

Man kann auch sagen, dass die SAE mit 49.512 Dimensionen codierter Darstellung 49.512 Merkmale aufweist. Merkmale bestehen aus entsprechenden Encoder- und Decodervektoren. Die Rolle des Encodervektors besteht darin, die internen Konzepte des Modells zu erkennen und gleichzeitig die Interferenz anderer Konzepte zu minimieren, während die Rolle des Decodervektors darin besteht, die „echte“ Merkmalsrichtung darzustellen. Die Experimente der Forscher ergaben, dass die Encoder- und Decodermerkmale jedes Merkmals unterschiedlich sind und die mittlere Kosinusähnlichkeit 0,5 beträgt. Im Bild unten entsprechen die drei roten Kästchen einzelnen Merkmalen.



Schematische Darstellung eines Sparse-Autoencoders, in dem die drei roten Kästchen dem SAE-Merkmal 1 und das grüne Kästchen dem SAE-Merkmal 4 entsprechen. Jedes Feature verfügt über einen 1x4-Encoder-Vektor, 1x1-Feature-Aktivierungen und einen 1x4-Decoder-Vektor. Die rekonstruierten Aktivierungen wurden ausschließlich unter Verwendung von Decodervektoren aus den SAE-Merkmalen 1 und 4 konstruiert. Wenn das rote Kästchen „rote Farbe“ und das grüne Kästchen „Ball“ darstellt, stellt das Modell möglicherweise einen „roten Ball“ dar.

Woher wissen wir also, was das hypothetische Merkmal 317 darstellt? Derzeit besteht die Praxis darin, nach Eingaben zu suchen, die die Funktionsaktivierung maximieren und eine intuitive Reaktion auf deren Interpretierbarkeit ermöglichen. Eingaben, die die einzelnen Funktionen aktivieren, sind normalerweise interpretierbar.

Beispielsweise trainierte Anthropic SAE mit Claude Sonnet und stellte fest, dass Texte und Bilder im Zusammenhang mit der Golden Gate Bridge, Neurowissenschaften und beliebten Touristenattraktionen unterschiedliche SAE-Funktionen aktivierten. Andere Merkmale werden durch Konzepte aktiviert, die nicht offensichtlich sind. Beispielsweise wird ein Merkmal eines auf Pythia trainierten SAE durch das Konzept „das letzte Zeichen eines Relativsatzes oder einer Präpositionalphrase, das zum Modifizieren des Subjekts des Satzes verwendet wird“ aktiviert. "

Da der SAE-Decoder-Vektor die gleiche Form wie die Zwischenaktivierungen des LLM hat, kann ein kausaler Eingriff einfach durch Hinzufügen des Decoder-Vektors zu den Modellaktivierungen durchgeführt werden. Die Stärke dieses Eingriffs kann durch Multiplikation dieses Decodervektors mit einem Spreizfaktor angepasst werden. Als die Anthropic-Forscher den SAE-Decodervektor „Golden Gate Bridge“ zu Claudes Aktivierung hinzufügten, war Claude gezwungen, in jeder Antwort „Golden Gate Bridge“ zu erwähnen.

Nachfolgend finden Sie eine Referenzimplementierung einer kausalen Intervention unter Verwendung des hypothetischen Merkmals 317. Ähnlich wie bei „Golden Gate Bridge“ Claude zwingt dieser sehr einfache Eingriff das GPT-3-Modell dazu, in jeder Antwort „Golden Retriever“ zu erwähnen.

def perform_intervention (model_activations_D: torch.Tensor, decoder_FD: torch.Tensor, scale: float) -> torch.Tensor:

Interventionsvektor_D = Decoder_FD [317, :]

skalierter Interventionsvektor_D = Interventionsvektor_D * Skalierung

modifizierte Modellaktivierungen_D = Modellaktivierungen_D + skalierter Interventionsvektor_D

returniert modifizierte_Modellaktivierungen_D

Das Bewertungsdilemma spärlicher Autoencoder

Eine der größten Herausforderungen beim Einsatz von SAE ist die Bewertung. Wir können spärliche Autoencoder trainieren, um Sprachmodelle zu interpretieren, aber wir haben keine messbare zugrunde liegende Grundwahrheit natürlicher Sprachdarstellungen. Derzeit ist die Bewertung sehr subjektiv. Grundsätzlich „untersuchen wir die Aktivierungseingabe einer Reihe von Merkmalen und erklären dann intuitiv die Interpretierbarkeit dieser Merkmale.“

Forscher haben einige gängige Proxys entdeckt, die offenbar mit der Interpretierbarkeit von Merkmalen übereinstimmen. Die am häufigsten verwendeten sind L0 und Loss Recovered. L0 ist die durchschnittliche Anzahl von Nicht-Null-Elementen in der codierten Zwischendarstellung von SAE. Der wiederhergestellte Verlust ersetzt die ursprünglichen Aktivierungen von GPT durch rekonstruierte Aktivierungen und misst den zusätzlichen Verlust unvollständiger Rekonstruktionsergebnisse. Normalerweise gibt es einen Kompromiss zwischen diesen beiden Metriken, da SAE möglicherweise eine Lösung wählt, die zu einer Verringerung der Rekonstruktionsgenauigkeit führt, um die Sparsity zu verbessern.

Beim Vergleich von SAEs besteht ein gängiger Ansatz darin, die beiden Variablen grafisch darzustellen und dann die Kompromisse zwischen ihnen zu untersuchen. Um bessere Kompromisse zu erzielen, haben viele neue SAE-Methoden (wie Gated SAE von DeepMind und TopK SAE von OpenAI) die Sparsity-Strafe geändert. Das Bild unten stammt aus dem Gated SAE-Artikel von DeepMind. Gated SAE wird durch die rote Linie oben links im Diagramm dargestellt und zeigt, dass es bei diesem Kompromiss besser abschneidet.



Gated SAE L0 und Verlust wiederhergestellt

Es gibt verschiedene Schwierigkeitsgrade bei der Messung von SAE. L0 und Loss Recovered sind zwei Proxy-Indikatoren. Wir verwenden sie jedoch nicht während des Trainings, da L0 nicht differenzierbar ist und die Berechnung des wiederhergestellten Verlusts während des SAE-Trainings sehr rechenintensiv ist. Stattdessen wird unser Trainingsverlust durch einen L1-Strafterm und die Genauigkeit der Rekonstruktion interner Aktivierungen bestimmt und nicht durch deren Auswirkung auf den Downstream-Verlust.

Die Trainingsverlustfunktion entspricht nicht direkt der Ersatzmetrik, und die Ersatzmetrik ist nur ein Proxy für eine subjektive Bewertung der Interpretierbarkeit von Merkmalen. Da unser eigentliches Ziel darin besteht, „zu verstehen, wie das Modell funktioniert“ und subjektive Einschätzungen der Interpretierbarkeit nur ein Anhaltspunkt sind, wird es eine weitere Ebene der Nichtübereinstimmung geben. Einige wichtige Konzepte im LLM sind möglicherweise nicht einfach zu interpretieren, und wir übersehen diese Konzepte möglicherweise, während wir blind auf Interpretierbarkeit optimieren.

Zusammenfassen

Auf dem Gebiet der Erklärbarkeit ist es noch ein langer Weg, aber SAE ist ein echter Fortschritt. SAE ermöglicht interessante neue Anwendungen, beispielsweise eine unbeaufsichtigte Methode zum Auffinden von Lenkvektoren wie dem Lenkvektor der Golden Gate Bridge. SAE kann uns auch dabei helfen, Schleifen in Sprachmodellen leichter zu finden, was dazu dienen kann, unnötige Verzerrungen innerhalb des Modells zu beseitigen.

Die Tatsache, dass SAEs interpretierbare Merkmale finden können (auch wenn das Ziel lediglich darin besteht, Muster in Aktivierungen zu identifizieren), legt nahe, dass sie etwas Sinnvolles offenbaren können. Es gibt auch Hinweise darauf, dass LLM tatsächlich etwas Sinnvolles lernen kann, anstatt sich nur oberflächliche statistische Muster zu merken.

SAE könnte auch einen frühen Meilenstein darstellen, den Unternehmen wie Anthropic anstrebten, nämlich „MRT (Magnetresonanztomographie) für Modelle des maschinellen Lernens.“ SAE bietet noch kein vollständiges Verständnis, kann aber zur Erkennung von Fehlverhalten genutzt werden. Die großen Herausforderungen der SAE und der SAE-Bewertung sind nicht unüberwindbar und viele Forscher beschäftigen sich bereits mit diesem Thema.

Eine weitere Einführung in Sparse-Autoencoder finden Sie im Colab-Notizbuch von Callum McDougal: https://www.lesswrong.com/posts/LnHowHgmrMbWtpkxx/intro-to-superposition-and-sparse-autoencoders-colab

https://www.reddit.com/r/MachineLearning/comments/1eeihdl/d_an_intuitive_explanation_of_sparse_autoencoders/

https://adamkarvonen.github.io/machine_learning/2024/06/11/sae-intuitions.html