在实习过程中需要训练一个sub-model,所以需要自己基于tensorflow搭建网络,完成从喂数据,到训练,inference,最后测试的过程。具体来讲,我的sub-model的目标是对用户过去的一段时间(60天)在搜索场景下的行为进行建模,得到用户对sku的一个偏好向量,最后加入到粗排模型里面作为用户的泛化连续值特征使用。
- 数据
数据是从公司的基础浏览,点击,购买日志中挖掘出来的,含有用户一段时间内的行为,以及每个行为具体的sku,brand,三级类目,价格(同三级类目下商品价格的比例),以及当时用户的搜索词和时间。一共60天,包含600G数据,480,000w条样本(拿出了500w条的样本作为验证集)。每一条样本的格式都由模型需求决定,样本生成是由hadoop streaming实现的。 - 训练
模型考虑了的是用搜索词当做切分点,按照搜索词来定义session,将一个用户的行为划分成多个session,会在训练过程中实现session内部的时序和session间的时序,我将它成为层级的GRU模型,也就是HGRU。需要明白,我定义两个GRU layer,分别是session-level GRU和user-level GRU。
第一层session-level GRU用来建模session内的变化,一旦当session结束,会由此时的hidden state去更新session间的GRU模型(可以说作为user-level GRU的input),然后得到该层次的输出,作为user的泛化特征,并将这个泛化表达作为session内的GRU的input,结合当前样本的sku查出的embedding输入到session-level GRU中,如此往复。而每一次session-level GRU会结合当前的sku对另外两个sku进行预测,预测是否点击。这两个sku分别是正样本和负样本,可以为用户本session的样本,也可以为用户下个session内的样本。