协作学习
来自 Insight 的 Javed Qadrud-Din 开源了一种通用的实体嵌入算法,相比谷歌的 word2vec 模型能实现更广泛实体(包括名人、商家、用户等)的嵌入、更高的准确率以及少 4 个数量级的数据需求量。
GitHub 链接:https://github.com/javedqadruddin/person2vec
Javed Qadrud-Din 先前曾在 IBM 公司的 Watson 团队担任业务架构师。他在 Insight 开发了一种新方法,使得企业能够将用户、客户和其他实体有效地表示,以便更好地理解、预测和服务他们。
企业通常需要了解、组织和预测他们的用户和合作伙伴。例如,预测哪些用户将离开平台(流失预警),或者识别不同类型的广告伙伴(集群)。这一任务的挑战性在于要用一种简洁而有意义的方式来表现这些实体,然后要将它们输入一个机器学习分类器,或者用其他方法进行分析。
灵感来自 NLP
最近,自然语言处理(NLP)领域最重要的进展之一是来自谷歌的一组研究人员(Tomas Mikolov, Ilya Sutskever, Kai Chen, Greg Corrado, Jeffrey Dean)创建了 word2vec,这是一种将单词表示为连续向量的技术,这种连续向量称为「嵌入」(embeddings)。
他们在 1000 亿个单词(已开源)上训练出的嵌入,成功地捕捉到了它们所代表的单词的大部分语义含义。例如,你可以将「国王」的嵌入,减去「男人」的嵌入,再加上「女人」的嵌入,这些操作的结果会很接近「女王」的嵌入——这个结果说明谷歌团队设法编码人类文字含义的能力已经到了几乎令人毛骨悚然的程度。
一些词嵌入的例子(Mikolov et. al.)
从那以后,word2vec 一直是自然语言处理的基本组成,为许多基于文本的应用程序(如分类、集群和翻译)提供了一个简单而高效的基础模块。我在 Insight 的时候有一个疑问是,类似于词汇内嵌的技术如何应用于其他类型的数据,比如人或企业。
关于嵌入
让我们首先来想想「嵌入」究竟是什么。在物理上,一个嵌入只是表示某个实体的数字列表(即一个向量)。对 word2vec 来说,这些实体就是英文单词。每一个单词拥有一个自己的数字列表。
通过训练任务过程中的梯度下降进行不断调整,这些数字列表被优化为它们所代表的实体的有用表示。如果训练任务要求记住有关对应实体的一般信息,那么嵌入将会最终吸收这些一般信息。
单词的嵌入
以 word2vec 为例,训练任务涉及提取一个单词(称为单词 A),并在一个巨大的文本语料库(来自谷歌新闻中的一千亿单词)中预测另一个单词(单词 B)出现在单词 A 的前后 10 个单词范围的窗口中的概率。
每一个单词在训练过程中都需要重复成千上万次预测,对应的单词 B 既包括通常一同出现的那些,也包括从不会出现在相同的语境中的那些(这叫做负采样技术)。
这个任务要求每个单词的嵌入编码与这个单词共同出现的其他单词的信息。与类似的单词一起出现的单词最终会有类似的嵌入。例如,「聪明(smart)」这个词和「有智慧(intelligent)」这个词经常可以互换使用,所以通常在一个大型语料库中,与这两个单词一起出现的那些单词集合是非常相似的。因此,「聪明」和「有智慧」的嵌入会非常相似。
用这个任务创建的嵌入被强制编码了很多关于这个单词的一般信息,所以在不相关的任务中,它们仍然可以用来代表对应的单词。谷歌 word2vec 嵌入广泛用于自然语言处理的各种应用程序,如情绪分析和文本分类。
还有其他团队使用不同的训练策略设计的单词嵌入。其中最流行的是 CloVe 和 CoVe。
任何东西的嵌入
单词向量是多种 NLP 任务的必要工具。但是,对于企业通常最关心的实体类型来说,预先训练的词向量并不存在。对于像「红色」和「香蕉」这样的单词,Google 已经为我们提供了预训练好的 word2vec 嵌入,但是并没有为我们提供诸如一个社交网络、本地企业或是其他没在 Google 新闻语料库中频繁出现的实体的嵌入。因为 word2vec 是基于 Google 新闻语料库进行训练的。
企业关心的是他们的客户、他们的雇员、他们的供应商,以及其他没有预先训练的嵌入的实体。一旦经过训练,实体的矢量化表示就可以用以输入大量机器学习模型。例如,他们可以用在预测用户可能会点击哪些广告的模型上,可以用在预测哪些大学申请者很可能以优异的成绩毕业的模型上,或者用在预测哪个政客有可能赢得选举的模型上。
实体嵌入使我们能够利用与这些实体相关联的自然语言文本来完成这些类型的任务,而这类文本往往是企业手中一直保存着的。例如,我们可以通过一个用户写的帖子,一个大学申请人写的个人陈述,或者人们关于一个政治家的推特和博客帖子来生成实体嵌入。
任何有对应文本的实体的公司都可以利用实体嵌入,当你考虑这个问题的时候,大多数企业都以不同方式拥有这样的实体及对应文本:facebook 拥有用户和他们发布或标记的文本;linkedin 拥有用户和他们简介的文本;Yelp 拥有用户和他们写的评论,以及商家和关于商家的评论;airbnb 拥有住的地方和关于这些地方的描述与评论;大学拥有申请者和他们写的申请论文。这样的例子不胜枚举。事实上,Facebook 最近发表了一篇论文,详细介绍了实体嵌入技术。(论文链接:https://arxiv.org/abs/1709.03856)
我的 entity2vec 项目的目标是找到一种方法,使用与实体关联的文本来创建能够代表这些实体的通用嵌入。为了做到这一点,我使用了一种类似于 word2vec 的负采样的技术,将已知与某个实体关联的大量文本中的信息提取到实体嵌入中。
实例 1:名人
为了开发和测试这种技术,我尝试了训练嵌入来代表杰出人物(例如:巴拉克·奥巴马、Lady Gaga、安吉丽娜·朱莉、比尔·盖茨)。杰出人物是一个很好的起点,因为,对于这些非常有名的人的名字,在预先训练的 Google word2vec 嵌入是存在的,而且可以免费使用,所以我可以将我的嵌入和这些人的名字的 word2vec 嵌入的进行比较。
和 word2vec 一样,我需要一项训练任务,它将迫使实体嵌入来学习它们所代表的实体的一般信息。我决定训练一个分类器,它可以从一个人的维基百科文章中获取一个文本片段,然后学习猜测这个片段是关于谁的。
训练任务将以几个实体嵌入作为输入,并输出文本片段所涉及的真实实体嵌入。在下面的例子中,分类器将会看到一个关于奥巴马的文本片段,以及奥巴马和另外三个随机选择的人物的嵌入。分类器将输出一个数字表示哪一个输入是奥巴马的嵌入。
所有的嵌入都将在每个步骤中被训练,所以不仅正确的人物嵌入将学习对应人物有什么相关信息,其他不正确的嵌入也会了解它们所代表的人物不相关的信息有哪些。
这种技术在直觉上似乎是合理的,但是为了验证我的结果,我需要尝试将这些训练好的嵌入应用到一些其他任务上,看看它们是否真的了解了它们的对应实体的一般信息。
为此,我在其他一些任务上训练简单的分类器,将实体嵌入作为输入,然后输出一些分类,诸如实体的性别或职业。以下是这些分类器的架构:
这是得到的结果,以及与单纯猜测和用 word2vec 得到的嵌入做相同任务的对比。
我的嵌入与 word2vec 嵌入表现非常接近,尽管我的嵌入所用的训练文本更少——大约 3000 万字 vs. 1000 亿字。文本要求少了 4 个数量级!
实例 2:Yelp 商家
接下来,我想看看这项技术是否可以推广。它是只能在维基百科上管用,还是更通用。我尝试应用同样的技术,以 Yelp 数据集来训练商家的嵌入。
Yelp 在网上提供了其数据集的一部分,包含商家以及关于这些商家的所有建议和评论。我用与训练维基百科人物的嵌入相同的技术来训练嵌入,除了这次的文本是 Yelp 里对商家的评论,而实体是这些商家。这个任务可以表示成下图:
经过训练后,我在一项新任务上测试了这些嵌入——弄清楚某一商家属于哪种类型的业务,例如:CVS 药店属于「健康」类,而麦当劳则属于「餐厅」类。一共有十种类别,而一个商家可能属于多个类别——因此这是一个多达十种标签的多标签分类任务,很有挑战性。与经过培训后的猜测结果相比较如下:
考虑到这一任务的难度,这是一个很好的结果!
总之,这是一个成功的实验。我训练了获取自然语言文本中的信息的嵌入,然后通过在其他任务上验证这些信息,我就能从他们那里得到有用的信息。任何有配对文本的业务都可以使用这种技术,能够在他们的数据上运行预测任务。
下一步和代码
虽然这些结果看起来已经很有潜力,但还可以通过将结构化的数据和文本结合一起用来训练嵌入,从而进一步提升结果,我将在未来探索这个思路。
原文链接:https://blog.insightdatascience.com/entity2vec-dad368c5b830