H好菇凉666用万字长文聊一聊 Embedding 技术( 二 )

  • 此外对于有明确关系的(如 item->文本->标签 or 关键词)可以采用对关键词/标签的向量均值来表示 item 的文本向量(这里安利一下 FaceBook 开源的StarSpace);
  • User 行为数据(用户在场景中的行为数据 , 如点击、互动、下载等)
    • 针对用户对 Item 的操作(如点击、互动、下载)构造用户->item+Item 标签体系 , 构造用户-item-tag 的异构网络 , 然后可以采用 Metapath2vec 来得到各节点的 embedding 向量;
    • 通过记录用户在整个场景访问 item , 构造 Item-Item 关系图 , 然后采用 DeepWalk 算法得到 item 的向量 , 用来挖掘 Item 间的关系特征;
  • 额外数据(外部扩充数据 , 如用户游戏行为、用户微信其他场景活跃等)
    • 标签型(主要是用户在各场景的兴趣偏好):
    • 关系链型(如游戏中心好友、游戏内好友、开黑好友)可以采用用户关系构造用户关系图 , 采用 Graph embedding 方法(如 GraphSAGE)来表示用户抽象特征
    当然 , 这些处理方法只是我个人这一年多的经验 , 可能有些地方用的并不是很合理 , 欢迎大家一起交流 。
    下面开始本文正文“介绍现在主流的 Embedding 技术” , 主要分三大块:
    1、奇异值分解 SVD(Singular value decomposition , 奇异值分解)是一种矩阵分解的方法 , 任何矩阵 , 都可以通过SVD的方法分解成几个矩阵相乘的形式 。
    其中和是正交矩阵 , 是特征值矩阵 。
    H好菇凉666用万字长文聊一聊 Embedding 技术
    本文插图
    对于机器学习 , SVD一个主要优点是对矩阵降维 , 对于高维矩阵可以通过SVD表示成三个维度相对较低的矩阵、和 。
    在推荐系统中 , 可以将用户行为构造成User-Item的评分矩阵, 其中m和n分别表示平台的User数和Item数 。表示用户对物品的评分(也可以是点击、互动、播放、下载等行为) , 用于刻画User对Item的有效操作 。 采用SVD算法将分解成 、和 。
    虽然 , 从形式上看SVD分解简单直接 , 但由于日常User-Item的评分矩阵事高度稀疏的 , 而SVD分解要求矩阵是稠密的 , 通常采用对评分矩阵中的缺失值进行补全(比如补0、全局平均值、用户物品平均值补全等)得到稠密矩阵 。 再用SVD分解并降维 。 但实际过程中 , 元素缺失值是非常多的 , 导致了传统SVD不论通过以上哪种方法进行补全都是很难在实际应用中起效果 。 此外传统SVD在实际应用中还有一个严重的问题——计算复杂度(时间复杂度是 , 空间复杂度是) 。 当用户数和物品总量过大(如千上万级) , 对矩阵做SVD分解是非常耗时 。 这是得传统的SVD分解方法很难在实际业务中应用起来 。
    研究者们做了大量工作来解决传统SVD的稀疏数据不适用和高计算复杂度的问题 , 其中主要的有FunkSVD、BiasSVD和SVD++算法 。
    LFM主要代表是2006年由Simon Funk在博客上公开的算法FunkSVD , 将评分矩阵分解成两个低维矩阵(P和Q)相乘 , 可直接通过训练集中的观察值利用最小化均方根学习P , Q矩阵 。
    用户对物品的评分可以表示为 , 其中和分别是矩阵和对应第和的列向量 , 表示用户和物品的隐向量 。 FunkSVD核心思想是将在原始SVD上加了线性回归 , 使得我们可以用均方差作为损失函数来寻找P和Q的最佳值:
    上式可以通过梯度下降法来求解 , 损失函数求偏导为:
    参数更新如下:
    在Funk-SVD获得巨大成功之后 , 研究人对其进行进一步优化工作 , 提出了一系列优化算法 。 其中BiasSVD就是在原始FunkSVD模型中添加三项偏移项优化得到的: