机器学习建模——如何融入先验信息

背景 想要用ML模型拟合业务,但实际中经常会遇到类似下面的场景: 二手车价格预估:同一辆车,预估的价格与里程应该是严格负相关的; 保费预估:保额越高,保费越高; 理财产品中,比如余额宝,用户的利率敏感度预估(利率敏感度=用户余额变化/利率变化):同一用户,理财产品利率越高,购买金额越高,余额越高; 如果直接用比如xgb或dnn模型拟合 X -> Y, $$ p_y=f(x), where\ x = [x_c, x_p] $$ 其中f为xgb或dnn等具体模型,x_c为先验无关的特征(比如二手车里面的品牌和里程特征无关),x_p为先验相关的特征。由于噪声数据的存在以及模型中没有任何的相关性约束,模型最终的打分输出很难保证满足上面案例中的约束关系。 自然想到的方法 一种自然想到的方法是,将f拆解成2部分: $$ p_y=f_c(x_c) + f_p(x_c,x_p) $$ 其中: $f_c$主要建模先验无关特征,可以是任意复杂模型,其输入只能是$x_c$; $f_p$单独建模先验信息,必须是满足先验约束的模型,一般是满足单调性的模型,比如LR、IsotonicRegression等,其输入包含$x_p$; 根据这个思路,二手车价格的建模就可以表达为:predicted car_value = 基础平均价格(baseclean_trade) + 里程相关的价格(predicted mieage_adjustment)。 这种方法建模有个问题,数据集怎么构造?针对二手车预估这个问题,标签一般只有最终的车价,basecleantrade model和averagemileage模型的标签怎构造呢? basecleantrade model:除里程相关特征(odometer,mileage等)外,其他特征group by计算平均价格作为标签,即同款车在不同里程下的平均价格作为标签; averagemileage:里程特征的平均作为标签,其他特征作为模型的输入; 从数据构造过程也可以看出,要采用这种方法的话,就一定得保证同款车有多个不同里程下的数据,这样效果才会好。 进一步——End2End 上面需要建模多个模型,是否能把多个模型融合做到End 2 End训练呢?答案是在DNN中加入先验信息。 同样对于二手车价格的建模,如下图,可以在DNN中针对里程这一项加入先验约束(mileageadjust module)。 图里画的是线性约束,当然,线性约束效果最中预估效果上可能会有一点折扣,可以考虑survival/cox function作为先验约束函数能达到更平滑的效果。具体用什么约束函数,是通过数据分析得到的。 根据这个思路,如果我要预估理财中的用户利率敏感度可以怎么做呢?把上面的思路顺一顺: 分析历史数据中“利率变化"和“余额变化"的关系,如果是接近线性,那就可以用线性先验,如果只是单调则可以考虑survival/cox function;也可以结合一些业务/经济规律来定义先验,比如需求价格弹性; DNN建模,在模型中加入步骤1中得到的先验约束; 最终,利率敏感度建模可以类似下面这样(先验有点类似于需求价格弹性先验)。其中$Q_t$是用户在t日的余额,$r_t$是产品在t日的利率,$Q_{t->t+N}$用户余额变化,$x_{t^+}$是用户利率变化,模型训练完后的$E_d$即可输出作为利率敏感度。 扩展 其实了解过uplift因果模型的同学,应该很容易发现这里的建模方式和uplift中的s-learner很像,只是s-learner中一般treatment是二元变量,但是这里例子中的变量(比如利率,里程等)是连续型变量。 所以要继续深入可以研究将uplift中的方法引入到先验建模场景中。

May 5, 2024 · 1 min · Monkeyzx

重读经典——word2vec

为什么需要重读word2vec Word2vec原论文: Tomas Mikolov, Kai Chen, Greg Corrado, and Jeffrey Dean. Efficient estimation of word representations in vector space. CoRR, abs/1301.3781,2013. Tomas Mikolov, Ilya Sutskever, Kai Chen, Gregory S. Corrado, and Jeffrey Dean. Distributed representations of words and phrases and their compositionality. NIPS 2013. 其中1主要是描述CBOW和skip-gram相关方法,2描述了Negative Sampling以及训练word2vec的方法。为什么想要重读word2vec: 推荐系统中,可以把item或user类比与word2vec中的word,很多i2i和u2i的方法都是借鉴的word2vec,以及召回中常用的NCE Loss和Sampled Softmax Loss都和word2vec相关;熟悉word2vec对了解召回,对如何像Aribnb KDD18和阿里EGES一样将word2vec改进应用到具体业务中,会非常有帮助; 召回热门样本的处理,也可以借鉴word2vec中热门词的处理思路; GPT的输入词是字符串,怎么表征输入到NN?当然,现在大家都很熟悉了embedding lookup table,embedding lookup table的其实最早差不多就是来自word2vec(更早影响没那么大暂且不提);沿着这个拓展,因为词表太大,又在embedding前加了tokenizer过程; word2vec是老祖级别的语言模型,那么最新的GPT和它主要区别在哪里? 以及初次看GPT代码时,发现GPT的输出是softmax,word2vec其实loss也是softmax loss。但为什么在word2vec里面的softmax就需要Negative sampling,而GPT里却不需要? CBOW和skip-gram word2vec核心思想是通过训练神经网络,将word映射到高维embedding。其embedding的思想对推荐系统、以及Bert,GPT等都影响深远。Word2vec一般有两种训练方法:CBOW和skip-gram。 CBOW是通过上下文(Context)学习当前word(BERT中的完形填空和这个很像),假设词与词之间相互独立,则对应的极大似然学习目标为: $$ E=-\log p(w_t|w_{t-1},w_{t-2},..,w_{t-c},w_{t+1},w_{t+2},...,w_{t+c}) \\ = -\log \frac{e^{h \cdot v'_o} }{\sum_{j \in V} e^{h \cdot v'_j }} \\ = - h \cdot v'_o + \log {\sum_{j \in V} e^{h \cdot v'_j}} $$ 其中,...

March 31, 2024 · 3 min · Monkeyzx

超长行为序列建模SDIM

SIM和ETA的问题 SIM通过类目从长序列中检索相关的items(hard-search)或者通过embedding inner product计算从长序列中检索最相似的topK个item;SIM的问题在 ETA 中讲过,主要是离线索引可能带来的在线target item embedding和离线的item embeddings不一致的问题; ETA在SIM基础上,通过对Long Behavior Sequence的item embeddings进行SimHash(LSH)之后,然后就可以将inner product的耗时计算转化为Hamming distance计算。从而大大降低了计算量,可以把检索topK的过程放到线上模型中,解决了SIM在离线不一致的问题;但是ETA依然需要通过一个Multi Head Target Attention得到最终的Long Behavior Sequence Embedding表达; 不管是SIM还是ETA,都是基于检索的方法从长序列(>1000)的候选items中选出最相关的topK,美团的这篇文章Sampling Is All You Need on Modeling Long-Term User Behaviors for CTR Prediction 则是吸收了ETA中Hash函数的特点,但不使用检索的方法,不通过Multi Head Target Attention,直接得到用户Long Behavior Sequence的embedding表达——SDIM(Sampling-based Deep Interest Modeling)。 Hash-Based Sampling的用户行为建模 SimHash有Local Sentitive特性,也就是说空间距离相近的两个vector在Hash之后距离也 大概率 相近。SDIM就是利用这个原理: 将序列的所有Item Embeddings和Target Embedding通过m个Hash函数进行Hash(比如下图m=4) Item Embedding每次Hash之后和Target Embedding落在同一个桶(Hash的LSH特性),则记为一次贡献; 进行m次Hash之后,统计每个item embedding的贡献,最后用L2 normalization进行归一化得到每个item embedding的权重 weights(按理L1也可以,但是作者说L2效果更好) 最后只需要将长序列的item embeddings通过weighted sum pooling求和就得到了Long Behavior Sequence的Embedding表达,完美避开了Multi Head Target Attention的操作; 当然,为了降低Hash冲突的风险,实际中需要将hash function数量m和Hash width设置得大一些。...

March 24, 2024 · 1 min · Monkeyzx

超长行为序列建模ETA

SIM的问题 前面介绍过阿里巴巴超长行为序列建模的方法SIM是two-stage,在预估的时候,SIM先通过target item从长行为序列中通过类目(hard-search)或item embedding相似度(soft-search)检索出top-K,再送到主模型中做target attention。由于类目索引和item embedding索引的构建是离线的,而CTR主模型很多时候需要online learning,这种情况下就造成用于检索的目标item embedding和离线构建的item embedding不在同一空间(离线的item索引存在滞后)。 End-to-End User Behavior Retrieval in Click-Through Rate Prediction Model 是阿里主搜团队 基于此出发提出了End-to-end Target Attention - ETA,GMV提升3%。我们回到长序列问题本身,为啥不能像DIN/DIEN一样直接对超长序列做target attention——因为inference time吃不消(target attention需要对长序列中的每个item emebedding做inner product)。那么有没有其它方法可以快速从长序列中检索出top-K,又不需要像SIM那样最终要用到比如faiss做快速的索引? ETA就想到了SimHash!通过将long behavior sequence item embeddings进行SimHash后,就能通过Hamming distance替代掉inner product,从而缓解长序列中inner product所带来的计算量问题。 Embedding SimHash后能快速的进行TopK检索 SimHash算法用于将每个item embedding映射成一个二进制的串(最终可以保存成一个整数),之前主要用于长文本相似度的比较。这里应用SimHash相当于把embedding当作长文本。 本文使用的SimHash伪代码如下,代码中共进行m次Hash,Hash的width=2即每次Hash返回二值0或1的$sig_k[i]$: 只要满足下面的条件,就能保证最终的计算复杂度能够降低: 映射后的向量相似度计算函数的复杂度比inner product低(映射后的二进制向量用Hamming distance计算相似度,复杂度 < inner product); 映射后的向量长度比原item embedding长度小(m<d); Hash映射函数的复杂度不高;从伪代码看,Hash过程也需要计算内积,怎么感觉比inner product还高,Table 2里面的ETA的Retrieval complexity貌似也没把Hash函数的计算量考虑进去?主要原因是:在inference阶段,模型训练好之后,item embedding都是lookup table,那我们可以把lookup table里面的所有embeddings都提前计算好它的$sig_k$,然后和Embedding Table以及模型一起存储下来,最终只要根据item查表得到$sig_k$就行。所以Inference的时候,理论上Hash函数的时间可以忽略不计; 下图是采用SimHash之后,ETA对各种检索方法的时间复杂度、检索信息一致性的对比:相比直接inner product,ETA通过对item embedding做SimHash,然后用Hamming distance相似度函数进行检索。 有几个问题: SimHash把d=128维度的embedding映射到了m=4维,且通过Hamming distance代替了inner product计算,这也就是ETA为什么能降低计算复杂度的核心原因。那如何保证映射后m=4维的向量后原d=128 embedding的信息不会丢失呢?SimHash有一个特殊的性质——locality sensitive hashing,即局部敏感哈希,也就是说空间上相近的两个embedding做完Hash之后位置依然大概率接近。 如果是SimHash映射到m=4然后再计算相似度,那为什么不建embedding lookup table的时候就让d=4?核心是因为这里的复杂度降低,是将inner product计算替换成了Hamming distance计算,Hamming distance通过异或XOR运算复杂度可以控制在O(1),所以不管怎么降低embedding dim都比较难达到Hamming distance这么低的计算复杂度。 ETA (End-to-end Target Attention) ETA结构左边就是SimHash的应用,具体的:...

March 23, 2024 · 1 min · Monkeyzx

超长行为序列建模SIM

为什么推荐需要超长行为序列? 试想这么种场景,某个用户4个月前在某家店买了厕纸,2个月前又买了厕纸,然后中间又浏览了成千上万的其他东西,到现在又隔了两个月,应不应该推厕纸? 然而,对于模型来说,因为2个月前到现在中间浏览了成千上万的其他东西,而DIN, DIEN, MIMN只能建模1000以下的行为序列,所以早就把厕纸从行为用户历史行为序列中剔除出去了。 所以: 第一,通过超长行为序列可以捕获用户长周期里面周期性或规律性的购买行为 第二,短序列只能刻画用户短时的兴趣偏好(买了几次盲盒,但无法确定是否二次元用户),但通过超长序列可以刻画用户的长期偏好(比如,除了最近几次的盲盒还买了很多手办,二次元用户) 任何事情也都有利弊,即使计算量不是问题,但直接把用户所有的历史行为序列到模型中,除了会引入有用信息,同时也引入了许多的噪音。如何从用户长历史中剔除噪声,提取有用的信息?SIM在一定程度上就是在解决这个问题。 题外话:LLM里面的RGA,不是也为了解决这种问题吗? SIM Paper: Search-based User Interest Modeling with Lifelong Sequential Behavior Data for Click-Through Rate Prediction SIM是Two-stage Model, 包括GSU和ESU阶段。注意,主结构中依然保留了User short-time behaviors的输入,在短时序的基础上做增量,毕竟最近的行为序列才是最重要的。 General Search Unit (GSU) GSU,通过线性时间复杂度,用于从原始超长序列中检索出top-K相关的子行为。文中介绍了两种GSU的方式,soft-search和hard-search。两种搜索的差别主要在序列中的item和目标item的相似度的计算上, $$ r_i = \left\{ \begin{aligned} sign (C_i=C_a) & & hard-search \\ (W_be_i) \cdot (W_ae_a)^T & & soft-search \end{aligned} \right. $$ 其中,$C_a$是目标item的category,$C_i$是序列中behavior item的category,即只从长序列中筛选同category的items;soft-search则是直接通过behavior item embedding和目标item embedding的内积(inner product)计算相似度,SIM使用的检索算法是ALSH(这也是召回里面常用的user向量检索item向量的方法)。 关于soft-search的item embedding: 不能直接使用short behavior sequence的embedding,因为不在一个表达空间,embedding差异会比较大;所以才有了上图中左边Soft Search Training辅助任务; Soft Search在原文中是和后面的ESU一起训练,得到behavior item embedding矩阵,线上serving的时候通过类似i2i召回,内积检索得到topK的item;但是,一起训练成本太高,behavior item的长期表达在短期内变化不大,这里是否可以定期离线训练? soft-search training的技巧:当life long sequential behavior实在太长的时候(内存放不下),可以随机采样子行为序列,对最终item embedding的分布影响不大; hard-search或soft-search的topK结果送到后续的ESU。...

March 21, 2024 · 1 min · Monkeyzx