透過嵌入進行成員推論
透過距離式推論、統計檢定與嵌入行為分析,判定特定資料是否存在於嵌入模型的訓練集之中。
成員推論(membership inference)攻擊判定特定資料是否曾納入嵌入模型的訓練集。這是一個與隱私相關的問題:它可揭露某組織的專有資料是否在未經同意下被用於訓練商用模型、某個人的個資是否存在於系統中,或某資料集是否違反授權條款被使用。
成員推論為何可行
嵌入模型和所有機器學習模型一樣,對「曾於訓練時看過的資料」和「沒看過的資料」行為不同。這種行為差異構成一個可透過細心分析偵測的訊號。
過擬合訊號
模型往往對其訓練資料略有過擬合,對訓練樣本產出更「有把握」的表示。對嵌入模型而言,這反映為:
- 較低的重建損失 — 模型對訓練資料編碼更有效率
- 較高的自我相似度 — 訓練資料的嵌入在擾動下更一致
- 叢集趨近 — 訓練樣本比非訓練樣本更接近叢集中心
- 維度集中 — 訓練資料產生在特定維度上更集中的嵌入
記憶化訊號
大型模型會記憶訓練資料的一部分。對嵌入模型而言,記憶資料會產生具獨特性質的嵌入:
- 在特定維度上出現更極端的值
- 與相關訓練範例嵌入具更高的餘弦相似度
- 在輸入擾動下表現出更可預測的嵌入行為
距離式推論
最簡單的成員推論做法,是比較候選文字與已知參照點之間的嵌入距離。
自我相似度測試
嵌入候選文字與其細微擾動版本。訓練資料在擾動下通常具更一致(自我相似)的嵌入:
def self_similarity_test(text, model, num_perturbations=50):
"""透過自我相似度檢定文字是否在訓練資料中。"""
original_embedding = model.encode(text)
perturbation_similarities = []
for _ in range(num_perturbations):
# 建立細微擾動(錯字、換詞、同義替換)
perturbed = create_perturbation(text)
perturbed_embedding = model.encode(perturbed)
similarity = cosine_similarity(original_embedding, perturbed_embedding)
perturbation_similarities.append(similarity)
# 訓練資料通常平均相似度較高
# (對擾動較穩健)
avg_similarity = np.mean(perturbation_similarities)
std_similarity = np.std(perturbation_similarities)
return {
'mean_similarity': avg_similarity,
'std_similarity': std_similarity,
'likely_member': avg_similarity > THRESHOLD # 請校準門檻
}最近鄰距離
訓練資料在嵌入空間中往往比非訓練資料更接近其最近鄰:
def nearest_neighbor_test(text, model, reference_corpus):
"""為成員與非成員資料比較最近鄰距離。"""
target_embedding = model.encode(text)
reference_embeddings = model.encode(reference_corpus)
# 計算對最近參照點的距離
distances = [
1 - cosine_similarity(target_embedding, ref)
for ref in reference_embeddings
]
min_distance = min(distances)
# 訓練資料通常具較小的最近鄰距離
return min_distance統計檢定
更嚴謹的做法是以統計檢定區分成員與非成員嵌入。
似然比檢定
比較嵌入在「成員」模型與「非成員」模型下的似然:
def likelihood_ratio_test(embedding, member_distribution, nonmember_distribution):
"""計算成員推論的似然比。"""
# 以已知成員與非成員嵌入擬合分布
member_likelihood = member_distribution.log_prob(embedding)
nonmember_likelihood = nonmember_distribution.log_prob(embedding)
ratio = member_likelihood - nonmember_likelihood
return ratio # 正值 = 可能為成員校準信心檢定
以已知樣本訓練一個分類器來區分成員與非成員嵌入:
from sklearn.ensemble import RandomForestClassifier
def train_membership_classifier(known_members, known_nonmembers, model):
"""訓練預測成員身分的分類器。"""
member_embeddings = [model.encode(t) for t in known_members]
nonmember_embeddings = [model.encode(t) for t in known_nonmembers]
X = np.vstack(member_embeddings + nonmember_embeddings)
y = [1] * len(member_embeddings) + [0] * len(nonmember_embeddings)
# 自嵌入擷取特徵
features = extract_embedding_features(X) # Norm、維度統計等
clf = RandomForestClassifier(n_estimators=100)
clf.fit(features, y)
return clf
def predict_membership(text, model, classifier):
embedding = model.encode(text)
features = extract_embedding_features(embedding.reshape(1, -1))
probability = classifier.predict_proba(features)[0][1]
return probability成員推論的特徵工程
用於分類的特徵包括:
| 特徵 | 描述 | 成員訊號 |
|---|---|---|
| 嵌入範數 | 向量的 L2 範數 | 成員的範數可能較一致 |
| 維度變異量 | 各維度的變異量 | 成員可能呈現較低變異量 |
| 峰度 | 維度分布的尖度 | 成員可能呈現較高峰度 |
| 自我相似度 | 擾動下的相似度 | 成員展現較高自我相似度 |
| 重建誤差 | 經自編碼器重建的誤差 | 成員具較低重建誤差 |
| 最近鄰距離 | 至最近參照點的距離 | 成員距鄰居較近 |
實務情境
偵測未授權的資料使用
某組織懷疑某商用嵌入服務以其專有文件訓練。可對已知專有文字進行成員推論測試:
# 測試專有文件是否曾用於訓練
proprietary_texts = load_proprietary_documents()
public_texts = load_public_documents_same_domain()
# 比較成員分數
proprietary_scores = [membership_score(t, target_model) for t in proprietary_texts]
public_scores = [membership_score(t, target_model) for t in public_texts]
# 統計檢定:專有文件分數是否顯著較高?
from scipy.stats import mannwhitneyu
statistic, p_value = mannwhitneyu(proprietary_scores, public_scores, alternative='greater')
print(f"p-value: {p_value}") # p-value 低暗示專有資料曾被使用個人資料是否存在
判定某位特定個人的資料是否存在於 AI 系統中,與 GDPR 下資料主體存取請求有關:
# 測試某位個人的 email 是否在訓練資料中
individual_texts = [
"Meeting with Sarah regarding Q3 projections",
"Please find attached the revised contract for Project Atlas",
# ... 更多已知該個人之文字
]
for text in individual_texts:
score = membership_score(text, target_model)
print(f"Membership score: {score:.4f} - {text[:50]}...")訓練資料稽核
模型供應商可將成員推論作為稽核工具,用以驗證其訓練管線是否正確排除已選擇退出或受限的資料。
限制與注意事項
針對嵌入模型的成員推論存在多項重要限制:
偽陽性率。 與訓練資料非常相似(同領域、相似措辭)的文字可能得高分而被判為成員,即便未在訓練集中。此技術偵測的是與訓練資料的相似度,而非精確成員身分。
模型規模依賴。 較大模型記憶較多、較易被成員推論攻擊。較小模型可能不出現可偵測的成員訊號。
訓練資料多樣性。 以高度多樣資料訓練的模型較難探測,因為沒有任一樣本被多次看到時,成員訊號會較弱。
訓練後處理。 量化、蒸餾與微調可能改變成員訊號,降低推論準確度。