17

如何划分一个跟测试集更接近的验证集?

 3 years ago
source link: https://kexue.fm/archives/7805
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

不管是打比赛、做实验还是搞工程,我们经常会遇到训练集与测试集分布不一致的情况。一般来说我们会从训练集中划分出来一个验证集,通过这个验证集来调整一些超参数(参考 《训练集、验证集和测试集的意义》 ),比如控制模型的训练轮数以防止过拟合。然而,如果验证集本身跟测试集差别比较大,那么验证集上很好的模型也不代表在测试集上很好,因此如何让划分出来验证集跟测试集的分布差异更小一些,是一个值得研究的题目。

首先,明确一下,本文所考虑的,是能给拿到测试集数据本身、但不知道测试集标签的场景。如果是那种提交模型封闭评测的场景,我们完全看不到测试集的,那就没什么办法了。为什么会出现测试集跟训练集分布不一致的现象呢?主要有两种情况。

第一种是 标签 的分布不一致。 也就是说,如果只看输入$x$,那么分布基本上是差不多的,但是对应的$y$分布不一样,典型的例子就是信息抽取任务,训练集往往是通过“远程监督 + 人工粗标”的方式构建的,量很大,但是里边可能错漏比较多,但是测试集可能是通过“人工反复精标”构建的,错漏很少。这种情况下就无法通过划分数据的方式构建一个更好的验证集了。

第二种是 输入 的分布不一致。 说白了就是$x$的分布不一致,但是$y$的标注情况基本上是正确的。比如分类问题中,训练集的类别分布跟测试集的类别分布可能不一样;又或者在阅读理解问题中,训练集的事实类/非事实类题型比例跟测试集不一样,等等。这种情况下我们可以适当调整采样策略,使得验证集跟测试集分布更一致些,从而验证集的结果能够更好反映测试集的结果。

为了达到我们的目的,我们让 训练集的标签为0,测试集的标签为1 ,训练一个二分类判别器$D(x)$:

\begin{equation}-\mathbb{E}_{x\sim p(x)}[\log (1 - D(x))] - \mathbb{E}_{x\sim q(x)}[\log D(x)]\end{equation}

其中$p(x)$代表了训练集的分布,$q(x)$则是测试集的分布。要注意的是,我们不是要将训练集和测试集直接混合起来采样训练,而是分别从训练集和测试集采样同样多的样本来组成每一个batch,也就是说需要过采样到类别均衡。

跟GAN的判别器类似,不难推导$D(x)$的理论最优解是

\begin{equation}D(x) = \frac{q(x)}{p(x)+q(x)}\label{eq:d}\end{equation}

也就是说,判别器训练完后,可以认为它就等于两个分布的相对大小。

优化模型也好,算指标也好,其实我们是希望在测试集上进行,也就是说,对于给定目标$f(x)$,我们希望算的是

\begin{equation}\mathbb{E}_{x\sim q(x)}[f(x)] = \int q(x) f(x) dx\end{equation}

但是要算目标$f(x)$通常要知道$x$的真实标签,但这个我们不知道啊。不过我们知道训练集的标签,我们可以解决它来做重要性采样:

\begin{equation}\int q(x) f(x) dx=\int p(x)\frac{q(x)}{p(x)} f(x) dx=\mathbb{E}_{x\sim p(x)}\left[\frac{q(x)}{p(x)} f(x)\right]\end{equation}

根据公式$\eqref{eq:d}$,我们知道$\frac{q(x)}{p(x)}=\frac{D(x)}{1-D(x)}$,所以最终变成

\begin{equation}\mathbb{E}_{x\sim q(x)}[f(x)] = \mathbb{E}_{x\sim p(x)}\left[\frac{D(x)}{1-D(x)} f(x)\right]\label{eq:w}\end{equation}

从公式$\eqref{eq:w}$,我们可以得到两个策略:

第一是直接按照公式加权,也就是说,还是按随机打乱的方式划分训练集和验证集,但是给每个样本配上权重$w(x)=\frac{D(x)}{1-D(x)}$。值得指出的是,类似的做法有些选手做比赛时已经用过了,只不过流传的权重是$D(x)$,而从理论推导的角度来看,$\frac{D(x)}{1-D(x)}$更加合理一些。

另一个策略就是实际地把对应的验证集采样出来。这也不难,假设训练集的所有样本为$x_1,x_2,\dots,x_N$,我们把权重归一化

\begin{equation}p_i = \frac{w(x_i)}{\sum\limits_{i=1}^N w(x_i)}\end{equation}

然后按照$p_1,p_2,\dots,p_N$为分布做独立重复采样,直到采样到指定数目即可。注意需要 有放回 的独立重复采样,因此同一个样本可能被采样多次,在验证集里边也要保留多次,不能去重,去重后分布就不一致了。

本文从训练判别器的角度来比较训练集和测试集的差异,并且结合重要性采样,我们可以得到一个跟测试集更接近的验证集,或者对训练样本进行加权,从而使得训练集的优化过程和测试集差异性更小。

转载到请包括本文地址: https://kexue.fm/archives/7805

更详细的转载事宜请参考: 《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎/本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (2020, Oct 16). 《如何划分一个跟测试集更接近的验证集? 》[Blog post]. Retrieved from https://kexue.fm/archives/7805


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK