炼丹知识点:模型的燃料,数据采样的秘密
在实践中,采样是非常重要的,本质上它是利用少量的样本来近似总体的分布,从特定的分布中抽取相应样本的过程。
同时,不仅是推荐、搜索、广告实际中需要,任何机器学习模型,这都是一个不得不去重视的知识点。
01
高斯分布采样
高斯分布(正态分布)的采样方法有逆变换法、拒绝采样法等。
02
马尔科夫蒙特洛卡采样
构造马尔科夫链,使其分布即为带采样目标的分布。其中构造马尔科夫链是该采样法的核心,根据构造方法的不同,对应不同的采样方法;
从任一初始状态,沿着马尔科夫链进行状态转移;
得到收敛于目标分布的状态转移序列的一系列样本;
03
概率图采样方法
根据有向图的顺序,对节点进行采样,包括最简单的祖先采样、参考重要性的似然加权采样和采用Metropolis Hastings方法的采样等。
01
数据采集和理解
1.1 数据收集机制理解
关于我们的数据收集形式对我们进行后续数据的使用和预处理起到非常关键的作用,我承认这块我做得不是很好,导致在实验的过程中无脑的把数据直接丢入模型,看上去模型的效果变差了,带来了非常多错误的结论。从而使得后期又不得不重复进行实验。
注:公司的数据一般非常大,做大模型的话,在机器资源不够的情况下,跑一轮得到的结果是极其浪费时间的,关于这块,个人最大的建议就是在直接将数据丢到模型之前,至少检查以下几点东西。
重复数据观测:查看相同的id是否存在较为严重的重复,即出现了较多的重复数据,这些重复的数据会使得模型训练变差,从而带来幻觉,这些数据是没有意义的,但其实把重复的数据删去之后可能结论就完全相反了; 收集的数据丢失率检测:好的meta数据是建模有效的前提之一,如果数据收集的策略有问题,最差的情况是数据收集出错了,那就没必要建模了;不过最常见的讨论的问题还是丢失率的问题,就是理想情况下可以收集到100条数据,实际只能收集到60条,这种情况的话也没什么好说的,最简单的就是询问工程端能否提升数据的收集率,这是最简单的,数据多了准了,模型自然也会有提升的; 标签是如何来的:在电商中,用户点击完商品并不会立即就购买,所以购买的信息要和前面用户的用户点击记录相关联,这种关联机制也很重要,了解这些对数据预处理能带来非常大的参考。 其它的很多很多坑。
1.2 数据字段理解
这边不想吐槽太多,目测很多公司很多业务都是类似的,尤其是当业务发展多年的情况下,会遗留下一大堆数据表,这些表有非常多的字段,但是表的负责人已经离职了,很多数据字段也都没有写备注,但是这张表又和后面的很多关键表相关联,这是非常头疼的事情。
为什么说字段的理解非常重要呢?举个例子来说,商品ID(ItemID),比如iphone12的ID,
情况1:在不同的国家,iphone12都是使用同一个ItemID来表示的; 情况2:在不同的国家,iphone12都是使用不同的ItemID来表示的;
这样两种不同的数据字段携带的信息量是完全不一样的,
对于情况1,iphone12是只能反映在全局情况下的情况; 但是对于情况2,iphone12却反映的是在国家细粒度下的情况;
我们知道,不同国家的iphone12的销量可能是完全不一样的,在贫穷的国家可能销量就低;在富有的国家则销量很高,所以说数据字段的理解是至关重要的,相同的字段在不同设计情况下统计的特征可能完全是两码事。
02
数据清洗
数据清洗:我们的数据中,存在非常多的脏数据,这些数据的处理可以帮助我们更好地提效,使得模型训练得到的结果更为良性;这一块没有做太多的工作,可能反欺诈等团队做的工作会多一些,典型的就是:
刷单的数据; 刷好评的数据等等; 爬虫的信息过滤等; 其它;
对这些数据的清洗可以更为真实的反映用户的习惯。
03
训练数据采样
数据采样:因为大模型这块数据量非常大,很多时候数据经过各种merge操作之后,都可以达到上PB级别,所以模型的训练经常需要有合理的采样策略;而目前最为常见的采样策略是基于随机的,基于启发式的(也就是大家经常会使用的基于规则的),也有一些基于最新的一些论文的方式:
3.1 负样本随机采样
这个基本所有的公司和数据竞赛中在样本规模达到一定比例的时候都会有碰到,将全部的负样本全部丢入到模型中进行训练,会浪费非常多的资源,而且常常因为类别不平衡等原因经常获得的效果往往还不如经过随机采样来的效果好。在我们的实验中,我们发现:
负样本的采样比例影响还是较大的,随机采样10%的负样本和随机采样20%的负样本得到的效果可能会相差一个点,而且较为稳定; 如果有特征工程的融入,在做负样本采样的时候我们需要先做特征,然后再对负样本进行随机采样,否则效果会很差;
注意,这边仅仅是对负样本进行随机采样,正样本的量非常少,一般都是全部保留的。
3.2 基于某些规则的启发式采样
在电商等应用中,很多用户对于position位置可能比较敏感,而这些position也具有非常大的参考价值,很多用户可能就只浏览了前面部分的商品,后面的曝光商品根本就没有看,尤其是末尾的商品,但是这些信息我们又没法捕捉,这块很多时候需要和工程讨论数据埋点的问题;而我们经常会使用下面的策略去进行尝试,几个典型的例子:
基于曝光位置的规则:在曝光页面,用户只点击了搜索之后的第二个曝光商品,对于后面的商品基本都是没有处理的;这些商品用户有没有细细浏览都得打个问号?所以在很多的博客中,有些公司会尝试将曝光位置大于最后一个点击商品的位置的商品去掉,在采样的过程中不再使用这些商品,而我们在实验过程中发现模型效果略有损失;后来我们将曝光位置大于最后一个点击商品的位置+某个阈值的商品去掉,在实验中可以看到细微的效果提升;
基于浏览/滑动时长的规则:用户在浏览的过程中,由于疲劳或者不感兴趣或者其它原因在某些页面会快速滑动浏览页,我们就可以基于端上收集的用户的滑动停留时长等信息对负样本进行过滤,认为这些样本用户是没有仔细观察的;
误点击样本过滤:上面的两种贪心式规则都是基于负样本进行采样的,当然在大家所熟知的问题中还存在一些噪音正样本,例如误点击的样本,这些样本普遍是较难判断的,而对于模型训练带来的影响也较难判断。一般我们可以通过删除那些点击进入之后直接就跳出的用户(即在详情页停留时间极短的样本的数据),而实践中,我们发现对这些样本进行过滤,效果并没有太大的变化,可能不同的场景会有些许差别。
上面的这三种策略基本都是可以尝试的,但是别指望可以带来巨大的提升,不过微弱的提升还是可以期待一下的。除此之外,我看到还有非常多其它值得尝试的,此处仅列举在下方,并没有什么具体的结论。(下面这两个来源于引文[31])
基于用户的活跃度分布采样,用户的活跃度一般都是一个长尾分布,越活跃的用户对应的人数越少,但是其所占的行为越多。这种情况下,如果不考虑用户活跃度去筛选正负样本,难免活跃用户所占的权重就会增大,此时有效的解决办法是针对每个用户提取相同的正负样本。 针对同一个内容在不同时间对同一个用户曝光多次的情况,这时候训练集中可能会出现同一用户对同一内容点击与不点击并存的情况,如果多次曝光的间隔非常短,考虑只使用其中的一次曝光数据。 其它....
3.3 基于最新技术的方案
好像也有听说最新的论文有使用一些最新的技术,来自动选择好的负样本,这块没有继续研究下去了。