语言模型的类人词序偏好:从语法规则到泛化能力检验

📅 2026/8/27 2:37:57
语言模型的类人词序偏好:从语法规则到泛化能力检验
语言模型Language Models在大量文本上学会了预测下一个词但真正能说明它理解结构的问题是它能否像人类一样对词序形成系统性偏好并泛化到没有见过的新组合。这个现象对应标题里所说的 Human-like Word Order Preferences。人类语言并不允许任意排列词语主语、宾语、动词的相对顺序会形成稳定类型语言模型通过训练数据获得的语序偏好可能只是记忆频率也可能是抽象规则。下面从概念、实验设计、代码实现和排错路径几个层次把这个问题讲清楚。1. 为什么词序偏好能检验语言模型的抽象能力1.1 词序是人类语言的底层排序规则几乎所有自然语言都会对主语、宾语、动词的相对位置作出约束。语言类型学中通常用 S、V、O 三个角色来描述基本语序SVO主语、动词、宾语例如英语、法语、中文普通话。SOV主语、宾语、动词例如日语、韩语、土耳其语。VSO动词、主语、宾语例如威尔士语、他加禄语。VOS、OVS、OSV相对少见但并非不存在。人类语言在大范围内表现出的这种规律性说明词序不是随意的“排列组合”。一种语言会稳定地选择某一种或少数几种基本语序并且这一选择会影响短语层面的其他结构比如介词是前置还是后置、关系从句放在名词前还是名词后。当语言模型在语料上训练时它看到的是已经带有固定语序的句子。模型的目标是预测下一个 token因此它会记住“哪些 token 经常出现在哪些位置上”。问题是这种记忆是否能在面对新词、新组合、甚至其他语言结构时仍然产生与人类选择一致的偏好1.2 “类人词序偏好”与“语法正确”的区别“模型能生成语法正确的句子”并不等于“模型具有类人的词序偏好”。语法正确通常意味着模型学会了训练数据中的高频模式。例如英语模型知道 “Alice praised Bob” 比 “Alice Bob praised” 更像一句自然的英语。这是统计频率学习的结果几乎任何 n-gram 模型都能做到一点。更难的是泛化。人类不会把语序规则锁死在具体单词上。当我们把一组全新名词放进句子框架时人类能立刻判断哪种顺序符合自己的语言直觉。类人的词序偏好还体现为一种系统偏好即使所有候选顺序都不出现在训练语料中人类也不会随机选择而是会根据语言类型学规律选出最接近母语结构的顺序。语言模型是否也能做到这一点这正是标题里 Generalize 的含义。Generalize 不是记住也不是在训练集内拟合而是在新刺激上产生稳定的、类似人类的选择。1.3 语言模型在哪一层编码语序信息Transformer 语言模型通常依靠两类信息编码语序位置编码无论是绝对位置编码、相对位置编码还是旋转位置编码都在告诉模型 token 的先后位置。注意力模式模型可以通过注意力权重观察到哪些 token 经常出现在动词之前哪些经常出现在动词之后。在预训练阶段模型通过下一词预测不断调整这些参数。因此tensor 内部是否存在语序偏好取决于训练语料中语序分布的统计特征以及模型容量是否足够提取这种特征。词序偏好实验的价值在于它提供了一种“行为探针”。我们不需要切开模型看内部向量只需要输入同一组词的所有排列观察模型给出概率的高低就能判断它对语序结构是否敏感。2. 词序偏好实验的设计路线2.1 把研究问题变成可计算的问题要测量“类人词序偏好”先要把抽象问题转成可计算的形式。可以拆成三个具体问题给定同一组词的不同排列语言模型是否系统性地偏好其中某些排列这种偏好是否与人类语言类型学中的语序频率有关这种偏好是否能在不同词汇、不同句子模板之间保持一致三个问题共同构成一个评估框架。第一个问题验证稳定性第二个问题验证“类人性”第三个问题验证“泛化性”。缺少任何一个实验结果都很难说明模型真的具有类人词序偏好。2.2 构建刺激材料从最小句子对到全排列最简单的刺激材料是“最小句子对”即只改变一个词语顺序的成对句子。例如正常语序Alice praised Bob。非正常语序Alice Bob praised。但最小句子对只能验证单一方向无法构建完整的偏好分布。更可靠的方法是采用全排列选取一个主语词、一个动词、一个宾语词然后生成所有六种排列。这样可以在同一组词汇上比较模型对所有可能语序的偏好。六种排列可以按角色顺序表示为语序标签角色顺序示例排列仅展示位置SVOS V OAlice praised BobSOVS O VAlice Bob praisedVSOV S Opraised Alice BobVOSV O Spraised Bob AliceOVSO V SBob praised AliceOSVO S VBob Alice praised表里的示例只是为了说明“哪个角色出现在哪个位置”并不代表这些句子在英语中都是合法表达。正式实验中还需要为每个排列固定语义角色。例如不管顺序如何我们都可以约定角色标签 S 和 O 分别对应固定的实体动词 V 对应固定的动作这样才能排除语义反转造成的影响。在实际研究里刺激材料还需要进一步控制词汇频率尽量接近避免模型因为某个词更常见而给出更高概率。避免使用有明显语义倾向的动词例如 “murder”“help”“praise” 可能让模型更关注世界知识。可以引入无意义词模仿儿童语言习得中的 Wug Test检验模型是否会纯从句法位置出发判断语序。2.3 选择能反映偏好的指标模型的输出是下一个词的概率分布。要比较不同句子常用三个指标句子总对数概率total log probability把所有 token 的预测概率取对数后相加。数值越高说明模型认为整句越自然。缺点是 token 长度不一致时会偏向短句。平均 token 对数概率mean log probability对总对数概率除以 token 数缓解长度偏差。困惑度perplexity等于平均负对数概率的指数值越低代表模型越偏爱该句子。在语序全排列实验中推荐使用平均 token 对数概率。因为不同排列很可能在子词切分上产生不同数量的 token只比较总概率会混入 token 数量的影响。此外还可以记录排序后的rank或top-1 rate。例如对每一种语序类型统计模型把它排在第一位的比例。这个指标更容易和人类受试实验的结果进行比较。2.4 用语言类型学数据作为人类基准人类偏好不能只靠常识判断需要借助语言类型学数据库。常用的参考是 WALSThe World Atlas of Language Structures世界语言结构图册。它收录了大量语言的语序特征例如主语、宾语、动词的基本语序。介词与名词短语的先后顺序。关系从句与名词的先后顺序。如果模型在多个语言上表现出与 WALS 统计一致的偏好例如 SVO 和 SOV 语言优先选择 “动词紧邻宾语” 的排列那就可以说模型具备了一定的人类类似偏置。需要注意WALS 统计的是“语言类型分布”不是“usage frequency”。两个概念在结果解读时不能混用。3. 用 Transformers 跑通一个最小实验3.1 环境准备下面代码用于测量一个预训练因果语言模型对六种语序排列的偏好。先准备环境依赖用途建议版本Python运行脚本3.9 或更高PyTorch模型推理2.0 以上transformers加载预训练模型4.30 以上scipy统计检验1.10 以上安装命令pip install torch transformers scipy如果机器有 GPU模型会自动放到 GPU 上没有 GPU 也可以使用 CPU只是速度会慢一些。下面的示例默认使用gpt2模型实验前可以先确认这个模型能否从本地或远端下载。3.2 构建句子排列生成器假设我们用一个主语Alice、一个动词praised、一个宾语Bob构成语义角色。先生成六种角色顺序from itertools import permutations roles [S, V, O] permuted_roles list(permutations(roles)) tokens { S: Alice, V: praised, O: Bob, } def roles_to_text(role_tuple, tokens): return .join(tokens[r] for r in role_tuple) for p in permuted_roles: print(.join(p), roles_to_text(p, tokens))输出会包含SVO、SOV、VSO、VOS、OVS、OSV六种排列。这里的tokens字典把角色映射到具体单词正式实验中建议使用多个不同的动词和名词组合避免结果被单个句子带偏。3.3 计算句子平均对数概率加载模型并计算每个排列的对数概率import torch from transformers import AutoTokenizer, AutoModelForCausalLM model_name gpt2 tokenizer AutoTokenizer.from_pretrained(model_name) model AutoModelForCausalLM.from_pretrained(model_name) model.eval() device torch.device(cuda if torch.cuda.is_available() else cpu) model.to(device) if tokenizer.pad_token is None: tokenizer.pad_token tokenizer.eos_token def mean_log_prob(text): enc tokenizer(text, return_tensorspt) input_ids enc[input_ids].to(device) attention_mask enc[attention_mask].to(device) with torch.no_grad(): logits model(input_ids, attention_maskattention_mask).logits[0] log_probs torch.log_softmax(logits, dim-1) # logits[i] 预测第 i1 个 token因此取 logits[:-1] # 对应目标 input_ids[1:] target_ids input_ids[0, 1:] token_log_probs log_probs[:-1].gather(1, target_ids.unsqueeze(1)).squeeze(1) return token_log_probs.mean().item(), len(target_ids) results [] for p in permuted_roles: text roles_to_text(p, tokens) mlp, ntokens mean_log_prob(text) results.append((text, .join(p), mlp, ntokens)) for text, label, mlp, ntokens in sorted(results, keylambda x: -x[2]): print(f{label:5s} {text:25s} mean_log_prob{mlp:.4f} tokens{ntokens})代码里有三个关键点mean_log_prob计算的是“模型看到前面 token 后正确预测下一个 token 的能力”。排列越自然下一个 token 越容易预测平均对数概率越高。取logits[:-1]是因为最后一个位置没有目标 token 可预测。只计算了非第一个 token因此第一个 token 的初始概率不参与计算。这避免了句子开头特殊处理带来的噪声。3.4 运行结果如何解读在英语预训练模型gpt2上运行通常会看到SVO排列的mean_log_prob最高。这是因为英语训练语料中绝大多数句子都是 SVO 结构。如果只得到这一个结论实验价值有限。更有意义的观察是第二高的排列是什么是SOV还是VSO不同语言模型可能给出不同答案。六种排列之间分数差距是大还是小如果差距很大说明模型对语序非常敏感如果差距很小说明模型对词序依赖较弱。更换主语、动词、宾语后偏好排序是否保持不变如果保持稳定说明模型形成了系统性语序偏好而不是记住了某个具体句子。这部分属于行为分析。正式研究需要把多个句子模板汇总统计每种语序类型的平均分数和标准差然后做显著性检验。4. 结果解读从模型偏好到语言类型学对照4.1 模型偏好和人类语序频率的相关性人类语言中最常见的基本语序是 SOV 和 SVO接下来是 VSO而 OVS 和 OSV 非常少见。如果模型在一种混合语言或无特定语序约束的刺激材料上也把高概率分配给 SOV 和 SVO那么它的偏好就和人类语言类型分布有一致性。但要注意这里存在一个主要干扰因素预训练模型会受训练语料主导。用英语模型测出来的偏好本质上是“受过英语语序影响的偏好”。要证明模型具备抽象的类人词序泛化需要使用多语言模型或者输入多个不同语言的句子模板观察模型偏好是否会随语言上下文切换。一个可行的做法是把实验扩展到多语言使用gpt2测英语。使用日文模型或支持日文的模型测日语。使用多语言模型如mGPT、XGLM统一测多种语言。然后分别计算模型偏好的语序排名与人类语言实际语序排名之间的相关性。4.2 用 Spearman 相关做显著性检验可以把每种语序的“人类语言数量排名”和“模型平均分数排名”做 Spearman 相关。示例代码如下from scipy.stats import spearmanr human_rank { SOV: 1, SVO: 2, VSO: 3, VOS: 4, OVS: 5, OSV: 6, } model_rank { SVO: 1, SOV: 2, VSO: 3, VOS: 4, OVS: 5, OSV: 6, } labels list(human_rank.keys()) h_ranks [human_rank[k] for k in labels] m_ranks [model_rank[k] for k in labels] rho, p_value spearmanr(h_ranks, m_ranks) print(fSpearman rho {rho:.3f}, p {p_value:.4f})上面的human_rank和model_rank是示意数据。正式实验中人类排名应来自 WALS 语种计数或人类受试行为实验模型排名应来自多个句子模板的平均分数。相关性越高说明模型偏好和人类语序分布越接近。4.3 强语法先验与弱先验的区分模型可能表现出两种不同强度的语序先验强度高几乎所有句子模板都稳定地选择同一种语序无论词汇如何变化。强度低不同句子模板之间排序不稳定模型对语序不敏感。类人的语序偏好应当表现为“适当强度的强先验”集中在人类常见语序上但又不是完全拒绝其他顺序。因为人类在诗歌、倒装句、口语省略中也能处理非典型语序。如果模型对六种排序给出非常极端的一二分分布可能反而是过拟合而不是泛化。5. 排查链路模型偏好不对时从哪查起5.1 Token 切分不一致导致的概率虚高不同排列可能在 BPE 切分后得到不同的 token 数。例如Alice praised Bob可能被切成 4 个 token而Bob Alice praised可能被切成 5 个 token。如果只用总对数概率比较token 数更多的排列会相对吃亏。解决方式是使用平均 token 对数概率并把 token 数打印出来检查。推荐做法print(text, tokenizer.tokenize(text), tokenizer(text, return_tensorspt)[input_ids].shape)如果发现某个排列被切出奇怪的子词例如Alice被切成两个 token而Bob是一个 token就要考虑换用更不易被切分的专有名词或字符级 tokenizer。5.2 语义和词汇频率噪声模型对句子的判断不只是句法判断它同时也会利用世界知识。Alice praised Bob比Bob praised Alice可能更符合模型记忆中的人物关系导致分数偏差。为了区分语义噪声和语序偏好可以尝试使用没有明显世界知识倾向的词汇例如red、blue、follows等组合。使用无意义词例如wug、blicket。对每一组词汇同时测两个方向S V O和O V S看模型是否总是偏好某类排列。5.3 语言和模型不匹配用英语模型测试日语的 SOV 偏好结果一定不理想。因为模型根本没有足够日语训练数据。如果研究目标是跨语言泛化应该使用多语言模型或者在测试前确认模型的训练语言覆盖范围。常见处理是英文模型只做英文实验。日文模型只做日文实验。多语言模型可以对比不同语言但要注意各语言训练数据占比差异。最好在结果表格里记录模型名称、模型参数量、训练语言和输入语言。5.4 按顺序逐层排查问题现象可能原因检查方式处理建议模型总偏好某一个词而不是语序词汇频率不平衡打印每个词的 token 切分和词频替换词汇使用频率接近的词不同排列 token 数差异大BPE 对位置敏感比较tokenize()结果改用平均对数概率不使用总概率语言模型明显偏向英语 SVO训练语料以英语为主检查模型 card 和语言支持换用多语言模型或限定结论范围概率计算为负数或数值异常设备或 labels 对齐错误检查logits.shape和input_ids确认logits[:-1]与input_ids[1:]对齐结果随机波动大单个句子太少增加动词和名词组合至少使用 20 个模板后再做统计排查时不要直接看loss一个数。transformers的loss默认是平均负对数概率但它包含的 token 范围和手动计算可能不同。自己的实验脚本里最可靠的方式是从logits出发计算每个 token 的对数概率。6. 从词序偏好到 ReAct推理与行动的有序性6.1 ReAct 的循环结构ReActReasoning and Acting是语言模型提示或微调中的一种范式核心思想是让模型在推理轨迹和外部行动之间循环交替。典型交互中包含Thought描述当前推理步骤。Action调用一个外部工具或动作。Observation接收工具返回结果。这个过程本身对“顺序”非常敏感Thought 通常先于 ActionAction 依赖 Observation 提供的上下文。模型如果对序列顺序没有稳定偏好就会在长链路中出现行动错乱或推理倒置。6.2 词序知识如何影响 ReAct 生成质量ReAct 依赖语言模型对结构化序列的建模能力。这里的“结构”不只是句子内部的语法语序还包括 prompt 中 Thought、Action、Observation 的书写顺序。如果模型已经具备类人的词序偏好它更容易理解“动作对象出现在动作之后”这类语言学规律。当 ReAct 的 prompt 需要书写工具调用时模型也更可能有能力按照自然语言顺序生成参数而不是随机摆放参数位置。例如函数调用search(query)本质上是一种 V-O 结构动词是search宾语是query。如果模型对 V-O 结构有先验偏好它在生成 Action 参数时就会更稳定。6.3 扩展实验Thought 与 Action 的顺序敏感性可以设计一个类似词序偏好的小实验准备多组 ReAct 片段例如Thought ... Action ... Observation ...的不同排列。用语言模型计算每组排列的平均对数概率。观察模型是否稳定地把高概率分配给符合 ReAct 惯例的顺序。这个实验和前面句子语序实验在方法上完全同构都是把同一组“部件”重新排列然后看模型有没有系统性偏好。区别只在于部件从 S、V、O 变成了 Thought、Action、Observation。如果你已经跑通了词序偏好实验迁移到 ReAct 场景会非常快。这也是这个研究问题更工程化的延伸。7. 可复用清单和后续学习路径7.1 实验前检查清单模型名称和模型家族是否记录清楚tokenizer 是否添加了 padding token输入句子之间是否只有语序差异没有词汇差异是否使用平均 token 对数概率消除 token 数影响是否准备了多个句子模板而不是单个句子是否记录了 GPU/CPU 设备、随机种子、transformers 版本7.2 刺激材料审查清单每组刺激材料是否包含六个排列而不是只包含合法与非法排列句型是否平衡有无语义反转、世界知识、不常见单词是否按语言分别处理没有混合不同语言语序是否使用人类语言类型学数据作为基线7.3 结果发布时建议报告每种语序类型的平均对数概率、标准差、token 数。模型名称、模型大小、训练数据语言。刺激材料数量、词汇来源、是否使用无意义词。统计检验方法例如 Spearman 相关和 p 值。与人类基准的对比方式例如 WALS 或行为实验数据。7.4 后续可以深入的方向把实验扩展到 WALS 的更多特征例如介词前后置、关系从句位置。使用受控生成任务让模型直接生成完整句子再统计生成语序分布。比较不同模型规模小模型是否也能表现出类人词序偏好在 ReAct 或工具调用场景中验证有序性偏好把词序偏好从语法层延伸到任务层。词序偏好实验的最终价值不只是判断模型“喜欢哪种顺序”。它提供了一面镜子让我们看到语言模型是否真的把结构规则抽象了出来。跑通最小实验只是开始真正的结论需要多语言、多模板、多模型才能立得住。如果你准备深入建议先从记录实验条件做起再逐步扩展刺激材料最后把结论收敛到可比较的统计指标上。