593. LLM - Detect AI Generated Text | llm-detect-ai-generated-text
感谢所有参与者带来的精彩竞赛时光和激烈角逐!
我使用了以下数据集:
此阶段保留了全部15个提示词。
数据集被合并为3个:训练数据集(包含所有数据)、仅包含LLM数据的数据集(Mistral数据与Gemini数据,全部标记为1)、原始数据集(99%为人类文本,标记为0),并将其命名为train_old(具体原因已记不清!)。
这是一个简单快速但必要的阶段,作为保险措施,原因如下:
我训练模型预测每个测试文本的prompt_name。
我统计了prompt_ids的唯一数量(我知道是5个,但希望解决方案更具通用性)。
我从9000+测试集中选择了重复次数最多的前N个prompt_names(N等于prompt_ids的唯一数量)。
通过这种方式,我确保了测试集中使用的prompt_names都被覆盖(此方法也可应用于其他数据集)。
确定测试集中使用的提示词后,我仅从训练数据集中选择对应的文本。
我没有对LLM数据集或old_train执行此操作(希望保留更通用的数据以减少过拟合)。
后续基于Levenshtein距离添加错误校正功能——参考了 @piotrkoz 的讨论帖和 @wickkey2 发布的方法(节省了我编写类似代码的时间)。
错误校正应用于所有训练数据集和测试数据集。
我仅使用了5000的词汇表大小,已足够。
我创建了3个分词后的数据集:Train、test以及test+llm_data(用于拟合)。
使用3到6/7个词的n-gram范围,min_df = 2(效果最佳)
至此,公开榜得分约为0.976/7(含拼写检查),不含拼写检查时为0.972/3;据我所知,私有榜得分在0.894到0.905之间。
我意识到这还不够,在私有榜中很可能会表现不佳,因此继续深入探索。
我尝试了多种方法:词干提取、词性标注、词形还原、句子混合等,但效果不佳,直到 @mustafakeser4 分享了distilroberta的结果。
我重新尝试distilroberta,达到了0.915的分数。但最终我选择了他0.913版本的模型(0.927版本在公开榜上并未显示出更高的集成效果,因此我选择了表现稍弱的模型),没有使用自己的模型是因为其集成效果略低。
我将distilroberta的结果与Ridge模型结果集成,使公开榜得分从0.972提升至0.975。
由于测试数据经过某种处理,难以构造足够相似的训练数据,我想:为何不直接用测试集进行训练?
我对集成模型的结果进行排序(当时为0.975),选择得分最高的X行作为AI生成文本,得分最低的Y行作为人类文本(首次实验X和Y均为1000),将其加入训练并重新评分,得分从0.975提升至0.982。
我重复此过程4次(最后一次实验重复了5次),每次将X和Y增加200/250行,最终达到0.983的公开榜得分和0.922的私有榜得分。
我将第十一阶段的Top X和Bottom Y数据作为distilroberta的验证数据(需要快速训练——在提交的同时进行训练!)
训练几个epoch(最佳为4.0),选择得分最高的模型。
生成新得分,并与第十二和第十一阶段的最终结果集成,得到公开榜0.982、私有榜0.957(不含第十一阶段)以及0.953(含第十一阶段)的得分。
以上是我的公开榜解决方案总结。
我没有选择自己表现最佳的方案:/ 这令人沮丧,但我必须接受这个错误并继续前行。
我还不确定效率奖的得分情况!不敢抱太大期望:/