動態對抗資料收集(DADC)於 MNIST – Hugging Face 教學

TL;DR

Hugging Face 發布了一份實用指南,示範在 MNIST 手寫數字任務上執行動態對抗資料收集(DADC),讓使用者能透過 Gradio 🤗 Space 收集對抗樣本、標記它們,並透過迭代式重新訓練模型以提升韌性。

什麼是動態對抗資料收集?

動態對抗資料收集(DADC)以一個迴圈取代靜態基準,讓人類產生刻意欺騙最先進模型的輸入。此迴圈帶來兩大好處:它揭示模型的真實韌性,並產生不斷成長、符合人類需求的資料集,可用於訓練更強大的模型。多輪重複「欺騙‑再訓練」的循環,會得到更符合人類期望的模型。

設定 MNIST 模型

本教學從定義一個簡單的 MNIST 捲積神經網路開始:

class MNIST_Model(nn.Module):
    def __init__(self):
        super(MNIST_Model, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x)

定義完架構後,模型會在標準的 MNIST 訓練/驗證切分上進行訓練。

透過 🤗 Spaces 與模型互動

當基線模型訓練完成(此範例在 20 個 epoch 後達到 89 % 的測試準確率),本指南示範如何透過 Gradio 🤗 Space 將其公開。使用者可在畫布上手寫數字,模型會回傳預測結果。Space 的網址為 https://huggingface.co/spaces/chrisjay/simple-mnist-classification。此互動示範即是收集對抗輸入的入口。

標記對抗樣本

當使用者成功欺騙模型時,該範例會被標記

  1. 將對抗影像保存至資料集。
  2. 當標記樣本數達到門檻後,模型會在擴充後的資料集上重新訓練。
  3. 步驟 1‑2 會在多輪中重複執行。 本教學提供自訂的 flag 函式(完整原始碼請見 .../mnist-adversarial/blob/main/app.py#L314)。Gradio 也提供內建的標記回呼函式,相關文件位於 https://gradio.app/using_flagging/。

端對端示範

將模型定義、互動 Space 與標記邏輯三個元件結合,即成為名為 MNIST Adversarial 的單一示範 (https://huggingface.co/spaces/chrisjay/mnist-adversarial)。使用者可直接測試系統、產生對抗樣本,並觀察模型在重新訓練後的改進情形。

影響與社群發現

DADC 透過持續注入人類產生的邊緣案例,克服靜態基準的限制,如飽和與隱藏偏見。部落格引用 Eric Wallace 等人(2022)的研究,指出雖然非對抗式資料收集可能帶來短期效益,DADC 卻能在自然語言推理任務上達到最高的長期準確率。同樣的原理亦適用於視覺任務,如 MNIST,因為靜態測試集中對多樣化手寫風格的代表性不足。

結論

動態對抗資料收集使得建立不會飽和、符合人類需求的資料集成為可能,並透過迭代式的欺騙‑再訓練迴圈提升模型韌性。Hugging Face 的教學示範,使用 🤗 Spaces 與 Gradio 即可輕鬆構建完整的 DADC 流程,降低研究人員與實務工作者採用此方法的門檻。

Sources