@zakexu
2021-05-31T10:07:52.000000Z
字数 10012
阅读 1036
机器学习&深度学习
首发时间:2020.9.27
作者:zakexu(个人主页)
目录
1、机器学习一般可以分为监督学习、非监督学习;其中监督学习包括分类、回归,非监督学习包括聚类、降维。
注:一个建模过程主要考虑样本、特征、模型、策略、算法、评估(线上、线下)。
2、监督学习三要素:模型、策略、算法。
问题假设:假设输入空间(特征空间)为维欧几里得空间,输出空间为(二分类问题);代表输入空间的一个随机向量,代表输出空间的一个随机变量;代表的联合分布,由此分布产生了个样本,构成训练集。
注:欧几里得空间
欧式距离:
余弦距离:
相比欧式距离,余弦距离更加注重两个向量在方向上的差异。内积越大,相似度越大,余弦距离越小。
(1)模型
判别模型一般分为两种,一种是直接对输入空间到输出空间的映射建模(【回归】);一种是直接对条件概率建模,也就是条件概率模型(【分类】),分别如下:
生成模型是先对进行建模,然后通过贝叶斯公式求得。
一般来讲,生成模型的目的是学习联合分布,可以获取更多的信息;但同时也需要更多的训练样本。实际使用中,判别模型的效果会更佳。
另外需要注意的是,条件概率模型一般会对每个类别设计一个概率公式,只不过很多时候为了简洁,可能会用一个公式来表示,比如LR模型的表示 ,从而与生成模型的表示一致,但这并不代表其就是生成模型,这个是需要区分的。
概率模型学习的目的是或者;非概率模型是直接对输入空间到输出空间的映射建模。
注:贝叶斯公式
一般来说,称为的先验概率,称为的似然度,称为的后验概率。
注:概率分布 vs 概率函数 vs 概率分布函数 vs 概率密度函数
(2)策略
模型在训练集上的平均损失称为经验损失:
为了解决上述过拟合问题,在经验损失的基础上,引入正则化项,构成结构损失:
利用已知的样本结果信息(对),反推最有可能导致这些样本结果产生的模型参数(),那么对于变量,其似然损失(极大似然函数等于最小化似然损失)可以表示为:
贝叶斯估计也叫最大化后验概率,根据贝叶斯公式,其是在参数似然的基础上乘以参数先验概率,也就是:
注:对数损失/对数似然损失/逻辑斯谛回归损失/交叉熵损失(以单样本为例)
上述可以等价表示为(本质上是一个KL散度的公式,用来衡量2个分布之间的相似度)(上述的表示的是真实分布的)(也就是说当真实分布符合onehot形式的话,交叉熵跟对数损失是等价的):
(3)算法:梯度下降算法。
批量梯度是每一次迭代时使用全部样本进行梯度计算,计算量大;随机梯度是每一次迭代时只使用单个样本进行梯度计算,训练速度快;小批量梯度是每一次迭代时只使用mini batch进行梯度计算,实际应用中最为常见。
虽然小批量梯度下降法通过采样的方式,让batch的梯度跟原始样本的梯度大致相同,但不是绝对相同,因此MGBD在收敛过程中会出现震荡,为了减少震荡的幅度,可以采用动量的思想:
由式子可以看出,每次迭代的梯度既考虑了之前梯度的指数加权平均,也考虑当前的实际梯度。由于梯度是有方向的,对以往梯度的加权,在垂直方向上正负抵消,减小了震荡幅度,而在水平方向上则加快收敛,提升训练速度。
随机梯度保持单一的学习率更新所有的权重,学习率在训练过程中并不会改变。而 Adam 通过计算梯度的一阶矩估计和二阶矩估计(二阶矩就是体现自适应的地方,更新越快的参数,二阶矩越大,那么学习率越小)而为不同的参数设计独立的自适应性学习率,是当前使用最多的优化方法(有点让每个参数都按照单位梯度大小来更新的味道)。
注:对于凸函数,学习率跟batch大小其实影响不会特别关键,因为最终都会收敛到全局最优,而对于非凸函数,因为存在局部最优,所以初始化参数、学习率、batch大小等都会影响。
注:学习率(步长)(基于batch计算的梯度带有噪声,所以需要学习率来选择性地过滤)
注:batch大小
注:通常当我们增加batchsize为原来的N倍时,要保证经过同样的样本后更新的权重相等,按照线性缩放规则,学习率应该增加为原来的N倍(迭代次数变少了,所以学习率要调大)。
3、多分类的常见方法
(1)one vs rest:构建个分类器,每个分类器依次将每个类做为正样本,剩余的类作为负样本。
(2)one vs one:构建个分类器,每个分类器选择两个类的样本进行训练。
4、集成学习(ensemble learning)的常见方法
(1)bagging:训练不同的模型,对预测结果取均值或者投票等(减小variance)。
(2)boosting:迭代算法,在上一次分类结果上进行迭代调整(减小bias)。
(3)stacking/cascade:训练不同的模型,用每个模型的预测作为输入,训练新的模型。
注:
(1)bias:偏差,表示模型的预测能力,偏差越小,模型的预测能力越强。
(2)variance:方差,表示模型的泛化能力,方差越小,模型的泛化能力越强。
(3)error = bias + variance
5、交叉验证(Cross Validation,CV)
通常情况下,当数据集比较大,可以将数据集切分成训练集、验证集、测试集;训练集用于模型学习,验证集用于超参选择或者模型选择,测试集用于最终的模型验证。当数据集比较小,上述做法容易过拟合,因此引入交叉验证;将数据集切分为训练集跟测试集,测试集的作用跟上述一致,训练集在学习过程中,会切分成份,依次选择份作为训练集,剩下1份作为验证集。
6、评测指标
(1)F1值
(2)ROC vs AUC
【注意代码实现】AUC的物理意义是给定一个正样本以及负样本,正样本预测为正的socre比负样本预测为正的score大的概率,其实就是按照预测score来排序的话,负样本排在正样本前面(关注逆序对)。计算AUC一般会有:
注:AUC只关注正负样本的顺序,对于正样本内部或者负样本内部的顺序,不关注。
(3)MAP@K vs NDCG@K
MAP@K可以表示为:
NDCG@K可以表示为:
(4)辛普森悖论:在某个条件下的两组数据,分别讨论时都会满足某种性质,可是一旦合并考虑,却可能导致相反的结论。
7、样本的正负设计:
(1)有转化行为的用户,转化的item可构成正样本,只曝光无转化的item可构成负样本(“曝光未点击”)。
(2)进一步分析负样本,可过滤列表中最后一次转化后曝光的item(“above click”)。
8、样本的数量设计:
(1)为了避免“重度用户”对loss的影响,在训练集中对每个用户提取相同数量的训练样本(为了充分评估每个用户群体的效果,可以考虑GAUC)。
(2)为了避免“刷量用户”对loss的影响,在样本设计中需要对User-Item对做去重。
9、样本不平衡的常见方法(以二分类为例,假设正样本数量为,负样本数量为)
(1)欠采样:对负样本进行欠采样,一般会随机切分成份,分别与正样本构成份训练样本,结合集成学习进行训练。
(2)过采样:对正样本进行过采样,最简单的做法就是将正样本复制份,但需要考虑过拟合问题。
(3)阈值调整:一般情况的决策边界是0.5,但因为负样本居多,可以将阈值调整至(可根据实验结果调整)。
(4)调整loss:为了应对样本不平衡,可以采用focal loss来替代log loss:
其中表示类别权重,所以在不平衡样本的训练过程中,参数调大;其中表示难度权重,比如对于正样本,越小,越难学,所以权重越大;对于负样本,越大,越难学,所以权重也会越大。
注:样本加权跟样本采样在数学上是等价的。样本加权是在loss函数中对相应的样本增加权重,最后的loss除以加权样本数(梯度会向加权的样本偏,所以会更好地拟合加权样本),从这个角度理解,样本加权跟样本采样是等价的。
注:只有保证样本的平衡性,才能保证正负样本都得到充分的学习,才能保证最终ctr的准确性,才能保证根据ctr排序是有意义的。
注:ctr修正:在推荐场景,一般都会对负样本做采样,最后得到的ctr一般都是不准确的,也就是说虽然结果保序但不保距,因此,在一些需要计算收益的场景比如游戏中ctr * arpu,会对预估的ctr进行修正,常见的修正方法如下:
(1)假设修正后的ctr为,修正前为,正样本数量为,负样本数量为,采样率为,那么根据以下公式:
可以得出:
(2)假设采用的是sigmoid或者softmax作为概率转换函数,那么可以有:
(3)调整样本权重,正样本为1,负样本为。
10、连续特征 vs 离散特征
(1)连续特征:比如点击率等;一般需要做归一化处理(树模型不需要);通过分桶等方法可以转化为离散特征(会有一定的信息损失)。
(2)离散特征:比如性别、年龄等;一般需要做特征编码处理;通过embedding等方法可以转化为连续特征。
注:
(1)LR、FM、SVM模型既适用于连续特征,也适用于离散特征;原因是这些模型都是通过找线性平面,然后通过sigmoid函数或者sign函数来转化成概率值,这样子的话对输入是连续型数值还是离散型数值其实都可以适用。但在工业界,对于LR或者FM模型,会倾向于采用离散特征:
(2)树模型既适用于连续特征,也适用于离散特征;原因是树模型是通过找特征分割点来做分类,本身就对输入是连续型数值还是离散型数值不敏感。
(3)DNN模型比较适用于连续特征;原因DNN模型本身的出发点是为了拟合连续型函数,因此对于连续型的输入更加make sense。
11、离散特征常见编码方法
(1)one hot encoding:独热编码(“高中低”表示为“100 010 001”)
(2)dummy encoding:哑编码(“高中低”表示为“00 01 10”)
(3)multi-hot encoding:多热编码(主要针对多类别取值的样本特征,比如兴趣标签“游戏、军事、政治、体育”表示为“1000、0100、0010、0001”,那么一个用户拥有标签“游戏、军事”可以表示为“1100”)
12、用户id类特征
(1)通常id都会隐藏某种规律,直接将用户id作为特征,可以学习到该种规律;比如说某个连号片段可能代表某个区域,又或者身份证号会隐藏着地域、年龄等特性。
(2)用户id onehot后跟item特征做交叉,那么同类item特征下,不同的用户都有不同的权重,类似为每个用户单独训练一个模型,当然前提是每个用户id的样本足够。
(3)一般用户id交叉后维度都会很高且稀疏,可以将用户id进行hash分桶,那么相当于本来是每个用户单独一个模型,变成每个用户群一个模型。
13、过拟合的常见方法
(1)数据增强(Data Augmentation)
(2)增加噪声
(3)特征筛选(只留权重高的)
(4)正则化
(5)dropout
(6)early stopping
(7)ensemble learning
注:过拟合(模型容量过大,过度拟合了噪声),方差大,泛化能力差;欠拟合(模型容量太小,无法拟合样本分布),偏差大,精确度差。
14、在部分推荐场景,不同的曝光位置,带来的效果是不一样的,比如说在feeds流场景,头部的位置更容易产生正样本,因此不同位置产生的样本权重应该是不一样的,一般会有以下几种解决方法:
(1)针对不同的样本设计不同的权重,主要体现在损失函数的设计。
(2)在特征构造中加入位置特征,从而将位置带来的影响体现在特征上(吸收bias),那么预测时候,将位置特征置为默认值(fake),可以削弱曝光位置的影响。
注:对于热门样本的打压也可以采取类似的思路。
1、激活函数:sigmoid vs tanh vs relu
(1)sigmoid函数
(2)tanh函数
(3)relu函数
(4)现在一般用relu、tanh作为激活单元的非线性函数,用sigmoid做门控制函数。
2、Batch Normalization vs Layer Normalization
(1)BN
深度网络在做每层非线性变化前的激活输入值()会随着网络的加深或者训练的迭代,发生数据分布的迁移,逐渐往非线性函数的取值区间的上下限两端靠近(比如sigmoid函数的两侧,这也是非0均值所导致的),导致反向传播时“梯度消失”的现象,从而训练收敛较慢。
BN类似图像处理中的白化,其实就是把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,使得非线性变换函数的输入值落入对输入比较敏感的区域,以此避免梯度消失问题。对于类似sigmoid函数而言,拉回到了对输入敏感的区域,也就变成了线性函数,那么会导致模型整体的表达能力变弱,所以一般拉回之后还会做scale跟shift的操作。
具体在训练过程中(推理的话,会根据所有训练batch得到的均值跟方差来推算总的均值跟方差),每个batch会计算出其均值跟方差,计算如下( 、由训练可得):
(2)LN
BN一般适用于DNN或者CNN网络,输入维度比较固定,对于RNN这种没有固定输入维度的,训练不方便(输入不固定维度,可能在测试出现训练没有出现过的token长度,那么超过的token位置就没有均值跟方差;而且长度不一致,在训练时候,每个token位计算均值跟方差的样本量也不一致);BN依赖batch大小,太小的话统计没有意义而且不适用于在线学习;BN需要有额外的开销来存储每层每个神经单元的均值以及方差。基于以上的问题,LN可以解决;相对BN,LN是在一个样本内,对同一层的数据做归一化,这样是不需要额外的存储开销。
3、highway network vs residual network
(1)highway network
(2)residual network
residual network是highway network的特例,本质上是为了学习残差,能够更好地拟合恒等函数。也就是说学习比学习容易。