TianduAI

Action speak louder than words

0%

用户行为序列的处理方式有很多,从原始的pooling类,如average poolingweighted average pooling等,到Attention类,如DIN中的处理模式等,到Sequence类,如DIEN中的GRU等。Transformer一出生就大放异彩,而用户行为序列天然就适用于Transformer等这种序列模型,于是Transformer在用户行为序列中被广泛使用。本文,从0开始构建适用于推荐系统的Transformer Layer,会设计到其中的各种细节,并辅以代码详细讲解。

Transformer的经典结构图如下所示:

首先明确一点,推荐系统中的Transformer Layer只有上图左半部分,即EncoderDecoder是不参与的。 实现Transformer Layer,可以将其拆解为以下几个步骤实现:

  • Positional Embedding
  • Self Attention
  • Multi-head Attention
  • Feed-forward Network

下面我们逐一进行实现,Action!

Positional Embedding

什么是Positional Embedding?为什么需要它?简而言之,就是Self Attention的计算过程中没有考虑item在行为序列中的位次信息,所以需要增加与位置相关的Positional Embedding,以引入位次信息,其具体表现形式就是一个矩阵,其中的每个元素均与item在序列中的位次相关。想要更详细的了解Positional Embedding,可以阅读《一文教你彻底理解Transformer中Positional Encoding》。在《Attention is all you need》

环境:tensorflow 2.0.0

Tensorflow中,继承Layer实现自定义类,一般重写build()方法,且build()方法需接收input_shape这一个参数。

1
2
3
class customLayer(Layer):
def build(self, input_shape):
xxx

若该层只有一个输入,那么input_shape就是该输入的shape

若该层有多个输入,那么input_shape为每个输入shapelist。需要注意的是,这时候call()函数中的多个输入需要以一个list的形式传入

阅读全文 »

DPP (Determinantal point process) 是一种概率模型,其描述了在全集中进行子集抽样的分布。本文主要介绍DPP算法在推荐系统中的应用,由Hulu公司在NIPS 2018会议上发表的论文Fast Greedy MAP Inference for Determinantal Point Process to Improve Recommendation Diversity中提出。本文中的DPP均指应用在推荐领域中的概念。

阅读全文 »

一、背景

组内最近准备上线ESMM模型,其中加入了用户的点击行为序列与候选物品的相似度特征。具体的做法是:根据用户点击过的item序列,经过Avg Pooling计算出representation vector。而后将其与candidate itemembedding vectorinner product,计算用户行为序列与当前候选item的相似度。

离线训练时发现,在第一个epoch中,train lossval loss在同步下降。而在第二个epoch开始后,train loss下降,val loss却在一直上升。很明显,模型过拟合了。

阅读全文 »

淘宝推荐系统目前遇到的挑战

  • 扩展性——数据集规模大
  • 稀疏性——用户交互行为少
  • 冷启动——新上线item无用户历史交互行为

推荐一般有两个阶段:matching & ranking。 本文聚焦在matching阶段,其核心任务是基于用户行为计算所有物品的两两相似度。

对于用户交互行为稀疏的item,学习到准确的embedding向量是很难的事情。所以作者利用side informationenhance the embedding procedure

阅读全文 »

本文旨在从所有教科书都讲到的AUC基本概念为起点,逐步带领大家进入AUC背后更为广阔、神奇的世界。

一、什么是AUC

AUC的全称为Area Under the Curve,即曲线下的面积。这里的曲线指的是什么曲线?有两种类型:ROC曲线PR曲线。所以,AUC也会有两种类型:ROCAUCPRAUC,分别对应ROC曲线下的面积以及PR曲线的的面积。

阅读全文 »

环境:tensorflow 1.14.0

在模型训练的过程中,经常会有实时观察中间tensor值的需求。Python自带的print函数只能打印出tensor或者op的名字、属性信息等等,所以需另辟蹊径。

阅读全文 »

考虑有这样一个场景:你需要根据入参的不同去引入不同层级下的util模块,比如,入参folder=v1,需要引入./v1/util.py,入参folder=v2,需要引入./v2/util.py如何利用一行代码就可以实现根据不同的入参来动态引入不同目录下的模块呢?

阅读全文 »