Новости

Как работают разреженные автоэнкодеры, вот интуитивное объяснение

2024-08-05

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



Отчет о сердце машины

Редактор: Панда

Короче говоря: матрица → активация ReLU → матрица.

Разреженные автокодировщики (SAE) становятся все более распространенным инструментом для интерпретации моделей машинного обучения (хотя SAE существуют с 1997 года).

Модели машинного обучения и LLM становятся все более мощными и полезными, но они по-прежнему остаются черными ящиками, и мы не понимаем, как они выполняют свои задачи. Понимание того, как они работают, должно иметь большое значение.

SAE помогает нам разбить расчеты модели на понятные компоненты. Недавно исследователь интерпретируемости LLM Адам Карвонен опубликовал сообщение в блоге, в котором интуитивно объясняет, как работает SAE.

Проблема интерпретируемости

Наиболее естественными компонентами нейронных сетей являются отдельные нейроны. К сожалению, один нейрон не соответствует одному понятию, например академической цитате, разговору на английском языке, HTTP-запросу и корейскому тексту. В нейронных сетях понятия представляются посредством комбинаций нейронов, что называется суперпозицией.

Причина этого в том, что многие переменные в мире по природе своей редки.

Например, место рождения знаменитости может фигурировать менее чем в одном из миллиарда обучающих жетонов, но современные студенты LLM все равно могут узнать этот факт и множество других знаний о мире. В обучающих данных больше отдельных фактов и концепций, чем нейронов в модели, вероятно, поэтому и возникает суперпозиция.

В последнее время технология разреженного автоэнкодера (SAE) все чаще используется для разложения нейронных сетей на понятные компоненты. Дизайн SAE вдохновлен гипотезой разреженного кодирования в нейробиологии. Сегодня SAE стал одним из наиболее перспективных инструментов интерпретации искусственных нейронных сетей. SAE похож на стандартный автоэнкодер.

Обычный автокодировщик — это нейронная сеть, используемая для сжатия и восстановления входных данных.

Например, если входные данные представляют собой 100-мерный вектор (список, содержащий 100 значений), автоэнкодер сначала пропускает входные данные через уровень кодера, чтобы сжать их в 50-мерный вектор, а затем сжимает это кодированное представление. декодер для получения 100-мерного выходного вектора. Процесс реконструкции обычно не идеален, поскольку процесс сжатия очень усложняет задачу реконструкции.



Схематическая диаграмма стандартного автоэнкодера с входным вектором 1x4, вектором промежуточного состояния 1x2 и выходным вектором 1x4. Цвет ячейки представляет значение активации. Выходные данные представляют собой несовершенную реконструкцию входных данных.

Объяснение разреженных автокодировщиков

Как работают разреженные автоэнкодеры

Разреженный автокодировщик преобразует входной вектор в промежуточный вектор, который может иметь более высокие, равные или меньшие размерности, чем входной. При использовании в LLM промежуточные векторы обычно имеют более высокие размерности, чем входные. В этом случае, без дополнительных ограничений, задача проста, и SAE может использовать единичную матрицу для идеального восстановления входных данных без каких-либо сюрпризов. Но мы добавим ограничения, одно из которых — добавить штраф за разреженность к потерям обучения, что заставит SAE создавать разреженные промежуточные векторы.

Например, мы можем расширить 100-мерный входной сигнал до 200-мерного вектора кодированного представления и научить SAE иметь только около 20 ненулевых элементов в кодированном представлении.



Принципиальная схема разреженного автоэнкодера. Обратите внимание, что промежуточные активации редки и имеют только два ненулевых значения.

Мы используем SAE для промежуточных активаций в нейронных сетях, которые могут содержать много слоев. Во время прямого прохода внутри каждого слоя и между каждым слоем происходят промежуточные активации.

Например, GPT-3 имеет 96 слоев. Во время прямого прохода каждый токен на входе имеет 12 288-мерный вектор (список из 12 288 значений). Этот вектор аккумулирует всю информацию, используемую моделью для прогнозирования следующего токена на каждом уровне обработки, но он непрозрачен, что затрудняет понимание того, какая информация в нем содержится.

Мы можем использовать SAE, чтобы понять эту промежуточную активацию. SAE — это, по сути, «матрица → активация ReLU → матрица».

Например, если коэффициент расширения GPT-3 SAE равен 4, а его входные активации имеют 12 288 измерений, то его представление в кодировке SAE имеет 49 512 измерений (12 288 x 4). Первая матрица — это матрица кодера формы (12 288, 49 512), а вторая матрица — матрица декодера формы (49 512, 12 288). Умножив активации GPT на кодировщик и используя ReLU, можно получить 49 512-мерное разреженное представление, закодированное SAE, поскольку функция потерь SAE способствует разреженности.

В общем, наша цель — иметь менее 100 ненулевых значений в представлении SAE. Путем умножения представления SAE на декодер получается 12 288-мерная активация восстановленной модели. Эта реконструкция не полностью соответствует исходным активациям GPT, поскольку ограничения разреженности затрудняют достижение идеального соответствия.

Вообще говоря, SAE используется только для одной позиции в модели. Например, мы можем обучить SAE на промежуточных активациях между уровнями 26 и 27. Чтобы проанализировать информацию, содержащуюся в выходных данных всех 96 слоев GPT-3, можно обучить 96 отдельных SAE — по одному для каждого выходного уровня. Если бы мы также хотели проанализировать различные промежуточные активации внутри каждого слоя, потребовались бы сотни SAE. Чтобы получить данные обучения для этих SAE, в эту модель GPT необходимо ввести большое количество различного текста, а затем собрать промежуточные активации для каждой выбранной позиции.

Ниже представлена ​​эталонная реализация SAE PyTorch. Переменные помечены фигурами. Эта идея принадлежит Ноаму Шазиру, см.: https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd. Обратите внимание, что для максимизации производительности разные реализации SAE часто имеют разные условия смещения, схемы нормализации или схемы инициализации. Одним из наиболее распространенных дополнений является своего рода ограничение на норму вектора декодера. Для получения более подробной информации посетите реализацию ниже:

  • 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
  • изучение_словаря: https://github.com/saprmarks/dictionary_learning/blob/main/dictionary.py#L30

импортный факел

импортировать torch.nn как nn

# D = d_model, F = dictionary_size

# например, если d_model = 12288 и dictionary_size = 49152

# тогда model_activations_D.shape = (12288,) и encoder_DF.weight.shape = (12288, 49152)

класс SparseAutoEncoder (nn.Module):

Однослойный автоэнкодер.

def __init__(self, activation_dim: целое, dict_size: целое):

супер ().__init__()

self.activation_dim = activation_dim

self.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:

вернуть nn.ReLU()(self.encoder_DF (model_activations_D))

def decode (self, encoded_representation_F: torch.Tensor) -> torch.Tensor:

вернуть self.decoder_FD (кодированное_представление_F)

def forward_pass (self, model_activations_D: torch.Tensor) -> кортеж [torch.Tensor, torch.Tensor]:

закодированное_представление_F = самокодирование (активации_модели_D)

восстановленная_модель_активации_D = саморасшифровка (кодированное_представление_F)

вернуть восстановленную_модель_активации_D, закодированное_представление_F

Функция потерь стандартного автокодировщика основана на точности входного результата реконструкции. Чтобы ввести разреженность, самый простой способ — добавить штрафной член за разреженность к функции потерь SAE. Самый распространенный способ расчета этого штрафного члена — взять потерю L1 закодированного представления этого SAE (а не весов SAE) и умножить ее на коэффициент L1. Этот коэффициент L1 является ключевым гиперпараметром в обучении SAE, поскольку он определяет компромисс между достижением разреженности и сохранением точности реконструкции.

Обратите внимание, что это не оптимизировано для интерпретируемости. Вместо этого интерпретируемые функции SAE являются побочным эффектом оптимизации разреженности и реконструкции. Ниже приведена функция эталонных потерь.

# B = размер партии, D = d_model, F = dictionary_size

def calculate_loss (автоэнкодер: SparseAutoEncoder, model_activations_BD: torch.Tensor, l1_coeffient: float) -> torch.Tensor:

восстановленная_модель_активации_BD, закодированное_представление_BF = автокодировщик.передача_пропуска (модель_активации_BD)

ошибка_реконструкции_BD = (реконструированная_модель_активации_BD - модель_активации_BD).pow (2)

ошибка_реконструкции_B = эйнопс.reduce (ошибка_реконструкции_BD, 'BD -> B', 'сумма')

l2_loss = ошибка_восстановления_B.mean ()

l1_loss = l1_coefficient * encoded_representation_BF.sum ()

потеря = l2_потеря + l1_потеря

обратные потери



Схематическая диаграмма прямого прохода разреженного автоэнкодера.

Это одиночный прямой проход разреженного автокодировщика. Сначала идет модельный вектор размером 1x4. Затем это умножается на матрицу кодера 4x8, чтобы получить закодированный вектор 1x8, и применяется ReLU для преобразования отрицательных значений в ноль. Этот закодированный вектор является разреженным. Затем умножьте его на матрицу декодера 8x4, чтобы получить активацию несовершенно реконструированной модели 1x4.

Гипотетическая демонстрация функций SAE

В идеале каждое значимое числовое значение в представлении SAE соответствует некоторому понятному компоненту.

Здесь мы примем случай для иллюстрации. Предположим, что 12 288-мерный вектор [1,5, 0,2, -1,2, ...] представляет «Золотого ретривера» с точки зрения GPT-3. SAE — это матрица формы (49 512, 12 288), но мы также можем думать о ней как о наборе из 49 512 векторов, каждый из которых имеет форму (1, 12 288). Если вектор 317 декодера SAE изучает ту же концепцию «Золотого ретривера», что и GPT-3, то вектор декодера примерно равен [1,5, 0,2, -1,2, ...].

Всякий раз, когда элемент 317 активации SAE не равен нулю, вектор, соответствующий «Золотому ретриверу» (и основанный на величине элемента 317), добавляется к реконструированной активации. С точки зрения механической интерпретации это можно кратко описать как «вектор декодера соответствует линейному представлению особенностей в пространстве остаточного потока».

Можно также сказать, что SAE с 49 512 измерениями закодированного представления имеет 49 512 функций. Функции состоят из соответствующих векторов кодера и декодера. Роль вектора кодера заключается в обнаружении внутренних концепций модели при минимизации взаимодействия других концепций, а роль вектора декодера заключается в представлении «реального» направления признака. Эксперименты исследователей показали, что функции кодирования и декодера каждой функции различны, а среднее косинусное сходство составляет 0,5. На изображении ниже три красных прямоугольника соответствуют отдельным функциям.



Схематическая диаграмма разреженного автоэнкодера, на которой три красных прямоугольника соответствуют функции SAE 1, а зеленый прямоугольник соответствует функции 4. Каждая функция имеет вектор кодера 1x4, активации функции 1x1 и вектор декодера 1x4. Реконструированные активации были построены с использованием только векторов декодера из функций SAE 1 и 4. Если красный прямоугольник представляет «красный цвет», а зеленый — «шар», то модель может обозначать «красный шар».

Так как же нам узнать, что представляет собой гипотетический признак 317? В настоящее время практика заключается в поиске входных данных, которые максимизируют активацию функций и дают интуитивный ответ на их интерпретируемость. Входные данные, которые активируют каждую функцию, обычно интерпретируются.

Например, компания Anthropic обучила SAE на Claude Sonnet и обнаружила, что текст и изображения, связанные с мостом Золотые Ворота, нейробиологией и популярными туристическими достопримечательностями, активируют различные функции SAE. Другие функции будут активироваться концепциями, которые не являются очевидными. Например, особенность SAE, обученного на Pythia, будет активирована концепцией «конечного знака придаточного предложения или предложной фразы, используемой для изменения подлежащего предложения». "

Поскольку вектор декодера SAE имеет ту же форму, что и промежуточные активации LLM, причинное вмешательство может быть выполнено просто путем добавления вектора декодера к активациям модели. Силу этого вмешательства можно регулировать путем умножения этого вектора декодера на коэффициент расширения. Когда исследователи Anthropic добавили вектор декодера SAE «Мост Золотые Ворота» к активации Клода, Клод был вынужден упоминать «Мост Золотые Ворота» в каждом ответе.

Ниже приведена эталонная реализация причинного вмешательства с использованием гипотетического признака 317. Подобно Клоду «Мост Золотые Ворота», это очень простое вмешательство заставляет модель GPT-3 упоминать «золотистого ретривера» в каждом ответе.

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

вектор_вмешательства_D = декодер_FD [317, :]

масштабированный_вектор_вмешательства_D = вектор_вмешательства_D * масштаб

модифицированные_активации_модели_D = активация_модели_D + масштабированный_вектор_вмешательства_D

вернуть измененные_модели_активации_D

Дилемма оценки разреженных автокодировщиков

Одной из основных проблем при использовании SAE является оценка. Мы можем обучить разреженные автокодировщики интерпретации языковых моделей, но у нас нет измеримой базовой истины о представлениях естественного языка. В настоящее время оценка очень субъективна: в основном «мы изучаем активацию ряда признаков, а затем интуитивно объясняем интерпретируемость этих признаков». Это основное ограничение поля интерпретируемости.

Исследователи обнаружили некоторые распространенные прокси, которые, по-видимому, соответствуют интерпретируемости функций. Наиболее часто используемые из них — L0 и Loss Recovered. L0 — среднее количество ненулевых элементов в закодированном промежуточном представлении SAE. Функция Loss Recovered заменяет исходные активации GPT реконструированными активациями и измеряет дополнительную потерю несовершенных результатов реконструкции. Обычно между этими двумя показателями существует компромисс, поскольку SAE может выбрать решение, которое приводит к снижению точности реконструкции, чтобы улучшить разреженность.

При сравнении SAE общий подход состоит в том, чтобы построить график двух переменных, а затем изучить компромиссы между ними. Чтобы добиться лучших компромиссов, многие новые методы SAE (такие как Gated SAE от DeepMind и TopK SAE от OpenAI) изменили штраф за разреженность. Изображение ниже взято из статьи DeepMind Gated SAE. Закрытый SAE представлен красной линией, расположенной в левом верхнем углу графика, которая показывает, что он работает лучше в этом компромиссе.



Закрытый SAE L0 и возмещение потерь

Существует несколько уровней сложности измерения SAE. L0 и Loss Recovered — это два прокси-индикатора. Однако мы не используем их во время обучения, поскольку L0 не является дифференцируемым, а вычисление восстановленных потерь во время обучения SAE требует очень больших вычислительных затрат. Вместо этого наши потери при обучении определяются штрафным членом L1 и точностью восстановления внутренних активаций, а не его влиянием на последующие потери.

Функция потерь обучения не соответствует напрямую суррогатной метрике, а суррогатная метрика является лишь показателем субъективной оценки интерпретируемости признака. Поскольку наша реальная цель — «понять, как работает модель», а субъективные оценки интерпретируемости — всего лишь прокси, возникнет еще один уровень несоответствия. Некоторые важные концепции LLM могут быть непростыми для интерпретации, и мы можем упускать из виду эти концепции, слепо оптимизируя интерпретируемость.

Подведем итог

В области объяснимости еще предстоит пройти долгий путь, но SAE — это настоящий прогресс. SAE обеспечивает новые интересные приложения, такие как неконтролируемый метод поиска векторов управления, например вектор управления мостом Золотые Ворота. SAE также может помочь нам легче находить циклы в языковых моделях, которые можно использовать для устранения ненужной предвзятости внутри модели.

Тот факт, что SAE могут находить поддающиеся интерпретации особенности (даже если цель состоит в том, чтобы просто идентифицировать закономерности в активации), предполагает, что они могут выявить что-то значимое. Есть также свидетельства того, что LLM действительно может научиться чему-то значимому, а не просто запоминать поверхностные статистические закономерности.

SAE также может стать первой вехой, к которой стремились такие компании, как Anthropic, а именно «МРТ (магнитно-резонансная томография) для моделей машинного обучения». SAE пока не обеспечивает идеального понимания, но его можно использовать для обнаружения плохого поведения. Основные проблемы, связанные с SAE и оценкой SAE, не являются непреодолимыми, и многие исследователи уже работают над этой темой.

Для получения дополнительной информации о разреженных автоэнкодерах обратитесь к записной книжке Каллума Макдугала Colab: 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