2

漫谈表征学习

 2 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzA4OTk5OTQzMg%3D%3D&%3Bmid=2449231588&%3Bidx=1&%3Bsn=5f93069cfa9005e7b99ac6cf345fb6ab
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

漫谈表征学习

Mikolov等人在2013年提出了word2vec模型,在一系列算法和工程技巧的加持下,验证了文本的分布式表征[1](distributed representation)在NLP领域的成功。在此之后,随着node2vec和deepwalk等模型的成功,大家发现分布式表征不仅在NLP领域有效,在其他机器学习问题上同样有效,分布式表征技术开始得到广泛应用,对问题中遇到的实体都会想到去做表征学习,且很多都取得了不错的效果,而以BERT为代表的上下文动态表征模型的出现,将这一趋势推到了一个新的高潮。表征学习技术一时间成为了近年来机器学习领域最重要的进展之一,考虑到实现的简单高效以及效果的通用性,甚至可以把之一也去掉了。

一个算法能在特定领域下取得成功,理论上可以解释为这个算法是在分析该领域特定问题之后针对性提出的,因此它很好地反应了这个问题域的规律。但是这个算法在更广泛的问题域上取得成功时,这种领域特定的解释理论就不合适了,需要寻找更加普适的理论来解释这种有效性。分布式表征以及对应的表征学习就是这样的情况。

行业中对于表征学习的关注更多集中在how上,即如何得到好用的表征,但对于背后的why并没有太多的关注和讨论,大家似乎已经把它的有效性和合理性认为是理所当然的事情,或者干脆直接用word2vec在NLP中起效的例子不假思索地做了推广,认为已经了解了表征学习的原理。但要想真正充分用好表征学习,发挥好它的作用,还是有必要对其根本原理做些基本的理解,对于要解决的问题和要用的技术,做到知己知彼,才能百战百胜,业务理解和技术原理,两手抓两手都要硬。本文将从机器学习通用问题域的角度来探讨表征学习的原理、方法和应用,希望对表征学习能够做到知其然也知其所以然。

表征学习的出现背景

故事还是要从机器学习的基础原理说起。机器学习,尤其是有监督分类问题,可行的基本原理,在于对特征空间进行划分,目标是形成特征空间上若干个小的区域,每个区域内样本的标签都是几乎相同的,或者说是有明显倾向性的。我们现在常用的模型本质上是两大类:树模型和线性模型,以及他们各种形式的组合。最方便理解“特征空间划分”这个概念的方式是想象一个决策树模型如何判断一个样本属于什么标签,本质就是在寻找一个和这个样本最相似的样本领域,根据这个领域中的样本组成来判断待预测样本的标签。而决策树训练的过程就是如何使用特征构建空间划分方法的过程。树模型是逐个特征构造和训练空间划分方法,而线性模型使用的是寻找决策平面的方法,即寻找 空间中的一个平面,在平面一侧的是一个标签,在平面另一侧的是另外一个标签。

所以从某个角度看,分类问题的学习过程本质上是将样本投影到特征空间中,然后寻找这个投影场景下的最佳空间划分方式,如果空间的划分能够形成比较好的可分性且具有局部平滑性,就可以达到好的分类效果。由此可见这个过程中特征空间扮演者非常重要的角色,不同的特征空间对应着样本投影结果的不同,也就对应着不同的空间划分结果。在常见应用中,构造出的特征可分为以下几类:

  • 连续数值类特征:最常见的为点击率类特征,以及一些价格、数量等原始形态就是连续值的特征
  • 低维ID类特征:数量有限且较少的分类型特征,典型的如性别、职业等
  • 高维ID类特征:理论上数量是非常巨大甚至无限的,且真实数量也较大的特征,典型的如原始文本类特征和ID类特征,以及ID类特征与其他特征交叉形成的特征。因为ID理论上是会持续无限增长的,在现实中也确实如此

从特征空间划分的角度,前面两类特征都是相对友好的,因为如果用这两类特征组成特征空间,并对空间进行划分,一个待预测样本有较大概率能够找到一个高置信划分区域或邻域,使得模型可以基于这个区域或邻域上的训练结果对样本做出预测。具体来说,对于一个已经归一化到[0, 1]之间的连续数值型特征,如将该特征划分为K个区间,如果一共有N条样本,那么落入每个区间中的样本数则为N/K,而在一般应用场景中N通常会是至少万级别,K则一般都在百以下,那么每个区间中的平均样本数至少为100个。也就是说一个待预测样本可以参考至少100个类似样本做出判断,可以得出一个相对置信的结果,此时模型需要学习的参数也是 个,学习难度相对较低。对于低维ID类特征,也可以用类似的方法得出类似的结论。这背后的重要原因之一就是相似度度量,对于数值型特征,可以通过余弦公式来衡量相似度,而对于低维ID类特征,则可以通过是否属于同一类别来判断相似度。

但对于高维ID类特征,若不加以处理,上面的良好性质则不再成立。原因在于对于在原始ID的特征空间中,常用的基于欧氏距离的相似度度量方法失效了,变得名存实亡,因为在这个特征空间中,每个特征值都是一个唯一的ID值,所以向量化表示之后,每两个特征向量都不共享任何元素,它们之间的余弦相似度都是0,这是一个非常贫乏的相似度空间。换句话说,每一个特征值,在整个特征空间中都找不到一个和它相似度非零的特征值,那么如果在这组特征值上做空间划分,只能是为每个特征值划分一个单独的空间区域。把这种情况套用到上面的分析方法中,对应着理论上无穷大,现实中也会非常大的K,但是N却还是一样的,那么每个区域中的样本数N/K就会变得非常的少,而且很可能会有很多个区域中完全没有任何样本落入。这会带来两个直接的问题:

  1. 级别的参数量随着K爆炸式增长,模型学习难度直线上升,对样本量的需求急剧加大
  2. 很有可能会有大量待预测样本落入样本量很少,甚至是完全没有任何样本的区域,导致模型无法给出置信结果,甚至完全无法给出结果,这是典型的泛化能力弱的体现

我们以最常见的ID类特征为例来具体看一下这个问题。在电商等互联网机器学习模型中,用户ID和物品ID是最常用的两类特征,尤其是ID特征还经常被用来生成交叉特征,例如“看过该物品(ID)的用户喜欢的标签”这一类交叉特征。百万级别的ID类特征,可轻松生成上亿的交叉特征,甚至达到十亿百亿级别。也就是说K达到了亿级别,并且这些ID特征值之间的相似度也全部是0,因此要想让每个划分区域中能有100条样本来达到比较置信的效果,至少需要百亿级别的样本。且不说有多少公司能有这么大量级的样本数据,即使有,对于模型训练也会是非常大的挑战。从另一个角度看,这也是为什么说高维特征会带来稀疏性,就是因为在每个特征值的邻域内,都只有非常少的样本,而单位空间内的数据量少,自然就是稀疏的意思。

因此,高维ID特征带来的稀疏性挑战、泛化挑战和训练挑战就成为了驱动表征学习的最直接源动力。而将这个问题做进一步地泛化,其实表征学习本质上解决的是数据降维的问题,更具体地,是希望寻找一种自动化的数据降维方法。数据降维是机器学习中一个重要的概念和技术,为数据降维最简单直观的方法是寻找数据的类别,例如商品ID降维可以寻找商品的标签、类别、价格等,但这样的局限性有两个:其一这种人为划分的类别不一定是最合适的;其二在很多场景下是没有类别信息可参考的。这两个局限性使得我们急切地需要一种或者一类能够自动降维的方法,希望一来能够得到更好的划分效果,二来可以不依赖人工分类数据的存在。更重要的是,这样的方法使得整个建模流程能够更加自动化,降低宝贵的人工成本,做到降本提效。

自动化的降维需求也不只限于高维ID类特征,凡是批量采集得到,且原始表示方式信息量较少的特征都有这个需求,典型的就是图像数据。图像的原始特征是像素,采集简单,但是特征维数高,每个像素内的有效信息非常有限,如果能有自动化降维的方法,对于下游应用也会非常有用。

除了将用于机器学习模型的特征进行降维,在互联网算法应用的其他领域也对降维有强烈的需求,最典型的就是推荐系统的召回。数据的稀疏性对于推荐召回也有着重大的影响,其道理与机器学习模型类似,因为召回从原理上看就是在找一批与当前上下文相关性最高的物品,而这个上下文包括当前物品ID、用户ID、物品属性、用户属性等等,使用物品ID和用户ID做召回的典型算法就是协同过滤及其各种变种,显然ID类数据的稀疏性对于协同过滤的召回是有着很明显的局限性的,这就导致协同过滤算法虽然有着较高的相关性和准确性,但在覆盖率,泛化能力以及应对冷启动能力上有着天然的短板,而如果能对这个场景下的物品ID和用户ID做有效降维,这些问题就可以得到有效缓解。

所以总结起来,表征学习的大目标就是降维,更具体一点说是能够自动、高效、有效降维的方法,使得降维后的特征仍然是有效的。

表征学习的目标和基础

顾名思义,表征学习的目标是要找到特征x的一个表示h,那么什么样的h是好的表征呢?如果从上面数据降维的目标出发,那目标其实很简单,就是维度低,同时还能有足够的区分能力。例如对于词汇量为N的语言,一篇文档需要用N维向量来表达,即dim(x)=N,那我们希望dim(h)=K,其中K<<N,典型的N一般至少是万级别,而K一般是百级别。剧情进行到这里就出现了矛盾:上面我们介绍了模型的学习能力和特征划分空间的能力直接相关,即特征表达能力和维度直接相关,即维度越高表达能力越强,而这里要求h的维度远小于N,那h的表达能力岂不是也要远小于x了吗?而这个矛盾也正是表征学习有趣的地方:如何能够消除掉大量不必要的维度,同时还能够保持足够的信息量?

以最早应用表征学习的图像领域为例,一张图片上有很多的像素点,这些像素点构成了原始的特征,但这些特征之间是否完全独立呢?显然并不是,例如图片中通常都会有大片的连续像素,其中的像素值高度相似,而真正在图片中起到识别性作用的,是物体的边缘、轮廓以及局部模式,例如人的耳朵、脸庞等等。autoencoder在图像上最早的成功应用就是利用了这中间的信息冗余,逐层提取出真正有信息量的特征,实现特征的高效压缩。

在文本领域同样存在这样的现象。在一篇英文文章中,am几乎只会出现在I的后面,那么虽然在词袋模型中I和am是两个特征,但我们基本上只用一个就够了,另一个提供的额外信息非常有限。再比如中文里的“观音菩萨”这个词,我说“观音”,你基本上知道我后面大概率接的就是“菩萨”,而看到“菩萨”你大概率第一个想到的也是“观音”,所以我们其实并不需要用两个词的特征来表示观音菩萨。这些例子说明在原始的文本数据中,信息的冗余是非常多的,这在语言学角度是有必要的,但从信息处理的角度来看,就给我们提供了将原始信息进行压缩的空间。

信息冗余的现象不仅在文本中存在,在其他领域也普遍存在,比较典型的是涉及到用户行为的各种领域,例如手机app的使用行为。某些类型的app的用户使用行为是存在高度相似性的,如借贷类app,对于需要借钱的人来说通常会下载多个借贷类app,还比如一些小众亚文化对应的app,例如漫画类、动漫类、球鞋类、体育类等等,这些app的用户群也存在较大相似性,用了其中一个app的就有较大可能会用另外的app。

无论是文本数据还是行为数据,这种现象都可以用互信息的概念来描述:若两个随机变量X和Y之间存在较大相关性,则二者之间的互信息会比较高。正是这个概念将不同域的特征降维问题统一到了一起,变成了一个问题,可以用一组概念来一同讨论。在互信息的概念下,如果两个变量之间是完全独立的,则他们之间的互信息为零,也就是说它们两个变量各自包含完全独立的信息,在这种情况下我们是无法缩减掉任何一个变量的,因为另一个变量完全无法表示被缩减变量的信息。换句话说,如果原始特征x中的每两维之间完全正交,互信息都是零,那么每去掉一维特征,就一定会完全损失这维特征包含的信息,也就是说如果从N维降维到K维,且K<<N,那么信息量的损失是巨大的,这样的降维显然不是我们想要的,因为我们想要的是维数少&信息量足。

但幸运的是这个世界还是将我们温柔以待的,通过上面几个例子可以看出,现实中大部分数据中的信息冗余还是很多的,这种信息中天然内在的冗余性,构成了各种表征学习方法的基础,使得表征学习在很多场景下都是可行的。

表征学习的方法

表征学习现在是一个非常活跃的领域,方法也是层出不穷,在这里介绍几类目前应用最为广泛的方法,这些方法的共同特点是实现简单、理解直观并且具有较广泛的普适性。需要说明的是,这里的介绍更多是在原理和思路层面,目的是为了后面更好的对表征学习的展开讨论,这些方法的细节可以在网上获取到。

自编码器(autoencoder)可以说是最早专门用来进行表征学习的方法之一。其核心思想是学习两个函数 和 ,使得 是原始特征x的一个表征, 是根据这个表征对原始特征的一个重建。在这个设定下,自编码器的学习目标为: ,其中 是可自定义的最优化目标,例如MSE。

但如果完全只盯着这个优化目标,不加限制地学习 和 ,极端情况下可能会学习出一个ID映射函数,这个函数完全记住了每一个x,能对于任意训练样本i做到 ,但这样的表征没有什么意义,因为对应的 并没有学到什么有用的信息,而且可能也起不到降维的效果。这是一个机器学习中典型的过拟合问题,所以为了防止自编码器过拟合,常常会在自编码器中加入以下一个或多个限制:

  • 限制 的维度远小于 的维度,即
  • 对优化目标做正则化限制,即优化 , 其中 ,这类自编码器叫做稀疏自编码器(sparse autoencoder)
  • 对输入特征 加入噪音,即优化 ,其中 是在 的基础上加入随机噪音而来,这类自编码器叫做去噪自编码器(denoising autoencoder)
  • 对导数做正则化限制,即 优化 ,其中 ,这类自编码器叫做收缩自编码器(contractive autoencoder)

熟悉机器学习优化套路的同学们可以看出,上面几种方法本质上都是提高泛化能力的方法,目标是在高度拟合目标函数和过拟合之间取到合理的平衡。但与传统正则化方法不同的是,在传统的监督学习中,正则化的目标是让模型在预测集上预测结果表现稳定,而以自编码器为代表的表征学习中的正则化关注的并不是最终的预测结果——因为预测结果是还原原始特征,而是更关注表征层的效果,让学到的 包含原始特征中重要的信息,而不只是记忆样本和特征的映射关系,这对于后面的下游流程才更有用,才能真正起到表征学习的作用。正是由于自编码器最终有用的是 本身,所以它的正则化项可能是含有 ,而传统的正则化项只含有参数而不包含特征值,这一点值得细细品味。

自编码器类的学习方法的特点是输入特征 维数虽高,但每一维中通常都是连续值,典型的场景是图像数据的处理。这类方法的本质是将很多零散信息进行抽象汇总,在各种正则化条件限制下,得到能够最大程度代表这些信息的表征,有一种“擒贼先擒王,射人先射马”、“百万军中取上将首级”的豪情在里面。

640?wx_fmt=jpeg
图1:手写数字图像的像素特征
640?wx_fmt=jpeg
图2:用自编码器学到的表征

图1展示了一组手写数字图像的样本,看到每张图像样本都是黑底白字,用28*28的像素矩阵表示。可以看出像素特征存在很明显的信息冗余:存在大量连续的黑色和少量连续的白色。图2是使用自编码器学习出的100维隐层表征 ,每个小格子代表一维,格子中发亮的部分代表这个区域的原始特征会激活这一维表征特征。可以看出,能够激活表征特征的都是原始特征中代表数字弯曲和笔画的部分,而在黑色和白色内部的区域则很少出现激活情况,这一现象与人类识字的过程也极为相似。这说明自编码器确实学到了冗余数据中真正重要的部分,这样的表征学习不仅降低了特征的维度,更可以让后面的学习只关注这些重要的特征,而不必关注原始存在冗余的特征,降低了后续性学习的难度。

图表征学习

与上述图像类数据不同,互联网场景下更常见的ID类特征展现的是另外一种形态的信息冗余。ID类特征本身含有的信息是非常少的,每一个维度就是一个ID,而每一个ID上本身是一个取值只有0或1的二元特征,并没有什么提炼汇总的空间,它的冗余主要体现在大量ID之间存在或强或弱的相关性,就像在前面举过的文本数据中的例子。这种情况下,要相对这海量的ID进行降维有两大类思路:第一类思路是将ID进行归类,即将个体ID降维到类别ID,这里的典型代表是LDA这类的主题聚类方法;第二类是不直接进行ID归类,而是将ID投射到一个新的低维空间中,在这个空间中ID间可计算相似度,拥有更丰富的相似度空间,这类方法的典型代表是word2vec等序列学习的方法。

这里有一个问题比较有意思,值得展开讨论一下,那就是像LDA这样的生成式模型和表征学习是什么关系,这个问题有意思之处在于,它可以让我们更深入思考表征学习的本质。从前面的介绍和讨论不难看出,表征学习并不是一个有明确定义的具体方法,它更多的是为了解决一类问题而催生的一类方法,只要是能解决这类问题的方法,都不妨称之为表征学习的方法。LDA模型的作用是将文档集合中的词抽象总结为若干个主题,它的核心思想是认为词不是由文档直接生成,而是由文档先生成主题,主题再生成词,对于文本数据的生成过程,这确实是更合理的逻辑,因此也取得了很好的效果。这种做法在机器学习的框架中可称之为隐变量模型,因为它引入了一个观测数据中不存在的变量,也就是主题这个变量。它首先假设存在这样一个隐变量,并假设了隐变量和观测变量之间的关系,然后通过模型训练得到隐变量和观测变量之间的具体关系,最终模型的产出包括隐变量的分布本身,以及更重要的,隐变量和观测变量之间的关系。把这个过程仔细看一看,是不是发现和上面自编码器的思路很像?以上面图像的例子为例,可以把这两种方法做一个大概的映射:

自编码器LDA观测变量原始特征原始文本隐变量隐层 主题分布 隐变量和观测变量的关系

640?wx_fmt=png

640?wx_fmt=png

表征输出使用 作为下游输入特征使用 作为下游输入特征

从表中可以看出,LDA和自编码器从表征学习的角度有着高度的相似性,完全可以认为是表征学习的一种方法,进一步地我们提炼出做出这样的观点:任何带有隐变量且具有对新数据进行推断能力的生成式模型,都可看作是一种表征学习的方法,更具体地,可看做是一种自编码器。

从应用的角度也可以印证生成式模型和表征学习的相似之处。以LDA为例,LDA聚类的结果经常被用来做聚类,典型的如文档的聚类,而自编码器或其他表征学习学到的ID表征,同样可以用来做ID的聚类,例如用词向量做词的聚类等。编程语言中有一句话说得好:走路像鸭子,叫起来像鸭子,那就是一只鸭子。同样的,如果能生成向量表示,并且能用来聚类,那就是一回事,从这个角度来看,表征学习和LDA这类生成式模型还真就可以看做是一回事。

讨论完这个问题,我们回归主题来看一下ID投射的图表征学习方法。我们所探讨的表征学习,本质上都可以说是分布式表征,而以NLP场景为例,各种分布式表征的学习算法,无论是常用的word2vec及其变种,还是基于矩阵分解的GloVe及其变种,本质上都是对下面这句话的落地执行和具体实现:

a word is characterized by the company it keeps - Firth, J.R

即,一个词可以用它相伴的词来刻画其特点。利用这个思想,我们可以构造一个简单的表征算法:

在一个词汇量为N的文档集合中,定义 为 和 在相隔不超过n的长度范围中共现的次数,则可以定义一个长度为N的表征方法,对于词i的表征 中的第j位 ,其取值等于 。

这个算法将上面这一思想做了最直接的实现,即直接用每个词和其他词的共现关系来直接表示这个词。如果你对对推荐算法有所了解,你会发现这个表征方法其实就是协同过滤算法中的用户/物品表征方法,区别在于协同过滤算法中是用一类实体的向量表征来表示另一类实体,例如用物品向量来表示用户,而这里是用同一类实体来表示自己,但本质上是一回事,都是对于序列关系数据的一种表征方法,这种跨领域的数据通性也为图表征学习算法的普适性做了铺垫和基础,而且这不是NLP技术和推荐系统技术的第一个交叉点,事实上NLP技术在推荐系统中有着非常广泛的应用,其中部分是使用NLP技术处理系统中的文本数据,而另一部分则是将NLP相关技术应用在推荐系统的用户行为数据上[2]。

虽然上面这个简单的表征算法没有太多实际意义,因为其维度并没有降低,但它已经具有分布式表征的一些神韵了,最核心的就是相比one-hot的表征,不同词之间有了共享信息,例如两个同义词可能和很多词的 计数相等或接近,那么这两个词在这个表征方法下就会有较高的内积相似度,从思路上来说,已经是我们想要的方向了。

上面这个方法虽然非常地naive,但沿着这个思路的方向继续延伸,同时用上一些常用的数学方法,就可以得到一些可用的算法了。GloVe就是这样,将数据集的PMI矩阵,也就是共现矩阵的延伸版本,进行矩阵分解得到词向量。而更进一步可以证明,word2vec算法得到的向量表征和对PMI矩阵的分解得到的向量表征近似是一回事,二者之间只差一个常量[3]。这种矩阵分解的方法虽然在应用中并不常用,但对于理解图表征学习的“a word is characterized by the company it keeps”这个核心本质是有帮助的。既然一个词的本质刻画就是经常和它相伴的词,那么任意一种能够还原它和其他词之间的相伴关系的表征方法都是可以的,而且如上文提到的,语言本身是一个数据冗余度非常高的系统,具体表现为同义词、近义词、反义词、固定搭配非常多,这就使得很多词拥有相同或类似的相伴词集合,那么这些词在表征学习角度看来,其本质特性就是类似的,就不需要用两个完全不同的ID来表示,而是可以共享很多的信息。无论是分解PMI矩阵的方法,还是word2vec系列的方法,本质上都是利用了上面这一套理念,只是在具体实现时在损失函数构造、样本构造、优化算法等具体方法上有所不同。

现在实践中常用的图表征学习方法基本上都可以溯源到word2vec中的词向量训练方法,其中又以SGNS[4]为主。SGNS方法的精髓有两点,一是通过序列构造训练样本的方式,二是通过负采样完成模型的高效求解。这套方法中模型只在样本中指明了不同节点之间应该是什么关系,应该亲密还是疏远,同时给出一组特征用来进行这种亲密度的判断,但有趣的地方在于就在这组特征:这里给的是一组完全随机初始化的,每个维度没有什么明确含义的特征,这和其他常用模型有着两点本质区别:

  1. 每一维特征没有既定输入的特征值
  2. 每一维特征没有明确的含义

作为对比,我们在电商CTR模型中可能会用一维特征叫做价格,同时这个特征在每条样本上也会有明确的取值,但在SGNS这套方法中这两点都被打破了。如果说传统机器学习算法是给定特征值,学习特征权重,那么图表征学习就是在同时学习特征值和特征权重。但仔细一想,事实也并非完全如此,样本中也并非完全没有输入特征值,其实每条样本都有一个信息量高度聚集的输入特征值,那就是节点本身,或者说是节点ID,所以从某种角度来看,整个图表征学习的过程就是把节点ID这一信息量大,但却稀疏性高,缺乏节点间共享能力的特征,分解到了一组向量上面,使得这组向量能够还原原始节点ID所持有的信息量,而原始节点ID的信息全部通过样本中两两节点的关系来体现,所以学习得到的向量也能够体现原始节点的两两关系。更重要的是,这样分解后的向量在不同节点有了大量共享重合的维度,具有了很好的泛化能力。

从这个角度来看,图表征学习就像是一个“打碎信息”的过程:将原本高度聚集在一个ID上的信息打碎之后分配在一个向量上,使得向量中分散的信息通过内积运算仍然能够最大程度还原原始ID的信息量。而从图表征学习的例子也可以看出,这种向量+梯度的方法有一种不可言说的美妙,就像一个圣诞老人,只要你许下愿望,他就会帮你实现,而你需要做的,只是把袜子放到他能看见的地方。

SGNS方法很好地解决了样本构造和海量softmax计算这两个图表征学习中最重要的问题,因此对后面的其他图表征学习算法都产生了很大的影响,像DeepWalk以及node2vec等方法,基本都保留SGNS方法的整体框架,只是在样本构造方式上做了优化。此外,SGNS算法还有比较强的调优空间,这主要体现在损失函数的构造上,negative sampling本质上是nce方法(noise contrastive estimate)的一种具体实现,而nce方法中的精髓在于他把难以计算的标准化多分类损失函数转化成为了更容易计算的二分类损失函数,这一精髓思想也在很多后续工作中得到了发扬,例如Airbnb发表在KDD 2018上的工作中[5],就把nce loss中负样本的部分进行了扩展,其loss如下图所示:

640?wx_fmt=jpeg
图3:Airbnb在房屋搜索排序模型中使用的损失函数

图3中上面一行的两个项可认为是SGNS中标准的正负样本loss,而下面一行中的两个项则是使用类似负采样的思想构造出来的,指明了想要把什么样的样本和什么样的样本区分开来。比如下面第一项是指出用户点击过的房子;应该和最终预订的房子比较像,第二项则是说用户点击的房子要和同区域内曝光未点击的房子比较不像。通过这样对loss的修改,达到了更好为自己业务目标服务的效果。由于具有上面这些优点,所以直到目前为止,SGNS算法仍然是图表征学习算法的事实标准方法。

现在回过头来,有一个问题值得思考:如果生成式模型和表征学习有如此高的相似度,为什么不直接用LDA这种已经有了大量成功案例的方式来生成ID特征的表征,而是似乎让word2vec这种形式的表征学习占据了主流应用呢?首先我们应该看到的是,在图表征学习得到大规模应用之前,以LDA为代表的生成式模型,或者叫生成式表征学习方法的应用面也非常的广,只要我们能把问题抽象成“文档+词”这样的结构,LDA几乎都可以给出一个有效的表示,例如“用户和群组”、“用户和POI”、“用户和商品”等关系都可以解构为“文档和词”这样的关系,从而可使用LDA模型计算主题和表征。此外,即使是在word2vec及其通用方法横空出世之后,LDA类方法应用仍然非常广泛。但以SGNS为代表的表征学习方法也确实有着一些比较明显的优势。

首先是与深度学习架构的原生兼容性。SGNS本质上就是一个特殊的浅层神经网络,其优化过程也是基于反向梯度传播的,所以SGNS得到的结果可以很方便地作为输入嫁接到一个更复杂的深度网络中继续训练,在之前结果上继续细粒度调优。

其次是图表征学习方法捕捉到的信息要比LDA更加丰富,或者说加入了很多LDA这类方法没有包含的信息,最为典型的就是节点间的顺序信息以及局部图结构信息:LDA看待文档中的词是没有顺序和局部性的,只有文档和词的相互对应关系,但是图表征学习却非常看重这一信息,能够学习到局部顺序信息,这一点对于一些对于信息要求高的下游应用是很有用的。

再次,以node2vec和deepwalk为代表的方法可以同时在同一个图结构中学到多种不同类型物品的表征,且这些物品在同一个语义空间中。例如可以同时将用户、物品甚至物品的属性放在一起进行学习,只要他们能够成一个图结构即可,物品和用户的表征是由于在训练过程中是无差别的,因此是在同一个语义空间中的,可以进行内积运算直接计算相似度。但LDA算法的理论基础决定了它一次只适合描述一种类型的物品,或者最多同时学习出文档和主题这两种类型的表示,而且即使这样,这两种表示也不在同一语义空间中,因此无法直接进行相关性运算,也无法当做同一组特征嵌入到其他模型中,在应用面和易用性方面相对受限。

最后就是工具层面的影响,在计算机行业,最流行的方法不一定是理论上最先进的,但一定是工具最方便的,古今中外,概莫能外。在TensorFlow、Pytorch等工具流行之前,基本都是每个算法一个专用工具,典型的例如libsvm、liblinear等,一个算法如果没有一个高效易用的实现是很难被广泛应用的,包括word2vec的广泛应用也有很大一部分要归功于其工具的简单高效,而tf这些可微分编程工具的出现,使得新算法的开发和优化变得更加简单,那么像LDA这样没有落入到可微分编程范畴内的方法自然就相对受到冷落了。

上面这些原因的存在,使得图表征学习成为了事实标准以及未来趋势,但LDA为代表的生成式表征学习方法仍然会在合适的场合继续发挥作用,并且也有可能会和可微分编程框架发生融合,焕发第二春。

基于混合信息的增强图表征学习

上面介绍的方法,在学习节点的表征时只使用了节点之间的关系信息,而没有使用任何外部信息,例如节点实体的属性等信息,这会让模型过分关注已知节点之间关系,导致学出来的表征泛化能力略差,同时对于冷启动场景不友好,在面对线上环境的新数据推断预测方面效果会受到影响,而推荐系统场景下的数据极度的稀疏性使得这些问题更加严重。为了克服这类问题,我们希望在学习过程中能用到更多维度的信息,尤其是那些具有较好泛化性能的信息。

在推荐系统这样用户和物品组成的典型互联网场景中,使用更多可泛化信息这个思路又可以进一步细分为三大类:

  1. 用更多的信息描述用户
  2. 用更多的信息描述物品
  3. 用更多的信息描述用户+用更多的信息描述物品,即上面两者的结合

第一种类型的典型代表方法是YouTube在2016年提出的模型[6],该模型的架构如图4所示:

640?wx_fmt=png
图4:YouTube提出的用户表征和物品表征联合学习的方案

可以看出这个架构与word2vec架构最大的差异在于,输入层不再只是ID信息做embedding,而是用一组上下文信息来描述用户,例如用户看过的视频,搜索过的query,地理信息以及用户性别等,然后用最后的ReLU层的输出作为最终的用户表征。这样做本质是将一个用户ID做了泛化解构,解构成为一组相对可泛化的特征来表示,这对于相对新的用户来说就会比较友好,不会因为新用户行为数据偏少而导致学不出好用的表征来,同时也可以让行为丰富的用户帮助行为相对稀疏的用户来学习一些泛化特征,提高在行为稀疏用户上的表现。

第二种类型的代表之一是阿里在KDD 2018上提出的GES和EGES模型[7]。GES的全称是Graph Embedding with Side information,顾名思义,就是用节点ID以外的信息(side information)来共同表征一个物品,用来增强表征的泛化能力,缓解冷启动问题。该方法的网络架构如图5所示:

640?wx_fmt=jpeg
图5:融合多种信息的图表征学习方法GES和EGES

在GES算法中,物品ID本身被算作 SI 0,其他的辅助信息,例如品牌、店铺、型号等分别是SI 1、SI 2、SI 3等等。GES算法的思想其实很简单,就是把这几类信息的向量进行平均来生成隐层向量H,用H来作为这个物品的表征。这样的架构对于新发布的物品就比较友好了,因为新物品还没有和其他组物品发生过太多联系,所以ID级别的训练数据会很稀疏,但新物品对应的SI辅助信息已经通过其他物品的样本训练出来了,所以即使这个新物品完全没有行为信息,也可以用这组辅助信息来进行表征,这就有效缓解了冷启动的问题。EGES和GES的区别在于将向量平均变为加权平均,即加入一组权重参数,用来表示不同类型信息对于不同物品的重要性,例如买数码商品的顾客更在乎品牌,而服装商品的用户可能更在乎款式,等等。

第三种类型,即上面两类思路的结合体,目前的实现度还不是很高,笔者所知的主要是YouTube在RecSys 2019上使用的一种双塔DNN结构[8],其结构如图6所示:

640?wx_fmt=jpeg
图6:双塔DNN结构学习图表征

从图中可以看出,左边的塔是负责描述用户信息的,右边的塔是负责描述物品信息的,二者共享了物品级别的ID表征。YouTube的这个架构沿袭了16年架构对于用户的描述方法,但做了如下改进:

  1. 左侧塔中用于描述用户的物品,其描述不再只有ID,还加入了channel、view、like等泛化能力更强的粗粒度特征。这种升级后的描述同时应用在了用户侧(左边的塔)和物品侧(右边的塔)
  2. 右侧塔中对于物品的描述,不再是16年架构中的一层参数,而是变成了多层的深度结构,同时也用了前述的channel等信息来描述物品,使得对物品的描述能力也大大增强,同时也显著增强了物品侧表征的泛化能力和克服冷启动的能力

这个架构中的channel、view、like这些信息就相当于上面GES模型中的辅助信息,但在用法上有所区别,这里将这些辅助信息的表征进行了拼接使用,而GES中是进行了平均后使用。

可以看到这种架构是对YouTube 2016年架构的一次升级,其思想很有趣,值得展开聊一聊。在传统的图表征学习算法中,以SGNS算法为例,都涉及两个物品,要么是两个同类型物品,例如经典word2vec场景中的两个词,要么是两个不同类型的物品,例如YouTube 2016年模型中的用户+物品,但无论如何都会有一方在输入层,一方在输出层,输入层在经过多层变换后会产生一组最终的特征,一般称为 ,而另一方一般也会用一组参数表示,一般称为 ,二者的相关性,同时也是模型的输出值,是用logistic函数表示:

可以看出在上面公式中 和 是完全对等的状态,二者在数学上并无差别,只是我们习惯将特征进行一系列变换后表达为 ,为的是增加特征的表达能力,但对于参数这一步,大多习惯性是用一组线性参数 ,而YouTube 2019这个工作所采用的架构则打破了这个思维局限,将 也看做特征进行深度描述和建模,于是就有了双塔模型中右侧的这个塔。巧的是这个思路也是借鉴自NLP领域,再一次印证了NLP和推荐系统之间紧密的关系。

按照这个思路,可以对GES和EGES模型做进一步的改造,即将模型顶端的 也用一个单独的塔来建模,这个塔和左侧的塔共享物品的描述向量。但截至目前还没有看到有这么处理的成型工作,有兴趣的同学不妨试一试效果。

端到端学习

除了上面几种学习方法,还有一类方法是端到端地学习某类物品的表征,这在各种深度学习算法中都有应用,但这种方法中学到的表征通常只为这个模型本身服务,在通用性方面并不占优势,因此较少在模型以外的场合单独使用。此外这些端到端的学习方法其核心原理与上面描述的几类方法大同小异,具有类似的思想内核,因此在此就不再单独介绍。

表征学习的研究和实践现在都非常活跃,相关工作和思路也远不止上面介绍的这些,例如近年来兴起的广义的GNN给图表征学习赋予了更丰富的内涵,建立了更多的方法。本文旨在覆盖表征学习的基础来龙去脉以及常用方法,希望读者读后能够在脑中建立起表征学习的基础脉络结构,为后面的持续精进打个基础。后面如果有机会,我们再来谈一些表征学习的更深层次问题,例如表征学习的有效性原理,表征学习的好坏判别标准,表征学习的更多应用方法以及更广义的GNN算法等等。





About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK