动态对抗数据收集(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 的 URL 为 https://huggingface.co/spaces/chrisjay/simple-mnist-classification。这个交互式演示是收集对抗输入的入口。
标记对抗样本
当用户成功欺骗模型时,示例会被 标记:
- 对抗图像被保存到数据集中。
- 当标记的样本数量达到阈值后,模型在扩展后的数据集上重新训练。
- 步骤 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 流水线非常简便,降低了研究者和实践者采用该方法的门槛。