返回列表

[8th LB Solution] Linguistic Features: PPL & GLTR

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

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

[第8名解决方案] 语言特征:困惑度与GLTR

作者:Abdullah Meda(Kaggle Master)

排名:第8名

发布时间:2024年1月23日

首先,我要感谢Kaggle、The Learning Agency Lab以及@cookiecutters举办了这场如此有趣的竞赛!我确实从这次比赛中学到了很多。对我个人而言,这算是一项巨大的成就,特别是因为我刚从大学毕业仅仅5个月。

能够体验到如此显著的排名提升,我感到非常幸运!虽然我预见到会有一定程度的上升,但没想到这个解决方案的泛化能力会如此出色!

这是我第二次参加竞赛,也是我的第一篇讨论帖。如果我说错或做错了什么,提前在此道歉。欢迎并感激大家的真诚反馈!

总结huggingface.co/spaces/abdullahmeda/detect-ai-text

语言分析:语言模型困惑度

困惑度(PPL)通常被用作评估语言模型(LM)性能的指标。它被定义为文本在语言模型下负对数似然平均值的指数。较低的困惑度表示语言模型对其预测更有信心,因此被认为是一个更好的模型。语言模型的训练是在大规模文本语料库上进行的,可以认为它已经学习了一些常见的语言模式和文本结构。因此,困惑度可以用来衡量文本与常见特征的符合程度。

我使用了开源GPT-2模型的所有变体(除了xl尺寸)来计算收集文本的困惑度(文本级和句子级困惑度)。观察到无论是在文本级别还是句子级别,LLM生成的内容相较于人类书写的文本都具有相对较低的困惑度。LLM捕捉到了其训练文本中的常见模式和结构,并且非常擅长重现它们。因此,LLM生成的文本具有相对集中的低困惑度。

人类有能力根据不同的上下文、受众和写作目的,以多种多样的方式表达自己。这包括使用创造性或富有想象力的元素,如隐喻、明喻和独特的词汇选择,这些都会使GPT-2更难预测。人类书写文本和LLM生成文本的困惑度分布如下图所示。

GLTR:巨型语言模型测试室

这个想法源自以下论文:arxiv.org/pdf/1906.04043.pdf。它研究了3种测试来计算输入文本的特征。他们的主要假设是,为了生成流畅且自然-looking的文本,大多数解码策略都会从分布头部采样高概率的token。我选择了最强大的Test-2特征,即从LM预测的概率分布中,统计位于Top-10、Top-100、Top-1000和1000+排名中的token数量。

获胜解决方案

该实现背后的核心思想来自以下论文:arxiv.org/pdf/2301.07597.pdf。将上述两种技术的特征结合起来,训练了一个VotingClassifier。我首先独立地在44k条daigt v2数据集上计算特征,但只获得了不到0.7的ROC AUC分数。使用@starblasters8分享的80万条数据集才是真正的转折点。PPL和GLTR的分数分别跃升至0.8和0.9。将它们结合并使用更大的模型获得了更好的结果。虽然计算了CV分数,但它对追踪进度的帮助不大,因为它总是接近1。以下是我所有解决方案迭代的分数明细:

数据 特征 模型 Public LB Private LB
44K PPL GPT-2 Small 0.674 0.506
44K GLTR GPT-2 Small 0.637 0.445
44K PPL + GLTR GPT-2 Small 0.661 0.465
800K PPL GPT-2 Small 0.800 0.656
800K GLTR GPT-2 Small 0.910 0.918
800K PPL + GLTR GPT-2 Small 0.923 0.926
800K PPL + GLTR GPT-2 Medium 0.932 0.953
800K PPL + GLTR GPT-2 Large 0.938 0.956
  • 与上述方法结合使用的许多技术往往会对分数产生负面影响,例如:
    • 在测试集的词汇表上训练自己的gpt2分词器
    • 使用T5 DeObfuscator
    • 将对数似然作为特征(对此研究不多)
    • 使用PySpellChecker纠正拼写错误
    • 文本统计分数,如flesch_reading_ease、flesch_kincaid_grade、smog_index、coleman_liau_index等

使用joblib持久化特征和scikit-learn模型,在推理时调用以节省时间。使用此方法的平均提交仅需约10分钟

哪些方法没有奏效?

1. LLM微调

受Hello-SimpleAI/chatgpt-detector-roberta的启发,我使用@starblasters8提供的80万样本数据集对该模型本身以及roberta-large进行了微调。我对这种方法寄予厚望,但在Public和Private LB上的分数分别没有超过0.793和0.674,尽管其CV接近0.98。

查看了@jsday96的这篇讨论后,我认为使用稍大的模型如deberta-v3-large,并将80万数据集扩展到包括Pile或SlimPajama等其他开放数据集会提高分数。不幸的是,我不得不放弃这个想法,因为我既没有处理如此多数据的经验,也没有相应的计算能力!

2. 自定义分词器 & TF-IDF

虽然公共TF-IDF方法获得了非常诱人的分数,但我怀疑它过度拟合了公共测试集。然而,我没想到它会跌至0.89这么低。相比之下,我未选择的最佳提交获得了0.964的分数,这是将TF-IDF与PPL和GLTR方法按相等权重混合的结果。

代码访问

代码可在 kaggle.com/code/abdullahmeda/8th-lb-solution-ppl-gltr-features 找到

参考文献

最后但并非最不重要的一点是,这次讨论是由LLM生成的吗?🤖🤣

同比赛其他方案