本篇结合了书籍 《深度学习推荐系统》和吴恩达老师的视频课程 《Natural Language Processing and Word Embeddings》。

embedding技术是深度学习的一种基础核心操作,有很多的应用场景。

1. embedding基础概念

word embedding差不多表示为词表示,如何用数字化的形式表示一个单词。简单解释embedding就是用一个低维稠密的向量表示一个对象。embedding可以表达对象的一些特征,在向量距离上反应了对象之间的相似性。

1.1 embedding词表示解释

如果用one-hot的方式表示词,类似[0 0 0 0 …… 1 …… 0 0 0]。
one-hot表示的问题,没有考虑词之间的关系,任意两个词的距离都是一样的。比较自然的可以想到将one-hot的向量转变为一个稠密的向量,比如[0.32 1.43 0.43 …… 4.32]。

合理的思考是,比如对于单词,man、woman、king、queen、apple、orange等,可以有一些描述词诸如gender、royal、age等,通过单词和描述词的相关度得分来作为词表示向量(实际的词表示向量是没有描述词概念的,并不明确向量维度的物理意义)。

1.2 embedding的性质

如前面的例子类似,词的表示,应该有类似近义词查找、类比推理的性质。
比如man和male的词表示向量应该是比较接近的,man和woman的向量距离和king和queen的向量距离也是近乎相等的。
如果已知man和woman的关系,需要找king对应的单词 eman−ewoman≈eking−e?e_{man} - e_{woman} \approx e_{king} - e_?emanewomanekinge?
通过类似向量检索的方式即可
argmaxwsim(ew,eking−eman+ewoman)argmax_{w} \quad sim(e_w, e_{king} - e_{man} + e_{woman}) argmaxwsim(ew,ekingeman+ewoman)

embedding对词做向量化,可以表示词之间的语义关系等信息。同样embedding也可以挖掘电影、商品ID等之间的向量化表示关系。

1.3 embedding的使用和可视化

词的向量表示可以方便的用在各种NLP的任务中,可以自行用大量的语料样本(1Billion,100Billion)训练得到词表示,也可以下载公开的训练好的embedding库。

在使用的时候,直接在词向量库中lookup相应词的embedding即可。

embedding向量一般来说都是很高维,比如64维、300维等,对于如此高维度的向量,是无法可视化的。但可以通过一些降维可视化的算法来做,比如t-sne,但降维算法是非线性的,因此降维后,可能会有一些向量距离上的偏差。

1.4 embedding的学习

embedding的学习,即通过算法学习得到单词的向量表示。最终可得到一个embedding矩阵。如果embedding的向量维度是300,共有100万个单词,那么embedding矩阵E就是300*100w的一个矩阵。

1.4.1 A neural probabilistic model @2003

在2003年的时候,begio等在论文A neural probabilistic model中就开始使用了词embedding相关的算法在NLP任务中了。大概形式如下:

以语言模型预测下一个单词为任务,可以得到训练单词的embedding。一般输入的单词数是固定的,比如这里是6。像这种训练得到embedding的模型已经算是比较复杂点的模型了,后面的模型会更加简单和有效。

1.4.2 word2vec

相比于前面的语言模型学习embedding,word2vec更加简单,更加高效。word2vec是google在2013年提出的,并使得embedding技术在自然语言处理、图像、搜索、推荐等领域广泛应用。

word2vec可以分为两种形式,CBOW(Continuous Bag-of-Words)和Skip-gram。CBOW模型输入是某一个特征词的上下文相关的词对应的词向量,而输出是特征词的词向量。 Skip-Gram的输入是特征词的词向量,而输出是特征词对应的上下文词向量。CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好。

CBOW的范式大概如下:

针对语料,选择一个target词(比如juice),然后再以juice为中心选择上下文相关的context词(比如左右各四个词,左边是a glass of orange,右边是 to go along with),以此训练得到词的embedding。
context可以有多种选择方式:前面4个词、左右各四个词、前一个词等等。

Skip gram的范式大概如下:

skip gram是选择一个context词(比如juice),再在juice附近选择一些其他的词(比如orange/my/glass等等)作为target。

一般来说,skip gram的方式效果会更好一些,重点来看看skip gram。

1.4.3 skip gram
skip gram的方式训练得到词的embedding会随机跳跃从context周边c范围内选择target词。模型结构非常简单,取得context词的embedding后()输入到softmax中预测结果输出target词。参数量存在于embedding矩阵(规模是300*10w,比如词向量维度是300,单词数是10w)和(softmax的参数,10w * 300)中。

如果单词总数的规模较大,那么计算softmax的性能会非常差。因此有分层采样和负采样两种方案。

负采样

负采样可以有效解决大量softmax计算带来的性能问题。负采样将softmax的问题改变为多个近似二分类的问题。通过skip gram的方式采样得到正样本,再通过随机采样其他词得到负样本。比如
正样本:
juice orange
负样本
juice hello
juice skip
juice of
juice interesting

单次只需要用这5个样本来更新模型,即变成5个二分类的模型。负采样时对词的随机选择,每个词的概率有一个经验值大概如下:
f(wi)34∑jf(wj)34\frac{f(w_i)^{\frac{3}{4}}}{\sum_j f(w_j)^{\frac{3}{4}}} jf(wj)43f(wi)43

2. embedding在推荐系统中的应用

其实前面提到的矩阵分解,从embedding的角度来看,用户隐向量和物品隐向量其实就是用户embedding和物品embedding。

常见的几种用法:
● 基于embedding计算物品、用户的相似度,实现相似商品的召回
● 物品/用户的embedding向量,和其他类型的特征一同作为排序模型的输入
● 粗排双塔模型,产生的用户向量和物品向量,直接做向量检索来完成粗排
● 推荐大量特征是id类特征,由embedding层转换成低维稠密的特征向量
● DeepMatch/Mind等召回模型

2.1 深度学习网络中的embedding层

在深度学习网络中,处理高维的稀疏特征向量,都会通过加入embedding层,转换为低维稠密的特征向量。在常见的排序模型中几乎都会这么来用,比如deep crossing,FNN,Wide&Deep等。

将embedding层与整个网络融合到一起进行训练,模型整体是自洽的。但embedding层的参数量巨大,会拖慢模型的收敛速度,故也有用预训练的embedding层代替的。

2.2 基于embedding的召回

DeepMatch/Mind等就是基于用户、物品embedding进行召回的深度模型。

DeepMatch的本质是一个多分类的模型,输入是用户搜索词向量、地理属性特征、历史观看视频的向量以及年龄性别等相关的特征。经过三层MLP后得到用户embedding的向量,再经过softmax层预测用户对视频的偏好度。softmax层的输入认为是用户的embedding,softmax层的参数认为是物品的embedding,训练后即可得到全量的用户和物品embedding。
模型部署时,通过用户embedding与物品embedding的内积运算,再取排序后的TopN即可完成。

3. item2vec

继word2vec之后,embedding的思想迅速扩散到其他各个算法领域,包括推荐系统。对用户点击序列、购买序列、观看视频序列等,如果也按照word2vec的方式来做,是不是也可以得到相应的embedding?Item2vec是在2016年的时候,微软提出的物品embedding向量的方法。

word2vec基于词序列来生成词的embedding,item2vec则是基于用户点击、购买的行为序列生成商品的embedding。Item2vec和word2vec的区别在于,item2vec没有时间窗口的概念。

对于word2vec而言,长度为T的句子w1,w2,……,wTw_1, w_2, ……, w_Tw1,w2,,wT,优化目标为:
1T∑t=1T∑−c≤j≤c,j≠0log(p(wt+j∣wt))\frac{1}{T}\sum_{t=1}^{T}\sum_{-c \le j \le c,j \neq 0}log(p(w_{t+j}|w_t)) T1t=1Tcjc,j=0log(p(wt+jwt))
对于item2vec而言,长度为T的用户历史序列w1,w2,……,wTw_1, w_2, ……, w_Tw1,w2,,wT,优化目标为:
1T∑t=1T∑j≠tTlog(p(wj∣wt))\frac{1}{T}\sum_{t=1}^{T}\sum_{j \neq t}^{T}log(p(w_{j}|w_t)) T1t=1Tj=tTlog(p(wjwt))

item2vec和word2vec最大的区别就在于item2vec没有时间窗口的概念,认为序列中任意两个物品都是相关的。因此在Item2vec的目标函数中,其实是两两物品的对数概率的和,而不仅是时间窗口内物品的对数概率之和。

4. graph embedding

item2vec只能使用序列数据来做,如果要处理网络结构数据,则可以用graph embedding的方式。

疑问:已经有了用户行为序列,再把行为序列生成物品关系图?
猜测,行为序列可以有更多的扩展

4.1 Deep walk

deep walk@2014 主要思想是在图结构上随机游走,那么就会产生大量的物品序列,然把这些物品序列作为训练样本输入到word2vec中进行训练从而得到物品的embedding,即随机游走+word2vec。
deep walk的大致流程为:

图来源于论文 “Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba”

在deep walk的流程中,随机游走的跳转概率为跳转边权重占相关边权重的之和的比例。

4.2 node2vec

node2vec在2016@斯坦福 被提出来。通过调整随机游走的权重方法使得graph embedding的结果更倾向于体现网络的同质性和结构性。
同质性是指距离相近节点的embedding应尽量近似(比如图中的U与s1,s2,s3,s4s_1,s_2,s_3,s_4s1,s2,s3,s4),结构性是指结构上相似的节点,embedding也应尽量近似(比如U和s6s_6s6)。

那么如何才能让模型上能够知道同质性和结构性?
同质性的表达:在随机游走的过程中偏向于DFS(深度优先搜索),DFS的多次跳转会游走到更远的节点上,在游走的过程中都是相邻的节点,那么相邻节点的embedding就会更加近似。
结构性的表达:在随机游走的过程中偏向于BFS(宽度优先搜索),BFS的多次跳转会集中在当前节点的周边,可以认为是对当前节点的结构做了一次扫描,当前节点是“中心节点”?“边缘节点”?从而使得embedding抓取到更多的结构性信息。

如何控制结构性和同质性?

如图表示从节点t跳转到节点v,再从节点v跳转到节点x的概率πvx=αpq(t,x)⋅wvx\pi_{vx} = \alpha_{pq}(t,x)\cdot w_{vx}πvx=αpq(t,x)wvx。节点v跳转到x的概率定义为,其中wvxw_{vx}wvx表示边的权重,αpq(t,x)\alpha_{pq}(t,x)αpq(t,x)表示为:

dtxd_{tx}dtx表示节点t到节点x到的距离,即x就是t,dtx=0d_{tx} = 0dtx=0即节点v往回走到节点t。由p(返回参数)来控制,p越小,返回的概率越大,那么就约注重结构性。dtx=2d_{tx} = 2dtx=2,即表示节点v要往远处走,逃离节点t,有参数q(进出参数)控制,q越小,则越注重同质性。

node2vec通过调整p和q可以产生不同的embedding结果。距离相近的节点颜色更接近,结构相近的特点颜色更接近。

疑问:同质性或者结构性,在电商的商品中有什么类比的吗?

5. 局部敏感hash

局部敏感hash是帮助embedding检索从海量(几百万、几千万)的候选中快速筛选出相似的向量。

5.1 最近邻搜索

基于embedding相似度的检索,需要对候选集合中所有的物品做遍历。k维的embedding空间,物品总数n,遍历一次的复杂度为O(kn)O(kn)O(kn)
建立kd树(KNN算法中用到的快速检索方式)的索引结构,进行最近邻搜索,可以把复杂度降低到O(log2n)O(log_2 n)O(log2n)

5.2 局部敏感哈希

局部敏感哈希(Locality Sensitive Hashing, LSH )基本思想是让相邻的点落入到同一个桶中,那么在进行最近邻检索时,只需要在相邻的几个桶内做搜索即可完成。局部敏感哈希利用了低维空间可以保留高维空间相近距离关系。

对于embedding向量来说,用向量内积操作就可以构建局部敏感哈希桶。是k维的embedding向量,是k维映射向量。内积操作h(v)=v⋅uh(v)=v \cdot uh(v)=vu可以把映射到一维空间,因为即使是一维空间,也会保存部分高维空间里的近似距离信息。分桶函数可以设计为:

h(v)=⌊v⋅u+bw⌋h(v) = \lfloor \frac{v\cdot u + b}{w} \rfloor h(v)=wvu+b

⌊⌋\lfloor \rfloor是向下取整,www是分桶宽度,bbb是均匀分布的一个变量。

5.3 多桶策略

如果只用一个哈希函数进行分桶,很容易误判相近点。可以采用多个哈希函数同时进行分桶。采用多个哈希函数做分桶,那么需要选择是通过“或”还是“与”的操作。具体的使用几个哈希函数,用或还是与的操作,都需要做准确率和召回率的权衡。

参考资料

word2vec 中的数学原理详解 https://www.cnblogs.com/peghoty/p/3857839.html
王喆《深度学习推荐系统》
吴恩达老师的视频课程 《Natural Language Processing and Word Embeddings》

读书笔记-深度学习推荐系统4-推荐与embedding相关推荐

  1. 读书笔记-深度学习推荐系统1-概述章节

    推荐系统充斥于互联网的各个角落,听音乐.看视频.看新闻.购物.学习课程等等. 1.1 推荐系统的作用 用户:在信息过载的情况下,帮助用户高效获得感兴趣的信息. 公司:通过推荐吸引用户留存.增加用户黏性 ...

  2. 读书笔记-深度学习入门之pytorch-第四章(含卷积神经网络实现手写数字识别)(详解)

    1.卷积神经网络在图片识别上的应用 (1)局部性:对一张照片而言,需要检测图片中的局部特征来决定图片的类别 (2)相同性:可以用同样的模式去检测不同照片的相同特征,只不过这些特征处于图片中不同的位置, ...

  3. 读书笔记-深度学习入门之pytorch-第五章(含循环实现手写数字识别)(LSTM、GRU代码详解)

    目录 1.RNN优点:(记忆性) 2.循环神经网络结构与原理 3.LSTM(长短时记忆网络) 4.GRU 5.LSTM.RNN.GRU区别 6.收敛性问题 7.循环神经网络Pytorch实现 (1)R ...

  4. 《深度学习推荐系统》读书笔记之推荐系统的进化之路

    来源:https://zhuanlan.zhihu.com/ p/138446984 作者:一块小蛋糕 编辑:深度传送门 最近读完了王喆老师的新作--<深度学习推荐系统>,拿到书之前,期待 ...

  5. 深度学习在工业推荐如何work?Netflix这篇论文「深度学习推荐系统Netflix案例分析」阐述DL在RS的优劣与经验教训...

    来源:专知 深度学习在推荐系统中如何发挥作用是一个重要的问题.最近来自Netflix的文章详细阐述了这一点指出:在建模用户物品交互方面,深度学习相比传统基线方法并无太大优势,而对于异质特征的表示融入深 ...

  6. 深度学习推荐系统实战笔记

    小广告 (欢迎大家关注我的公众号"机器学习面试基地",之后将在公众号上持续记录本人从非科班转到算法路上的学习心得.笔经面经.心得体会.未来的重点也会主要放在机器学习面试上!) 序 ...

  7. 深度学习推荐系统中各类流行的Embedding方法(下)

    我的个人微信公众号: Microstrong 微信公众号ID: MicrostrongAI 微信公众号介绍: Microstrong(小强)同学主要研究机器学习.深度学习.推荐系统.自然语言处理.计算 ...

  8. 重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文

    作者简介,王喆,硅谷高级机器学习工程师. 本文转载自知乎专栏 https://zhuanlan.zhihu.com/p/52169807 这里是王喆的机器学习笔记,每隔一到两周我会站在算法工程师的角度 ...

  9. 带你重读Youtube深度学习推荐系统论文,惊为神文

    来源:知乎专栏 作者:王喆 本文约5400字,建议阅读10+分钟. 本以为毫不起眼的地方,也藏着Youtube工程师宝贵的工程经验. 这里是王喆的机器学习笔记,每隔一到两周我会站在算法工程师的角度讲解 ...

最新文章

  1. Docker常用命令大全
  2. 个人代码库の设置窗体效果AnimateWindow
  3. es中的ResourceWatcherService
  4. Hyperledger Fabric 核心模块(3)cryptogen 工具
  5. .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB
  6. 环境部署(九):linux下安装python+chrome+Xvfb
  7. Linux内核参数传递Tag
  8. apacheBench对网站进行压力测试
  9. html百度天气api,百度API 免费接口获取天气预报
  10. mvc 生成输出url
  11. VMware Workstation 14.1.1 精简特别版
  12. opencv 二值化图像详解 一文看懂各种二值化方法
  13. Python爬取 201865 条《隐秘的角落》弹幕,发现看剧不如爬山?
  14. sql分组排序mysql_SQL分组排序
  15. lsb_slam Tracking线程 SE3Tracking 欧式变换矩阵跟踪参考帧 加权高斯牛顿优化算法WLM 最小二乘优化 归一化方差的光度误差函数 偏导数雅克比矩阵J 线性方程组LDLT求解
  16. android 检测 Home 键
  17. 业界天花板 | 四度入围Gartner全球《数据防泄露市场指南》
  18. 对象不支持“attachEvent”属性或方法
  19. 免息贷款但有手续费的年化利率计算方法及Java实现;
  20. Redis进阶篇:发布订阅模式原理与运用

热门文章

  1. 萧红《生死场》读后感
  2. HDU4730--We Love MOE Girls HDU(148)
  3. 语言学c刊,完整版|最新版C刊(2021-2022版)目录发布!新增和踢出了哪些?
  4. 快手20200412招聘
  5. html idv垂直居中,1.2.7 Excel表格打印技巧
  6. 【历史上的今天】2 月 24 日:乔布斯生日;苹果推出 Thunderbolt 接口;WhatsApp 创始人诞生
  7. AH8696_非隔离IC,AC220V降12V500MA,超高效简约电路,电源芯片IC*
  8. 喜马拉雅xm格式转化mp3_如何把喜马拉雅音频改为mp3格式
  9. 计算机在盲童音乐教学中的具体应用,盲童钢琴教学实践和教学方法探究
  10. 如何优雅查看Ubuntu的系统信息