noticias

Cómo funcionan los codificadores automáticos dispersos, aquí hay una explicación intuitiva

2024-08-05

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



Informe del corazón de la máquina

Editor: Panda

En resumen: matriz → activación ReLU → matriz

Los codificadores automáticos dispersos (SAE) son una herramienta cada vez más común para interpretar modelos de aprendizaje automático (aunque los SAE existen desde 1997).

Los modelos de aprendizaje automático y los LLM son cada vez más potentes y útiles, pero siguen siendo cajas negras y no entendemos cómo cumplen sus tareas. Comprender cómo funcionan debería ser de gran ayuda.

SAE nos ayuda a dividir los cálculos de un modelo en componentes comprensibles. Recientemente, el investigador de interpretabilidad de LLM, Adam Karvonen, publicó una publicación de blog para explicar intuitivamente cómo funciona SAE.

El problema de la interpretabilidad

Los componentes más naturales de las redes neuronales son las neuronas individuales. Desafortunadamente, una sola neurona no corresponde convenientemente a un solo concepto, como una cita académica, una conversación en inglés, una solicitud HTTP y un texto en coreano. En las redes neuronales los conceptos se representan mediante combinaciones de neuronas, lo que se denomina superposición.

La razón de esto es que muchas variables en el mundo son naturalmente escasas.

Por ejemplo, el lugar de nacimiento de una celebridad puede aparecer en menos de uno entre mil millones de tokens de capacitación, pero los LLM modernos aún pueden aprender este hecho y una gran cantidad de otros conocimientos sobre el mundo. Hay más hechos y conceptos individuales en los datos de entrenamiento que neuronas en el modelo, lo que probablemente explica por qué se produce la superposición.

Recientemente, la tecnología de codificador automático disperso (SAE) se ha utilizado cada vez más para descomponer las redes neuronales en componentes comprensibles. El diseño de SAE está inspirado en la hipótesis de codificación escasa en neurociencia. Hoy en día, SAE se ha convertido en una de las herramientas más prometedoras para interpretar redes neuronales artificiales. SAE es similar a un codificador automático estándar.

Un codificador automático convencional es una red neuronal que se utiliza para comprimir y reconstruir datos de entrada.

Por ejemplo, si la entrada es un vector de 100 dimensiones (una lista que contiene 100 valores), el codificador automático primero pasa la entrada a través de una capa de codificador para comprimirla en un vector de 50 dimensiones y luego comprime esta representación codificada. el decodificador para obtener un vector de salida de 100 dimensiones. El proceso de reconstrucción no suele ser perfecto, ya que el proceso de compresión dificulta mucho la tarea de reconstrucción.



Diagrama esquemático de un codificador automático estándar con un vector de entrada de 1x4, un vector de estado intermedio de 1x2 y un vector de salida de 1x4. El color de la celda representa el valor de activación. La salida es una reconstrucción imperfecta de la entrada.

Explicando los codificadores automáticos dispersos

Cómo funcionan los codificadores automáticos dispersos

Un codificador automático disperso convierte un vector de entrada en un vector intermedio que puede tener dimensiones mayores, iguales o menores que la entrada. Cuando se utilizan en LLM, los vectores intermedios suelen tener dimensiones más altas que los de entrada. En este caso, sin restricciones adicionales, la tarea es sencilla y SAE puede utilizar la matriz de identidad para reconstruir perfectamente la entrada sin sorpresas. Pero agregaremos restricciones, una de las cuales es agregar una penalización por escasez a la pérdida de entrenamiento, lo que hará que SAE cree vectores intermedios dispersos.

Por ejemplo, podemos expandir una entrada de 100 dimensiones a un vector de representación codificada de 200 dimensiones y podemos entrenar el SAE para que tenga solo unos 20 elementos distintos de cero en la representación codificada.



Diagrama esquemático de un codificador automático disperso. Tenga en cuenta que las activaciones intermedias son escasas, con solo 2 valores distintos de cero.

Usamos SAE para activaciones intermedias dentro de redes neuronales, que pueden contener muchas capas. Durante el pase hacia adelante, hay activaciones intermedias dentro de cada capa y entre cada capa.

Por ejemplo, GPT-3 tiene 96 capas. Durante el paso hacia adelante, cada token en la entrada tiene un vector de 12,288 dimensiones (una lista de 12,288 valores). Este vector acumula toda la información utilizada por el modelo para predecir el siguiente token en cada capa de procesamiento, pero es opaco, lo que dificulta entender qué información contiene.

Podemos usar SAE para comprender esta activación intermedia. SAE es básicamente "matriz → activación ReLU → matriz".

Por ejemplo, si el factor de expansión de GPT-3 SAE es 4 y sus activaciones de entrada tienen 12 288 dimensiones, entonces su representación codificada en SAE tiene 49 512 dimensiones (12 288 x 4). La primera matriz es la matriz codificadora de forma (12,288, 49,512) y la segunda matriz es la matriz decodificadora de forma (49,512, 12,288). Al multiplicar las activaciones de GPT con el codificador y usar ReLU, se puede obtener una representación dispersa codificada SAE de 49,512 dimensiones porque la función de pérdida SAE promueve la escasez.

En general, nuestro objetivo es tener menos de 100 valores distintos de cero en la representación SAE. Al multiplicar la representación SAE con el decodificador, se obtiene una activación del modelo reconstruido de 12.288 dimensiones. Esta reconstrucción no coincide perfectamente con las activaciones de GPT originales porque las restricciones de escasez harían difícil lograr una coincidencia perfecta.

En términos generales, un SAE solo se usa para una posición en el modelo. Por ejemplo, podemos entrenar un SAE en activaciones intermedias entre las capas 26 y 27. Para analizar la información contenida en las salidas de las 96 capas de GPT-3, se pueden entrenar 96 SAE independientes, uno para la salida de cada capa. Si también quisiéramos analizar las diversas activaciones intermedias dentro de cada capa, se necesitarían cientos de SAE. Para obtener datos de entrenamiento para estos SAE, se debe introducir una gran cantidad de texto diferente en este modelo GPT y luego se recopilan las activaciones intermedias para cada posición seleccionada.

A continuación se proporciona una implementación de referencia de PyTorch de SAE. Las variables están anotadas con formas. Esta idea proviene de Noam Shazeer, consulte: https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd. Tenga en cuenta que para maximizar el rendimiento, las diferentes implementaciones de SAE a menudo tienen diferentes términos de sesgo, esquemas de normalización o esquemas de inicialización. Una de las adiciones más comunes es algún tipo de restricción en la norma del vector del decodificador. Visite las siguientes implementaciones para obtener más detalles:

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

antorcha de importación

importar antorcha.nn como nn

# D = d_modelo, F = tamaño_diccionario

# por ejemplo si d_model = 12288 y dictionary_size = 49152

# entonces model_activations_D.shape = (12288,) y encoder_DF.weight.shape = (12288, 49152)

clase SparseAutoEncoder (nn.Module):

Un autocodificador de una capa.

def __init__(self, dimensión_de_activación: int, tamaño_dict: int):

súper().__init__()

auto.activación_dim = activación_dim

self.dict_size = tamaño_dict

self.encoder_DF = nn.Linear (activación_dim, dict_size, sesgo=Verdadero)

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

def encode (self, modelo_activaciones_D: antorcha.Tensor) -> antorcha.Tensor:

devuelve nn.ReLU()(self.encoder_DF(modelo_activaciones_D))

def decodificar (self, representación_codificada_F: antorcha.Tensor) -> antorcha.Tensor:

devuelve self.decoder_FD (representación codificada_F)

def forward_pass (self, modelo_activaciones_D: antorcha.Tensor) -> tupla [antorcha.Tensor, antorcha.Tensor]:

representación_codificada_F = self.encode (activaciones_modelo_D)

activaciones_del_modelo_reconstruido_D = self.decode (representación_codificada_F)

devuelve activaciones_del_modelo_reconstruido_D, representación_codificada_F

La función de pérdida de un codificador automático estándar se basa en la precisión de los resultados de la reconstrucción de entrada. Para introducir escasez, la forma más sencilla es agregar un término de penalización de escasez a la función de pérdida de SAE. La forma más común de calcular este término de penalización es tomar la pérdida L1 de la representación codificada de este SAE (no las ponderaciones SAE) y multiplicarla por un coeficiente L1. Este coeficiente L1 es un hiperparámetro clave en el entrenamiento de SAE porque determina el equilibrio entre lograr escasez y mantener la precisión de la reconstrucción.

Tenga en cuenta que esto no está optimizado para la interpretabilidad. En cambio, las características SAE interpretables son un efecto secundario de optimizar la escasez y la reconstrucción. A continuación se muestra una función de pérdida de referencia.

# B = tamaño del lote, D = d_model, F = tamaño del diccionario

def calculate_loss (autoencoder: SparseAutoEncoder, activaciones_modelo_BD: antorcha.Tensor, coeficiente_l1: float) -> antorcha.Tensor:

activaciones_modelo_reconstruidas_BD, representación_codificada_BF = autoencoder.forward_pass (activaciones_modelo_BD)

error_de_reconstrucción_BD = (activaciones_del_modelo_reconstruido_BD - activaciones_del_modelo_BD).pow (2)

error_de_reconstrucción_B = einops.reduce (error_de_reconstrucción_BD, 'BD -> B', 'suma')

l2_loss = error_de_reconstrucción_B.mean()

l1_pérdida = l1_coeficiente * representación_codificada_BF.suma()

pérdida = pérdida_l2 + pérdida_l1

pérdida de retorno



Diagrama esquemático del paso directo de un codificador automático disperso.

Este es un paso único hacia adelante del codificador automático disperso. Primero está el vector modelo de tamaño 1x4. Luego, esto se multiplica por una matriz de codificador de 4x8 para obtener un vector codificado de 1x8, y se aplica ReLU para convertir los valores negativos en cero. Este vector codificado es escaso. Luego, multiplíquelo por una matriz decodificadora de 8x4 para obtener una activación del modelo reconstruida imperfectamente de 1x4.

Demostración hipotética de funciones SAE

Idealmente, cada valor numérico significativo en la representación SAE corresponde a algún componente comprensible.

Aquí suponemos un caso a modo de ilustración. Supongamos que un vector de 12.288 dimensiones [1,5, 0,2, -1,2, ...] representa "Golden Retriever" en la vista de GPT-3. SAE es una matriz de forma (49,512, 12,288), pero también podemos considerarla como un conjunto de 49,512 vectores, cada uno de los cuales tiene forma (1, 12,288). Si el vector 317 del decodificador SAE aprende el mismo concepto de "Golden Retriever" que GPT-3, entonces el vector del decodificador es aproximadamente igual a [1,5, 0,2, -1,2, ...].

Siempre que el elemento 317 de la activación SAE sea distinto de cero, entonces el vector correspondiente al "Golden Retriever" (y basado en la magnitud del elemento 317) se suma a la activación reconstruida. En términos de interpretabilidad mecánica, esto se puede describir sucintamente como "el vector decodificador corresponde a una representación lineal de las características en el espacio de flujo residual".

También se puede decir que el SAE con 49.512 dimensiones de representación codificada tiene 49.512 características. Las características constan de los correspondientes vectores codificadores y decodificadores. La función del vector codificador es detectar los conceptos internos del modelo mientras se minimiza la interferencia de otros conceptos, mientras que la función del vector decodificador es representar la dirección de la característica "real". Los experimentos de los investigadores encontraron que las características del codificador y decodificador de cada característica son diferentes y la similitud del coseno medio es 0,5. En la imagen siguiente, los tres cuadros rojos corresponden a características individuales.



Diagrama esquemático de un codificador automático disperso, en el que los tres cuadros rojos corresponden a la característica 1 de SAE y el cuadro verde corresponde a la característica 4. Cada función tiene un vector codificador de 1x4, activaciones de funciones 1x1 y un vector decodificador de 1x4. Las activaciones reconstruidas se construyeron utilizando únicamente vectores decodificadores de las características 1 y 4 de SAE. Si el cuadro rojo representa "color rojo" y el cuadro verde representa "bola", entonces el modelo puede representar "bola roja".

Entonces, ¿cómo sabemos qué representa la característica hipotética 317? Actualmente, la práctica es buscar entradas que maximicen la activación de funciones y den una respuesta intuitiva a su interpretabilidad. Las entradas que activan cada característica suelen ser interpretables.

Por ejemplo, Anthropic entrenó SAE en Claude Sonnet y descubrió que el texto y las imágenes relacionadas con el puente Golden Gate, la neurociencia y las atracciones turísticas populares activaban diferentes características de SAE. Otras características se activarán mediante conceptos que no son obvios. Por ejemplo, una característica de un SAE entrenado en Pythia se activará mediante el concepto de "el símbolo final de una cláusula relativa o frase preposicional utilizada para modificar el sujeto de la oración". "

Dado que el vector decodificador SAE tiene la misma forma que las activaciones intermedias del LLM, la intervención causal se puede realizar simplemente agregando el vector decodificador a las activaciones del modelo. La fuerza de esta intervención se puede ajustar multiplicando este vector decodificador por un factor de dispersión. Cuando los investigadores de Anthropic agregaron el vector decodificador SAE "Puente Golden Gate" a la activación de Claude, Claude se vio obligado a mencionar "Puente Golden Gate" en cada respuesta.

A continuación se muestra una implementación de referencia de una intervención causal utilizando la característica hipotética 317. Similar al "Puente Golden Gate" Claude, esta intervención muy simple obliga al modelo GPT-3 a mencionar "golden retriever" en cada respuesta.

def realizar_intervención (modelo_activaciones_D: antorcha.Tensor, decodificador_FD: antorcha.Tensor, escala: float) -> antorcha.Tensor:

vector_de_intervención_D = decodificador_FD [317, :]

vector_de_intervención_escalado_D = vector_de_intervención_D * escala

activaciones_modelo_modificadas_D = activaciones_modelo_D + vector_intervención_escalado_D

devolver activaciones_modelo_modificado_D

El dilema de la evaluación de los codificadores automáticos dispersos

Uno de los principales desafíos del uso de SAE es la evaluación. Podemos entrenar codificadores automáticos dispersos para interpretar modelos de lenguaje, pero no tenemos una verdad subyacente mensurable de las representaciones del lenguaje natural. Actualmente, la evaluación es muy subjetiva: básicamente "estudiamos la entrada de activación de una serie de características y luego explicamos intuitivamente la interpretabilidad de estas características".

Los investigadores han descubierto algunos indicadores comunes que parecen corresponder a la interpretabilidad de características. Los más utilizados son L0 y Pérdida recuperada. L0 es el número promedio de elementos distintos de cero en la representación intermedia codificada de SAE. La pérdida recuperada reemplaza las activaciones originales de GPT con activaciones reconstruidas y mide la pérdida adicional de resultados de reconstrucción imperfectos. Generalmente existe una compensación entre estas dos métricas, ya que SAE puede elegir una solución que resulte en una disminución en la precisión de la reconstrucción para mejorar la escasez.

Al comparar EAG, un enfoque común es trazar las dos variables y luego examinar las compensaciones entre ellas. Para lograr mejores compensaciones, muchos métodos SAE nuevos (como Gated SAE de DeepMind y TopK SAE de OpenAI) han modificado la penalización por escasez. La siguiente imagen es del artículo Gated SAE de DeepMind. El SAE cerrado está representado por la línea roja, ubicada en la parte superior izquierda del gráfico, lo que muestra que se desempeña mejor en esta compensación.



Cerrado SAE L0 y pérdida recuperada

Hay varios niveles de dificultad para medir SAE. L0 y Pérdida recuperada son dos indicadores indirectos. Sin embargo, no los usamos durante el entrenamiento porque L0 no es diferenciable y calcular la pérdida recuperada durante el entrenamiento SAE es muy costoso desde el punto de vista computacional. En cambio, nuestra pérdida de entrenamiento está determinada por un término de penalización L1 y la precisión de reconstruir las activaciones internas, en lugar de su impacto en la pérdida posterior.

La función de pérdida de entrenamiento no se corresponde directamente con la métrica sustituta, y la métrica sustituta es sólo un indicador de una evaluación subjetiva de la interpretabilidad de las características. Dado que nuestro verdadero objetivo es "comprender cómo funciona el modelo" y las evaluaciones subjetivas de interpretabilidad son sólo una aproximación, habrá otra capa de desajuste. Es posible que algunos conceptos importantes en LLM no sean fáciles de interpretar y es posible que los pasemos por alto mientras optimizamos ciegamente la interpretabilidad.

Resumir

El campo de la explicabilidad todavía tiene un largo camino por recorrer, pero SAE es un progreso real. SAE permite nuevas aplicaciones interesantes, como un método no supervisado para encontrar vectores de dirección como el vector de dirección del puente Golden Gate. SAE también puede ayudarnos a encontrar bucles en los modelos de lenguaje más fácilmente, lo que puede usarse para eliminar sesgos innecesarios dentro del modelo.

El hecho de que los SAE puedan encontrar características interpretables (incluso si el objetivo es simplemente identificar patrones en las activaciones) sugiere que pueden revelar algo significativo. También hay evidencia de que un LLM puede aprender algo significativo, en lugar de simplemente memorizar patrones estadísticos superficiales.

SAE también podría representar un hito temprano al que aspiraban empresas como Anthropic, a saber, "MRI (imágenes por resonancia magnética) para modelos de aprendizaje automático". SAE aún no proporciona una comprensión perfecta, pero puede usarse para detectar malos comportamientos. Los principales desafíos de la SAE y la evaluación de la SAE no son insuperables y muchos investigadores ya están trabajando en este tema.

Para obtener más información sobre los codificadores automáticos dispersos, consulte el cuaderno 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