1-----w2v 原理:利用词和词之间的共现,将词转换为向量,利用滑动窗口,窗口内体现共现性 好处:与one-hot,tfidf相比,能够降维,解决稀疏性,可衡量向量之间的相似性 方式:cbow,skip-gram skip-gram:【将多分类改为二分类】how?
在窗口所在的五个单词中,利用中心词和窗口内的其他词组合,每一对组合都可以看成是一个正样本,不在窗口内的词组,就是负样本
模型要量化输入两个词之间的相似度,那就将输入的v1,v2去计算相似度,再利用sigmoid量化到0-1之间,模型学习的参数就是V1,V2...
此时的损失就是二分类常用的交叉熵损失
利用中间一个词预测其他词【一个窗口内的政府样本对,label对应的位置为1,其余为0】,其中负样本太多,需要采样。
在w2v中,由于每个词有两种身份,因此不放在一个矩阵里面更新,一个是中心词【窗口内embedding矩阵,每个词训练多次】,一个是上下文词【窗口内context矩阵,每个词训练有限次】,因此每一个词都有两个矩阵。这两个矩阵均会随着梯度下降而更新,这两个矩阵得到的向量vector均可用。
2-----item2vec 场景:用户点击过的文章序列【文章1/id1,....,文章n/idn】,这个文章序列是在一个窗口内的,那么这个窗口该如何设计呐? 用户点击过的序列要进行shuffer【由于窗口大小不一定,,id1和idn之间是有关系的,如果不shuffer,两者之间是无法联系的,不能出现在一个窗口中】,但是不能整体shuffer,只能局部shuffer【这个和word2vec的最重要的区别就在于此,word2vec词序列之间是有语序的,但是item点击序列是没有严格的顺序关系的】 按照session划分窗口【固定时间,或者最近n次点击】+shuffer+窗口 利用item的向量得到user-embedding 当点击特别稀疏的时候,引入文章的上级类别信息
得到这种embedding之后,当一个文章没有被点击过,类似于冷启动的时候,就可以利用类别1和类别2的向量进行pooling
深度match方式 airbin【租房场景】
i1-in均表示房源,在w2v的模型中【加入窗口大小选择3,并用skip-gram的方式训练】,那可以组成下面那三条样本
但是在租房场景中,用户看了很多最终选择了ilast,那这个last可以认为和前面的所有点击都是相似的,而且和w2v不同,w2v是不能打乱词之间的语序的,但是在这里可以;在这里求item2vec的时候,将ilast作为与窗口内其他item的相关源,缓解序列之间可能的相似性 aribin的trick【item2vec】 最后预定的房子ilast,作为每个房源的相似源【产生更多的正样本】,如果30min之内无预定,全局的ilast就没有了 电商推荐中,加购收藏等行为可以和ilast一样作为正样本; 内容分发中,停留时长,收藏可以单独拿出来,增加正样本数ß 多次shuffer【注意shuffer的次数和seesion取值的合理性】 如果session过长,i1和in可能不相似,但是可能连在一起 i1和i2shuffler10次,其中5次连在一起,5次不在一起,模型学到不同的pattern 学乱了 优化负采样 同一个城市下进行负采样;【因为常住地可以通过策略进行区分】,增加模型学习的难度【学到更多的关于房屋结构的特征】 那在做文章负采样的时候,借鉴这种思想,可以在同类别下进行负采样 冷启动缓解 新上传的房源【指定位置,价格,房屋类型】的embedding=地理位置最相近的三个embedding进行avg-pooling NCF【neural cf】神经协同
利用内积做特征交叉,比如对于一个userid和itemid,随机初始化一个ue和ie,然后做内积,然后rmse梯度下降也可以学习,但是现在想用更深的方式
最初版的ncf,这样user和item均直接进行深层次交叉,这样会丢失一些浅层次【特别直观明显的特征】的交互,有一些交互就可能没有了
这里的u分解为浅和深的过程,类似于矩阵分解 youtube召回【向量化召回】
相比于ncf只引入user和item的id信息,youtube引入了行为序列和用户画像信息 item-emb随机初始化【用户观看和搜索序列】 对于性别年龄引入一阶,二阶非线形变化 training【训练目标是根据所有特征预测用户下一个会点击的视频,从视频库中的所有视频进行多分类】 softmax负采样优化
serving【向量化召回】 拿到用户的embedding,要从100w的item待选中拿到合适的item,这里需要使用向量化检索工具faiss 召回 线上召回的时候只有user的embedding,item的embedding是在模型训练结束后存起来的 user-embedding【线上计算的,relu最后一层的输出】 item-embedding【线下训练,softmax多分类-n个类别-n个概率-n为所有物品数】 softmax负采样---全库随机采样
user-embeding的维度为1d,最终item-emb的维度为1d【存的是softmax对应的全连接矩阵d*n】
DSSM
召回实际上做的就是:<user,pos_item>之间的距离 大于 <user,neg_item>之间的距离,学的就是相对差值;因此dssm搞了三个塔就是去优化对应的这个目标;交叉熵适合于point-wise,而dssm的优化目标适合于pair-wise,loss-区分好坏的能力,衡量cos<user,pos_item>与cos<user,neg_item>之间的差,越大越好
1.两侧的vector一定要同维度;2.一定都做过点乘操作【这样才能保证user和item的embedding在一个向量空间】 线上serving: item:与youtue结构不同,模型训练结束后,item的信息由于没有youtube的softmax全联接层,是没有办法全量保存的,只能离线将推荐池中的所有item都经过一次模型计算,然后保存在faiss中。 user:实时计算 youtube和dssm的区别 双塔user侧和item侧的embedding版本错位;由于item侧的更新频率很高,可能是小时级/分钟级更新推荐池的item对应的emb,那就会出现模型训练结果还没有更新【模型版本】,item就更新了两次,但是由于item的特征值【价格--等特征】变了,两次更新item对应的embedding就不一样;但是user侧是有请求就线上计算【解决方式:item侧embedding的更新和模型更新保持一致,均为一个小时计算一次】 youtube的dnn得一直更新 双塔中新物品可以引入物品属性特征,在item侧的塔中单独计算;但是youtube不可以,因为youtube中softmax对应的item向量矩阵维度是确定的,新的id对应的emb是拿不到的【youtube对于所有的新物品预留一个位置,随机初始化一个向量】 双塔模型缺点:user和item之间不能做特征交互 改进: 微博【SENET双塔】注意力机制的一种 【SENET可以对embedding做清洗】 ---------user和item侧进入hidden之前,加入一个senet-layer 强化特征提取---类attention 如果输入dnn之前,过滤无效特征的话,经过nn提取的特征更纯【指认能力强,有一些不重要的特征会作为噪声被放大】
原始nn的输入,是多个emb拼接在一起
变化的过程是,将每一维度的emb向量进行avg-pooling变为一个标量(zi),所有的zi拼起来就形成一个新向量【z】
z相当于对e做压缩【对原始concat(ei)选代表】 运算中的第一层全连接计算 \sigma(w,\bar{z}) ,是在做特征交叉 第二层的全连接是在做维度变化 对于非embedding的连续特征,可以用自身值代表z值 连续特征一般是要做离散化的,分桶之后就会有embedding MIND
目标:根据用户历史行为预测用户下一条点击;一般用于召回,和youtube类似,训练目标只是手段,训练的其实是用户和item的embedding~【向量化召回】 将传统的dnn层换成了多兴趣抽取层【胶囊网络】,这个抽取层的输出可以看成为多个hidden-layer;传统dnn形式只能输出一个vector,将多兴趣点的所有信息都压缩到一个向量内,所有的信息都混合到一起,导致匹配阶段返回不正确的物品。相反,我们采用多个向量来表达用户的多个兴趣点。 简单来说,胶囊是一种新类型的神经元,用一个向量表示,而不是标量表示的传统神经元。基于向量的胶囊可以表示实体的多个属性,胶囊的方向表示一个特征,模表示特征存在的概率。对应的,多兴趣点抽取层的目标是学习到一组向量,表示用户的多兴趣点已经对应的兴趣点是否存在。
胶囊网络就是将之前nn层里面的每一个神经元【标量】变为一个胶囊【向量】,之前是多个神经元组成一个向量,只有一个指向;现在每一个胶囊都有方向和大小【大小代表的是在该方向存在的概率】
v1,v2是上一个胶囊网络的输出,利用w【可学习】线性变化之后,在利用c【动态路由计算】加权,然后在做一个squash【类似nn中的激活函数】----这里w矩阵的必要性在于:整个胶囊网络中,c是不可学习的,是迭代算出来的,整个net只有w一个可学习的,所以不可或缺
计算c的过程:利用b去更新c;最后一步,a和u的内积 就是为了计算最终得到的a与上一步结果u哪个最相似,最相似的u对应的b进行加权,b减弱,softmax单调性,c减弱【T为超参】
最终生成的胶囊个数就对应用户的兴趣个数,胶囊的个数和用户行为序列长度有关【阿里的做法是取log 胶囊的个数 = log(用户行为序列长度)】
为了防止兴趣过于发散,在拿到胶囊向量之后,拼起来之后再经过两层全连接nn之后 与输入的label做一个attention
图网络 graph-embedding 比w2v的优势在于:前者可以很好的缓解冷启动
相比于ietm2vec【只能基于用户行为去训练item-vec】,但是在图网络中,是基于所有用户对item的行为,有利于item更好的去做协同;将item在所有用户空间复用,有利于冷启动;形成序列之后,利用item2vec的方式训练即可 对于随机游走的优化 node2vec【游走策略优化】 是在graph-embedding随机游走的基础上,引入两种游走方式【DFS,BFS】,这两种游走方式是通过两个超参控制的.【p,q控制游走的结果是个性化还是高热】 DFS-同质性【学到两两之间相似性问题】,价格,品类差不多商品,得到emb差不多 BFS-结构性【学到整体性东西】-平板,包,学到某一个品类的爆品【两个爆款之间相似度高】 因此===============》 爆款----结构性----BFS-----p⬇️;个性化------同质性------DFS-----q⬇️
EDGE【除了物品的id信息之外,引入side-info信息】 side-info:除了id信息之外,额外的属性信息 side-info信息引入向量化召回方式: 直接将side-info信息向量化
结构采用item2vec,可以当成一条链去学习,也可以将id,类别,价格当成三条链去学习,然后将三条链对应的emb各自拼接起来表示最终的item-emb
end-2-end方式学习出该item的embedding,并将side-info信息在该过程中融入
si均表示物品的side-info信息,end-2-end方式就是将所有的side-info的emb【随机初始化】,avgpooling得到一个emb,丢到模型中训练 阿里的EGES,就是将上面的si在做avg-pooling的时候,做一个加权平均【权重可以通过attention机制得到,也可以去学习这个权重】