特征工程和 Embedding
Embedding 特征向量(Embedding 就是用一个数值向量“表示”一个对象(Object)的方法),用向量表示一个物体,主要目的是对稀疏特征进行降维,主要可作为推荐系统的召回层或召回策略之一
优势在于,通过低维向量表达,能够体现距离的远近;本质是无监督学习方法
如何进行 Embedding?
流行的词嵌入方法,word2vec,Node2vec,skipgram等,Pytorch 中使用 nn.Embedding() TF是end2end训练embedding层,并不是w2v实现。
Embedding方法:word2vec
Word2vec 模型分为两种形式,CBOW 模型 和 Skip-gram 模型。
Word2Vec 样本生产
我们从语料库中抽取一个句子,选取一个长度为 2c+1(目标词前后各选 c 个词)的滑动窗口,将滑动窗口由左至右滑动,每移动一次,窗口中的词组就形成了一个训练样本。根据 Skip-gram 模型的理念,中心词决定了它的相邻词,我们就可以根据这个训练样本定义出 Word2vec 模型的输入和输出,输入是样本的中心词,输出是所有的相邻词。Word2Vec 模型结构
三层神经网络。它的输入层和输出层的维度都是 V,这个 V 其实就是语料库词典的大小
Word2vec 模型解决的是一个多分类问题
隐层的维度是 N,N 的选择就需要一定的调参能力了,我们需要对模型的效果和模型的复杂度进行权衡,来决定最后 N 的取值,并且最终每个词的 Embedding 向量维度也由 N 来决定。
隐层神经元是没有激活函数的,或者说采用了输入即输出的恒等函数作为激活函数,而输出层神经元采用了 softmax 作为激活函数。
这个由输入词 WI 预测输出词 WO 的条件概率,其实就是 Word2vec 神经网络要表达的东西。我们通过极大似然的方法去最大化这个条件概率,就能够让相似的词的内积距离更接近,这就是我们希望 Word2vec 神经网络学到的。
进阶学法:为了节约训练时间,Word2vec 经常会采用负采样(Negative Sampling)或者分层 softmax(Hierarchical Softmax)的训练方法。词向量从 Word2vec 模型中提取出来
我们往往会把输入向量矩阵转换成词向量查找表(Lookup table,如图 7 所示)。例如,输入向量是 10000 个词组成的 One-hot 向量,隐层维度是 300 维,那么输入层到隐层的权重矩阵为 10000x300 维。在转换为词向量 Lookup table 后,每行的权重即成了对应词的 Embedding 向量。如果我们把这个查找表存储到线上的数据库中,就可以轻松地在推荐物品的过程中使用 Embedding 去计算相似性等重要的特征了。
Embedding方法:item2vec
既然 Word2vec 可以对词“序列”中的词进行 Embedding,那么对于用户购买“序列”中的一个商品,用户观看“序列”中的一个电影,也应该存在相应的 Embedding 方法。
Item2vec 可以利用物品的 Embedding 直接求得它们的相似性,或者作为重要的特征输入推荐模型进行训练,这些都有助于提升推荐系统的效果。
1 | def trainItem2vec(spark, samples, embLength, embOutputPath, saveToRedis, redisKeyPrefix): |
Embedding 优势
Embedding 是处理稀疏特征的利器。 几乎所有深度学习推荐模型都会由 Embedding 层负责将稀疏高维特征向量转换成稠密低维特征向量。
Embedding 可以融合大量有价值信息,本身就是极其重要的特征向量 。 相比由原始信息直接处理得来的特征向量,Embedding 的表达能力更强,特别是 Graph Embedding 技术被提出后,Embedding 几乎可以引入任何信息进行编码,使其本身就包含大量有价值的信息,所以通过预训练得到的 Embedding 向量本身就是极其重要的特征向量。
实时特征加工
实时特征加工的源头多为埋点数据落的 Kafka 数据(实时流-多为json格式),通过 flink 任务加工成用户所有的 kv 格式数据,在 ctr 场景中,key多为用户pin,value多为用户特征值,举例value可能为 0和1 在性别场景下
训练框架场景
用户加工好实时特征,多为keyvalue的形式存储在数据库中,如果想通过深度学习模型进一步训练,需要将特征进行 Embedding 特征工程。Embedding特征工程后,通过 Embedding 层、attention层、MLP层等网络架构,进行模型训练,从而得到模型文件进行模型服务和特征服务
实时特征存储
特征服务,包括召回服务等,数据往往存储在 redis 中,通过快速的点查支持线上业务
实时特征服务
线上服务,一般包含模型服务和特征服务
其他QA
- Q:为什么深度学习的结构特点不利于稀疏特征向量的处理呢?
- A:是因为深度学习通过反向传播算法来更新参数的值,损失函数对参数w的梯度与其对应的a有关,对于稀疏向量而言,会有大量的a为0,根据链式法则,那么相应的权重w的更新梯度也会为0,从而出现梯度消失的问题。
- Q:常用的相似度度量方法?
- A:余弦距离可以体现数值的相对差异,欧式距离体现数值的绝对差异;例如,衡量用户点击次数的相似度,欧氏距离更好,衡量用户对各类电影的喜好的相似度,用余弦距离更好;线上快速召回一般有用ANN,比如LSH算法进行近似召回。
- Q:物品embedding和用户embedding如何一起训练,让他们在同一个空间里呢,我理解这样才可以进行物品和用户的相似度计算。
- A:方法一是item embedding生成好后,再利用item embedding生成user embedding。方法二是使用矩阵分解这类方法生成item和user embedding。
Embedding 可以是实时特征嘛?如何实时读取 Embedding 特征?向量数据库的原理?Facebook开源的faiss?