涨点
就笔者2.5年的从业经验来看,能确定涨点的方向有三个,模型容量、有效计算以及信息增益。分别介绍一下,模型容量就是通过扩大模型参数、提高Embedding维度等方式扩大模型容量提高模型表征;有效计算也是在模型维度通过修改模型结构、变化特征处理等方式提高有效计算能力提升模型性能,比如LR模型升级WideDeep、特征One-hot变为Embedding;信息增益则是在特征维度通过新增有效特征,比如多模态信息、序列信息等,使模型预测有更多的参考。
在实际中,做算法方向的同学也基本上都是按照上诉三个思路去找寻工作方向,比如能找到一个当前还未加入的模型的特征,同时这个特征和预测结果又有很强的相关性,这个Q的绩效是不是稳了。只找对一个方向都能稳了,那找对两个岂不是要起飞。本文要介绍的DIN结构就确实起飞了,不仅添加了有效特征而且增加了有效计算。这里的有效特征就是序列特征,这里的有效计算就是Attention结构。
什么是序列建模
相信很多的读者在入坑机器学习的时候都做过Kaggle的股票预测,股票预测是一个典型的时间序列预测问题。对于时间序列预测问题,解决方案有很多,比如均值法、指数平滑法、Lstm等,本质上都是利用历史信息对未来进行预测,于是这里就出现了核心问题,历史信息这么多,可能是7天、30天甚至一年,哪些信息对预测是重要的,这些信息又该怎么表征呢。与时间序列预测问题类似,推荐或者广告领域的序列建模则是根据历史有过交互的物品预测未来可能交互的物品。
图1.Youtube DNN Pooling建模
同样的,对于所有历史有过交互的物品我们是一碗水端平考虑所有行为记录的影响,比如Youtube DNN的Pooling建模,还是有选择的让近期有交互的物品权重更高一些呢。乍一听,第二种可能更合理。但是仔细想一想我们自己的平时刷抖音的过程,我们的兴趣是多样的,既看篮球,有浏览时政,同时还看小姐姐,难道小姐姐能和篮球一样重要?这就是注意力机制(Attention),顾名思义就是模型在预测的时候,对用户不同交互权重是不一样的。
序列建模方式
上面讲到序列建模一个重要的手段就是引入注意力机制,提到注意力机制,想必大家都会想起那篇驰名中外的Attention is all you need。注意力机制有三个重要元素,Target、Query、Key,原系列的<key,value>数据对构成,此时对于Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention的数值。
对于序列建模中,一一对应,Target就是我们的候选物品,Key就是序列物品。那么Query怎么选呢?与NLP问题略有不同,Query的选择是由业务场景、产品形式、或者实验数据决定的。看几个不同的场景,比如Feed流,Query通常是候选物品,选择Target-Attention结构;相关推荐场景Query通常是当前物品,选择Trigger-Attention结构;搜索场景Query通常是搜索词,选择Query-Attention结构。在实际应用中,需要各位攻城狮结合具体业务和实验数据选择合适的建模方式。上诉的场景对应建模方式只是给各位做个参考,笔者在实际实验中也出现过对应匹配不合适的情况,因此业务理解和实验很重要。
DIN结构
说了这么多,终于到DIN模型了。深度兴趣网络(Deep Interest Network)是多种序列建模方式中的一种,由阿里妈妈团队提出,用于电商网站或APP中给用户推荐广告。
论文中提出使用历史有过交互的广告商品 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 作为用户表征 <math xmlns="http://www.w3.org/1998/Math/MathML"> V u V_u </math>Vu ,通过与候选广告商品进行注意力加权计算 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( V i , V a ) g(V_i, V_a) </math>g(Vi,Va) 对候选广告商品进行打分排序。
<math xmlns="http://www.w3.org/1998/Math/MathML"> V u = f ( V a ) = ∑ i = 1 N w i ∗ V i = ∑ i = 1 N g ( V i , V a ) ∗ V i V_u = f(V_a) = \sum_{i=1}^{N} w_i * V_i = \sum_{i=1}^{N} g(V_i, V_a) * V_i </math>Vu=f(Va)=∑i=1Nwi∗Vi=∑i=1Ng(Vi,Va)∗Vi
由于引入了注意力机制, <math xmlns="http://www.w3.org/1998/Math/MathML"> V u V_u </math>Vu 从之前 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 的加和变成了 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 的加权和, <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 的权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi 就由 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 与 <math xmlns="http://www.w3.org/1998/Math/MathML"> V a V_a </math>Va 的关系决定,也就是上式中的 <math xmlns="http://www.w3.org/1998/Math/MathML"> g ( V i , V a ) g(V_i,V_a) </math>g(Vi,Va)。
图2.深度兴趣网络
DIN结构在生成用户Embedding时加入了一个Activation unit层,这一层负责计算每个用户行为 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 的权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> w i w_i </math>wi。对于Activation unit层,首先是把 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> V a V_a </math>Va 以及两者的Element wise差值向量合并起来作为输入,通过全连接层得出权重,这样的方法损失的信息更少。
上面就是DIN论文提到的重点内容,同时作为一篇工业气味浓厚的文章,也提到了一些其他的贡献点,如:
- GAUC替代AUC成为离线指标,想必同行们目前做理线调研时,两个指标应该都是关注的重点
- Dice替代PReLU成为新的激活函数
- 介绍一种Adaptive的正则化方法
- 介绍阿里的X-Deep Learning深度学习平台
实际应用需要关注些什么
在实际的工作中,假设某个场景需要引入时序特征,加入DIN结构,需要关注些什么呢?或者说有哪些坑点呢?笔者根据自己的经验列举一些,供各位参考讨论。
-
序列的选择
如何进行序列选择,比如场景来源,是选择全站还是特定场景;交互行为,是历史点击还是历史点赞;;都会直接影响到实验的效果,针对不同的业务场景,合适的选择不是唯一的。
-
序列特征的宽度和长度
序列特征的长度指的是历史行为记录的个数或者是时间窗口的大小,比如历史点击过的10个物品、近一周内的点击物品。序列特征的长度越大,自然序列特征就包含了时间周期更长、更丰富的信息,能关注到更久的用户兴趣。
序列特征的宽度指的是序列特征的维度或者是特征数量。特征更多、Embedding维度越大,序列建模的能力就越强。
-
Target与序列物品
在论文中,会发现在计算Attention时Target的good_id与shop_id是和序列物品的good_id与shop_id分别进行计算的,保证了统一的ID映射空间,这里也是需要注意的。
-
成本与产出的平衡
序列特征的长度和宽度越大,信息越丰富、建模能力更强。但是序列和Attention的引入会带来计算资源的增长。在"涨点"的同时还要考虑到计算成本,做好性价比。为了应对这个问题,提高资源利用效率,可以做一些快速检索的操作,减少序列长度的同时提高效率,比如阿里的SIM模型。
总结
本文讨论了常见的序列建模方式DIN结构在实际业务中的使用,以及常面对的问题和关注点。