空白折叠压倒上下文 | AI生成和翻译
以下是您提供的 Markdown 内容的中文翻译:
以下是由 613 个标记的上下文产生的内容。让我分析一下提示结束后的延续部分:
示例 1:
free(classroom[i]->name);
data(s, &n, &n,->n1);
然后大约 250 个字符的纯空白。
示例 2:
free(classroom[i]->name);
if(p->size() == 1)
然后大约 250 个字符的纯空白。
示例 3:
free(classroom[i]->name);
= 1;
m[i - i] + 1] + 1_t;
然后大约 200 个字符的纯空白。
发生了什么
好消息仍然存在。 在 613 个标记的上下文下,模型确实生成了 C/C++ 标记——data(s, &n, &n,->n1)、if(p->size() == 1)、m[i - i] + 1]——这些在语法上是合理的片段。它甚至试图保持正确的风格:在循环内的 free() 调用后,它生成了更多的 C 语句。这表明上下文条件作用正在发挥作用。
但三个明显的问题仍然可见:
-
它无法完成明显正确的下一行。 提示在
free(classroom[i]->name);处结束——任何人类都会自然写出free(classroom[i]); }作为下一行。模型做不到。它生成了语法上相似但语义上错误的内容 (data(s, &n, &n,->n1))。这是 124M + PPL 32 的症状:它有足够的局部统计信息来生成 一个 C 语句,但不足以生成 正确的 C 语句。 -
在延续大约 10 个标记后,它会塌缩为空白。 所有三个样本都生成了一行伪 C 代码,然后填充了 200 多个空白字符。这是模型的空白先验在重新发挥作用。它有足够的上下文来“启动”一段延续,但在 10 个标记后,上下文信号减弱,它回退到训练数据中的主导模式:空白和缩进。这直接来自于数据质量问题——github-code 包含大量的空白序列(许可证头、空行、缩进),模型最强的先验是“在不确定时,发出空白。”
-
_乱码仍然存在,但有所减轻。 样本 3 中的_t,样本 1 中的->n1。这些是经过 BPE 切分的标识符片段。与 3 标记上下文相比,出现的频率降低,但仍然可见。
诊断更新
613 个标记的测试确认了之前答案的诊断,但有一个细化:
- “活的、训练不足的、分词不佳的” — 已确认。模型显然在根据上下文进行条件作用(在 C 提示后生成 C 标记,而不是
<div>标签),但无法维持。 - 空白塌缩 比之前的答案暗示的更严重。即使有 613 个标记的上下文,模型也只会生成大约 10 个标记的伪代码,然后陷入空白陷阱。这意味着空白问题不仅是短上下文的产物——它是一个数据分布问题,在任何上下文长度下都会持续存在。模型已经学会了“空白是最常要发出的内容”,即使有丰富的上下文,它也无法摆脱这个先验。这使得数据清洗手段比之前答案的优先级更高。
修订后的优先级排序
| 排名 | 手段 | 原因 |
|---|---|---|
| 1 | 数据清理 | 在 613 个标记处出现的空白塌缩证明数据质量是第一大问题。富含空白的训练数据 → 空白优先的模型。 |
| 2 | 分词器 | 仍然重要——_t、->n1 是 BPE 的伪影。但不如数据问题关键。 |
| 3 | 延长训练 | 仅在 #1 和 #2 修复后才有用。 |
还有一件事可以尝试
在相同提示上以 temperature=0.0(贪婪解码)运行。如果贪婪解码也在 10 个标记后塌缩为空白,则确定是数据/权重问题(模型给空白分配了最高概率)。如果贪婪解码生成了一个完整的函数,那么这是采样问题,权重比看起来要好。