如何划分一个跟测试集更接近的验证集?
By 苏剑林 | 2020-10-16 | 55420位读者 |不管是打比赛、做实验还是搞工程,我们经常会遇到训练集与测试集分布不一致的情况。一般来说我们会从训练集中划分出来一个验证集,通过这个验证集来调整一些超参数(参考《训练集、验证集和测试集的意义》),比如控制模型的训练轮数以防止过拟合。然而,如果验证集本身跟测试集差别比较大,那么验证集上很好的模型也不代表在测试集上很好,因此如何让划分出来验证集跟测试集的分布差异更小一些,是一个值得研究的题目。
两种情况 #
首先,明确一下,本文所考虑的,是能给拿到测试集数据本身、但不知道测试集标签的场景。如果是那种提交模型封闭评测的场景,我们完全看不到测试集的,那就没什么办法了。为什么会出现测试集跟训练集分布不一致的现象呢?主要有两种情况。
第一种是标签的分布不一致。也就是说,如果只看输入$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,也就是说需要过采样到类别均衡。
可能有读者担心过拟合问题,即判别器彻底地训练集和测试集分开了。事实上,在训练判别器的时候,我们应该也要像普通监督训练一样,划分个验证集出来,通过验证集决定训练的epoch数,这样就不会严重过拟合了;或者像网上有些案例一样,直接用逻辑回归做判别器,因为逻辑回归足够简单,过拟合风险也更小了。
跟GAN的判别器类似,不难推导$D(x)$的理论最优解是
\begin{equation}D(x) = \frac{q(x)}{p(x)+q(x)}\label{eq:d}\end{equation}
也就是说,判别器训练完后,可以认为它就等于测试集分布的相对大小。
重要性采样 #
优化模型也好,算指标也好,其实我们是希望在测试集上进行,也就是说,对于给定目标$f(x)$(比如模型的loss),我们希望算的是
\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》
如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。
如果您觉得本文还不错,欢迎分享/打赏本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!
如果您需要引用本文,请参考:
苏剑林. (Oct. 16, 2020). 《如何划分一个跟测试集更接近的验证集? 》[Blog post]. Retrieved from https://kexue.fm/archives/7805
@online{kexuefm-7805,
title={如何划分一个跟测试集更接近的验证集?},
author={苏剑林},
year={2020},
month={Oct},
url={\url{https://kexue.fm/archives/7805}},
}
October 19th, 2020
完全看不懂,(1)式用来干啥呢 ?D(x)既然是训练得到的判别器,那(2)代表什么呢?f(x)实际对应什么呢?逻辑完全串不起来
$(1)$式是判别器的训练目标,$(2)$是判别器的理论最优解,$f(x)$对应着我们要求期望的目标(损失函数、acc等)。如果看不懂,可以选择不看或者只看结论。
October 21st, 2020
第一种直接按照公式加权,指的是训练集的数据加权训练吗?
还有一个问题,为什么判别器是要用稍微简单一些的模型?感觉稍微有些过拟合会更好一些吧
1、训练集和验证集都加权;
2、简单是为了在没有验证集的情况下防止过拟合罢了,如果你用复杂的模型,那么训练判别器的过程中也需要按照常规方式划分一个验证集出来做earlystop,不然按照神经网络的万能拟合能力,只要训练集和测试集的样本没有全匹配的,就能彻底区分开来。
October 23rd, 2020
有现成的代码资源供参考
October 26th, 2020
请问公式(2)是怎么推导出来了,能详细解释一下吗?谢谢
$$-\mathbb{E}_{x\sim p(x)}[\log (1 - D(x))] - \mathbb{E}_{x\sim q(x)}[\log D(x)]=-\int \left[p(x)\log (1 - D(x)) + q(x)\log D(x)\right]dx$$
所以也就是求$p(x)\log (1 - D(x)) + q(x)\log D(x)$的最大值(如果每一点都取最大,那么积分肯定也最大),省去$(x)$,就相当于求$p\log (1 - D) + q\log D$的最大值,这不用问了吧~
非常感谢,有泛函的入门书推荐吗?
估计你只是想学变分法相关部分而不是真正要学泛函?如果是这样的话,你可以看看朗道《力学》第一章。
$F=p \log(1-D) + q \log(D)$
$\frac{\partial F}{\partial D} = - \frac{p}{1-D} + \frac{q}{D}=0$
$\frac{p}{1-D} = \frac{q}{D}$
$D=\frac{q}{p+q}$
April 25th, 2021
如何从真实的在线数据抽样得到测试数据集,苏神有没有一套方法论呢?
因为真实的模型上线,评估的往往是业务指标,有两个问题就是
1. 业务指标和模型测试阶段所用的指标有很大差距。
2. 真实在线数据往往和我们所用的测试数据也存在较大差距。
这个就是根据你们自己的真实业务数据做采样吧,这方面我没啥方法论呀。
December 13th, 2021
苏神这个方法(苏剑林 2020)我关注了一段时间了,一直没有找到学术上的索引,
大部分看到的研究是 OOD 相关的(Deng and Zheng 2020),或者是欠规范(Underspecification)(D’Amour et al. 2020)、LeCun 最近给的 interpolation(Balestriero, Pesenti, and LeCun 2021),但是都不是苏神这种在 train 和 test 上比较的思想。
最近找文献终于看到了相关研究,Conformal inference,Vladimir Vovk 1990年的研究。苏神这种方法对应 Weighted conformal prediction(Tibshirani et al. 2020),其实就是看 test to train ratio 来构建 ‘non-conformity scores’。
补充下相关文献历史,也算回馈一直依赖这个受益匪浅的博客。
Balestriero, Randall, Jerome Pesenti, and Yann LeCun. 2021. “Learning in High Dimension Always Amounts to Extrapolation.” https://arxiv.org/abs/2110.09485.
D’Amour, Alexander, Katherine Heller, Dan Moldovan, Ben Adlam, Babak Alipanahi, Alex Beutel, Christina Chen, et al. 2020. “Underspecification Presents Challenges for Credibility in Modern Machine Learning.” https://arxiv.org/abs/2011.03395.
Deng, Weijian, and Liang Zheng. 2020. “Are Labels Necessary for Classifier Accuracy Evaluation?” arXiv Preprint arXiv:2007.02915.
Tibshirani, Ryan J., Rina Foygel Barber, Emmanuel J. Candes, and Aaditya Ramdas. 2020. “Conformal Prediction Under Covariate Shift.” https://arxiv.org/abs/1904.06019.
苏剑林. 2020. “如何划分一个跟测试集更接近的验证集?.” 科学空间. 2020. https://kexue.fm/archives/7805.
感谢你的追根溯源哈,非常宝贵的参考资料~
最近又看了一部分文献,发现这个 idea 也是 "Adversarial Validation",但是没有找到和 conformal inference 的关联性文献。
如 Pan et al. (2020) 这不是一个学术很关注的领域。
Pan, Jing, Vincent Pham, Mohan Dorairaj, Huigang Chen, and Jeong-Yoon Lee. 2020. “Adversarial Validation Approach to Concept Drift Problem in User Targeting Automation Systems at Uber.” https://arxiv.org/abs/2004.03045.