# 评估

通过评估方法你可以从总体上查看 NLU 模型相应的指标并有针对性的采取行动优化。

# 评估方法

一般来讲,训练模型时我们建议把数据集单独留出一小部分作为评估之用,但事实上很少有人在 NLP 建模任务中采用这个方法,可能的原因如下:

  1. 受限于总体训练数据的规模,单独分一部分数据降低了用于训练的数量,反而可能会降低模型的预测效果。
  2. chatbot 场景中实际的用户可能来自各种各样你意向不到的场景,不同的场景带来不同的语料,随着语料的改变,对应的用于单独评估的语料也需要随之改变,总加了维护的工作量。

Botfront 针对上面这些问题提供了几个优化选项,尽量在独立评估模型的同时避免掉到上面所述的坑里面。

评估策略

# 使用训练数据

虽然这些评估的指标经常会被高估或者不可信,但在模型的开发过程中,这些指标还是会暴露出一些模型设计和数据标注上的问题,帮你完善训练方法。

# 使用验证数据

一旦你的对话机器人发布,甚至只是小范围测试的时候,你都可以立即通过验证数据集针对你的模型做测试。这些测试之所以有意义是因为你的模型在测试之前从未见过这些数据。同时,这些测试也更能体现实际的应用情况,因为对应的测试数据都是来自一线的真实用户。而且,一旦这些测试完成,对应的测试结果也会融入到你的模型中,不用像在假数据上做测试那样,纠结于假数据带来的对模型的影响。这种方式另一个好处是操作简便,无需把数据倒来倒去,并且在整个测试的过程中模型性能的变化都是完全可跟踪观测的。

# 使用单独的测试数据(上传)

这种是最标准的评估流程,但是,由于上面说到的原因,也是用处最少的一种测试方式。

评估实体的一个最佳实践

假设你在训练一个模型用于抽取加拿大所有的城市,你没有足够的、包含所有城市的语料,这种情况下如何让模型可以做到不漏掉任一个城市呢?解决问题的方式之一是用类似 Chatito 这样的工具生成一份包含所有城市的数据,然后通过本节介绍的这种单独上传测试数据的方式补充到你的模型中,然后你的模型具备了识别所有城市的能力,问题解决。

注意

注意不要在 training dataset 里面使用上面提到的这种方式生成的数据!否则你会得到一个虽然很大,但严重缺乏语义多样化的模型,换句话说这个模型的泛化能力非常弱。

# 评估报告

# 意图

下图展示了 Botfront 关于意图评估特意挑取的几个简洁实用指标和可执行的行动建议。通过这个面板你可以很容易的看到你模型的各项关键性能指标,并且发掘出那些影响指标的语料、场景,异常的语料识别都被以列表的形式列了出来,同时对应的实际意图和模型预测意图也对比显示在后头供你快速处理。这个例子展示了标注错误和意图冲突的情况(伴随着数据量的增长这种问题几乎是不可避免的会发生)。

下图里面隐掉了一个我们接下来会拿掉的特性,这个特性就是意图冲突矩阵的展示,因为这个特性对大一点的 NLU 模型来说基本没什么用处。设想一下, 50个意图对应的一个 50x50 的矩阵显示在屏幕上也不会带来什么有建设性的洞察,也就无法通过观察这个指标来做出针对性的行动从而优化模型。

针对每个意图的详细报告也会以可排序列表的方式展现出来,通过这个列表你可以很容易的找出那些数据支持比较薄弱的意图,然后有针对性的采取行动把这些数据补上。

# 实体

关于实体数据的抽取效果评估和 debug 是一个比较有挑战性的活,下面这个报告列出了抽取失败的语料和实际期望得到的结果之间的详细差别。简单看下这张表你就能找到那些问题是可以被快速解决的。跟意图部分的处理逻辑一样,你也可以在这里看到所有的预测失败条目。

Evaluation report