优化验证测试

假设你正在构建一个语音识别系统,该系统通过输入一个音频片段 $A​$ ,并为每一个可能的输出句子 $S​$ 计算得分 $\text{Score}_A(S)​$。例如,你可以试着估计 $ \text{Score}_A(S)=P(S|A)​ $ ,表示句子 $S​$ 是正确输出的转录的概率,其中 $A​$ 是给定的输入音频。

给定某种方法能够计算 $ \text {Score}_A(S) $ 后,你仍然需要找到一个英文句子 $S$ 来使之最大化:

要如何去计算上面的 $\arg \max$ 呢?假设在英文中共有 5000 个词汇,对于长度为 $N$ 的句子,则有 $50000^N$ 种搭配,多到根本无法一一列举。因此,你需要使用一种近似搜索算法,努力去找到能够优化(最大化)$ \text{Score}_A(S)$ 的那个 $S$ . 有一种叫做 “定向搜索” 的搜索算法,在搜索过程中仅保留最优的 $K$ 个候选项(在本章中你并不需要了解该算法的细节)。类似这样的算法并不足以保证能够找到满足条件的 $S$ 来最大化 $ \text{Score}_A(S)$ .

假设有一个音频片段记录着某人说的:“我爱机器学习。”但你的系统输出的却是不正确的 “我爱机器人。”,它没能够输出正确的转录。造成该误差的可能原因有两种:

  1. 搜索算法存在问题。 近似搜索算法没能够找到最大化 $ \text{Score}_A(S)$ 的那个 $S$ .
  2. 目标(得分函数)存在问题。 我们对 $\text{Score}_A (S)=P(S|A)$ 的估计并不准确。尤其在此例中,我们的得分函数没能辨认出 “我爱机器学习” 是正确的转录。

对应不同的失败原因,你需要优先考虑的工作方向也将很不一样。如果原因 1 导致了问题,你应该改进搜索算法。如果原因 2 导致了问题,你应该在评估学习算法的函数 $ \text{Score}_A(S)$ 上面多花些心思。

面对这种情况,一些研究人员将决定研究搜索算法;其他人则努力去找到更好的 $ \text{Score}_A(S)$ . 但是,除非你知道其中哪一个是造成误差的潜在原因,否则你的努力可能会被浪费掉。怎么样才能更系统地决定要做什么呢?

让我们用 $S_{out}$ 表示实际的输出 “我爱机器人”,用 $S^*$ 表示正确的输出 “我爱机器学习” 。为了搞清楚上面的 1 或 2 是否存在问题,你可以执行 优化验证测试(Optimization Verification test): 首先计算 $S_{out}$ 和 $S^*$ ,接着比较他们的大小。有两种可能:

情况1:$ \text{Score}_A {(S^*)} \gt \text{Score}_A {(S_{out})} $

在这种情况下,你的学习算法正确地给了 $S^*$ 一个比 $S_{out}$ 更高的分数。尽管如此,我们的近似搜索算法选择了 $S_{out}$ 而不是 $S^*$ . 则表示你的近似搜索算法没能够找到最大化 $ \text{Score}_A(S)$ 的那个 $S$ . 此时优化验证测试告诉你,搜索算法存在着问题,应该花时间研究。例如,你可以尝试增加定向搜索的搜索宽度。

情况2:$ \text{Score}_A (S^*) \leq \text{Score}_A (S_{out}) $

在这种情况下,计算 $\text{Score}_A (.)$ 的方式是错误的:它没有给正确的输出 $S^*$ 比实际输出 $S_{out}$ 一个相同或更高的分数。优化验证测试告诉你,目标(得分函数)存在问题。因此,你应该专注于改进你的算法对不同的句子 $S$ 学习或近似出得分 $\text{Score}_A (S)$ 的方式。

我们上面的讨论集中于某个单一的样本 $A$ 上,想要在实践中运用优化验证测试,你需要在开发集中检测这些误差样本。对于每一个误差样本,你都需要测试是否有 $\text{Score}_A (S^*) \gt \text{Score}_A (S)_{out}$ . 开发集中所有满足该不等式的样本都将被标记为优化算法自身所造成的误差,而满足不等式 $\text{Score}_A (S^*) \leq \text{Score}_A (S)_{out}$ 的样本将被记为是计算得分 $\text{Score}_A (.)$ 造成的误差。

假设你最终发现 95% 的误差是得分函数 $\text{Score}_A (.)$ 造成的,而仅有 5% 的误差是由优化算法造成的。现在你应该知道了,无论你如何改进你的优化程序, 实际上也只会消除误差中的 5% 左右。因此,你应该专注于改进你的得分函数 $\text{Score}_A (.)$ .


改进当前页面