误差分析与性能审计
在机器学习系统的生命周期中,模型这一阶段被分为了两个部分,分别是上一节的选择、训练模型,与这一节的误差分析与性能审计。
选择、训练模型一节中,提出了以数据为中心的AI开发,强调对于构建一个将被应用于生产系统中的模型来说,我们不必在模型的算法实现上花费过多的精力,而更应关注数据的质量,使用高质量的数据来训练出适合具体应用环境的模型,并建立模型的评价基线。
误差分析与性能审计这一节则围绕对模型的评价展开。
错误分析
在上一节中讲到,模型训练完成后,即使取得了很低的平均训练误差,此时的模型也不能直接投入部署。我们还需要对模型的性能作进一步评估,并探索进一步的优化空间。最直接的思路就是,对于标记错误的样本,分析可能导致其出错的原因。
以语音识别系统为例。假设在一个语音识别系统中,有100条数据转录错误,此时,我们可以提取出这100条转录失败的数据,建立如下表格。
Example | Label | Prediction |
---|---|---|
1 | “Stir fried lettuce recipe” | “Stir fry lettuce recipe” |
2 | “Sweetened coffee” | “Swedish coffee” |
3 | “Sail away song” | “Sell away some” |
4 | “Let’s catch up” | “Let’s ketchup” |
…… | …… | …… |
接下来,我么可以听一听这些转录失败的样本,了解这些样本中存在哪些可能会对预测造成影响的干扰。比如,在语音识别中常见的一些问题:车辆噪音、人声噪音,或是低带宽环境等等。我们可以把这些影响因素添加至表格,标记表格中的样本是否存在这些问题。比如:
Example | Label | Prediction | Car Noise | People Noise | Low Bandwidth |
---|---|---|---|---|---|
1 | “Stir fried lettuce recipe” | “Stir fry lettuce recipe” | √ | √ | |
2 | “Sweetened coffee” | “Swedish coffee” | √ | ||
3 | “Sail away song” | “Sell away some” | √ | √ | |
4 | “Let’s catch up” | “Let’s ketchup” | √ | ||
…… | …… | …… | …… | …… | …… |
分析对样本预测出错的原因并不是一蹴而就的,而是一个迭代的过程。比如在检视第一个转录失败的样本时,我们听到了“Car Noise”,于是我们在表格中添加了这一Tag,并标记第一个样本存在这一问题;在检视第二个样本时,我们没有发现“Car Noise”,但发现了“People Noise”,于是新增这一Tag,再返回再次检视第一个样本确认它是否也存在“People Noise”这一情况而我们早前没有留意到。如此往复,逐步对这些预测出错的样本建立起了错误分析表。
我们可以从错误分析表中得到很多有价值的信息。
- 具有某一tag的错误样本在总的错误样本中的占比。例如,100条转录失败的样本中,有18%的样本存在“Car Noise”。我们可以从中初步得知某一因素对预测的影响有多大、将其解决能够将模型提升多少。
- 我们可以对所有的样本进行标记,从而得到具有某一Tag的样本中,预测错误的样本占比。例如,在数据集中有1000条存在“Car Noise”,其中有20条转录失败了。由此,我们能够从整体的角度检视某一因素对模型准确度带来的影响,或许在错误样本中,某一Tag占比很大,但是在整个数据集中,带有该Tag的绝大多数样本都被正确预测了。
- 我们还可以得到整个数据集中,有多少数据具有某个Tag。我们可以以此知晓某一Tag在数据集中有多重要,从而评估整个数据集的质量。
- 对于某一Tag,模型还有多少的改进空间。
建立错误分析的表格这一过程,可以手动进行,也有一些MLOps工具可以完成这一过程,在课程中提到了LandingLens这一工具。
工作优先分级
还是以语音识别系统为例。在建立了转录错误原因分析表格后,我们可以围绕表格所得,来列出接下来模型优化工作的方向和优先级。在上一节中提到了以人工转录的水平作为评价基准,可以把低于HLP的项作为进一步优化的目标;在接下来的工作中,我们还需要考虑更多,如下表所示:
Type | Accuracy | Human Level Performance | Gap to HLP | % of Data |
---|---|---|---|---|
Clean Speech | 94% | 95% | 1% | 60% |
Car Noise | 89% | 93% | 4% | 4% |
People Noise | 87% | 89% | 2% | 30% |
Low Bandwidth | 70% | 70% | 0% | 6% |
如果不考虑HLP,我们可能会简单地认为,模型在Low Bandwidth环境下的表现不佳,因而需要把低带宽环境下准确率的提升作为优化的主要目标。但是考虑HLP后,我们发现模型在低带宽环境下已经达到了人工语音转录的水平,已经没有多少值得优化的空间了,反而是Car Noise环境下与HLP还有着4%的差距,应该将其作为优化重点。但是在这一节中,我们还要继续考虑各个Tag下的样本在整个数据集中的占比情况,可以发现,虽然汽车噪音环境下转录的准确率低于HLP较多,但是这一类的样本仅仅占4%,我们可以认为将其优化至最佳,对模型整体的提升也只有 4% * 4% = 0.16%;而清晰讲话环境下转录准确率仅比HLP低1%,这一类样本却在数据集中占有60%之多,将其优化至HLP能将模型提升**1% * 60% = 0.6%**之多。同理,我们可以计算出将各个Tag优化至HLP后,模型的提升情况:
Type | Accuracy | Human Level Performance | Gap to HLP | % of Data | improvement |
---|---|---|---|---|---|
Clean Speech | 94% | 95% | 1% | 60% | 0.6% |
Car Noise | 89% | 93% | 4% | 4% | 0.16% |
People Noise | 87% | 89% | 2% | 30% | 0.6% |
Low Bandwidth | 70% | 70% | 0% | 6% | 0% |
至此,我们可以认为,以Clean Speech和People Noise环境下的转录作为重点、Car Noise次之的优化优先级顺序,能够更有效地改进模型。
这样公式化地决定工作优先级具有一定的道理,但其实往往还是不够,而是还要遵循以下的几点原则:
- 对于每一类情况,还有多少可改进的空间。
- 某一类别的样本出现的频率。这两点即是我们在上文中所做的。
- 我们还需要考虑,提升模型在某一类别样本上的表现的困难程度。比如上文中,虽然对Clean Speech环境进行改进能够很大地提升模型性能,但是在这一环境中,语音样本的质量已经无法再提升了,可能也就没有更多的手段能够提升在这一环境中的转录准确度了;但是对于Car Noise或是People Noise环境,我们可以采用数据增强等技术手段提升数据的质量,进而更轻易地改进模型性能。
- 我们当然还要考虑提升某一类别表现的重要程度。比如,对于一个车载导航应用,用户显然是更多地在Car Noise环境下使用系统,所以提升这一类别下模型表现的优先级显然更高。
在确定工作优先级后,下一步需要考虑的是如何在某些类别上提升模型的平均表现。上文中的优先级确定过程会给这一步工作提出很多指导。
如果我们希望模型在某一类环境下取得更好的表现,最直接的思路当然是获得更多这一类环境下的数据,或者是提升已有的这一类环境下的数据的质量。概括而言即是:
- 获得更多数据;
- 提升现有数据质量。
而在机器学习或者说深度学习中,数据是非常昂贵的,获得更多数据并不是那么容易的事。工作优先级的确定,其意义就在于为我们提供了获取数据和优化数据的思路,而盲目地去收集、优化各个种类的数据,很多时候并不能为我们的工作带来太多帮助。
偏斜的数据集
在上一节中也提到了数据的分布对模型评估的影响。比如,对于分类问题来说,我们会很希望样本标签能够很均匀地分布于各个类别,但是现实往往事与愿违。这也很容易理解,例如在制造业检验产品是否合格,在制造工艺相对成熟的情况下,不合格品占比往往是非常小的,我们得到的数据也很可能是90%以上的合格与百分之几的不合格;又比如医疗影像辨识,健康的样本也会是大多数。
准确率与召回率
在严重偏斜的数据集上,我们很容易就可以训练出一个平均误差很低的模型,毕竟如果数据集中有着99%的positive标签,直接输出positive的模型都能取得99%的准确率了。不过这样的模型显然是毫无意义的,因此,我们不能简单地以预测准确率来评价模型。在课程中,介绍了利用混淆矩阵计算准确率和召回率来评价模型。
如图所示,矩阵的行代表着预测值,列代表着真实值。
- True Negative(TN):真实值为0,预测值为0的样本数
- False Negative(FN):真实值为1,预测值为0的样本数
- False Positive(FP):真实值为0,预测值为1的样本数
- True Positive(TP):真实值为1,预测值为1的样本数
在混淆矩阵的基础上,我们定义准确率(Precision)为:
P
r
e
c
i
s
i
o
n
=
T
P
F
P
+
T
P
Precision = \frac{TP}{FP + TP}
Precision=FP+TPTP
代表着被预测为Positive的样本中,预测值正确的比例。
定义召回率(Recall)如下:
R
e
c
a
l
l
=
T
P
F
N
+
T
P
Recall = \frac{TP}{FN + TP}
Recall=FN+TPTP
代表着真值为Positive的样本中,被正确预测的比例。
可以认为,准确率是对于预测值而言的,召回率是对于真实值而言的。
有了准确率和召回率这两个评价指标,我们认为,只有在这两个指标都取得较高的值时,模型才算是表现不错。如图中所示,这是一个典型的偏斜分布,Negative样本占比很大,如果是按照预测准确率计算,模型的准确率可以达到97.3%,我们会直觉地认为模型表现还不错。但按照上文的定义,其准确率为88.3%,召回率为79.1%,都还有着很大的优化空间。如果我们将所有的样本都预测为Negative,准确率将是Undefined,召回率是0%。这样一来就避免了对偏斜分布的样本只给出一种预测标签就得到很低的平均误差的情况。
F1 Score
对于一个有着较高准确率和较低召回率的模型,以及一个有着较低准确率和较高召回率的模型,直接从这两个值似乎很难看出直观的差异来比较这两个模型的优劣。如下表所示:
Model | Precision(P) | Recall(R) |
---|---|---|
Model 1 | 88.3 | 79.1 |
Model 2 | 97.0 | 7.3 |
此时,我们可以采用Precision和Recall的调和平均数来评价模型,只有当二者的调和平均数较高时,模型的效果才算好。这一调和平均数即为我们常说的F1分数:
F
1
=
1
1
P
+
1
R
F1 = \frac{1}{\frac{1}{P} + \frac{1}{R}}
F1=P1+R11
F1分数的意义在于,只有P和R同时取得较大值时才可使F1值更大。当然,具体的应用中我们可能还会赋予P和R一些权重,F1是常用的评价模型标准,但绝不是唯一的。
性能审计
当模型取得了很高的F1分数、将要将其部署只生产环境之前,对其做一次性能审计是非常有必要的,我们总是需要全力确保之前对模型的优化没有遗漏。在这一步,我们需要再次检查模型的准确度和公平度。
模型的公平度是近几年很常见的一个说法,前段时间我读了好几篇AI相关的综述都在强调这一问题。总的来说,模型的公平性是指,模型的预测不会被特定的性别、种族等因素左右,也就是模型不应特别的偏向某一社会群体。比如对于一个筛选简历的系统,它不应有根据性别来接收简历的表现,造成对女性求职者的偏见(Bias)等等。
性能审计可以以下面几点作为参考:
- 思考模型可能会犯的错误。
- 在数据集的某些子集上的表现。我们用某些特定种族、性别的数据集再次对模型进行评审。
- 检查一下数据集的标签是否存在错误导致我们训练得到的模型也会做出FP或FN的判断。毕竟,收集到的数据也并非100%可靠的。
- 测试一下模型对于数量很少的样本的表现。某些类型的样本在数据集中占比可能很小,但是训练过程中很容易被忽略,但我们要尽可能确保这些数据能够被拟合。
- ……
- 针对上面提出的一些问题,利用合适的数据切片来对这些问题进行评估。