用户多兴趣建模MIND

用户多兴趣建模MIND

1. 概述

在工业界,一个完整的推荐系统中通常包括两个阶段,分别为召回阶段和排序阶段。在召回阶段,根据用户的兴趣从海量的商品中去检索出用户(User)可能感兴趣的候选商品( Item),满足推荐相关性和多样性需求。在排序阶段,根据不同的目标,如CTR,CVR,时长等对候选出的商品进行打分。目前,对于用户兴趣的建模,通常是从用户的历史行为中挖掘出用户兴趣,以当前的深度学习模型为例,通常是将User的历史行为数据embedding到一个固定长度的向量中,以此表示该用户的兴趣。然而在实际环境中,一个用户的兴趣通常是多样的,使用单一固定长度的embedding向量难以刻画用户兴趣的多样性。Multi-Interest Network with Dynamic routing[1](MIND)用户多兴趣建模网络取代了原先的单一固定长度embedding向量,取而代之的是用户的多兴趣向量。在MIND中,主要的创新点在于:

  1. 通过Mulit-Interest Extractor Layer获取User的多个兴趣向量表达,并采用动态路由(Dynamic Routing)的方法自适应地将User历史行为聚合到User兴趣表达向量中;
  2. 通过Label-Aware Attention机制,指导网络学习到用户的多兴趣Embedding向量;

2. 算法原理

2.1. MIND模型的网络结构

MIND模型的网络结构如下图所示:

www.zeeklog.com  - 用户多兴趣建模MIND

MIND的网络结构与Youtube的召回网络结构[2]基本一致,Youtube的召回网络结构如下图所示:

www.zeeklog.com  - 用户多兴趣建模MIND

不同点主要是在多兴趣抽取层Mulit-Interest Extractor Layer和Label-Aware Attention机制。

2.2. Mulit-Interest Extractor Layer

多兴趣抽取层的目的是对用户历史行为的item抽取出多个兴趣向量表达,通常采用聚类的过程将用户的历史行为聚类到多个簇中,一个簇中的item比较靠近,该簇代表了用户兴趣的一个方面。在MIND中,为了实现这样的聚类过程,使用到了胶囊网络(Capsule Network)。

2.2.1. 胶囊网络(Capsule Network)

什么是胶囊网络(Capsule Network)呢?参照参考[3],对胶囊网络做简单介绍。对于一个普通的神经网络是由神经元组成,每个神经元中是一个具体的值,如下图的左侧图所示;而在胶囊网络中是由被称为Capsule的基本单元组成,与神经元不同的是Capsule中存储的是向量,如下图的右侧图所示。

www.zeeklog.com  - 用户多兴趣建模MIND

在上图的胶囊网络中,蓝色的Capsule的输入是黄色的Capsule和绿色的Capsule的输出,分别为向量 v 1 v^1 v1和向量 v 2 v^2 v2,蓝色的Capsule的输出是向量 v v v。

2.2.2. 动态路由(Dynamic Routing)

在神经网络中,网络的权重 w 1 , w 2 , ⋯ , w n w_1,w_2,\cdots ,w_n w1​,w2​,⋯,wn​是在网络的backpropagation过程中学习到的。对于胶囊网络,其过程与神经网络有点不一样,借鉴参考[3]中的图,结合参考[1]中的实例,有如下的图:

www.zeeklog.com  - 用户多兴趣建模MIND

假设存在两层的胶囊,当前的第 h h h层的胶囊如上图中的蓝色部分,其输入为第 l l l层,且上层的输出向量为 c → i l ∈ R N l × 1 \overrightarrow{c}_i^l\in \mathbb{R}^{N_l\times 1} c   il​∈RNl​×1,且 i ∈ { 1 , ⋯ , m } i\in \left\{1,\cdots ,m \right\} i∈{1,⋯,m},对应到第 h h h层的输出向量为 c → j h ∈ R N h × 1 \overrightarrow{c}_j^h\in \mathbb{R}^{N_h\times 1} c   jh​∈RNh​×1,且 j ∈ { 1 , ⋯ , n } j\in \left\{1,\cdots ,n \right\} j∈{1,⋯,n},在上图中,我们选取其中一个第 h h h层的输出向量 c → j h \overrightarrow{c}_j^h c   jh​。 z → j h \overrightarrow{z}_j^h z   jh​的计算过程如下:

z → j h = ∑ i = 1 m w i j S i j c → i l \overrightarrow{z}_j^h=\sum_{i=1}^{m}w_{ij}S_{ij}\overrightarrow{c}_i^l z   jh​=i=1∑m​wij​Sij​c   il​

其中,矩阵 S i j ∈ R N h × N l S_{ij}\in \mathbb{R}^{N_h\times N_l} Sij​∈RNh​×Nl​是需要学习的参数,可通过网络的backpropagation过程学习,连接权重 w i j w_{ij} wij​在胶囊网络中被称为coupling coefficients,不是在网络中学习得到的。最终通过一个非线性的squash函数得到最终的胶囊的输出向量 c → j h \overrightarrow{c}_j^h c   jh​:

c → j h = s q u a s h ( z → j h ) = ∥ z → j h ∥ 2 1 + ∥ z → j h ∥ 2 z → j h ∥ z → j h ∥ \overrightarrow{c}_j^h=squash\left ( \overrightarrow{z}_j^h \right )=\frac{\left\|\overrightarrow{z}_j^h \right\|^2}{1+\left\|\overrightarrow{z}_j^h \right\|^2}\frac{\overrightarrow{z}_j^h}{\left\|\overrightarrow{z}_j^h \right\|} c   jh​=squash(z   jh​)=1+   ​z   jh​   ​2   ​z   jh​   ​2​   ​z   jh​   ​z   jh​​

Squash函数的作用是相当于对向量 z → j h \overrightarrow{z}_j^h z   jh​做归一化的操作,当至此完成了胶囊网络的前馈过程,然而对于连接权重却并不知道是如何得到的,为了求得连接权重需要使用到动态路由(dynamic routing)的过程,动态路由其实是一个迭代的过程,首先定义the routing logit  b i j b_{ij} bij​:

b i j = ( c → j h ) T S i j c → i l b_{ij}=\left ( \overrightarrow{c}_j^h \right )^TS_{ij}\overrightarrow{c}_i^l bij​=(c   jh​)TSij​c   il​

那么, w i j w_{ij} wij​可以由 b i j b_{ij} bij​定义:

w i j = e x p b i j ∑ k = 1 m e x p b i k w_{ij}=\frac{exp\;b_{ij}}{\sum_{k=1}^{m}exp\; b_{ik}} wij​=∑k=1m​expbik​expbij​​

具体过程如下面的伪代码所示:

www.zeeklog.com  - 用户多兴趣建模MIND

2.2.3. 如何理解聚类过程

在参考[4]中详细论述了动态路由与K-Means聚类算法之间的关系,简单来说Capsule所使用的聚类算法,其实是K-Means的变种。通过直观的理解这个过程,首先对于K-Means,为了与上面的Dynamic Routing过程对应,假设原始的样本为 e i e_i ei​,其中 i ∈ { 1 , ⋯ , m } i\in \left\{1,\cdots ,m \right\} i∈{1,⋯,m},存在 K K K个聚类中心 u j u_j uj​,其中 j ∈ { 1 , ⋯ , K } j\in \left\{1,\cdots ,K \right\} j∈{1,⋯,K},K-Means的目标是将 m m m个原始样本 e 1 , e 2 , ⋯ , e m e_1,e_2,\cdots ,e_m e1​,e2​,⋯,em​划分到 K K K个类中,使得类内的间隔最小,即:

m i n ∑ j = 1 K ∑ i = 1 m w i j ∥ e i − u j ∥ 2 min\sum_{j=1}^{K}\sum_{i=1}^{m}w_{ij}\left\|e_i-u_j \right\|^2 minj=1∑K​i=1∑m​wij​∥ei​−uj​∥2

其中 w i j w_ij wi​j表示样本 e i e_i ei​是否属于聚类 j j j,因此 w i j ∈ { 0 , 1 } w_{ij}\in \left\{0,1 \right\} wij​∈{0,1}。聚类中心 u j u_j uj​为:

u j = ∑ i = 1 m w i j e i ∑ i = 1 m w i j u_j=\frac{\sum_{i=1}^{m}w_{ij}e_i}{\sum_{i=1}^{m}w_{ij}} uj​=∑i=1m​wij​∑i=1m​wij​ei​​

与Dynamic Routing中的 u → j \overrightarrow{u}_j u   j​的更新有两点不一样,第一,计算 w i j w_{ij} wij​的方式,第二是计算最后结果,在K-Means中是直接求平均,而在Dynamic Routing中, u → j \overrightarrow{u}_j u   j​采用的是squash函数。

上述只是从直观上对比了两个过程,具体的数学上的论述可以参见参考[4]。

2.2.4. 动态兴趣个数

对于不同的用户,其兴趣的个数 K K K是不一样的,在参考[1]中给出了计算特定用户 u u u的兴趣个数 K u ′ K_{u}^{'} Ku′​

K u ′ = m a x ( 1 , m i n ( K , l o g 2 ( ∣ I u ∣ ) ) ) K_{u}^{'}=max\left ( 1,min\left ( K,log _2\left ( \left|I_u \right| \right )\right ) \right ) Ku′​=max(1,min(K,log2​(∣Iu​∣)))

2.3. Label-aware Attention Layer.

通过多兴趣提取器层,对用户行为序列得到了用户的多个兴趣向量,为了评估多个兴趣向量对目标Item相关度及贡献度,在[1]中设计Label-aware Attention机制来衡量目标Item选择使用哪个兴趣向量,其具体的表达式如下:

v → u = A t t e n t i o n ( e → i , V u , V u ) = V u s o f t m a x ( p o w ( V u T e → i , p ) ) \overrightarrow{v}_u=Attention\left ( \overrightarrow{e}_i,V_u,V_u \right )=V_usoftmax\left ( pow\left ( V_u^T\overrightarrow{e}_i,p \right ) \right ) v   u​=Attention(e   i​,Vu​,Vu​)=Vu​softmax(pow(VuT​e   i​,p))

其中, p o w pow pow表示的是指数函数, p p p是一个调节attention分布的参数。

3. 总结

在MIND中,通过Mulit-Interest Extractor Layer获取User的多个兴趣向量表达,并采用动态路由(Dynamic Routing)的方法自适应地将User历史行为聚合到User兴趣表达向量中;最后通过Label-Aware Attention机制,指导网络学习到用户的多兴趣Embedding向量。

参考文献

[1] Li C, Liu Z, Wu M, et al. Multi-interest network with dynamic routing for recommendation at Tmall[C]//Proceedings of the 28th ACM international conference on information and knowledge management. 2019: 2615-2623.

[2] Covington P, Adams J, Sargin E. Deep neural networks for youtube recommendations[C]//Proceedings of the 10th ACM conference on recommender systems. 2016: 191-198.

[3]

[4]

[5].

Read more

11.1标准编码格式是什么意思?编码的概念 编码的字符集与编码 编码的意义 字符与编码的发展 标准编码常见格式 ASCII UTF-8 Python标准编码格式——《跟老吕学Python编程》附录资料

11.1标准编码格式是什么意思?编码的概念 编码的字符集与编码 编码的意义 字符与编码的发展 标准编码常见格式 ASCII UTF-8 Python标准编码格式——《跟老吕学Python编程》附录资料

标准编码格式是什么意思?——《跟老吕学Python编程》附录资料 * * * * 标准编码格式 编码是用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号。 为保证编码的正确性,编码要规范化、标准化,即需有标准的编码格式。 常见的编码格式有ASCII、ANSI、GBK、GB2312、UTF-8、GB18030和UNICODE等。 编码的概念 编码,又称代码,是用预先规定的方法,将文字、数字或其他对象编成数码,或将信息、数据转换成规定的电脉冲信号。它在电子计算机、电视遥控和通讯等方面广泛使用。 在电子计算机中,将指令和数字实行编码后,适合计算机运行和操作。编码作为计算机书写指令的过程,是程序设计活动的一部分。在数字磁记录中,可按照一定的规则,进行输入信息序列向编码序列的过程转换。在遥控系统和通信系统中,采用编码步骤可提高传送的效率和可靠性。 将数据转换为编码字符,必要时又可编码成原来的数据形式。 编码的字符集与编码 各个国家和地区所制定的不同 ANSI 编码标准中,都只规定了各自语言所需的“字符”。比如:

By Ne0inhk
11.如何运行Python程序?——《跟老吕学Python编程》

11.如何运行Python程序?——《跟老吕学Python编程》

11.如何运行Python程序?——《跟老吕学Python编程》 * * * * * * * * 一、必学重点 学习【如何运行Python程序?】之前必须得先理解以下基础知识: 1.Python 源文件是什么? Python 源文件,通常指的是以 .py 为扩展名的文本文件,它包含了 Python 编程语言编写的代码。这些文件可以被 Python 解释器读取并执行,以实现特定的功能或任务。源文件是编程过程中的基础,因为它们包含了程序员编写的原始代码。 在 Python 中,源文件不仅仅是简单的文本文件。它们组织着程序的各个部分,包括函数、类、变量和逻辑结构,如条件语句和循环。源文件通常包含了程序的入口点,即当程序开始执行时首先运行的代码。 Python 源文件的编写通常遵循一定的编程规范和最佳实践,以提高代码的可读性、可维护性和效率。例如,使用有意义的变量名、注释代码、遵循 PEP 8 编码风格指南等。 Python 源文件是一种纯文本文件,内部没有任何特殊格式,

By Ne0inhk
1.什么是XHTML?——《跟老吕学XHTML》

1.什么是XHTML?——《跟老吕学XHTML》

1.什么是XHTML?——《跟老吕学XHTML》 * * * * * 什么是XHTML? XHTML(eXtensible HyperText Markup Language)可扩展超文本标记语言,是一种新兴的网页设计和制作语言。XHTML是在HTML基础上发展起来的,同时吸取了可扩展 标记语言(extensible Markup Language,XML)的语法严谨的优点。因此,XHTML比 HTML具加更加严谨的语法,能够为众多品牌的Web浏览器研发提供规范的技术标准, XHTML的可扩展性和灵活性将适应未来网络应用的更多需求。 XHTML(可扩展超文本标记语言)是使用可扩展标记语言(XML)对HTML 4.0的改订, XHTML的优点在于其可扩展性和可移植性。 XHTML发展历史 XHTML最早叫做“HTML in XML”,是一种基于XML的超文本标记语言,也就是说,将以前用 SGML定义的HTML改为用XML重新定义。从这个意义上讲,XHTML实际上是XML的一种应用。表面上看,在XHTML中,其标记仍旧延用以往的HTML 的标记,

By Ne0inhk
【Python游戏开发】超级玛丽v1.0——《跟老吕学Python编程》附录资料

【Python游戏开发】超级玛丽v1.0——《跟老吕学Python编程》附录资料

【Python游戏开发】超级玛丽v1.0——《跟老吕学Python编程》附录资料 * * * * 游戏设计思路v1.0 在一个背景上,超级玛丽通过空格键跳跃,越过水管和飞弹 本次开发环境情况 本次系统的软件开发及运行环境具体如下: 操作系统: Windows 10(WindowsXP以上系统均可运行) Python版本:Python 3.12.2(凡是3.0及以上版本均可运行) 开发工具:PyCharm(老吕比较习惯PyCharm和VS开发环境) 第三方模块:Pygame 2.5.2 开发前准备 音乐Audio和图片Image文件夹备用 随便挑了几个音乐、找了张背景图、超级玛丽跑步的动作图、水管图、子弹图(先做这么多吧) 安装Pygame模块 本次开发是依靠Pygame模块运行的,所以首先需要使用pip install命令安装该模块,可以在命令窗口中执行以下命令: pip install pygame 注意!!!小白遇此文请看以下图片,命令是在DOS安装,

By Ne0inhk