推荐系统 百面百搭 —— 21~28
作者简介
作者:Rulcy
原文:https://zhuanlan.zhihu.com/p/422464069
转载者:杨夕
推荐系统 百面百搭地址:
https://github.com/km1994/RES-Interview-Notes
NLP 百面百搭地址:
https://github.com/km1994/NLP-Interview-Notes
个人笔记:
https://github.com/km1994/nlp_paper_study
Q21: 推荐系统的特征工程有哪些?怎么做?
A: 数据、模型、算力共同决定效果,而数据部分决定了效果上限,模型和算力只是在逼近上限。推荐系统的特征工程属于数据部分,目的是为了保留有用的特征,摒弃无用的特征。常用的特征类别有:
固有属性特征。可以是用户/商家自行设置的标签,或是由用户给物品打上的标签等。
行为特征。这类数据多为序列型数据,多用以序列建模。或是取历史行为数据的平均embedding或DIN的方式处理(embedding求权)。
社交特征。关于社交关系的特征,可以建立关系图并应用图embedding技术;或是作为用户的一个固有属性进行预测。
内容特征(多媒体特征)。图片、视频、文字等信息。
上下文特征(场景特征)。此类特征保留推荐行为发生的场景信息,包括时间、空间、特定事件等。
统计特征。通过统计方法计算出来的特征。
高阶组合特征。
不同类别的特征输入可以作为多路召回的策略之一。
常见的基本特征类型有连续型特征和类别(离散)型特征。对于它们的处理方式通常有:
连续型特征:归一化、离散化、加非线性函数处理(如log、幂等,主要是为了使特征数值更适合模型输入)。
类别型特征:one-hot、multi-hot等。
Q22: Transformer细节:Scaled Dot-Product Attention为什么要缩放?(两点)Position Embedding是如何实现的?
A: Scaled——论文中的解释为,点积的结果可能会比较大,将softmax函数push到一个梯度很小的区域。Scaled通过对向量中数值的同程度放缩,缓解这种现象。可以如此进行理解,如传入softmax层的向量为[0.27,0.73]时,softmax能起到好的效果,而放大100倍,softmax输出结果近似能达到[0,1]的程度,使梯度传播缓慢。
另一方面,需要了解为什么scaled采用根号d(向量维度)进行放缩:对于QK的内积(1×D · D×1)而言,假设QK中各个分量都服从均值方差~(0,1),则内积结果服从(0,D)。方差越大,即说明点积结果可能取到更大/小的概率。故采用Scaled操作将方差控制在1。
可以扩展的是,常规的Attention形式有Add和Mul两种。简化来看,Add将两个向量相加并通过一个隐层输出权重,Mul将两个向量通过内积得到相似度值,并使用Softmax层输出权重。Mul相较于Add实现更为简单快捷,但发现随着向量维度D增长,Mul的性能渐渐不如Add了,此时认为是较大的内积值将Softmax层推向了梯度平缓区,而Add由于其性质,天然的不需要Scaled的存在。
Position Embedding——存在的原因在于Self-attention的形式和常规神经网络是同一性质的,即平等地看待网络中的所有输入,这不同于串行训练的循环网络,会使序列信息中宝贵的位置信息丢失。Transformer中引入的位置编码为正弦位置编码,并将不同的Position Embedding加到不同位置的向量中。正弦位置编码在为每个向量引入不同的绝对位置编码的同时,任意两个向量能够很好地获取相对位置的信息(原文提到过,PE(pos+k)可以表示成PE(pos)的线性函数)。
Q23: 如何解决数据不平衡?
A: 在数据不平衡的前提下训练,很容易使模型预测结果总偏向于数据量多的一方,从而产生没有实际收益的结果。解决数据不平衡有以下几种方案:
重采样(包括欠采样和过采样)。举例说明,对数据进行聚类,对大的簇进行随机欠采样,对小的簇进行数据生成。缺点:欠采样可能导致数据信息损失,使模型欠拟合;过采样需要生成较少类别的数据或使用重复数据,导致过拟合。合成新数据和过采样地理念是相似的,这种方法有可能造成数据信息不准确。
集成模型。对多类样本进行欠采样,并与所有的少类样本共同作为基学习器的数据。
选择对于数据不平衡相对不敏感的模型,如树模型。
将有监督学习问题转化为一个无监督学习问题,如异常检测。
阈值调整。例如在二分类中,将类别分类的阈值从0.5转为较少类别/(较大类别+较少类别)。个人认为,调整阈值的方法需要对损失函数进行调整,且这种方案可以理解成”改变权重”,即对与少数类分类错误的惩罚加重。
Q24: 假设检验的两类错误。
A: 弃真(第一类错误)、取伪(第二类错误)。常用避免两类错误的方法是增大样本量。
Q25: 为什么快排比堆排快?
A: 从局部性原理解释:读取数据的应该遵循的两个原则——不久之前读取过的数据在之后可能会被读取;读取一个数据,它周围存储地址的数据可能会被找到。堆排序主要流程是建堆的过程,堆排常规使用的是完全二叉树,每次在单个元素上升的过程比较的是x与2x(或2x+1),由于数据之间相隔较远,会导致经常在cache中找不到缓存的数据。
Q26: RMSE、MSE、MAE。
A: MSE——均方误差,对量纲敏感(万*万会到亿级别),多用于损失函数。RMSE——均方根误差,克服了MSE的量纲问题,多用于评价指标。MAE——平均绝对误差,多用于评价指标。
需要注意,这里说的多用于损失函数/评价指标并不绝对,只是大多数研究中是这么做的。
MSE用于损失函数的优点在于其平方的形式,使误差更大的模型被给予更高的惩罚,这有利于快速收敛。缺点在于这种“更高的惩罚”是相对的,如果模型训练出现了离群点,那么训练过程会更偏向于离群点,使得模型整体性能下降。
MAE相较于MSE,没有平方项的作用,对所有训练数据惩罚力度相同。但反之,MAE对所有数据的一视同仁,使基于MAE的模型学习速度慢,甚至可能由于梯度值小,使模型陷入局部最优。另外,MAE在0处不可导。
RMSE更多的是作为评价指标与MAE相比较而言的。RMSE由于其平方的性质,如果评估集中较大误差的数据会更大程度的提升RMSE值(简单来说,RMSE更容易受到方差的影响)。所以常规情况下,RMSE值是大于MAE的。在评测中,更小的RMSE更具备代表意义,这说明在评估集中相对较大的误差也是比较小的。
Q27: 双塔模型的应用。
A: 说到双塔模型不得不谈DSSM模型。DSSM模型用于解决NLP的语义匹配任务,后被引入到推荐领域,成为早期的双塔模型代表。双塔模型主要的理念是,将user与item分别利用一个网络进行建模,在网络的最后计算相似度/通过隐层输出预测结果值,其模型结构像两座高塔。双塔模型在工业界应用广泛,在线下训练完成后,将user与item的embedding存入内存数据库中,在线上推断时,直接拿出缓存的embedding进行简单的计算(相似度)即可。双塔模型的不足在于只在最后阶段有着user与item的交互(特征交叉程度不足,只在user/item内部域才存在特征交叉)。2019年谷歌提出的双塔模型具有较大的工业价值,有时间可以自行看看。
Q28: XGBoost如果损失函数没有二阶导,该怎么办?
A: 使用次导数或退化到使用一阶导。