在NLP(自然语言处理)中,自然语言无法直接应用到数学模型的建立中,需要将其映射到欧式空间。
Embedding就是解决如何将自然语言表示为向量的,Google推出了Word2Vec模型,可以将语义相近的词映射到向量空间中相近的位置,之后Google又提出了BERT,BERT可以考虑到相同词在不同位置有不同含义等信息,利用这个新的语言模型刷新了问答、文本情感分析等多个语言任务的表现。同时,Embedding也可以作为深度学习模型的隐藏层,可以极大提高模型的表现。
自从word2vec横空出世,似乎各行各业的一切东西都在被Embedding,Embedding在数学上表示一个映射F: X -> Y,也就是一个函数,其中该函数是一一对应的而且保持空间同构性 (即在X空间是近邻的,则被映射到Y空间也是近邻的)。Embedding技术被应用在了多种业务场景中:
1) 在 Airbnb 中实现实时个性化搜索,利用用户近几周或者近几个月点击过的房源行为数据实时对用户的搜索目标房源进行相似度比较和排序,这样既极大的提高了效率而且也保证的搜索房源的准确性提高了用户体验。
2) 在电子商务领域,根据用户的浏览和购买行为数据,通过深度学习模型可以将用户和物品同时嵌入(embedding)到相同的低维空间,然后利用Embedding计算用户和物品之间的相似度(匹配度)直接给用户推荐感兴趣的物品。
在人力资本领域,求职者、公司、职位、专业、技能等不同的实体间存在着多种类型的关系,构成了一个知识图谱(Knowledge Graph)。这里,我们主要关注的是Graph Embedding(其实也可以称为Network Embedding)。我们利用Graph Embedding技术,把这些实体嵌入到低维的向量空间,可以直接比较他们的相似性,并能大大的提高简历和岗位的匹配效果。对于具有较多类型节点且各类型节点的数量巨大来说这是比较好的尝试,而且取得了一些效果。
生成Graph Embedding常用方法及其原理
由于graph embedding的广泛应用,同时衍生出了很多计算embedding的方法,下面我们介绍几种商业上比较常用的几种方法:
DeepWalk [3]是KDD 2014的一篇文章,我们常用的word2vec是根据词的共现关系利用skip gram和COBW将词映射到低维向量。DeepWalk算法思路其实是利用了word2vec生成embedding的一种方法skipgram,对于已经建立的Graph来说每个节点可以是不同的实体且实体时间可以有不同的关系,从图上的一个节点开始随机游走(random walk),如果节点之间有weight可以根据weight的不同进行walk来生成类似文本的序列数据,实体id作为一个个词使用skip gram训练得到词向量。
2) LINE
LINE(Large-scale Information Network Embedding)是2015年文章[4]中微软亚洲研究院提出来的一种算法,LINE定义了两种度量节点相似度的方法:一阶相似度(First-order proximity)和二阶相似度(Second-orderproximity)。
一阶相似度
其中一阶相似度就是两个点直接相连的边的权重,且边权重越大说明两个点越相似,如果两个节点之间无连接,则一阶相似度为0;
对每个无向边,定义顶点和的联合概率分布为:
是顶点的低维向量表示, 我们的目的就是使得经验分布和概率分布尽可能的接近,于是我们定义以下一阶相似度的目标函数:
其中为两种分布之间的距离,为空间上的一个分布, =是它的经验分布,其中W为两点间边权重总和。我们选择KL 散度来计算(2)式子。
KL散度的计算公式其实是熵计算公式的简单变形,在原有概率分布p上,加入我们的近似概率分布q,比较两个概率分布的相似性:
将,带入KL散度的公式我们得到︰
其中C为一个常数,需要注意的是,一阶相似度仅适用于无向图,而不适用于有向图。
二阶相似度
二度相似性则是两个点之间共享多少相同的节点,共享的相同节点越多,而且共享的边的权重越高则它们的相似性就越高。二阶相似性假定与其他顶点共享邻居顶点的两个点彼此相似(无向有向均可),一个向量和分别表示顶点本身和其他顶点的特定“上下文”,意为二阶相似。对于每个有向边,我们首先定义由顶点生成“上下文”的概率:
式子(5)是一个条件分布,对于顶点,我们的目的就是要拟合与其经验分布。为边的权重,为相邻边的权重的和,因此最小化以下目标函数:
d(,)上文已经说明,来表示顶点的度数。这里我们令利用KL散度同一阶相似性的推导类似我们可以得到二阶相似性的计算公式(去掉常数项)为:
具体应用时,我们可以将一阶和二阶的得出的embedding进行拼接这样可以得到更多的语义信息。
Node2vec[5]算法是在DeepWalk基础上进行了改进,主要的创新点在于改进了随机游走的策略,DeepWalk中根据边的权重进行随机游走,而Node2vec加了一个权重调整参数,同时考虑到局部和宏观的信息,并且具有很高的适应性。
除了以上提到的常用的生成embedding方法,学术界和工业界还提出了很多方法,像SDNE[6]、Struc2vec、Starspace[7](Facebook用的技术)、EGES(阿里巴巴推荐使用的技术之一)等。
Graph Embedding为人岗匹配带来新突破
在人力资本行业最主要的两大核心要素就是简历CV和工作岗位JD,如何让CV和JD有效的匹配是人力资本行业一直非常重视的问题也是一个难题。我们在人力资本行业领域对graph embedding的尝试和应用,并且取得了一定的效果。
1)原始文本处理
想要有效的进行人岗匹配(即CV和JD的合理匹配),需要综合考虑包括职能、行业、技能、专业等维度在内的多维度匹配。首先应该提取CV、JD中的文本特征,可以利用深度学习模型提取出CV、JD的文本特征,我们这里称为实体。抽取出实体之后,我们就可以进行CV和JD的匹配,对于自由文本来说除了CV和JD的实体完全匹配上,可以算他们的相似度,词的语义相似度无法完全的诠释。举个例子:
CV的特征:技能实体(JAVA),职能实体(JAVA开发工程师)、专业实体(计算机)
JD的特征:技能实体(Spring),职能实体(JAVA后端开发)、专业实体(信息技术)
从词的表面是无法区分他们的相似度的。下面就用到了embedding,embedding可以将这些实体嵌入到同一低维的向量空间,在空间中实体之间的距离可以通过数学公式计算从而表示他们的相似性。
2)生成实体embedding
第一步:数据的生成,我们首先利用CV、JD中不同实体的共现,以及不同工作经历之间的跳转来抽取简历中的实体跳转,这些不同的实体之间可以构成network如图1所示。不同的实体就是不同的节点,实线就是节点之间的边也可以称为关系。
图1
第二步:使用Deepwalk、LINE生成embedding。对于Deepwalk可以直接根据network生成不同的文本序列,利用skip-gram进行模型的训练。而对于LINE可以直接利用不同实体的共现次数作为模型的输入。
第三步:优化训练数据。我们发现不同的实体出现次数的量级是不同的,比如专业在JD中就很少出现,这样就导致了数据的不平衡。我们解决的方式是,统计了不同实体之间的tfidf、npmi(Normal Pointwise Mutual Information)作为实体之间的权重,即表示了不同实体之间关系的强弱程度,之后再进行模型的训练。
第四步:以上都是利用无监督的方式去训练embedding,由于e成科技有自己独立的人力资源ATS系统,包含了用户大量的真实行为数据。把其中匹配上的CV、JD作为正例,未匹配上的作为负例,构造出有监督的训练数据。将JD作为query,CV作为title,利用DSSM模型(如图2)进行有监督的模型训练。需要注意的是这里的embedding层并不是随机初始化的,而是利用第三步已经训练过的embedding作为预训练的权重。这样有监督训练的目的就是利用真实的行为数据更新embedding层的数据,使得每个实体的embedding更能好的表达在招聘这个业务场景中的语义。
图2
我们使用内部标注的评估数据对不同模型进行了评估,比较结果如下:
以下是fasttext和graph embedding模型输出的top相关公司实体的一些例子。可以看到FastText单单只从字面意思进行了相似度匹配;而graph embedding模型输出结果能够更好地包含了具有相似业务、相似规模的公司,具有更好的语义相关性。
本文主要阐述了Embedding的原理以及一些应用,具体的阐述了Graph Embedding在人力资本领域的落地应用。
Embedding既可以作为计算各个实体的工具也可以作为深度学习中的embedding嵌入层增加模型的准确性。不夸张的说一切可以embedding,而且embedding在很多领域都取得了不俗的成就,尤其是NLP领域。