nouvelles

Comment fonctionnent les auto-encodeurs clairsemés, voici une explication intuitive

2024-08-05

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



Rapport sur le cœur de la machine

Editeur : Panda

En bref : matrice → activation ReLU → matrice

Les auto-encodeurs clairsemés (SAE) sont un outil de plus en plus courant pour interpréter les modèles d'apprentissage automatique (bien que les SAE existent depuis 1997).

Les modèles d’apprentissage automatique et les LLM deviennent de plus en plus puissants et utiles, mais ils restent des boîtes noires et nous ne comprenons pas comment ils accomplissent leurs tâches. Comprendre comment ils fonctionnent devrait aller très loin.

SAE nous aide à décomposer les calculs d'un modèle en composants compréhensibles. Récemment, Adam Karvonen, chercheur en interprétabilité au LLM, a publié un article de blog pour expliquer intuitivement le fonctionnement de SAE.

Le problème de l’interprétabilité

Les composants les plus naturels des réseaux neuronaux sont les neurones individuels. Malheureusement, un seul neurone ne correspond pas à un seul concept, comme une citation académique, une conversation en anglais, une requête HTTP et un texte coréen. Dans les réseaux de neurones, les concepts sont représentés par des combinaisons de neurones, appelées superposition.

La raison en est que de nombreuses variables dans le monde sont naturellement rares.

Par exemple, le lieu de naissance d'une célébrité peut apparaître dans moins d'un jeton de formation sur un milliard, mais les LLM modernes peuvent toujours apprendre ce fait ainsi qu'une multitude d'autres connaissances sur le monde. Il y a plus de faits et de concepts individuels dans les données d'entraînement que de neurones dans le modèle, ce qui explique probablement pourquoi la superposition se produit.

Récemment, la technologie des auto-encodeurs clairsemés (SAE) a été de plus en plus utilisée pour décomposer les réseaux neuronaux en composants compréhensibles. La conception du SAE s’inspire de l’hypothèse du codage clairsemé en neurosciences. Aujourd’hui, SAE est devenu l’un des outils les plus prometteurs pour interpréter les réseaux de neurones artificiels. SAE est similaire à un encodeur automatique standard.

Un auto-encodeur conventionnel est un réseau neuronal utilisé pour compresser et reconstruire les données d'entrée.

Par exemple, si l'entrée est un vecteur à 100 dimensions (une liste contenant 100 valeurs) ; l'encodeur automatique fait d'abord passer l'entrée à travers une couche d'encodeur pour la compresser en un vecteur à 50 dimensions, puis la compresse. La représentation codée est transmise à le décodeur pour obtenir un vecteur de sortie à 100 dimensions. Le processus de reconstruction n’est généralement pas parfait, car le processus de compression rend la tâche de reconstruction très difficile.



Diagramme schématique d'un auto-encodeur standard avec un vecteur d'entrée 1x4, un vecteur d'état intermédiaire 1x2 et un vecteur de sortie 1x4. La couleur de la cellule représente la valeur d'activation. La sortie est une reconstruction imparfaite de l’entrée.

Expliquer les auto-encodeurs clairsemés

Comment fonctionnent les auto-encodeurs clairsemés

Un auto-encodeur clairsemé convertit un vecteur d'entrée en un vecteur intermédiaire qui peut avoir des dimensions supérieures, égales ou inférieures à celles de l'entrée. Lorsqu'ils sont utilisés en LLM, les vecteurs intermédiaires ont généralement des dimensions plus élevées que l'entrée. Dans ce cas, sans contraintes supplémentaires, la tâche est simple et SAE peut utiliser la matrice d'identité pour reconstruire parfaitement l'entrée sans aucune surprise. Mais nous ajouterons des contraintes, dont l'une consiste à ajouter une pénalité de parcimonie à la perte d'entraînement, ce qui amènera SAE à créer des vecteurs intermédiaires clairsemés.

Par exemple, nous pouvons étendre une entrée à 100 dimensions en un vecteur de représentation codée à 200 dimensions, et nous pouvons entraîner le SAE pour qu'il n'ait qu'environ 20 éléments non nuls dans la représentation codée.



Diagramme schématique d’un auto-encodeur clairsemé. Notez que les activations intermédiaires sont rares, avec seulement 2 valeurs non nulles.

Nous utilisons SAE pour les activations intermédiaires au sein des réseaux de neurones, qui peuvent contenir plusieurs couches. Lors du passage vers l'avant, il y a des activations intermédiaires au sein de chaque couche et entre chaque couche.

Par exemple, GPT-3 comporte 96 couches. Lors de la passe avant, chaque jeton de l'entrée possède un vecteur de 12 288 dimensions (une liste de 12 288 valeurs). Ce vecteur accumule toutes les informations utilisées par le modèle pour prédire le prochain jeton à chaque couche de traitement, mais il est opaque, ce qui rend difficile la compréhension des informations qu'il contient.

Nous pouvons utiliser SAE pour comprendre cette activation intermédiaire. SAE est essentiellement "matrice → activation ReLU → matrice".

Par exemple, si le facteur d'expansion de GPT-3 SAE est de 4 et que ses activations d'entrée ont 12 288 dimensions, alors sa représentation codée SAE a 49 512 dimensions (12 288 x 4). La première matrice est la matrice codeuse de forme (12,288, 49,512) et la deuxième matrice est la matrice codeuse de forme (49,512, 12,288). En multipliant les activations GPT avec l'encodeur et en utilisant ReLU, une représentation clairsemée codée SAE à 49 512 dimensions peut être obtenue car la fonction de perte SAE favorise la parcimonie.

En général, notre objectif est d'avoir moins de 100 valeurs non nulles dans la représentation SAE. En multipliant la représentation SAE avec le décodeur, une activation de modèle reconstruit en 12 288 dimensions est obtenue. Cette reconstruction ne correspond pas parfaitement aux activations GPT d'origine car les contraintes de parcimonie rendraient difficile la réalisation d'une correspondance parfaite.

De manière générale, un SAE n'est utilisé que pour une seule position dans le modèle. Par exemple, on peut entraîner un SAE sur des activations intermédiaires entre les couches 26 et 27. Afin d'analyser les informations contenues dans les sorties des 96 couches de GPT-3, 96 SAE distincts peuvent être formés - un pour la sortie de chaque couche. Si l’on voulait également analyser les différentes activations intermédiaires au sein de chaque couche, des centaines de SAE seraient nécessaires. Afin d'obtenir des données de formation pour ces SAE, une grande quantité de textes différents doit être introduite dans ce modèle GPT, puis les activations intermédiaires pour chaque poste sélectionné sont collectées.

Une implémentation de référence PyTorch de SAE est fournie ci-dessous. Les variables sont annotées avec des formes. Cette idée vient de Noam Shazeer, voir : https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd. Veuillez noter que afin de maximiser les performances, différentes implémentations SAE ont souvent des termes de biais, des schémas de normalisation ou des schémas d'initialisation différents. L’un des ajouts les plus courants est une sorte de contrainte sur la norme du vecteur du décodeur. Pour plus de détails, veuillez visiter la mise en œuvre ci-dessous :

  • 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
  • dictionnaire_apprentissage : https://github.com/saprmarks/dictionary_learning/blob/main/dictionary.py#L30

torche d'importation

importer torch.nn comme nn

# D = d_model, F = taille_du_dictionnaire

# par exemple si d_model = 12288 et dictionary_size = 49152

# alors model_activations_D.shape = (12288,) et encoder_DF.weight.shape = (12288, 49152)

classe SparseAutoEncoder (nn.Module) :

Un autoencodeur monocouche.

définition de __init__(self, activation_dim: int, dict_size: int):

super().__init__()

self.activation_dim = activation_dim

self.dict_size = dict_size

self.encoder_DF = nn.Linear (activation_dim, dict_size, bias=True)

self.decoder_FD = nn.Linear (dict_size, activation_dim, bias=True)

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

renvoie nn.ReLU ()(self.encoder_DF (model_activations_D))

def decode (self, représentation_encodée_F : torch.Tensor) -> torch.Tensor :

renvoie self.decoder_FD (encoded_representation_F)

def forward_pass (self, model_activations_D: torch.Tensor) -> tuple [torch.Tensor, torch.Tensor]:

représentation_encodée_F = self.encode (model_activations_D)

reconstruit_modele_activations_D = self.decode (représentation_codée_F)

renvoyer reconstruit_model_activations_D, représentation_encodée_F

La fonction de perte d'un auto-encodeur standard est basée sur la précision du résultat de reconstruction d'entrée. Afin d’introduire la parcimonie, le moyen le plus simple consiste à ajouter un terme de pénalité de parcimonie à la fonction de perte de SAE. La manière la plus courante de calculer ce terme de pénalité consiste à prendre la perte L1 de la représentation codée de ce SAE (et non les poids SAE) et à la multiplier par un coefficient L1. Ce coefficient L1 est un hyperparamètre clé dans la formation SAE car il détermine le compromis entre atteindre la parcimonie et maintenir la précision de la reconstruction.

Notez que ceci n’est pas optimisé pour l’interprétabilité. Au lieu de cela, les caractéristiques SAE interprétables sont un effet secondaire de l’optimisation de la parcimonie et de la reconstruction. Vous trouverez ci-dessous une fonction de perte de référence.

# B = taille du lot, D = d_model, F = dictionary_size

def calculate_loss (autoencodeur : SparseAutoEncoder, model_activations_BD : torch.Tensor, l1_coeffient : float) -> torch.Tensor :

activations_du_modèle_reconstruit_BD, représentation_encodée_BF = autoencoder.forward_pass (activations_du_modèle_BD)

erreur_reconstruction_BD = (activations_du_modèle_reconstruit_BD - activations_du_modèle_BD).pow (2)

reconstruction_error_B = einops.reduce (reconstruction_error_BD, 'BD -> B', 'somme')

l2_loss = erreur_reconstruction_B.moyenne()

l1_loss = l1_coefficient * représentation_encodée_BF.sum ()

perte = l2_perte + l1_perte

perte de retour



Diagramme schématique de la passe avant d'un auto-encodeur clairsemé.

Il s’agit d’une seule passe avant de l’auto-encodeur clairsemé. Le premier est le vecteur modèle de taille 1x4. Ceci est ensuite multiplié par une matrice d'encodeur 4x8 pour obtenir un vecteur codé 1x8, et ReLU est appliqué pour transformer les valeurs négatives en zéro. Ce vecteur codé est clairsemé. Ensuite, multipliez-le par une matrice de décodeur 8x4 pour obtenir une activation de modèle 1x4 imparfaitement reconstruite.

Démonstration hypothétique des fonctionnalités SAE

Idéalement, chaque valeur numérique significative dans la représentation SAE correspond à un composant compréhensible.

Nous prenons ici un cas à titre d'illustration. Supposons qu'un vecteur à 12 288 dimensions [1,5, 0,2, -1,2, ...] représente « Golden Retriever » du point de vue de GPT-3. SAE est une matrice de forme (49 512, 12 288), mais on peut aussi la considérer comme un ensemble de 49 512 vecteurs, dont chacun a une forme (1, 12 288). Si le vecteur 317 du décodeur SAE apprend le même concept "Golden Retriever" que GPT-3, alors le vecteur décodeur est à peu près égal à [1,5, 0,2, -1,2, ...].

Chaque fois que l'élément 317 de l'activation SAE est non nul, alors le vecteur correspondant au "Golden Retriever" (et basé sur la magnitude de l'élément 317) est ajouté à l'activation reconstruite. En termes d'interprétabilité mécanique, cela peut être succinctement décrit comme « le vecteur décodeur correspond à une représentation linéaire des caractéristiques dans l'espace d'écoulement résiduel ».

On peut également dire que le SAE avec 49 512 dimensions de représentation codée possède 49 512 caractéristiques. Les fonctionnalités sont constituées de vecteurs de codeur et de décodeur correspondants. Le rôle du vecteur codeur est de détecter les concepts internes du modèle tout en minimisant l'interférence d'autres concepts, tandis que le rôle du vecteur décodeur est de représenter la direction « réelle » des caractéristiques. Les expériences des chercheurs ont révélé que les caractéristiques du codeur et du décodeur de chaque fonctionnalité sont différentes et que la similarité médiane du cosinus est de 0,5. Dans l'image ci-dessous, les trois cases rouges correspondent à des caractéristiques individuelles.



Diagramme schématique de l'auto-encodeur clairsemé, dans lequel les trois cases rouges correspondent à la fonctionnalité SAE 1 et la case verte correspond à la fonctionnalité 4. Chaque fonctionnalité possède un vecteur d'encodeur 1x4, des activations de fonctionnalités 1x1 et un vecteur de décodeur 1x4. Les activations reconstruites ont été construites en utilisant uniquement les vecteurs décodeurs des fonctionnalités SAE 1 et 4. Si la case rouge représente la « couleur rouge » et la case verte représente la « balle », alors le modèle peut représenter « la balle rouge ».

Alors, comment savons-nous ce que représente la caractéristique hypothétique 317 ? Actuellement, la pratique consiste à rechercher des entrées qui maximisent l’activation des fonctionnalités et donnent une réponse intuitive à leur interprétabilité. Les entrées qui activent chaque fonctionnalité sont généralement interprétables.

Par exemple, Anthropic a formé SAE sur Claude Sonnet et a découvert que les textes et images liés au Golden Gate Bridge, aux neurosciences et aux attractions touristiques populaires activaient différentes fonctionnalités SAE. D'autres fonctionnalités seront activées par des concepts qui ne sont pas évidents. Par exemple, une fonctionnalité d'un SAE formé sur Pythia sera activée par le concept de "le jeton final d'une proposition relative ou d'une phrase prépositionnelle utilisé pour modifier le sujet de la phrase". "

Étant donné que le vecteur décodeur SAE a la même forme que les activations intermédiaires du LLM, une intervention causale peut être effectuée simplement en ajoutant le vecteur décodeur aux activations du modèle. La force de cette intervention peut être ajustée en multipliant ce vecteur décodeur par un facteur d'étalement. Lorsque les chercheurs d'Anthropic ont ajouté le vecteur décodeur SAE « Golden Gate Bridge » à l'activation de Claude, Claude a été obligé de mentionner « Golden Gate Bridge » dans chaque réponse.

Vous trouverez ci-dessous une implémentation de référence d'une intervention causale utilisant la caractéristique hypothétique 317. Semblable au « Golden Gate Bridge » Claude, cette intervention très simple oblige le modèle GPT-3 à mentionner « golden retriever » dans chaque réponse.

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

intervention_vector_D = decoder_FD [317, :]

vecteur_d'intervention_à_échelle_D = vecteur_d'intervention_D * échelle

activations_du_modèle_modifié_D = activations_du_modèle_D + vecteur_d'intervention_à_l'échelle_D

retourner modified_model_activations_D

Le dilemme d’évaluation des auto-encodeurs clairsemés

L’un des défis majeurs liés à l’utilisation de SAE est l’évaluation. Nous pouvons former des auto-encodeurs clairsemés pour interpréter des modèles de langage, mais nous n'avons aucune vérité fondamentale sous-jacente mesurable sur les représentations en langage naturel. Actuellement, l'évaluation est très subjective, essentiellement "nous étudions l'entrée d'activation d'une série de fonctionnalités, puis expliquons intuitivement l'interprétabilité de ces fonctionnalités".

Les chercheurs ont découvert des proxys courants qui semblent correspondre à l’interprétabilité des fonctionnalités. Les plus couramment utilisés sont L0 et Loss Recovered. L0 est le nombre moyen d'éléments non nuls dans la représentation intermédiaire codée de SAE. Loss Recovered remplace les activations originales de GPT par des activations reconstruites et mesure la perte supplémentaire des résultats de reconstruction imparfaits. Il existe généralement un compromis entre ces deux mesures, car SAE peut choisir une solution qui entraîne une diminution de la précision de la reconstruction afin d'améliorer la parcimonie.

Lors de la comparaison des EIG, une approche courante consiste à tracer les deux variables, puis à examiner les compromis entre elles. Afin d'obtenir de meilleurs compromis, de nombreuses nouvelles méthodes SAE (telles que Gated SAE de DeepMind et TopK SAE d'OpenAI) ont modifié la pénalité de parcimonie. L'image ci-dessous est tirée du document Gated SAE de DeepMind. Le Gated SAE est représenté par la ligne rouge, située en haut à gauche du graphique, ce qui montre qu'il est plus performant sur ce compromis.



Gated SAE L0 et perte récupérée

Il existe plusieurs niveaux de difficulté dans la mesure du SAE. L0 et Loss Recovered sont deux indicateurs proxy. Cependant, nous ne les utilisons pas pendant la formation car L0 n'est pas différentiable et le calcul de la perte récupérée lors de la formation SAE est très coûteux en calcul. Au lieu de cela, notre perte de formation est déterminée par un terme de pénalité L1 et par la précision de la reconstruction des activations internes, plutôt que par son impact sur la perte en aval.

La fonction de perte d'entraînement ne correspond pas directement à la métrique de substitution, et la métrique de substitution n'est qu'un proxy pour une évaluation subjective de l'interprétabilité des fonctionnalités. Étant donné que notre véritable objectif est de « comprendre comment fonctionne le modèle » et que les évaluations subjectives de l’interprétabilité ne sont qu’une approximation, il y aura un autre niveau d’inadéquation. Certains concepts importants du LLM peuvent ne pas être faciles à interpréter, et nous pouvons les négliger tout en optimisant aveuglément leur interprétabilité.

Résumer

Le domaine de l’explicabilité a encore un long chemin à parcourir, mais la SAE constitue un réel progrès. SAE permet de nouvelles applications intéressantes, comme une méthode non supervisée pour trouver des vecteurs de direction comme le vecteur de direction du Golden Gate Bridge. SAE peut également nous aider à trouver plus facilement des boucles dans les modèles de langage, ce qui peut être utilisé pour supprimer les biais inutiles au sein du modèle.

Le fait que les SAE puissent trouver des caractéristiques interprétables (même si l’objectif est simplement d’identifier des modèles d’activation) suggère qu’ils peuvent révéler quelque chose de significatif. Il existe également des preuves que le LLM peut effectivement apprendre quelque chose de significatif, plutôt que de simplement mémoriser des modèles statistiques superficiels.

SAE pourrait également représenter une première étape que visaient des entreprises comme Anthropic, à savoir « l'IRM (imagerie par résonance magnétique) pour les modèles d'apprentissage automatique ». SAE ne permet pas encore une compréhension parfaite, mais il peut être utilisé pour détecter de mauvais comportements. Les défis majeurs du SAE et de son évaluation ne sont pas insurmontables, et de nombreux chercheurs travaillent déjà sur ce sujet.

Pour une introduction plus approfondie aux autoencodeurs clairsemés, veuillez vous référer au cahier Colab de 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