在样本稀少的时候,怎么处理样本不平衡的问题?
这个问题比较经典,也在面试中经常用到,尤其在金融领域常遇到,基本解决的思路如下:
1)过采样或者欠采样
使用抽样的方法来处理不平衡数据,基本思想就是通过改变训练数据的分布来消除或减小数据的不平衡,过抽样方法通过增加少数类样本来提高少数类的分类性能 ,最简单的办法是简单复制少数类样本。欠抽样方法通过减少多数类样本来提高少数类的分类性能,最简单的方法是通过随机地去掉一些多数类样本来减小多数类的规模。
2)特征筛选
样本数量分布很不平衡时,特征的分布同样会不平衡,需要根据特征特点,选择有分别能力的特征,提升AUC的上限。
3)算法层面,改变目标损失函数,不同label,代价不同。Pull 和 push 对应的真实场景是什么?
这个问题比较经典,是推荐典型的架构演进。不同业务场景,适用的架构不一样。pull和push的本质是解决推荐系统中的性能问题,举两种push和pull结合的例子。
1)基于社交关系的UGC推荐
UGC推荐时我们会将用户关注的人发表的优质UGC放到候选集合中,这种场景下最自然的是通过pull的方式,但是点评社交网络中一些用户的关注人数达到了几十甚至几百的规模,实时拉取每一个好友的发布列表并进行合并,会对系统的性能和稳定性带来较大的影响。
如果我们采取push的方式,用户每发表一篇UGC,就把该UGC放到他的关注者的候选队列中,在推荐时,我们只用拉取一次就可以获得对应的UGC候选结合。纯push模式虽然加速了UGC推荐候选集合的获取速度,但是会对存储空间带来比较大的挑战,尤其是点评的一些明星用户的关注者人数达到了几万甚至几十万的规模。因此我们采取push和pull相结合的方式,如果关注该用户的人数超过了一定的限制采用pull的模式,否则采用push的模式,在响应时间和存储空间上有比较好的权衡。
2)近实时计算
获取推荐候选集合时我们采用了多策略相结合的模式,其中某些复杂的策略的计算复杂度较高,例如基于RNN和基于DeepCF这样的的召回策略。如果这些多策略的结果都是实时计算,就会导致推荐服务的请求响应超时, 因此我们会将这些耗时
的召回策略的结果事先计算好,然后push到用户的推荐列表中,当用户发出请求时,直接推荐给用户。
3)PULL的场景
用户的LBS请求,就是实时从索引中检索的,因为Location的经纬度太多了,很难直接预先存储,直接检索来的效率更高。所以PULL和PUSH适用于不同的场景,是对服务性能和存储的一个折中。深度学习网络中,优化器如何选择?
1 ) 优化器在实验初期大部分情况下使用adam adadelta, rmsprop等可以自适应梯度优化器,初始学习率可以设置较大的值,速度比sgd快了数倍。到了实验后期可以选择sgd+momentum,学习率手动衰减,衰减时机可以是验证集准确率不再上升时或者固定学习n个epoch之后,这种方法经常能获得比adam更好的效果。
2) 对RNN来说,有个经验,如果RNN要处理的序列比较长,或者RNN层数比较多,那么步长一般小一些比较好,否则有可能出现结果不收敛,或者Nan等问题。具体关于优化器的各种优缺点,可以参考美团点评技术博客上的文章,https://tech.meituan.com/dl.html排序的训练数据怎么生成
训练数据是根据前端日志生成的,点击过标记为正例,没点击为负例 采用skip above原则,会做一些样本的筛选 关于样本的生成和筛选 有很多经典方法,大家可以看一些经典的论文如何选择 DSSM 目标函数?
首先说下目标函数是用来衡量模型效果和可用性,通常分为经验风险(平均损失
)和结构风险(模型复杂度)。对于DSSM模型而言,我们更关注损失函数,它是经验风险函数的核心部分,也是结构风险函数重要组成部分。DSSM模型的目的是将不同结构的匹配对压缩到同一个低维的语义空间中,并且最大限度的保证匹配对的相关性。
为了达到这样的目标,首先需要衡量语义空间中不同向量的相关度。通常可以使用欧氏距离或者余弦相似度来计算,
但具体到文本向量,由于是稀疏的,一般使用cosine较好,修正了可能存在的度量标准不统一的问题。
在衡量相关性之后,对于一个待匹配的向量,我们将相关性带入softmax函数来表示它和其他向量之间存在匹配关系的概率。为了最大化正样本匹配成功的概率,我们选择了对数似然损失函数,通过最小化该损失函数来估计模型参数,减小预测值与真实值Y的不一致程度,增强模型的鲁棒性。请问在训练wideDeep中采用过哪些防止过拟合的办法?加dropout?加batch normalization?进行early stop?另外是不是尽可能训练的batch_size小些,num_epoch尽可能小或为1,毕竟重复的训练数据可能导致过拟合。
最简单的是增加数据量,dropout是针对dnn非常有效的方法。另外就是正则化项,early stop也是所有模型训练时候的标配来了,当测试集上的准确度不增加时 则停止训练。batch normalization也有效,batch_size是一个调参过程,过小训练慢可能导致震荡RNN 在召回策略中是如何使用的?
我们在线下训练的时候,首先输入层对用户访问序列中的item进行one-hot编码,在输入层之上通过embedding层压缩成稠密连续值,在embedding层之上我们搭建了若干个RNN层,最后是增加若干全连接层到输出层。
输出层的loss目前采用的是交叉熵。线上预测的时候,将用户历史点击的文章ID按照时间排序形成序列,这个序列作为RNN模型的输入,输出是用户可能点击的文章的分数,排序后取得分最高的TOP N个结果作为召回结果。Deep 层和 wide 层特征辨别规则是什么?
wide层在处理高纬离散特征(category特征,命中召回策略特征,经离散化的连续特征,skuid等)上有优势, deep层在处理连续特征上有优势 ,销量,质量分,好评数etc...
wide与deep层的特征,与LR模型与DNN模型的特征适用场景基本类似,Wide&Deep正是用了这两个模型的有点才更强大。embeding主要用了哪些方法?以及有用到graph enbedding么?怎么用的?
embedding的训练用到了两类方法:端到端的和非端到端的。端到端的方法是将embedding层作为神经网络的一部分,在进行bp更新每一层参数的时候同时更新embedding,可参考tensorflow中的tf.nn.embedding_lookup方法;非端到端的方法有doc2vec item2vec word2vec等,另外lda可以给出每一篇文章下主题的分布向量,也可以看作是学习出了文章的embedding。
目前我们线上使用的embedding主要是用端到端的方法训练出来的。
使用embedding的方式主要是直接与其他特征concat成向量,然后作为后续网络的输入。
Graph embedding这个我们暂时还没有使用到召回是不是就是美团系统各个业务产生的数据?
召回就是推荐的粗排数据海选,用相对简单的特征和算法,海选出一批推荐的候选集合,然后精排层进行排序,使得推荐更为精准。embedding是用什么工具实现的?
主要是离线采用keras,选择一种网络结构及网络参数后,根据目标函数,自动训练出来的。端到端的embedding由模型自动生成,在模型训练的过程中同步更新。除了体现端端的特点,随不同任务的数据分布体现领域特性。非端的embedding,通常需结合模型一起使用,可以缓解数据量减少难以训练的情况。端到端可以用tf的embedding_lookup 还可以使用keras的embedding层。
headlineEmbedding = tf.nn.embedding_lookup(embedding_weight['headline_embedding'], headlineId)
denseFeatures = tf.placeholder(dtype=tf.float32, shape=(None, FEATURE_SIZE), name="feature_holder")
input = tf.concat([headlineEmbedding, denseFeatures], axis=1)
lastOutput = input
for i in range(LAYERS):
h = tf.add(tf.matmul(lastOutput, weights[i]), biases[i]) # wx+b
layer = tf.nn.relu(h) # activation
tf.summary.histogram("layer" + str(i), layer)
dropout = tf.nn.dropout(layer, keepProb) # dropout
lastOutput = dropout
logit = tf.exp(tf.add(tf.matmul(lastOutput, weights['out']), biases['out']))
output = tf.nn.sigmoid(tf.add(tf.matmul(lastOutput, weights['out']), biases['out']))
Embedding的相关代码。。。大家可以自己实践一下。
点评的推荐系统是如何保证质量的?
线下的监控和评测,线上的特征监控与效果统计,线上服务的监控。数据越实时越容易反馈出业务的问题。训练wideDeep模型时,因为embedding层是放到网络里端到端训练的,而id类特征会导致整个网络的参数非常多,这时候训练样本的数量需要是特征数目的多少倍比较合适?你们是什么倍数?
训练wideDeep模型时,因为embedding层是放到网络里端到端训练的,而id类特征会导致整个网络的参数非常多,这时候训练样本的数量需要是特征数目的多少倍比较合适?你们是什么倍数?
dnn里对于id类特征通常是使用embedding表示,可以大大降低特征维数;特征数量与样本数量是没有必然关系的,对于深度学习,网络结构的复杂度越高,要求的样本也就越多,目前我们线上的特征有数百维(id类特征作了embedding之后),训练样本在千万级别。现在点评的ltr是point还是pair?
有point 也有pair的 ,尝试过基于pair的1.对于增量训练的不稳定性是怎么解决的
2.对于偏好类特征是怎么embedding的,比如1:0.5,2:0.2,3:0.3这类特征
3.由于数据解析过慢,导致gpu占用率偏低,训练速度很慢,请问有什么好的解决方法吗
答:对于1,选取增量的时间窗大一些 避免这种问题,如果增量不稳定,有线上的校验机制 避免模型更新
对于2,对于题中示例,我们是取 1,2,3对应的embedding 按照0.5 0.2 0.3的权重作加权平均
tf.div(tf.reduce_sum(tf.multiply(preferedCategoryEmbeddings, weight), 1), preferedCategoryCnt)
对于3,没遇到过