소식

희소 오토인코더의 작동 방식에 대한 직관적인 설명은 다음과 같습니다.

2024-08-05

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



기계 심장 보고서

편집자: 팬더

간단히 말해서: 행렬 → ReLU 활성화 → 행렬

SAE(Sparse Autoencoder)는 기계 학습 모델을 해석하기 위한 점점 더 일반적인 도구입니다(SAE는 1997년부터 사용되었지만).

기계 학습 모델과 LLM은 점점 더 강력해지고 유용해지고 있지만 여전히 블랙박스에 불과하며 작업을 어떻게 수행하는지 이해하지 못합니다. 작동 방식을 이해하는 것은 먼 길을 가야 합니다.

SAE는 모델의 계산을 이해할 수 있는 구성 요소로 분해하는 데 도움이 됩니다. 최근 LLM 해석성 연구원인 Adam Karvonen은 SAE의 작동 방식을 직관적으로 설명하는 블로그 기사를 게시했습니다.

해석 가능성 문제

신경망의 가장 자연스러운 구성 요소는 개별 뉴런입니다. 불행하게도 단일 뉴런은 학술 인용, 영어 대화, HTTP 요청, 한국어 텍스트와 같은 단일 개념에 편리하게 대응하지 않습니다. 신경망에서는 개념이 뉴런의 조합을 통해 표현되는데, 이를 중첩이라고 합니다.

그 이유는 세상의 많은 변수가 자연적으로 희박하기 때문입니다.

예를 들어, 유명인의 출생지는 10억 개의 훈련 토큰 중 1개 미만으로 나타날 수 있지만 현대 LLM은 여전히 ​​이 사실과 세계에 대한 풍부한 기타 지식을 배울 수 있습니다. 모델의 뉴런 수보다 훈련 데이터에 더 많은 개별 사실과 개념이 있는데, 이것이 아마도 중첩이 발생하는 이유일 것입니다.

최근에는 신경망을 이해할 수 있는 구성 요소로 분해하는 데 SAE(Sparse Autoencoder) 기술이 점점 더 많이 사용되고 있습니다. SAE의 디자인은 신경과학의 희소 코딩 가설에서 영감을 받았습니다. 오늘날 SAE는 인공 신경망을 해석하는 가장 유망한 도구 중 하나가 되었습니다. SAE는 표준 오토인코더와 유사합니다.

기존 오토인코더는 입력 데이터를 압축하고 재구성하는 데 사용되는 신경망입니다.

예를 들어, 입력이 100차원 벡터(100개의 값을 포함하는 목록)인 경우 오토인코더는 먼저 입력을 인코더 계층을 통해 전달하여 50차원 벡터로 압축한 다음 이를 압축하여 인코딩된 표현을 제공합니다. 100차원 출력 벡터를 얻기 위한 디코더. 압축 프로세스로 인해 재구성 작업이 매우 어려워지기 때문에 재구성 프로세스는 일반적으로 완벽하지 않습니다.



1x4 입력 벡터, 1x2 중간 상태 벡터 및 1x4 출력 벡터가 있는 표준 자동 인코더의 개략도. 셀의 색상은 활성화 값을 나타냅니다. 출력은 입력을 불완전하게 재구성한 것입니다.

희소 오토인코더 설명

희소 자동 인코더의 작동 방식

희소 오토인코더는 입력 벡터를 입력보다 높거나 같거나 낮은 차원을 가질 수 있는 중간 벡터로 변환합니다. LLM에서 사용될 때 중간 벡터는 일반적으로 입력보다 더 높은 차원을 갖습니다. 이 경우 추가 제약 없이 작업이 간단하며 SAE는 단위 행렬을 사용하여 예상치 못한 일 없이 입력을 완벽하게 재구성할 수 있습니다. 그러나 우리는 제약 조건을 추가할 것입니다. 그 중 하나는 훈련 손실에 희소성 페널티를 추가하는 것이며, 이로 인해 SAE는 희소 중간 벡터를 생성하게 됩니다.

예를 들어, 100차원 입력을 200차원 인코딩된 표현 벡터로 확장할 수 있으며 인코딩된 표현에 약 20개의 0이 아닌 요소만 포함하도록 SAE를 훈련할 수 있습니다.



희소 오토인코더의 개략도. 중간 활성화는 0이 아닌 값이 2개뿐이므로 희박합니다.

우리는 많은 레이어를 포함할 수 있는 신경망 내의 중간 활성화에 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를 사용하면 SAE 손실 함수가 희소성을 촉진하므로 49,512차원 SAE로 인코딩된 희소 표현을 얻을 수 있습니다.

일반적으로 우리의 목표는 SAE 표현에 0이 아닌 값을 100개 미만으로 포함하는 것입니다. SAE 표현을 디코더와 곱함으로써 12,288차원 재구성 모델 활성화가 얻어집니다. 희소성 제약으로 인해 완벽한 일치를 달성하기 어렵기 때문에 이 재구성은 원래 GPT 활성화와 완벽하게 일치하지 않습니다.

일반적으로 SAE는 모델의 한 위치에만 사용됩니다. 예를 들어 레이어 26과 27 사이의 중간 활성화에 대해 SAE를 교육할 수 있습니다. GPT-3의 96개 레이어 전체의 출력에 포함된 정보를 분석하기 위해 각 레이어의 출력에 대해 하나씩 96개의 개별 SAE를 훈련할 수 있습니다. 각 계층 내의 다양한 중간 활성화도 분석하려면 수백 개의 SAE가 필요할 것입니다. 이러한 SAE에 대한 교육 데이터를 얻으려면 이 GPT 모델에 많은 양의 다양한 텍스트를 입력해야 하며 선택한 각 위치에 대한 중간 활성화가 수집됩니다.

SAE의 PyTorch 참조 구현이 아래에 제공됩니다. 변수에는 모양으로 주석이 달려 있습니다. 이 아이디어는 Noam Shazeer에서 나왔습니다. https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd를 참조하세요. 성능을 최대화하기 위해 다양한 SAE 구현에는 종종 서로 다른 바이어스 항, 정규화 체계 또는 초기화 체계가 있다는 점에 유의하십시오. 가장 일반적인 추가 사항 중 하나는 디코더 벡터 표준에 대한 일종의 제약입니다. 자세한 내용은 다음 구현을 참조하세요.

  • 오픈AI: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_모델, F = 사전_크기

# 예를 들어 d_model = 12288이고 dictionary_size = 49152인 경우

# 그런 다음 model_activations_D.shape = (12288,) 및 인코더_DF.weight.shape = (12288, 49152)

클래스 SparseAutoEncoder(nn.Module):

단일 레이어 자동 인코더.

def __init__(자기, 활성화_차원: int, dict_size: int):

슈퍼().__init__()

셀프.활성화_딤 = 활성화_딤

자기.dict_size = dict_size

self.encoder_DF = nn.Linear(활성화_차원, 사전_크기, 편향=참)

self.decoder_FD = nn.Linear(dict_size, 활성화_차원, 편향=참)

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

nn.ReLU()(self.encoder_DF(model_activations_D))를 반환합니다.

def decode(self, encoding_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 = self.decode(인코딩된 표현 F)

재구성된 모델 활성화 D, 인코딩된 표현 F를 반환합니다.

표준 오토인코더의 손실 함수는 입력 재구성 결과의 정확성을 기반으로 합니다. 희소성을 도입하기 위한 가장 간단한 방법은 SAE의 손실 함수에 희소성 페널티 항을 추가하는 것입니다. 이 페널티 항을 계산하는 가장 일반적인 방법은 이 SAE(SAE 가중치가 아님)의 인코딩된 표현의 L1 손실을 취하고 L1 계수를 곱하는 것입니다. 이 L1 계수는 희소성 달성과 재구성 정확도 유지 간의 균형을 결정하기 때문에 SAE 훈련의 핵심 하이퍼 매개변수입니다.

이는 해석 가능성에 최적화되어 있지 않습니다. 대신, 해석 가능한 SAE 기능은 희소성 및 재구성 최적화의 부작용입니다. 아래는 기준 손실 함수입니다.

# B = 배치 크기, D = d_model, F = 사전 크기

def calculate_loss(자동 인코더: SparseAutoEncoder, model_activations_BD: torch.Tensor, l1_coeffient: float) -> torch.Tensor:

재구성된 모델 활성화 BD, 인코딩된 표현 BF = 자동 인코더.포워드 패스(모델 활성화 BD)

재구성 오류 BD = (재구성된 모델 활성화 BD - 모델 활성화 BD).pow (2)

재구성_오류_B = einops.reduce(재구성_오류_BD, 'BD -> B', '합계')

l2_loss = 재구성_오류_B.평균()

l1_손실 = l1_계수 * 인코딩된_표현_BF.sum()

손실 = l2_손실 + l1_손실

반사 손실



희소 오토인코더의 순방향 전달에 대한 개략도.

이는 희소 오토인코더의 단일 정방향 전달입니다. 첫 번째는 1x4 크기의 모델 벡터입니다. 그런 다음 여기에 4x8 인코더 행렬을 곱하여 1x8 인코딩된 벡터를 얻고 ReLU를 적용하여 음수 값을 0으로 바꿉니다. 이 인코딩된 벡터는 희박합니다. 그런 다음 8x4 디코더 매트릭스를 곱하여 불완전하게 재구성된 1x4 모델 활성화를 얻습니다.

가상 SAE 기능 데모

이상적으로 SAE 표현의 각 중요한 숫자 값은 이해할 수 있는 구성 요소에 해당합니다.

여기서는 예시를 위한 사례를 가정합니다. 12,288차원 벡터 [1.5, 0.2, -1.2, ...]가 GPT-3의 관점에서 "골든 리트리버"를 나타낸다고 가정합니다. SAE는 모양이 (49,512, 12,288)인 행렬이지만 각각 모양이 (1, 12,288)인 49,512개의 벡터 집합으로 생각할 수도 있습니다. SAE 디코더의 317 벡터가 GPT-3과 동일한 "골든 리트리버" 개념을 학습하는 경우 디코더 벡터는 대략 [1.5, 0.2, -1.2, ...]와 같습니다.

SAE 활성화의 317 요소가 0이 아닐 때마다 "골든 리트리버"에 해당하는 벡터(및 317 요소의 크기를 기반으로 함)가 재구성된 활성화에 추가됩니다. 기계적인 해석 가능성 측면에서 이는 "디코더 벡터가 잔여 스트림 공간의 특징에 대한 선형 표현에 해당합니다"라고 간결하게 설명할 수 있습니다.

49,512차원의 인코딩된 표현을 가진 SAE는 49,512개의 특징을 가지고 있다고 말할 수도 있습니다. 기능은 해당 인코더와 디코더 벡터로 구성됩니다. 인코더 벡터의 역할은 다른 개념의 간섭을 최소화하면서 모델의 내부 개념을 감지하는 것이고, 디코더 벡터의 역할은 "실제" 특징 방향을 나타내는 것입니다. 연구진의 실험에서는 각 기능의 인코더와 디코더 기능이 서로 다르며, 코사인 유사도 중앙값이 0.5인 것으로 나타났습니다. 아래 이미지에서 세 개의 빨간색 상자는 개별 기능에 해당합니다.



희소 오토인코더의 개략도. 여기서 세 개의 빨간색 상자는 SAE 기능 1에 해당하고 녹색 상자는 기능 4에 해당합니다. 각 기능에는 1x4 인코더 벡터, 1x1 기능 활성화 및 1x4 디코더 벡터가 있습니다. 재구성된 활성화는 SAE 기능 1과 4의 디코더 벡터만 사용하여 구성되었습니다. 빨간색 상자가 "빨간색"을 나타내고 녹색 상자가 "공"을 나타내는 경우 모델은 "빨간 공"을 나타낼 수 있습니다.

그렇다면 가정된 특징 317이 무엇을 나타내는지 어떻게 알 수 있습니까? 현재는 기능 활성화를 최대화하고 해석 가능성에 대한 직관적인 응답을 제공하는 입력을 찾는 것이 관행입니다. 각 기능을 활성화하는 입력은 일반적으로 해석 가능합니다.

예를 들어 Anthropic은 Claude Sonnet에서 SAE를 교육한 결과 금문교, 신경과학, 인기 있는 관광 명소와 관련된 텍스트와 이미지가 다양한 SAE 기능을 활성화한다는 사실을 발견했습니다. 다른 기능은 명확하지 않은 개념에 의해 활성화됩니다. 예를 들어, Pythia에서 훈련된 SAE의 기능은 "문장의 주제를 수정하는 데 사용되는 관계사절 또는 전치사구의 최종 토큰"이라는 개념에 의해 활성화됩니다. "

SAE 디코더 벡터는 LLM의 중간 활성화와 동일한 모양을 가지므로 모델 활성화에 디코더 벡터를 추가하는 것만으로 인과 개입을 수행할 수 있습니다. 이 개입의 강도는 이 디코더 벡터에 확산 인자를 곱하여 조정할 수 있습니다. Anthropic 연구원들이 Claude의 활성화에 "Golden Gate Bridge" SAE 디코더 벡터를 추가했을 때 Claude는 모든 응답에서 "Golden Gate Bridge"를 언급해야 했습니다.

아래는 가설된 특징(317)을 사용한 인과적 개입의 참조 구현입니다. "골든 게이트 브리지" 클로드와 유사하게, 이 매우 간단한 개입으로 인해 GPT-3 모델은 모든 응답에서 "골든 리트리버"를 언급하게 됩니다.

def perform_intervention(모델 활성화 D: 토치 텐서, 디코더 FD: 토치 텐서, 스케일: 플로트) -> 토치 텐서:

개입 벡터 D = 디코더 FD [317, :]

스케일된 개입 벡터 D = 개입 벡터 D * 스케일

수정된 모델 활성화 D = 모델 활성화 D + 확장된 개입 벡터 D

modified_model_activations_D를 반환합니다.

희소 오토인코더의 평가 딜레마

SAE를 사용할 때의 주요 과제 중 하나는 평가입니다. 언어 모델을 해석하기 위해 희소 자동 인코더를 훈련할 수 있지만 자연어 표현에 대한 측정 가능한 기본 실제 정보는 없습니다. 현재 평가는 매우 주관적입니다. 기본적으로 "우리는 일련의 기능의 활성화 입력을 연구한 다음 이러한 기능의 해석 가능성을 직관적으로 설명합니다." 이것이 해석 가능성 분야의 주요 한계입니다.

연구자들은 기능 해석 가능성에 해당하는 것으로 보이는 몇 가지 일반적인 프록시를 발견했습니다. 가장 일반적으로 사용되는 것은 L0 및 손실 복구입니다. L0은 SAE의 인코딩된 중간 표현에서 0이 아닌 요소의 평균 개수입니다. 손실 복구는 GPT의 원래 활성화를 재구성된 활성화로 대체하고 불완전한 재구성 결과의 추가 손실을 측정합니다. SAE는 희박성을 개선하기 위해 재구성 정확도를 감소시키는 솔루션을 선택할 수 있으므로 일반적으로 이 두 측정항목 간에는 절충점이 있습니다.

SAE를 비교할 때 일반적인 접근 방식은 두 변수를 표시한 다음 두 변수 사이의 장단점을 조사하는 것입니다. 더 나은 절충안을 달성하기 위해 DeepMind의 Gated SAE 및 OpenAI의 TopK SAE와 같은 많은 새로운 SAE 방법이 희소성 페널티를 수정했습니다. 아래 그림은 DeepMind의 Gated SAE 논문에서 가져온 것입니다. Gated SAE는 그래프의 왼쪽 상단에 있는 빨간색 선으로 표시되며, 이는 이러한 절충안에서 더 나은 성능을 발휘함을 나타냅니다.



게이트된 SAE L0 및 손실 복구

SAE 측정에는 여러 수준의 어려움이 있습니다. L0 및 손실 복구는 두 가지 프록시 지표입니다. 그러나 L0은 미분 가능하지 않고 SAE 훈련 중 복구된 손실을 계산하는 데 계산 비용이 매우 많이 들기 때문에 훈련 중에는 이를 사용하지 않습니다. 대신, 훈련 손실은 다운스트림 손실에 대한 영향보다는 L1 페널티 항과 내부 활성화 재구성의 정확성에 의해 결정됩니다.

훈련 손실 함수는 대리 측정항목과 직접적으로 일치하지 않으며, 대리 측정항목은 기능 해석 가능성에 대한 주관적인 평가를 위한 프록시일 뿐입니다. 우리의 실제 목표는 "모델이 어떻게 작동하는지 이해"하는 것이고 주관적인 해석 가능성 평가는 단지 프록시일 뿐이므로 불일치의 또 다른 계층이 있을 것입니다. LLM의 일부 중요한 개념은 해석하기 쉽지 않을 수 있으며, 해석 가능성을 맹목적으로 최적화하면서 이러한 개념을 간과할 수 있습니다.

요약하다

설명 가능성 분야는 아직 갈 길이 멀지만 SAE는 진정한 발전입니다. SAE는 Golden Gate Bridge 조향 벡터와 같은 조향 벡터를 찾기 위한 비지도 방법과 같은 흥미로운 새로운 애플리케이션을 가능하게 합니다. SAE는 또한 언어 모델에서 루프를 더 쉽게 찾는 데 도움이 되며, 이는 모델 내에서 불필요한 편견을 제거하는 데 사용될 수 있습니다.

SAE가 해석 가능한 특징을 찾을 수 있다는 사실(단순히 활성화의 패턴을 식별하는 것이 목표일지라도)은 SAE가 의미 있는 것을 밝힐 수 있음을 시사합니다. LLM이 단순히 피상적인 통계 패턴을 암기하는 것이 아니라 실제로 의미 있는 것을 배울 수 있다는 증거도 있습니다.

SAE는 또한 Anthropic과 같은 회사가 목표로 삼은 "기계 학습 모델을 위한 MRI(자기 공명 영상)"라는 초기 이정표를 나타낼 수도 있습니다. SAE는 아직 완벽한 이해를 제공하지는 않지만 잘못된 동작을 감지하는 데 사용할 수 있습니다. SAE 및 SAE 평가의 주요 과제는 극복할 수 없는 것이 아니며 많은 연구자들이 이미 이 주제에 대해 연구하고 있습니다.

희소 자동 인코더에 대한 추가 소개는 Callum McDougal의 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