嵌入反演攻擊
由嵌入向量重建輸入文字的技術:模型特定反演方法、隱私意涵,以及對抗嵌入反演的防禦。
嵌入反演(embedding inversion)將嵌入過程逆轉:給定向量,攻擊者還原出產生該向量的文字。這之所以重要,是因為嵌入常被視為「非敏感衍生資料」,相較原始文件所受保護較少。若反演可行,則嵌入必須以等同於原始文件的嚴謹度加以保護。
反演模型架構
嵌入反演模型通常訓練為 seq-to-seq 模型:輸入為向量,輸出為文字。
訓練反演模型
訓練流程需要一批(文字、嵌入)配對資料:
# 步驟 1:產生訓練資料
training_pairs = []
for text in corpus:
embedding = target_model.encode(text)
training_pairs.append((embedding, text))
# 步驟 2:訓練反演模型
# 架構:嵌入向量 → 解碼器 → 文字 token
class InversionModel(nn.Module):
def __init__(self, embedding_dim, vocab_size, hidden_dim=512):
super().__init__()
self.projection = nn.Linear(embedding_dim, hidden_dim)
self.decoder = nn.TransformerDecoder(
nn.TransformerDecoderLayer(d_model=hidden_dim, nhead=8),
num_layers=6
)
self.output = nn.Linear(hidden_dim, vocab_size)
def forward(self, embedding, target_tokens):
# 將嵌入投影至解碼器的隱藏空間
memory = self.projection(embedding).unsqueeze(0)
# 解碼出文字 token
output = self.decoder(target_tokens, memory)
return self.output(output)攻擊者所需具備的條件
要訓練出有效的反演模型,攻擊者需要:
- 目標嵌入模型或近似替代品。 反演模型必須以目標系統使用的同一模型(或相近模型)所產生之嵌入來訓練。
- 與目標領域相近的文字語料。 以 Wikipedia 語料訓練的反演模型,對醫療紀錄表現會很差。領域吻合的訓練資料可大幅提升還原品質。
- 足夠的算力。 訓練反演模型所需的 GPU 資源,約可與微調小型語言模型相比擬。
反演品質與期望
嵌入反演並不會產出完美重現的原文。還原品質受多項因素影響。
通常可被還原的內容
跨多個嵌入模型的研究顯示:
| 還原層級 | 能捕捉的內容 | 範例 |
|---|---|---|
| 主題/領域 | 大致主題範圍 | 從臨床病歷推出「醫療診斷」 |
| 關鍵實體 | 命名實體、技術術語 | 「Smith 病患」、「metformin」、「第二型糖尿病」 |
| 核心語意 | 文字的主要涵義 | 「病患因糖尿病被處方藥物」 |
| 近似措辭 | 類似但不完全相同的用語 | 原文的同義、換句話 |
| 逐字還原 | 完全相同的原文 | 罕見;在短而獨特的輸入較可能 |
影響還原品質的因素
嵌入維度。 更高維度的嵌入(text-embedding-3-large 為 1536、較新模型為 3072)保留較多資訊,較易被反演。低維度嵌入(all-MiniLM-L6-v2 為 384)丟失較多資訊,較難完整反演。
輸入長度。 較短輸入較易被完整還原,因為嵌入涵蓋了較高比例的資訊。一段被壓縮成 1536 維的 10 字句子,其每字保留的資訊量高於 500 字段落。
詞彙獨特性。 含獨特詞彙(技術術語、專有名詞、冷僻語句)的文字,比泛泛文字更易被還原,因獨特 token 會在嵌入中留下較強痕跡。
訓練資料品質。 以領域內資料訓練的反演模型,還原效果顯著優於以一般文本訓練者。
模型特定技術
OpenAI 嵌入
OpenAI 的嵌入模型(text-embedding-ada-002、text-embedding-3-small、text-embedding-3-large)廣泛使用且有大量研究:
# 對 OpenAI 嵌入的反演思路
# 攻擊者無法存取模型權重,因此需使用已訓練之反演模型
# 以領域吻合語料產生訓練資料
import openai
def generate_training_data(texts):
pairs = []
for text in texts:
response = openai.embeddings.create(
model="text-embedding-3-small",
input=text
)
embedding = response.data[0].embedding
pairs.append((embedding, text))
return pairs
# 於這些配對上訓練反演模型
# 再對自向量資料庫擷取到的目標嵌入套用OpenAI 模型為黑箱,攻擊者需仰賴反演模型的泛化能力。還原品質屬中等:關鍵實體與主題通常可還原,但確切措辭難以重現。
開源模型
開源嵌入模型(Sentence Transformers、E5、BGE)較易遭反演,因攻擊者可完整存取模型:
# 有模型存取權時,攻擊者除了訓練式反演,
# 還可使用梯度式反演
def gradient_inversion(model, target_embedding, num_steps=1000):
# 以隨機 token 嵌入初始化
input_embeds = torch.randn(1, max_len, model.config.hidden_size,
requires_grad=True)
optimizer = torch.optim.Adam([input_embeds], lr=0.01)
for step in range(num_steps):
optimizer.zero_grad()
output = model(inputs_embeds=input_embeds)
current_embedding = output.last_hidden_state.mean(dim=1)
# 最小化與目標嵌入的距離
loss = 1 - torch.nn.functional.cosine_similarity(
current_embedding, target_embedding
)
loss.backward()
optimizer.step()
# 將最佳化後的嵌入映射回最接近的 token
return find_nearest_tokens(model, input_embeds)隱私意涵
嵌入反演對資料保護與隱私有重大意涵:
法規面考量
依 GDPR 及類似法規,凡可識別個人的資料即構成個人資料。若嵌入可被反演以還原含個人資訊之文字,則嵌入本身也可能被歸類為個人資料,並因此適用:
- 資料主體存取請求(有權得知所儲存之資料)
- 刪除權(於來源資料刪除時一併刪除嵌入)
- 嵌入管線的資料保護影響評估
- 嵌入儲存的跨境傳輸限制
實務隱私情境
- 人資文件之嵌入供搜尋。 員工紀錄的嵌入可能被反演還原出薪資、績效考核或懲處紀錄。
- 客戶通訊之嵌入供客服。 支援單的嵌入可能揭露客戶姓名、帳戶細節與申訴歷史。
- 醫療紀錄之嵌入供臨床搜尋。 臨床病歷的嵌入可能暴露診斷、用藥與病患識別碼。
防禦與其侷限
降維
在儲存前縮減嵌入的維度(例如由 1536 降為 256 維)可減少可供反演利用的資訊。但這也會降低檢索品質。
差分隱私
在嵌入儲存前加入經過校準的雜訊,可提供理論性的隱私保證。挑戰在於:足以防止反演的雜訊量,往往也會降低檢索效能。
嵌入量化
將嵌入量化為較低精度(例如由 float32 降為 int8)可減少可供反演利用的資訊,對檢索品質的影響低於降維。
針對向量的存取控制
最有效的防禦是阻止未授權者存取嵌入向量。這代表要將向量資料庫設定為查詢結果中不回傳向量值(只回傳 ID 與相似度分數),並限制對資料庫的直接存取。
相關主題
- 經由向量資料庫的資料外洩 — 將反演納入外洩流程
- 對抗性嵌入 — 相反方向:刻意打造特定嵌入
- 成員推論 — 較輕量的隱私攻擊