當特徵數量超過模型維度時
理想的情況下,神經網絡的世界應該是每個神經元只對一個特徵進行反應。這樣的話,解釋模型會變得簡單明瞭:這個神經元對狗耳朵特徵反應,那個神經元對車輪反應。不幸的是,現實並非如此。實際上,當模型的維度 d 通常需要表示 m 個特徵時,d < m。這時我們會觀察到重疊現象。
在機器學習的背景下,重疊指的是模型中的一個神經元代表多個重疊的特徵,而不是單一的特徵。例如,InceptionV1 模型中有一個神經元同時對貓臉、車的前面和貓的腿進行反應。這導致我們可以在同一個神經元或電路中觀察到不同特徵的重疊激活。
重疊的存在使得模型的可解釋性變得困難,特別是在深度學習模型中,隱藏層的神經元代表複雜的模式組合,而不是與簡單、直接的特徵相關聯。
在這篇文章中,我們將通過 Python 的簡單範例來展示重疊現象,並在這個筆記本中詳細實現。
我們首先討論“特徵”這個術語。
在表格數據中,定義特徵幾乎沒有模糊性。例如,當使用表格數據集預測葡萄酒的品質時,特徵可以是酒精的百分比、年份等等。
然而,當處理非表格數據(如圖像或文本數據)時,定義特徵可能變得複雜。在這些情況下,沒有普遍認可的特徵定義。廣義上來說,特徵可以被認為是輸入的任何屬性,對大多數人類來說都是可識別的。例如,在大型語言模型 (LLM) 中,一個特徵可能是某個單詞是否是法語。
當特徵的數量超過模型的維度時,就會發生重疊。我們認為,重疊發生需要滿足兩個必要條件:
- 非線性:神經網絡通常在每個隱藏層的末尾包含非線性激活函數,例如 sigmoid 或 ReLU。這些激活函數使得網絡能夠以非線性的方式將輸入映射到輸出,從而捕捉特徵之間更複雜的關係。如果沒有非線性,模型將表現得像一個簡單的線性變換,特徵仍然保持線性可分,無法通過重疊進行維度壓縮。
- 特徵稀疏性:特徵稀疏性意味著只有一小部分特徵是非零的。例如,在語言模型中,許多特徵不會同時出現:例如,同一個單詞不能同時是法語和其他語言。如果所有特徵都是密集的,我們可以想像由於重疊表示而產生的重要干擾,這使得模型很難解碼特徵。
合成數據集
讓我們考慮一個玩具範例,包含 40 個特徵,特徵重要性線性遞減:第一個特徵的重要性為 1,最後一個特徵的重要性為 0.1,其餘特徵的重要性均勻分佈在這兩個值之間。
然後我們使用以下代碼生成合成數據集:
def generate_sythentic_dataset(dim_sample, num_sample, sparsity): """根據稀疏性生成合成數據集"""dataset=[]for _ in range(num_sample): x = np.random.uniform(0, 1, n)mask = np.random.choice([0, 1], size=n, p=[sparsity, 1 - sparsity])x = x * mask # 應用稀疏性dataset.append(x)return np.array(dataset)
這個函數創建一個合成數據集,具有給定的維度數量,在我們的例子中是 40。對於每個維度,從 [0, 1] 的均勻分佈中生成一個隨機值。稀疏性參數在 0 到 1 之間變化,控制每個樣本中活躍特徵的百分比。例如,當稀疏性為 0.8 時,每個樣本中的特徵有 80% 的機會為零。該函數應用一個掩碼矩陣來實現稀疏性設置。
線性和 ReLU 模型
我們現在想探討基於 ReLU 的神經模型如何導致重疊形成,以及稀疏性值如何改變它們的行為。
我們將實驗設置如下:將 40 維的特徵壓縮到 5 維空間,然後通過反向過程重建向量。觀察這些變換的行為,我們期望看到在每種情況下重疊是如何形成的。
為此,我們考慮兩個非常相似的模型:
- 線性模型:一個只有 5 個係數的簡單線性模型。回想一下,我們想處理 40 個特徵——這遠遠超過模型的維度。
- ReLU 模型:一個幾乎與線性模型相同的模型,但在末尾增加了一個 ReLU 激活函數,引入了一個非線性的層次。
這兩個模型都是使用 PyTorch 構建的。例如,我們用以下代碼構建 ReLU 模型:
class ReLUModel(nn.Module):def __init__(self, n, m):super().__init__()self.W = nn.Parameter(torch.randn(m, n) * np.sqrt(1 / n))self.b = nn.Parameter(torch.zeros(n))
def forward(self, x):h = torch.relu(torch.matmul(x, self.W.T)) # 添加 ReLU 激活: x (batch, n) * W.T (n, m) -> h (batch, m)x_reconstructed = torch.relu(torch.matmul(h, self.W) + self.b) # 使用 ReLU 進行重建return x_reconstructed
根據代碼,n 維的輸入向量 x 通過與 m×n 的權重矩陣相乘被投影到低維空間。我們然後通過 ReLU 變換將其映射回原始特徵空間,並調整偏置向量。線性模型的結構類似,唯一的區別是重建僅使用線性變換,而不是 ReLU。我們通過最小化原始特徵樣本和重建樣本之間的均方誤差來訓練模型,並根據特徵重要性進行加權。
我們用不同的稀疏性值訓練了這兩個模型:0.1、0.5 和 0.9,從較少稀疏到最稀疏。我們觀察到幾個重要的結果。
首先,無論稀疏性水平如何,ReLU 模型“壓縮”特徵的效果都比線性模型好:線性模型主要捕捉具有最高特徵重要性的特徵,而 ReLU 模型則能通過重疊形成來關注較不重要的特徵——在這裡,一個模型維度代表多個特徵。讓我們在以下可視化中觀察這一現象:對於線性模型,偏置對前五個特徵的影響最小(如果你不記得的話:特徵重要性是根據特徵順序定義的線性遞減函數)。相比之下,ReLU 模型的偏置並未顯示出這種順序,並且通常減少得更多。
另一個重要且有趣的結果是:當特徵的稀疏性水平較高時,更容易觀察到重疊現象。為了感受這一現象,我們可以可視化矩陣 W^T@W,其中 W 是模型中的 m×n 權重矩陣。人們可以將矩陣 W^T@W 解釋為輸入特徵如何投影到低維空間的量:
特別地:
- W^T@W 的對角線表示每個特徵在低維轉換空間中的“自相似性”。
- 矩陣的非對角線表示不同特徵之間的相關性。
我們現在可視化之前構建的線性模型和 ReLU 模型在兩個不同稀疏性水平(0.1 和 0.9)下的 W^T@W 值。你可以看到,當稀疏性值高達 0.9 時,非對角線元素相比於稀疏性為 0.1 的情況變得更大(你實際上不會看到兩個模型輸出之間有太大差異)。這一觀察表明,當稀疏性高時,不同特徵之間的相關性更容易被學習。
在這篇文章中,我進行了一個簡單的實驗,介紹了神經網絡中重疊的形成,通過比較維度少於特徵的線性模型和 ReLU 模型。我們觀察到,ReLU 激活引入的非線性,結合一定程度的稀疏性,可以幫助模型形成重疊。
在現實世界的應用中,這些應用比我的簡單範例要複雜得多,重疊是表示神經模型中複雜關係的重要機制,特別是在視覺模型或大型語言模型 (LLM) 中。
[1] Zoom In: An Introduction to Circuits. https://distill.pub/2020/circuits/zoom-in/
[2] Toy models with superposition. https://transformer-circuits.pub/2022/toy_model/index.html
本文由 AI 台灣 運用 AI 技術編撰,內容僅供參考,請自行核實相關資訊。
歡迎加入我們的 AI TAIWAN 台灣人工智慧中心 FB 社團,
隨時掌握最新 AI 動態與實用資訊!