593. LLM - Detect AI Generated Text | llm-detect-ai-generated-text
感谢竞赛组织者创建了如此有趣的比赛!我学到了很多。也祝贺其他获奖者!
在以下数据集的不同混合上微调了 deberta-v3-large 和 mamba-790m:
| 数据集 | 人类文档数 | 生成文档数 |
|---|---|---|
| PERSUADE论文 | 25,996 | 327,268 |
| 无版权Pile补全 | 512,371 | 512,371 |
| SlimPajama补全 | 233,146 | 233,146 |
| Tricky Crawl | 125,192 | 0 |
各个模型在集成中的采样比例有所不同,但一个反复出现的模式是,除了Pile数据外,其他所有数据都被欠采样。最佳模型使用了62-99%的Pile数据,这是我们最高质量的数据集。PERSUADE论文始终占数据混合的1%。
在测试时,我们的推理笔记本执行以下操作:
我对这种领域适应策略为何有益的直觉是,短上下文学生模型学会了寻找与长上下文模型在更广文档中寻找的内容相关的特定数据集措辞怪癖。这个策略主要受到SimCLR的启发,但事后看来,我也意识到它类似于Noisy Student Training和UDA。
仅使用全上下文DeBERTa模型在私有排行榜上得分为0.970,Mamba模型得分约为0.957。最终学生模型在没有Mamba的情况下得分为0.977,有Mamba时为0.972。我们没有将最佳提交选为最终的3个提交之一,因此获得了第5名而不是第3名。此外,我们使用的DeBERTa模型并非最佳……我们有一个模型单独得分0.976,无需领域适应。
创建此数据集的一般策略是:从The Pile随机选择文档,随机截断它们,然后提示本地托管的LLM生成文档最后25-75%的合理续写。我最初使用了一个包含版权数据且不再公开可用的旧版Pile,但过滤后仅保留基于无版权限制子集的文档补全,这些子集仍公开可用。
使用以下模型生成文档补全。以下文档数量来自后处理过滤后(如果我没记错的话,大约丢弃了16%的数据)。
| 模型 | 文档数量 |
|---|---|
| Airoboros-L2-13B-2.1-AWQ | 46,358 |
| CodeLlama-34B-AWQ | 29,885 |
| falcon-7b | 11,178 |
| Llama-2-13B-AWQ | 61,531 |
| Llama-2-13B-chat-AWQ | 43,145 |
| Llama-2-70B-AWQ | 31,297 |
| Mistral-7B-Instruct | 46,825 |
| Mistral-7B-v0.1 | 61,851 |
| mpt-7b | 12,232 |
| OpenHermes-2.5-Mistral-7B | 21,221 |
| StableBeluga2-70B-AWQ | 21,046 |
| WizardCoder-Python-34B-V1.0-AWQ | 41,716 |
| WizardLM-70B-V1.0-AWQ | 41,979 |
| zephyr-7b-beta | 42,093 |
对于基础模型,提示只是文档前缀。对于指令或聊天调优的模型,我将文档前缀随机分成两部分,第一部分用于形成"用户"指令,请求对文档进行合理续写,第二部分用作"引导词",在模型通常填充的token序列部分中(在类似"### Response:"的标记之后,具体取决于模型期望的格式)。引导词有助于确保模型生成看起来合理的文档补全,而不会出现奇怪的前缀或拒绝。
这些数据分两个阶段生成。我从早期数据训练模型观察到的结果以及为最后约15%所做的更改如下:
我创建此数据集的方式与最后一批Pile补全非常相似,只是使用了来自SlimPajama的源文档而不是Pile,并且模型组合略有不同。生成这些数据的目的在于,希望减轻因过滤掉Pile中有问题(版权)部分而导致的精度损失。它在公共排行榜上并没有太大帮助,但可能在私有排行榜上有所帮助——我需要更仔细地回顾分数。
我用于创建此数据集的模型组合如下:
| 模型 | 文档数量 |
|---|---|
| airoboros-l2-70B-gpt4-1.4.1-AWQ | 23,399 |
| deepseek-coder-33B-base-AWQ | 20,718 |
| dolphin-2.6-mistral-7b | 24,168 |
| Mistral-7B-Instruct-v0.2 | 24,813 |
| Mistral-7B-v0.1 | 24,618 |
| mixtral-8x7b-v0.1-AWQ | 24,609 |
| Mixtral-8x7B-Instruct-v0.1-GPTQ | 24,581 |
| Nous-Hermes-2-SOLAR-10.7B-AWQ | 22,833 |
| Nous-Hermes-Llama2-AWQ | 18,741 |
| SOLAR-10.7B-v1.0-AWQ | 24,623 |
我对SlimPajama的一个担忧是(这也是我最初没有使用它的原因),它包含收集于ChatGPT发布之后的互联网文本,因此可能会有一些AI生成文本被错误标记为训练时的"人类"文本。这可能就是为什么它似乎比Pile数据质量更低的原因。
我为与PERSUADE语料库中学生论文相同的作业生成了超过30万篇论文。这些论文分为3个子集,采用不同的生成策略:
不幸的是,与Pile数据相比,这些论文并不是很有用。我的分类器似乎很快就会过拟合,需要更多样化的数据才能很好地泛化。
这是通过过滤The Pile的Common Crawl子集(Pile-CC)创建的,目的是提取出被2个中等强度的通用AI内容检测模型误分类为AI生成的人类撰写文本。其中一个分类器基于deberta-v3-base,另一个基于deberta-v3-xsmall。
用于最终提交模型训练的此数据集版本是通过过滤150万文档创建的,提取出对受害者分类器来说最混乱的约12.5万篇文档。
此数据集背后的总体思路是通过增加训练数据集中棘手人类文本的数量来减少假阳性。以5%的采样比例(即5%的训练示例来自此数据集)将其混合到训练数据集中,似乎对短上下文模型有益,但对全上下文模型没有太大差异。
竞赛组织者的数据似乎有些损坏,因此我们解决方案中的模型经过以下数据增强步骤以提高鲁棒性:
mamba-790m的速度大致与deberta-v3-large相当,尽管参数超过2倍,但在训练期间消耗的GPU内存更少。由于它是结构化状态空间模型而非Transformer,因此似乎具有一些重大效率优势。
mamba-790m在Pile数据的本地CV上做得几乎和DeBERTa一样好(低0.001-0.002),在公共排行榜上也几乎一样好(比"不幸"的DeBERTa运行低约0.003,比"良好"的DeBERTa运行低约0.006)。主要差异出现在私有排行榜上。Mamba的得分从公共到私有基本保持不变,而大多数DeBERTa模型跃升了约0.01。结果,Mamba在公共排行榜上似乎略有作用,以低权重集成时,但在私有排行榜上却拖累了我们。
我认为Mamba在这里的弱点并非真正由于架构缺陷或结构化状态空间模型天生劣于Transformer,而是因为这是我第一次使用Mamba,我在竞赛最后3-4天匆忙训练它。此外,mamba-ssm库似乎主要用于文本生成,而非分类,因此用于此类工作负载并不太直接。
详细说明我训练时的错误,我通常像这样初始化Mamba模型:
model = MambaLMHeadModel.from_pretrained("state-spaces/mamba-790m")
model.lm_head = nn.Linear(model.config.d_model, 2)
这导致其输出形状为(batch size, token count, 2)的预测。在早期训练中,我使用如下操作从每个序列的最后一个token获取类别标签预测:
raw_predictions = output.logits[:, -1, :]
这种方法的问题在于token序列是填充的,填充影响了预测。通过使用如下操作从填充开始前最后一个token获取预测:
last_token_indices = torch.clamp(attention_masks.sum(dim = 1) - 1, min = 0)
raw_predictions = torch.gather(
logits,
dim=1,
index=last_token_indices.unsqueeze(1).unsqueeze(2).expand(-1, -1, logits.shape[2])
).squeeze(1)
似乎使最佳学习率提高了约8倍,并允许在相对小规模的训练运行中(仅对10万个示例文档进行一个epoch)更快地收敛到更准确的模型。然而,当我尝试以更高的学习率扩展到更多数据时,它变得不稳定。弄清楚这一点后,我并没有太多时间正确地训练它。因此,第5名解决方案使用的2个Mamba模型是通过以下非理想设置训练的:
mamba-ssm库不支持dropout。