一、背景
组内最近准备上线ESMM模型,其中加入了用户的点击行为序列与候选物品的相似度特征。具体的做法是:根据用户点击过的item序列,经过Avg Pooling计算出representation vector。而后将其与candidate item的embedding vector做inner product,计算用户行为序列与当前候选item的相似度。
离线训练时发现,在第一个epoch中,train loss与val loss在同步下降。而在第二个epoch开始后,train loss下降,val loss却在一直上升。很明显,模型过拟合了。
尝试将该特征剔除后,模型恢复到需要多个epoch才能收敛的状态。由此我们确定由于加入了id类信息,导致了模型的过拟合。
类似的,阿里的DIN原论文中也提到了这个现象:
Overfitting is a critical challenge for training industrial networks.For example, with addition of fine-grained features, such as features of goods_ids with dimensionality of 0.6 billion (including visited_goods_ids of user and goods_id of ad as described in Table 1), model performance falls rapidly after the first epoch during training without regularization.
二、原因
我们认为,出现过拟合的原因在于:id类特征取值过大,各个id在训练集中出现的次数并不多,也就是说大部分id在训练集中都是相对低频的。而低频就导致模型训练时容易记录这些出现过的pattern,这些id特征的representation在训练时尽可能倾向于表达这些出现过的pattrn,而对测试集中未出现过的pattern表达效果却不佳,这就造成了过拟合的现象。
这里的pattern是什么意思?举个例子,用户A之前的点击id序列为[101,302,463],当前点击item id为965,那么这里的pattern可以理解为101、302、463这些item比物料库中其它item的representation更接近于item_id=965。模型会学到这个信息。
举个极端点的例子,上述的pattern只出现过一次,也就是说101、302、463在训练集中只出现过一次,同时其对应的click item_id=965也只出现过一次,那么模型就会非常强烈的记住这个信息,以至于在测试集中就算某个用户点击id序列为[101,302,463]时,candidate item_id不等于965,效果就有可能变得很差。
尤其是用户交互行为稀疏的场景,该现象会更明显。用户行为稀疏的含义包含两方面:1. 有交互行为的用户占比少;2. 用户交互行为长度短,比如有行为用户的平均交互长度为1.x。
缓解过拟合问题,有两种解决方法:
- 丰富用户行为
- 参数正则
第一种方法,几乎很难实现,要求场景的流量大幅提升或者采取某些策略可以强烈吸引用户点击的欲望。Rome wasn't built in a day.并且,如果物料库太大,如阿里的商品id到达0.6 billion级别,过拟合的现象不可避免的还是会发生。
所以推荐第二种方法,对id embedding向量进行正则。这又引入了一个问题,常规的正则需要对存储id embedding词表的所有参数进行正则计算。这种计算量是不可接受的。仔细想想,每一个mini batch更新时,其实只有在该batch中出现过的id embedding vector才会进行更新,那我们只对这部分参数进行正则计算就可以解决计算复杂度的问题。阿里的DIN论文就是这么做的,有兴趣的同学可以看看,这里就不再赘述了。
三、总结
一般来说,id类特征是强特征,用好它们会给模型带来比较好的收益,但是一定要注意由此引入的过拟合问题,可以通过正则解决。
参考文献
- 阿里
DIN论文: ‘Deep Interest Network for Click-Through Rate Prediction’