Selective Data Acquisition in the Wild for Model Charging
本文解决的问题是为机器学习的模型学习一些有效的数据。目前有两大挑战:
- 不同的数据服从不同的分布
- 如何选取对于提升性能有帮助的数据
这里的方法是,将整个算法分成两部分:首先进行data discover,建立起data pool。其次,对于candidate dataset进行数据的选取。
问题描述
在监督学习当中,模型的性能很大程度上取决于对于有标签的训练数据的数量、质量。但是将我们收集到的数据全部用于训练的话,并不一定会带来性能上的提升。因此需要选取有帮助的数据来进行训练集的填充。
解决方案
在第一阶段,dataset discovery,这里就提到使用了api来进行数据的填充。这里的重点是第二部分,data point selection
Data Point Selection
收集到的数据会服从不同的数据分布。如果让所有数据停留在原来的数据集当中进行聚类,每一个dataset当中而只有一小部分的数据会起作用。这样就会导致数据的选取会非常困难。因此,需要先对数据进行聚类。文中尝试了Multivariate Guassian Mixture Model (GMM),DBSCAN等方法,发现GMM方法最有效。
简述一下什么是GMM方法,对于每一个数据点,都会计算其概率分布。一共有\(g\)个cluster,一个数据点\(x\)会计算其属于每一个cluster的概率,然后对最高的那个进行分配。通过GMM,我们可以产生初步的cluster。接下来要做的,就是在这些cluster当中进行数据选取。接下来介绍如何进行data selection。
MAB & Auto Data
Multi-armed bandit指的是一种算法框架,它模拟每一轮所有可能发生的动作,并且估计它们所带来的价值。通过每次价值最大化,来实现优化的目标。在AutoData里面,每个cluster都可以当作是一个arm,从这个cluster当中选取data就是一个action。每次从一个cluster当中选取一个小的batch,加入到数据集当中,并且计算其对应的penalty和reward。
这里就涉及到,如何定义每个动作的penalty和reward。这里首先提到了如何定义clsuter之间的距离:
以上被称为Wasserstein距离,但是这里并不重要,只要知道它是一种衡量距离的方式就可以。同时,这里也定义了Neighbor的概念:\(\mathcal{N}(C_i)\),当两个cluster之间的距离小于某一个阈值时,就是邻居。
对于reward,当加入的数据可以带来提升的时候,我们应该给reward,反之亦然。我们通过加入数据之后,模型的表现与之前的表现之间的差异进行评估。也就是:
同时,还引入了“连坐”机制,如果一个cluster被选中了,他的邻居也会收到reward/penalty。假设一共迭代了\(k\)次,那么在第\(k\)轮的分数应该是:
其中\(n^k_i\)指的是这个cluster在\(k\)轮当中被选中的次数。
Explore & Exploit
上述描述了如何选取性能好的数据(Exploit),但是每次单从表现好的数据当中选取会带来局部最优值,也就是我们的探索会只局限于那些当前表现不错的cluster当中,需要给那些还没被检测过的cluster一些机会(Explore)。所以这里提出Upper Confidence Bounds (UCB) based solution, 对于分数进行了一些修正:
第一项就是前面提到的,从exploition当中获取的分数,第二项对应的是exploration, \(n^k\)指的是所有cluster在\(k\)轮当中的分数总和,\(n^k_i\)代表第\(i\)个cluster被选取的次数,如果这个cluster被探索的频率越少,那么这一项的分数就越高。
DQN-Based RL for Auto Data
在上述的基础上,本文进一步引入强化学习。基于本人粗浅的理解,强化学习的关键概念是state, action, reward, policy上。在这里,目前的选取的数据就是作为当前的state。每次选取/delete哪些cluster对应的action。强化学习就是需要判断每个action对应的reward,每次选取最好的action。但是强化学习在这里的应用也有一些问题需要解决。首要的问题,就是对于数据的表达。
这里,作者选择将training data的分布作为当前的state。对于data的分布,我们需要知道每个数据点它们对应的原始的cluster是什么。一种直接的做法是,将每个数据点的分布作为一个\(g\)维的向量来表达 (也就是cluster的数量,类似一种独热码)。但是这样的做法有以下问题:
- 每次training data的size在不断地变化,导致state \(s^k\)是一个大小在不断变化的矩阵。
- 随着迭代的增加,矩阵的size会变得很大,导致后面收敛的速度变慢。
这里的做法如下: - 初始化:创建\(g\)个空的集合\(G_i\),用来表示训练数据当中属于\(C_i\)的数据
- 对于训练数据当中,计算每个训练数据点可能属于的cluster,并且更新对应的\(G_i\)
- 用\(G_i\)的数据来表示当前的state。
通过上述方法,可以减少\(s^k\)矩阵的大小,后面就是强化学习那一套东西了~

浙公网安备 33010602011771号