Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

3.2 评估语言模型:训练集与测试集

评估语言模型性能的最佳方法,是把它嵌入一个应用,并衡量该应用得到多大改进。这种端到端评估称为外在评估(extrinsic evaluation)。只有外在评估才能说明语言模型(或任何组件)的某项改进是否真的有助于当前任务。例如,要评估作为语音识别或机器翻译组件的 n 元语言模型,可以分别使用两个候选模型各运行一次语音识别器或机器翻译系统,再比较哪个模型得到的转写或译文更准确。

遗憾的是,端到端运行大型 NLP 系统往往非常昂贵。因此,如果有一种指标能快速评估语言模型的潜在改进,就会很有帮助。内在评估指标(intrinsic evaluation metric)不依赖任何应用,直接衡量模型本身的质量。下一节将介绍困惑度(perplexity):无论是简单的 n 元语言模型,还是第 7 章更复杂的神经大语言模型,它都是衡量语言模型性能的标准内在指标。

为了评估任何机器学习模型,至少需要三个相互独立的数据集:训练集(training set)、开发集(development set)和测试集(test set)。

训练集是用于学习模型参数的数据。对简单 n 元语言模型而言,它就是提供计数的语料库;这些计数经过归一化后成为 n 元语言模型的概率。

测试集是一组不同的留出数据,不与训练集重叠,用于评估模型。独立测试集能够无偏地估计:把训练所得模型应用于某个未知新数据集时,它能否良好泛化。如果一个机器学习模型完美捕捉训练数据,却在任何其他数据上表现糟糕,那么需要把它应用于新数据或新问题时,它就没有多大用处。因此,我们根据 n 元模型在这个未见测试集或测试语料库上的表现衡量其质量。

应当怎样选择训练集和测试集?测试集应当反映模型将来使用的语言。如果语言模型将用于识别化学讲座的语音,测试集就应当包含化学讲座文本;如果它将作为把酒店预订请求从汉语译成英语的系统的一部分,测试集就应当包含酒店预订请求。如果希望语言模型具有通用性,测试集就应当取自多种文本。此时,可以从不同来源收集大量文本,再划分成训练集和测试集。划分必须谨慎:构建通用模型时,测试集不应只包含一份文档或一位作者的文本,否则它无法良好衡量总体性能。

因此,如果给定一个文本语料库,并希望比较两种不同 n 元模型的性能,就要把数据分成训练集和测试集,在训练集上训练两个模型的参数,再比较两个训练所得模型与测试集的拟合程度。

但“拟合测试集”究竟是什么意思?标准答案很简单:为测试集分配更高概率的语言模型——也就是更准确预测测试集的模型——更好。给定两个概率模型,更好的模型能更好地预测测试数据的细节,因此会为测试数据分配更高概率。

由于评估指标以测试集概率为基础,不能让测试句子进入训练集。假设我们正在计算某个“测试”句子的概率。如果测试句子属于训练语料库,那么它出现在测试集中时,模型会错误地为它分配人为偏高的概率。这种情况称为在测试集上训练(training on the test set),也称数据污染(data contamination)。它会引入偏差,使所有概率看起来过高,并严重扭曲下文介绍的基于概率的困惑度指标。

即使没有在测试集上训练,如果每次修改模型后都在测试集上反复测试,也可能通过观察哪些修改似乎让模型变好,而隐式地针对测试集特征进行调优。因此,只有确定模型已经准备好以后,才应当在测试集上运行一次,或至多运行极少几次。

为此,我们通常使用第三个数据集,称为开发测试集(development test set)或开发集(devset)。直到开发工作最后阶段,所有测试都在这个数据集上进行;最后再在测试集上测试一次,衡量模型的实际质量。

怎样把数据划分成训练集、开发集和测试集?我们希望测试集尽可能大,因为小测试集可能偶然缺乏代表性;同时又希望保留尽可能多的训练数据。测试集至少应当具有足够的统计功效,能够衡量两个候选模型之间具有统计显著性的差异;在此前提下可以选择最小的测试集。开发集应当与测试集来自同类文本,这一点也很重要,因为开发集的目标就是估计模型在测试集上的表现。