返回列表

[21th Solution] Secret Sauce [0.986 Public - Selected Private: 0.932 Best:0.957]

593. LLM - Detect AI Generated Text | llm-detect-ai-generated-text

开始: 2023-10-31 结束: 2024-01-22 AI安全与对抗 数据算法赛

[第21名解决方案] 秘密武器 [公开榜: 0.986 - 选定私有榜: 0.932 最佳: 0.957]

作者:Ali

发布时间:2024年1月23日

投票数:87

感谢所有参与者带来的精彩竞赛时光和激烈角逐!

LB解决方案:- 秘密武器

第一阶段:数据集选择

我使用了以下数据集:

  • DAIGT V2 训练数据集(来自 @thedrcat
  • LLM: Mistral-7B 指令文本(来自 @carlmcbrideellis
  • LLM 额外数据集(私有 - 由我生成),使用与 @carlmcbrideellis 相同的方式从 Mistral-7B 生成
  • Gemini Pro LLM - DAIGT(由我生成,公开)
  • 竞赛官方数据集

第二阶段:数据集准备

此阶段保留了全部15个提示词。
数据集被合并为3个:训练数据集(包含所有数据)、仅包含LLM数据的数据集(Mistral数据与Gemini数据,全部标记为1)、原始数据集(99%为人类文本,标记为0),并将其命名为train_old(具体原因已记不清!)。

第三阶段:训练LogisticRegression进行prompt_name分类

这是一个简单快速但必要的阶段,作为保险措施,原因如下:
我训练模型预测每个测试文本的prompt_name。
我统计了prompt_ids的唯一数量(我知道是5个,但希望解决方案更具通用性)。
我从9000+测试集中选择了重复次数最多的前N个prompt_names(N等于prompt_ids的唯一数量)。
通过这种方式,我确保了测试集中使用的prompt_names都被覆盖(此方法也可应用于其他数据集)。

第四阶段:选择训练数据集

确定测试集中使用的提示词后,我仅从训练数据集中选择对应的文本。
我没有对LLM数据集或old_train执行此操作(希望保留更通用的数据以减少过拟合)。

第五阶段:拼写校正阶段

后续基于Levenshtein距离添加错误校正功能——参考了 @piotrkoz 的讨论帖和 @wickkey2 发布的方法(节省了我编写类似代码的时间)。
错误校正应用于所有训练数据集和测试数据集。

第六阶段:字节对编码(BPE)的魔力——感谢 @datafan07 的黄金方案

我仅使用了5000的词汇表大小,已足够。
我创建了3个分词后的数据集:Train、test以及test+llm_data(用于拟合)。

第七阶段:Tf-idf

使用3到6/7个词的n-gram范围,min_df = 2(效果最佳)

第八阶段:MaxAbsScaler + Ridge/LinearSVR 足矣

至此,公开榜得分约为0.976/7(含拼写检查),不含拼写检查时为0.972/3;据我所知,私有榜得分在0.894到0.905之间。

我意识到这还不够,在私有榜中很可能会表现不佳,因此继续深入探索。

第九阶段:训练不同Transformer模型

我尝试了多种方法:词干提取、词性标注、词形还原、句子混合等,但效果不佳,直到 @mustafakeser4 分享了distilroberta的结果。
我重新尝试distilroberta,达到了0.915的分数。但最终我选择了他0.913版本的模型(0.927版本在公开榜上并未显示出更高的集成效果,因此我选择了表现稍弱的模型),没有使用自己的模型是因为其集成效果略低。

第十阶段:集成

我将distilroberta的结果与Ridge模型结果集成,使公开榜得分从0.972提升至0.975。

第十一阶段:秘密武器——0.932和0.957私有榜得分的来源

由于测试数据经过某种处理,难以构造足够相似的训练数据,我想:为何不直接用测试集进行训练?
我对集成模型的结果进行排序(当时为0.975),选择得分最高的X行作为AI生成文本,得分最低的Y行作为人类文本(首次实验X和Y均为1000),将其加入训练并重新评分,得分从0.975提升至0.982。
我重复此过程4次(最后一次实验重复了5次),每次将X和Y增加200/250行,最终达到0.983的公开榜得分和0.922的私有榜得分。

第十二阶段:更多调料

  • 这次我选择了测试集中得分接近中位数的50行
  • 计算这些行与训练数据的相似度,找出最相似的X行(X设为10)
  • 重新训练Ridge模型并更新这50行的得分
  • 这使得公开榜得分提升至0.984,私有榜提升至0.929

第十三阶段:仍需更多Transformer

我将第十一阶段的Top X和Bottom Y数据作为distilroberta的验证数据(需要快速训练——在提交的同时进行训练!)
训练几个epoch(最佳为4.0),选择得分最高的模型。
生成新得分,并与第十二和第十一阶段的最终结果集成,得到公开榜0.982、私有榜0.957(不含第十一阶段)以及0.953(含第十一阶段)的得分。

以上是我的公开榜解决方案总结。

我没有选择自己表现最佳的方案:/ 这令人沮丧,但我必须接受这个错误并继续前行。

我还不确定效率奖的得分情况!不敢抱太大期望:/

同比赛其他方案