0%

实时特征加工链路

特征工程和 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 作为激活函数。
    word2vec
    这个由输入词 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def trainItem2vec(spark, samples, embLength, embOutputPath, saveToRedis, redisKeyPrefix):
word2vec = Word2Vec().setVectorSize(embLength).setWindowSize(5).setNumIterations(10)
model = word2vec.fit(samples)
synonyms = model.findSynonyms("158", 20)
for synonym, cosineSimilarity in synonyms:
print(synonym, cosineSimilarity)
embOutputDir = '/'.join(embOutputPath.split('/')[:-1])
if not os.path.exists(embOutputDir):
os.makedirs(embOutputDir)
with open(embOutputPath, 'w') as f:
for movie_id in model.getVectors():
vectors = " ".join([str(emb) for emb in model.getVectors()[movie_id]])
f.write(movie_id + ":" + vectors + "\n")
embeddingLSH(spark, model.getVectors())
return model

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?

Welcome to my other publishing channels