脏数据,垃圾代码 | AI生成和翻译
TRAINING DIAGNOSIS
模型已正确训练(427k 次迭代,最终验证损失 3.466),并且确实学到了 一些真实内容——困惑度从 50,304(随机)下降到 32.3。但 生成输出是垃圾。原因如下:
PROBLEM 1:训练数据过于杂乱(主要问题) codeparrot/github-code 数据集是未经整理的原始 GitHub 转储: - 仅约 54% 的实际代码 - 约 31% 的许可证/版权样板头部 - 约 12% 的 HTML 文档(javadoc、doxygen、生成页面) - 约 2% 的配置/JSON 文件
一个 124M 的模型在近一半训练数据是噪音的情况下无法学习有意义的代码模式。
PROBLEM 2:空格 Token 主导 数据集中所有 Token 的 26% 是单个空格(Token 220)。 模型学到的最安全预测总是空格: “def quicksort(arr):” 之后 → 46.8% 空格,10.8% 换行 这是将代码缩进解释为信号而非结构。
PROBLEM 3:欠拟合,而非过拟合 训练损失(约 3.63)高于验证损失(约 3.54)。 模型没有记住——它根本无法学习模式。 它需要更干净的数据或更大的容量。
PROBLEM 4:验证损失 3.466(困惑度 32)对于代码来说过高 参考: GPT-2 124M 在 OpenWebText(英文)上:约 2.85 损失(困惑度约 17) CodeParrot-small 110M 在代码上:约 3.0 损失(困惑度约 20) 本模型:3.47 损失(困惑度约 32)
在困惑度 32 时,模型无法可靠预测下一个 Token, 因此生成退化为最常见的 Token(空格)。
WHAT TO DO
Option A(最佳):清理数据并重新训练
- 过滤掉 HTML 密集的文件(’<’ 计数 > 阈值)
- 删除主要包含许可证/版权头部的文件
- 删除少于 200 个字符的文件(配置存根)
- 去重样板内容
- 仅此一项即可将损失降至约 3.0-3.1
Option B:使用经过整理的数据集
- The Stack v2(BigCode)——已按质量过滤
- StarCoder 训练数据
- 或者在 Token 化之前直接过滤 codeparrot/github-code
Option C:训练更长时间
- 在 427k 次迭代时损失仍在下降
- 或许 800k-100 万次迭代会有所帮助,但数据质量是瓶颈
Option D:转换为 GGUF 并用作代码补全辅助
- 即使在困惑度 32 时,它仍具有一些代码知识
- 可用于带约束解码的自动补全类任务
- 但不要期望它能生成完整函数
需要我编写一个数据清理脚本来过滤 parquet 文件并重新进行 Token 化吗?这是影响最大的修复方法。