熟悉深度学习的同学一定对Embedding不陌生,由于神经网络通常输入的是高维稀疏向量,Embedding层可以起到降维、防止参数爆炸的同时,也可以实现稀疏向量稠密化,便于上层网络处理。然而,Embedding的作用远远不止这些,文中提到,Embedding是深度学习中的基础核心操作。
Embedding经历的三大过程:处理序列样本、处理图样本、处理异构的多特征样本
Embedding的优势:综合信息能力强、易于线上部署
书中提到,Embedding表示的含义:向量可以表达相应对象的某些特征,同时,向量间的距离可以表示对象间的相似性
为什么说Embedding是深度学习的基本核心操作呢?原因有三点:
1. 推荐场景中对大量类别/id类型特征进行onehot编码,会产生稀疏特征,稀疏特征不利于深度神经网络学习,Embedding层负责将稀疏特征转为稠密特征;
2. Embedding由于综合信息的能力强,常作为重要特征向量送入后续网络层中;
3. Embedding配合最近邻搜索算法,可以实现推荐系统中的粗筛和召回阶段
最经典的embedding方法--Word2vec
word2vec是一种在NLP领域中将词用稠密向量表示的一种技术,word2vec的实现细节在这里不详细展开,可参考网络资料。
https://zhuanlan.zhihu.com/p/114538417
https://zhuanlan.zhihu.com/p/26306795
文中提到,word2vec中的一些技术细节,包括模型结构,目标函数,负采样方法以及负采样中的目标函数都值得好好研究。
Item2Vec--word2vec在推荐领域的推广
Item2vec的思想在于,word2vec具备处理(词)序列的能力,那么这种网络结构同样可以处理其他任意序列结构,因此,用户观看的视频序列,购买的物品序列等自然而然均可被Embedding,进而用户的Embedding可基于与其发生关系的物品Embedding结果经过加权平均或者聚类得到。
文中提到一些其他的物品Embedding的方法,例如DSSM双塔模型。双塔模型的原理也很清晰,整个模型包含两个模块(网络),分别输入用户特征和物品特征,经过Embedding层后,在某一层进行内积操作,相当于把用户及物品的特征变换到同一空间,那么其中的中间结果便是用户与物品的Embedding向量。
GraphEmbedding--图嵌入技术
GraphEmbedding技术的出现是为了解决上述word2vec嵌入方法只能处理序列数据的问题,而很多情况下,物品与物品之间的关系,用图来表示更加合理,另外,当前流行的知识图谱,本质上就是图结构数据。
因此,GraphEmbedding技术可以实现对图数据中的每个节点向量化,并且保证相邻节点在向量结果上的相似性。
文中提到,当前主流的GraphEmbedding实现方法有:DeepWalk、Node2Vec、EGES等。这里的技术细节就不详细展开,可以查阅网络资料。
Embedding的预训练
Embedding应用于深度学习的方式无外乎两种:
1. Embedding参与整个推荐模型的训练过程,实现端到端
2. Embedding训练与推荐模型训练分开,将Embedding的结果作为输入送入推荐模型
上述1方法,由于Embedding实现的是高维稀疏到低维稠密向量的转换,因此参数量极大。在推荐模型更新频繁的情况下,整个模型的训练性能会被Embedding的训练更新拖慢。另外,文中也提到,对于GraphEmbedding而言,由于数据结构不自洽,无法参与到整个推荐模型的训练过程。
基于上述原因,方式2成为工业界主流Embedding方法。这里将Embedding的训练与推荐模型的训练独立开来,像典型的FFM,就是将FM得到的Embedding向量送入神经网络。由于这种解耦的方式,很多针对各类数据结构的各类Embedding方法就可以发挥他们的作用。另外,从生产的角度考虑,由于物品的固有属性,其Embedding结果也无需更新过于频繁。而推荐模型需要跟踪数据趋势,需要快速更新甚至实时更新,方式2也符合这一点诉求。
局部敏感哈希--Embedding快速最近邻搜索方法
上文提到,Embedding常用于推荐系统粗筛和召回阶段,目的就是快速从几百万甚至几千万的候选集中快速选出万以下量级的用户可能感兴趣的物品。
由于用户及物品的Embedding结果都是一个n维向量,因此最容易想到的方式就是对每个用户Embedding,遍历所有的物品Embedding做相似度计算,并选出topK个最相近的物品,但是这种方式的计算量太大,线上延迟太高,无法在实际中使用。工业界常使用的是局部敏感哈希(Locality Sensitive Hashing,LSH)来处理这个问题。
LSH方法基于这样的思想:在高维数据空间中的两个相邻的数据被映射到低维数据空间中后,将会有很大的概率任然相邻;而原本不相邻的两个数据,在低维空间中也将有很大的概率不相邻。通过这样一映射,我们可以在低维数据空间来寻找相邻的数据点,避免在高维数据空间中寻找,因为在高维空间中会很耗时。有这样性质的哈希映射称为是局部敏感的。
如果我们对原始数据进行一些hash映射后,我们希望原先相邻的两个数据能够被hash到相同的桶内,具有相同的桶号。对原始数据集合中所有的数据都进行hash映射后,我们就得到了一个hash table,这些原始数据集被分散到了hash table的桶内,每个桶会落入一些原始数据,属于同一个桶内的数据就有很大可能是相邻的,当然也存在不相邻的数据被hash到了同一个桶内。
因此,如果我们能够找到这样一些hash functions,使得经过它们的哈希映射变换后,原始空间中相邻的数据落入相同的桶内的话,那么我们在该数据集合中进行近邻查找就变得容易了,我们只需要将查询数据进行哈希映射得到其桶号,然后取出该桶号对应桶内的所有数据,再进行线性匹配即可查找到与查询数据相邻的数据。
与LSH原理有关的网络资料:
https://ansvver.github.io/lsh_minhash.html
https://www.jianshu.com/p/3d9e5b061840
tips: 当前工业界应用广泛的向量检索方案还有facebook提出的Faiss工具,其中实现了很多不同的稠密向量聚类和相似性搜索方法,其中的PQ(乘积量化)广泛应用于推荐系统的粗筛和召回阶段。